Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r6419179374edcd65da462de84e8aeaefb7e20320 -r049175cd6c514657ede645412cab05ce707d002f --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 6419179374edcd65da462de84e8aeaefb7e20320) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 049175cd6c514657ede645412cab05ce707d002f) @@ -31,6 +31,7 @@ #include "OperationModes.h" #include "SystemComm.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" #ifdef EMC_TEST_BUILD // TODO - test code #include "FPGA.h" #endif @@ -42,14 +43,22 @@ // ********** private definitions ********** +#define DG_DISINFECTS_DATA_PUB_INTERVAL ( 4 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode chem disinfect data publish interval in counts. + // ********** private data ********** -static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. +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 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 U32 dataPublishCounter = 0; ///< Disinfects data publish counter. // ********** private function prototypes ********** +static void publishDisinfectData( U32 disinfectSubModeState ); + /*********************************************************************//** * @brief * The initStandbyMode function initializes the Standby Mode module. @@ -59,8 +68,10 @@ *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; + currentStandbyState = STANDBY_START_STATE; treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; } /*********************************************************************//** @@ -131,6 +142,66 @@ } break; + case STANDBY_WAIT_FOR_DISINFECT_STATE: + if ( TRUE == flushStartReqReceived ) + { + cmdStartDGFlush(); + currentStandbyState = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + } + else if ( TRUE == heatDisinfectStartReqReceived ) + { + cmdStartDGHeatDisinfect(); + currentStandbyState = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + } + else if ( TRUE == chemDisinfectStartReqReceived ) + { + cmdStartDGChemicalDisinfect(); + 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() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + 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() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + 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() ) + { + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + } + break; + default: // TODO - s/w fault currentStandbyState = STANDBY_START_STATE; @@ -273,4 +344,158 @@ // Alarm actions not handled in Standby mode } +/*********************************************************************//** + * @brief + * The signalUserInitiateFlushMode function handles user initiation of flush + * mode. + * @details Inputs: currentStandbyState + * @details Outputs: flushStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateFlushMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + flushStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalUserInitiateFlushMode function handles user initiation of flush + * mode. + * @details Inputs: currentStandbyState + * @details Outputs: heatDisinfectStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateHeatDisinfectMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + heatDisinfectStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalUserInitiateChemicalDisinfectMode function handles user + * initiation of flush mode. + * @details Inputs: currentStandbyState + * @details Outputs: chemDisinfectStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateChemicalDisinfectMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( MODE_STAN == getCurrentOperationMode() ) && ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + chemDisinfectStartReqReceived = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalInitiateStandbyDisinfectSubmode function handles user + * initiation of setting the disinfects submode. + * @details Inputs: currentStandbyState + * @details Outputs: currentStandbyState + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalInitiateStandbyDisinfectSubmode( void ) +{ + 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; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +// ********** private functions ********** + +/*********************************************************************//** + * @brief + * The publishDisinfectData function publishes disinfects data at + * the set interval. + * @details Inputs: dataPublishCounter + * @details Outputs: dataPublishCounter + * @return: none + *************************************************************************/ +static void publishDisinfectData( U32 disinfectSubModeState ) +{ + if ( ++dataPublishCounter > DG_DISINFECTS_DATA_PUB_INTERVAL ) + { + DISINFECTS_DATA_T data; + + data.disinfectState = (U32)currentStandbyState; + data.disinfectSubModeState = disinfectSubModeState; + + broadcastDisinfectsData( &data ); + + dataPublishCounter = 0; + } +} + + /**@}*/