Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -ra19a676d1e67bb3e1aca9e9bba49727f9d5f8b38 -r8a18b5d1fb4598c6b7facb3e7e233252941eaded --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a19a676d1e67bb3e1aca9e9bba49727f9d5f8b38) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8a18b5d1fb4598c6b7facb3e7e233252941eaded) @@ -16,19 +16,31 @@ #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" +#include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Buttons.h" +#include "Dialysis.h" #include "OperationModes.h" +#include "SystemComm.h" #include "SystemCommMessages.h" #include "ModeStandby.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; #endif + /** + * @addtogroup HDStandbyMode + * @{ + */ + + // ********** private definitions ********** + // ********** private data ********** +static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. + // ********** private function prototypes ********** /************************************************************************* @@ -42,6 +54,7 @@ *************************************************************************/ void initStandbyMode( void ) { + currentStandbyState = STANDBY_START_STATE; } /************************************************************************* @@ -55,7 +68,10 @@ *************************************************************************/ void transitionToStandbyMode( void ) { - // temporary test code - TODO - remove later + // re-initialize when transitioning to standby mode + initStandbyMode(); + initDGInterface(); + #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); @@ -73,22 +89,165 @@ * Inputs : none * Outputs : * @param none - * @return none + * @return current state (sub-mode) *************************************************************************/ -void execStandbyMode( void ) +U32 execStandbyMode( void ) { - BOOL stop = isStopButtonPressed(); +#ifdef EMC_TEST_BUILD + static BOOL toggle = FALSE; + static BOOL button_state = FALSE; +#endif +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 ) +#ifdef UF_TEST_WITH_DG + // state machine to get DG to prep a reservoir so we can start a treatment + switch ( currentStandbyState ) { - cmdStartDG(); - requestNewOperationMode( MODE_PRES ); + case STANDBY_START_STATE: + // temporary test code - TODO - remove later + if ( TRUE == isDGCommunicating() ) + { + //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 + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML ); + } + } + 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( FILL_RESERVOIR_TO_VOLUME_ML ); + } + } + 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 ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + break; + + case STANDBY_WAIT_FOR_TREATMENT_STATE: + // TODO - test code + if ( TRUE == stop ) + { + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + setStartReservoirVolume(); + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + requestNewOperationMode( MODE_TPAR ); + } + } + } + break; + + default: + // TODO - s/w fault + currentStandbyState = STANDBY_START_STATE; + break; } +#else + // state machine to get DG to prep a reservoir so we can start a treatment + switch ( currentStandbyState ) + { + case STANDBY_START_STATE: + // temporary test code - TODO - remove later + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + break; + + case STANDBY_WAIT_FOR_TREATMENT_STATE: + // TODO - test code + if ( TRUE == stop ) + { +#ifdef EMC_TEST_BUILD + if ( stop != button_state ) + { + toggle = ( toggle == TRUE ? FALSE : TRUE ); + if ( TRUE == toggle ) + { + setBloodPumpTargetFlowRate( 500, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( 500, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( 500, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + } + else + { + setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + } + } +#else + requestNewOperationMode( MODE_TPAR ); +#endif + } +#ifdef EMC_TEST_BUILD + button_state = stop; +#endif + break; + + default: + // TODO - s/w fault + currentStandbyState = STANDBY_START_STATE; + break; + } +#endif + #ifdef RM46_EVAL_BOARD_TARGET if ( TRUE == didTimeout( start, 5000U ) ) { - requestNewOperationMode( MODE_PRES ); + requestNewOperationMode( MODE_TPAR ); } #endif + + return currentStandbyState; } +/**@}*/