Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rbf1f56417b8b306b2667b08a950688da5375bcaf -re0baadc7d3a23c03202ae312140d30410e061b88 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision bf1f56417b8b306b2667b08a950688da5375bcaf) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision e0baadc7d3a23c03202ae312140d30410e061b88) @@ -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 ); @@ -155,14 +164,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; @@ -519,69 +552,86 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ) { HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DISINFECT_STATE; - BOOL result = FALSE; - if ( TRUE == flushStartReqReceived ) + if ( ( TRUE == flushStartReqReceived ) && ( FALSE == hasDisinfectCmdBeenSet ) ) { - if ( FALSE == hasDisinfectCmdBeenSet ) - { - cmdStartDGFlush(); - hasDisinfectCmdBeenSet = TRUE; - } - //else if ( DG_MODE_FLUS == getDGOpMode() ) // TODO remove - else - { - DG_CMD_RESPONSE_T dgCmdResp; - if ( TRUE == getDGCommandResponse( DG_CMD_START_FLUSH, &dgCmdResp ) ) - { - if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) - { - hasDisinfectCmdBeenSet = FALSE; - flushStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_FLUSH_STATE; - state = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; - } - - sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); - } - } + cmdStartDGFlush(); + //hasDisinfectCmdBeenSet = TRUE; // TODO remove + state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; } - else if ( TRUE == heatDisinfectStartReqReceived ) + else if ( ( TRUE == heatDisinfectStartReqReceived ) && ( FALSE == hasDisinfectCmdBeenSet ) ) { - 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(); + //hasDisinfectCmdBeenSet = TRUE; TODO remove + state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; + } + else if ( ( TRUE == chemDisinfectStartReqReceived ) && ( FALSE == hasDisinfectCmdBeenSet ) ) + { + cmdStartDGChemicalDisinfect(); + //hasDisinfectCmdBeenSet = TRUE; TODO remove + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; } - else if ( TRUE == chemDisinfectStartReqReceived ) + + 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 ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + DG_CMD_RESPONSE_T dgCmdResp; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_FLUSH, &dgCmdResp ) ) { - if ( FALSE == hasDisinfectCmdBeenSet ) + // 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; + 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 @@ -595,15 +645,69 @@ 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 ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + DG_CMD_RESPONSE_T dgCmdResp; + + 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; + } + + 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 @@ -617,15 +721,70 @@ 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 ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + DG_CMD_RESPONSE_T dgCmdResp; + + 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_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + } + + 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 @@ -639,8 +798,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;