Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r049175cd6c514657ede645412cab05ce707d002f -rb7318644527939f0b8b01bd3999a9c187c64f40e --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 049175cd6c514657ede645412cab05ce707d002f) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision b7318644527939f0b8b01bd3999a9c187c64f40e) @@ -32,6 +32,7 @@ #include "SystemComm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" +#include "Timers.h" #ifdef EMC_TEST_BUILD // TODO - test code #include "FPGA.h" #endif @@ -43,7 +44,7 @@ // ********** private definitions ********** -#define DG_DISINFECTS_DATA_PUB_INTERVAL ( 4 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode chem disinfect data publish interval in counts. +#define DISINFECTS_DATA_PUB_INTERVAL ( 4 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Disinfects data publish interval in counts. // ********** private data ********** @@ -54,10 +55,11 @@ 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 U32 dataPublishCounter = 0; ///< Disinfects data publish counter. +static BOOL hasDisinfectCmdBeenSet = FALSE; ///< Flag indicates that a disinfect command has been set. // ********** private function prototypes ********** -static void publishDisinfectData( U32 disinfectSubModeState ); +static void publishDisinfectData( void ); /*********************************************************************//** * @brief @@ -68,10 +70,11 @@ *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; - treatStartReqReceived = FALSE; - flushStartReqReceived = FALSE; - dataPublishCounter = 0; + currentStandbyState = STANDBY_START_STATE; + treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; + hasDisinfectCmdBeenSet = FALSE; } /*********************************************************************//** @@ -145,65 +148,71 @@ case STANDBY_WAIT_FOR_DISINFECT_STATE: if ( TRUE == flushStartReqReceived ) { - cmdStartDGFlush(); - currentStandbyState = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + if ( FALSE == hasDisinfectCmdBeenSet ) + { + cmdStartDGFlush(); + hasDisinfectCmdBeenSet = TRUE; + } + else if ( DG_MODE_FLUS == getDGOpMode() ) + { + hasDisinfectCmdBeenSet = FALSE; + currentStandbyState = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + } } else if ( TRUE == heatDisinfectStartReqReceived ) { - cmdStartDGHeatDisinfect(); - currentStandbyState = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + if ( FALSE == hasDisinfectCmdBeenSet ) + { + cmdStartDGHeatDisinfect(); + hasDisinfectCmdBeenSet = TRUE; + } + else if ( DG_MODE_HEAT == getDGOpMode() ) + { + hasDisinfectCmdBeenSet = FALSE; + currentStandbyState = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + } } else if ( TRUE == chemDisinfectStartReqReceived ) { - cmdStartDGChemicalDisinfect(); - currentStandbyState = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + if ( FALSE == hasDisinfectCmdBeenSet ) + { + cmdStartDGChemicalDisinfect(); + hasDisinfectCmdBeenSet = TRUE; + } + else if ( DG_MODE_CHEM == getDGOpMode() ) + { + hasDisinfectCmdBeenSet = FALSE; + currentStandbyState = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + } } break; case STANDBY_DG_FLUSH_IN_PROGRESS_STATE: - { - DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); - U32 subModeState = state.flushUIState; - - publishDisinfectData( subModeState ); - - if( DG_MODE_STAN == getDGOpMode() ) + if ( getDGOpMode() != DG_MODE_FLUS ) { currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; } - } - break; + publishDisinfectData(); + break; case STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE: - { - DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); - U32 subModeState = state.heatDisinfectUIState; - - publishDisinfectData( subModeState ); - - if( DG_MODE_STAN == getDGOpMode() ) + if ( getDGOpMode() != DG_MODE_HEAT ) { currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; } - } - break; + publishDisinfectData(); + break; case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: - { - DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); - U32 subModeState = state.chemDisinfectUIState; - - publishDisinfectData( subModeState ); - - if( DG_MODE_STAN == getDGOpMode() ) + if ( getDGOpMode() != DG_MODE_CHEM ) { currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; } - } - break; + publishDisinfectData(); + break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_STANDBY_INVALID_STATE, currentStandbyState ); currentStandbyState = STANDBY_START_STATE; break; } @@ -482,20 +491,34 @@ * @details Outputs: dataPublishCounter * @return: none *************************************************************************/ -static void publishDisinfectData( U32 disinfectSubModeState ) +static void publishDisinfectData( void ) { - if ( ++dataPublishCounter > DG_DISINFECTS_DATA_PUB_INTERVAL ) + if ( ++dataPublishCounter > DISINFECTS_DATA_PUB_INTERVAL ) { + DG_DISINFECT_UI_STATES_T state = getDGDisinfectsStates(); DISINFECTS_DATA_T data; - data.disinfectState = (U32)currentStandbyState; - data.disinfectSubModeState = disinfectSubModeState; + switch( currentStandbyState ) + { + case STANDBY_DG_FLUSH_IN_PROGRESS_STATE: + data.disinfectDGState = state.flushUIState; + break; + case STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE: + data.disinfectDGState = state.heatDisinfectUIState; + break; + + case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: + data.disinfectDGState = state.chemDisinfectUIState; + break; + } + + data.disinfectSubModeHDState = (U32)currentStandbyState; + broadcastDisinfectsData( &data ); dataPublishCounter = 0; } } - /**@}*/