Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r24b2fe72608344e67ef37234085d15ad5e4fcc37 -r5b448e81db260e5b041699a83c6f2a3faa260ea9 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 24b2fe72608344e67ef37234085d15ad5e4fcc37) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 5b448e81db260e5b041699a83c6f2a3faa260ea9) @@ -8,7 +8,7 @@ * @file ModeStandby.c * * @author (last) Dara Navaei -* @date (last) 12-Nov-2021 +* @date (last) 07-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -46,16 +46,16 @@ // ********** private definitions ********** #define DISINFECTS_DATA_PUB_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Disinfects data publish interval in counts. +#define SERVICE_TIME_INTERVAL_MS ( 6 * 30 * SECONDS_IN_A_DAY * MS_PER_SECOND ) ///< HD/DG 6-month service interval in milliseconds. // ********** private data ********** static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. -static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of a treatment. -static BOOL flushStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of flush mode. -static BOOL heatDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of heat disinfect mode. -static BOOL chemDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of chemical disinfect mode. -static BOOL hasDisinfectCmdBeenSet = FALSE; ///< Flag indicates that a disinfect command has been set. +static BOOL treatStartReqReceived; ///< Flag indicates user has requested initiation of a treatment. +static BOOL flushStartReqReceived; ///< Flag indicates user has requested initiation of flush mode. +static BOOL heatDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of heat disinfect mode. +static BOOL chemDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of chemical disinfect mode. static DG_DISINFECT_STATE_T dgDisinfectState; ///< DG disinfect state to be boadcast to UI. static U32 dataPublishCounter = 0; ///< Disinfects data publish counter. @@ -66,8 +66,17 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); static HD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushToStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGFlushInProgressState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGHeatDisinfectInProgressState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGChemDisininfectInProgressState( void ); static void publishDisinfectData( void ); @@ -76,17 +85,20 @@ * @brief * The initStandbyMode function initializes the Standby Mode module. * @details Inputs: none - * @details Outputs: Standby Mode module initialized. + * @details Outputs: currentStandbyState, treatStartReqReceived, + * flushStartReqReceived, dataPublishCounter, heatDisinfectStartReqReceived, + * chemDisinfectStartReqReceived, dgDisinfectState * @return none *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; - treatStartReqReceived = FALSE; - flushStartReqReceived = FALSE; - dataPublishCounter = 0; - hasDisinfectCmdBeenSet = FALSE; - dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + currentStandbyState = STANDBY_START_STATE; + treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; + heatDisinfectStartReqReceived = FALSE; + chemDisinfectStartReqReceived = FALSE; + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; } /*********************************************************************//** @@ -110,9 +122,10 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, FALSE ); // Pumps should be off - setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); // Set valves to default positions setValveAirTrap( STATE_CLOSED ); @@ -155,14 +168,38 @@ currentStandbyState = handleStandbyModeWaitForDisinfectState(); break; + case STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGFlushCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGFlushToStartState(); + break; + case STANDBY_DG_FLUSH_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGFlushInProgressState(); break; + case STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGHeatDisinfectCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGHeatDisinfectStartState(); + break; + case STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGHeatDisinfectInProgressState(); break; + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectStartState(); + break; + case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGChemDisininfectInProgressState(); break; @@ -279,11 +316,6 @@ BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; - if ( TRUE == getNoNewTreatmentStatus() ) - { - rejReason = REQUEST_REJECT_REASON_NO_NEW_TREATMENT_ALARM_TRIGGERED; - } - if ( ( MODE_STAN != getCurrentOperationMode() ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE != currentStandbyState ) ) { rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; @@ -341,7 +373,7 @@ *************************************************************************/ BOOL signalUserInitiateFlushMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -351,9 +383,9 @@ if ( TRUE == isDGCommunicating() ) { flushStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -377,7 +409,7 @@ *************************************************************************/ BOOL signalUserInitiateHeatDisinfectMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -387,9 +419,9 @@ if ( TRUE == isDGCommunicating() ) { heatDisinfectStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -413,7 +445,7 @@ *************************************************************************/ BOOL signalUserInitiateChemicalDisinfectMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -423,9 +455,9 @@ if ( TRUE == isDGCommunicating() ) { chemDisinfectStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -449,16 +481,16 @@ *************************************************************************/ BOOL signalInitiateStandbyDisinfectSubmode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) { if ( TRUE == isDGCommunicating() ) { currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - result = TRUE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -516,10 +548,8 @@ * The handleStandbyModeWaitForDisinfectState function handles wait for * disinfect state. * @details Inputs: flushStartReqReceived, heatDisinfectStartReqReceived, - * chemDisinfectStartReqReceived, hasDisinfectCmdBeenSet - * @details Outputs: flushStartReqReceived, heatDisinfectStartReqReceived, - * chemDisinfectStartReqReceived, hasDisinfectCmdBeenSet, dgDisinfectState, - * currentStandbyState + * chemDisinfectStartReqReceived + * @details Outputs: none * @return next state of the standby mode state machine *************************************************************************/ static HD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ) @@ -528,55 +558,82 @@ if ( TRUE == flushStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) - { - cmdStartDGFlush(); - hasDisinfectCmdBeenSet = TRUE; - } - else if ( DG_MODE_FLUS == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - flushStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_FLUSH_STATE; - state = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; - } + cmdStartDGFlush(); + state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; } else if ( TRUE == heatDisinfectStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) - { - cmdStartDGHeatDisinfect(); - hasDisinfectCmdBeenSet = TRUE; - } - else if ( DG_MODE_HEAT == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - heatDisinfectStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_HEAT_STATE; - state = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; - } + cmdStartDGHeatDisinfect(); + state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; } else if ( TRUE == chemDisinfectStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) + cmdStartDGChemicalDisinfect(); + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGFlushCmdResponseState function handles DG flush + * command response state. + * @details Inputs: none + * @details Outputs: flushStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushCmdResponseState( void ) +{ + DG_CMD_RESPONSE_T dgCmdResp; + + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + // Check if DG has responded to the start DG flush command + if ( TRUE == getDGCommandResponse( DG_CMD_START_FLUSH, &dgCmdResp ) ) + { + // Assume the command will be rejected and it goes back to wait for disinfect command + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + flushStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) { - cmdStartDGChemicalDisinfect(); - hasDisinfectCmdBeenSet = TRUE; + // If the command has not been rejected, transition to the next state + dgDisinfectState = DG_DISINFECT_FLUSH_STATE; + state = STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE; + result = TRUE; } - else if ( DG_MODE_CHEM == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - chemDisinfectStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_CHEM_STATE; - state = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; - } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); } return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGFlushToStartState function handles DG flush + * wait to start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushToStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE; + + if ( DG_MODE_FLUS == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGFlushInProgressState function handles DG flush * in progress state. * @details Inputs: none @@ -590,15 +647,70 @@ if ( getDGOpMode() != DG_MODE_FLUS ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGHeatDisinfectCmdResponseState function handles + * DG heat disinfect command response state. + * @details Inputs: none + * @details Outputs: heatDisinfectStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectCmdResponseState( void ) +{ + DG_CMD_RESPONSE_T dgCmdResp; + + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_HEAT_DISINFECT, &dgCmdResp ) ) + { + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + heatDisinfectStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + dgDisinfectState = DG_DISINFECT_HEAT_STATE; + state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE; + result = TRUE; + } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGHeatDisinfectStartState function handles + * DG heat disinfect wait for start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE; + + if ( DG_MODE_HEAT == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGHeatDisinfectInProgressState function handles DG * heat disinfect in progress state. * @details Inputs: none @@ -612,15 +724,71 @@ if ( getDGOpMode() != DG_MODE_HEAT ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGChemDisinfectCmdResponseState function handles + * DG chemical disinfect wait for command response state. + * @details Inputs: none + * @details Outputs: chemDisinfectStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectCmdResponseState( void ) +{ + DG_CMD_RESPONSE_T dgCmdResp; + + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_CHEM_DISINFECT, &dgCmdResp ) ) + { + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + chemDisinfectStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + dgDisinfectState = DG_DISINFECT_CHEM_STATE; + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE; + result = TRUE; + } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); + } + + return state; + +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGChemDisinfectStartState function handles + * DG chemical disinfect wait for start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE; + + if ( DG_MODE_CHEM == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGChemDisininfectInProgressState function handles * DG chemical disinfect in progress state. * @details Inputs: none @@ -634,8 +802,9 @@ if ( getDGOpMode() != DG_MODE_CHEM ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state;