Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r93a439cf9d1b347e23b84d1156417380ee01efaa -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 93a439cf9d1b347e23b84d1156417380ee01efaa) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -16,9 +16,10 @@ #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" +#include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Buttons.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "ModeStandby.h" @@ -27,8 +28,24 @@ static U32 start; #endif +// ********** private definitions ********** + +/// Sub-mode states while in standby mode +typedef enum Standby_States +{ + STANDBY_START_STATE = 0, ///< Start standby + STANDBY_FLUSH_DG_LINES_STATE, ///< + STANDBY_DRAIN_RESERVOIR_STATE, ///< + STANDBY_WAIT_FOR_PRIME_STATE, ///< + STANDBY_FILL_RESERVOIR_STATE, ///< + STANDBY_WAIT_FOR_TREATMENT_STATE, ///< + NUM_OF_STANDBY_STATES ///< Number of standby states (sub-modes). +} STANDBY_STATE_T; + // ********** private data ********** +static STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. + // ********** private function prototypes ********** /************************************************************************* @@ -42,6 +59,7 @@ *************************************************************************/ void initStandbyMode( void ) { + currentStandbyState = STANDBY_START_STATE; } /************************************************************************* @@ -55,10 +73,9 @@ *************************************************************************/ void transitionToStandbyMode( void ) { - // temporary test code - TODO - remove later - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); + // re-initialize when transitioning to standby mode + initStandbyMode(); + #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); @@ -81,12 +98,94 @@ void execStandbyMode( void ) { BOOL stop = isStopButtonPressed(); + DG_OP_MODE_T dgOpMode = getDGOpMode(); // TODO - the DG mode & sub-mode come as a pair at interval - they MUST be kept together. + U32 dgSubMode = getDGSubMode(); - if ( TRUE == stop ) + // treatment mode state machine + switch ( currentStandbyState ) { - cmdStartDG(); - requestNewOperationMode( MODE_PRES ); + case STANDBY_START_STATE: + // temporary test code - TODO - remove later + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + cmdStartDG(); + currentStandbyState = STANDBY_FLUSH_DG_LINES_STATE; + break; + + case STANDBY_FLUSH_DG_LINES_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGDrain( 100 ); + } + } + else if ( DG_MODE_DRAI == dgOpMode ) + { + currentStandbyState = STANDBY_DRAIN_RESERVOIR_STATE; + } + else + { + cmdStartDG(); + } + break; + + case STANDBY_DRAIN_RESERVOIR_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + currentStandbyState = STANDBY_WAIT_FOR_PRIME_STATE; + } + break; + + case STANDBY_WAIT_FOR_PRIME_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGFill( 1500 ); + } + } + else if ( DG_MODE_FILL == dgOpMode ) + { + currentStandbyState = STANDBY_FILL_RESERVOIR_STATE; + } + break; + + case STANDBY_FILL_RESERVOIR_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + break; + + case STANDBY_WAIT_FOR_TREATMENT_STATE: + // TODO - test code + if ( TRUE == stop ) + { + if ( DG_MODE_CIRC == getDGOpMode() ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + requestNewOperationMode( MODE_PRES ); + } + } + } + break; + + default: + // TODO - s/w fault + currentStandbyState = STANDBY_START_STATE; + break; } + #ifdef RM46_EVAL_BOARD_TARGET if ( TRUE == didTimeout( start, 5000U ) ) {