Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r1699da4737a1a176ed842cb30a887c9c2ffdfc94 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 1699da4737a1a176ed842cb30a887c9c2ffdfc94) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -51,11 +51,10 @@ 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 +65,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 +84,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; } /*********************************************************************//** @@ -155,14 +166,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; @@ -425,12 +460,11 @@ else { rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + sendDisinfectConfirmResponse( result, rejReason ); } } } - sendDisinfectConfirmResponse( result, rejReason ); - return result; } @@ -511,10 +545,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 ) @@ -523,55 +555,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 @@ -585,15 +644,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 @@ -607,15 +721,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 @@ -629,8 +799,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;