Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r20de4244b5e55d858ade633a264da25017f12df2 -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 20de4244b5e55d858ade633a264da25017f12df2) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -88,7 +88,7 @@ static HD_STANDBY_STATE_T handleStandbyModeDGCleaningModeInProgressState( void ); static void handleDisinfectCancel( BOOL stop ); -static void setRequestedCleaningMode( DG_OP_MODE_T opMode ); +static void setRequestedCleaningMode( DG_OP_MODE_T opMode, BOOL isNocturnalHeatDis ); static void clearCurrentCleaningModeStatus( void ); static void handleChemFlushSampleCollection( void ); static void handleROPermeateSampleCollection( void ); @@ -359,7 +359,7 @@ * The signalUserInitiateFlushMode function handles user initiation of flush * mode. * @details Inputs: currentStandbyState - * @details Outputs: flushStartReqReceived, currentStandbyState + * @details Outputs: currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserInitiateFlushMode( void ) @@ -373,7 +373,7 @@ { if ( TRUE == isDGCommunicating() ) { - setRequestedCleaningMode( DG_MODE_FLUS ); + setRequestedCleaningMode( DG_MODE_FLUS, FALSE ); result = TRUE; currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; rejReason = REQUEST_REJECT_REASON_NONE; @@ -395,7 +395,7 @@ * The signalUserInitiateFlushMode function handles user initiation of heat * disinfect mode. * @details Inputs: currentStandbyState - * @details Outputs: heatDisinfectStartReqReceived + * @details Outputs: currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserInitiateHeatDisinfectMode( void ) @@ -409,7 +409,7 @@ { if ( TRUE == isDGCommunicating() ) { - setRequestedCleaningMode( DG_MODE_HEAT ); + setRequestedCleaningMode( DG_MODE_HEAT, FALSE ); result = TRUE; currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; rejReason = REQUEST_REJECT_REASON_NONE; @@ -431,7 +431,7 @@ * The signalUserInitiateChemicalDisinfectMode function handles user * initiation of chemical disinfect mode. * @details Inputs: currentStandbyState - * @details Outputs: chemDisinfectStartReqReceived + * @details Outputs: currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserInitiateChemicalDisinfectMode( void ) @@ -447,7 +447,7 @@ { if ( TRUE == isChemDisinfectEnabledInInstitRecord() ) { - setRequestedCleaningMode( DG_MODE_CHEM ); + setRequestedCleaningMode( DG_MODE_CHEM, FALSE ); result = TRUE; currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; rejReason = REQUEST_REJECT_REASON_NONE; @@ -474,7 +474,7 @@ * The signalUserInitiateChemicalDisinfectFlushMode function handles user * initiation of chemical disinfect flush mode. * @details Inputs: currentStandbyState - * @details Outputs: chemDisinfectFlushStartReqReceived, currentStandbyState + * @details Outputs: currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserInitiateChemicalDisinfectFlushMode( void ) @@ -490,7 +490,7 @@ { if ( TRUE == isChemDisinfectEnabledInInstitRecord() ) { - setRequestedCleaningMode( DG_MODE_CHFL ); + setRequestedCleaningMode( DG_MODE_CHFL, FALSE ); result = TRUE; currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; rejReason = REQUEST_REJECT_REASON_NONE; @@ -517,7 +517,7 @@ * The signalUserInitiateROPermeateSampleMode function handles user * initiation of RO permeate sample mode. * @details Inputs: currentStandbyState - * @details Outputs: roPermeateSampleStartReqReceived, currentStandbyState + * @details Outputs: currentStandbyState * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserInitiateROPermeateSampleMode( void ) @@ -531,7 +531,7 @@ { if ( TRUE == isDGCommunicating() ) { - setRequestedCleaningMode( DG_MODE_ROPS ); + setRequestedCleaningMode( DG_MODE_ROPS, FALSE ); result = TRUE; currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; rejReason = REQUEST_REJECT_REASON_NONE; @@ -550,6 +550,79 @@ /*********************************************************************//** * @brief + * The signalUserInitiateNocturnalHeatDisinfectMode function handles user + * initiation of nocturnal heat disinfect mode. + * @details Inputs: currentStandbyState + * @details Outputs: currentStandbyState + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateNocturnalHeatDisinfectMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( MODE_STAN == getCurrentOperationMode() ) + { + if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + setRequestedCleaningMode( DG_MODE_HEAT, TRUE ); + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief + * The signalUserInitiateHeatDisinfectActiveCoolMode function handles user + * initiation of heat disinfect active cool mode. + * @details Inputs: currentStandbyState + * @details Outputs: currentStandbyState + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateHeatDisinfectActiveCoolMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( MODE_STAN == getCurrentOperationMode() ) + { + if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + setRequestedCleaningMode( DG_MODE_HCOL, FALSE ); + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + 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 @@ -706,7 +779,7 @@ case DG_MODE_CHFL: case DG_MODE_HCOL: case DG_MODE_ROPS: - setRequestedCleaningMode( dgOperationMode ); + setRequestedCleaningMode( dgOperationMode, FALSE ); state = STANDBY_WAIT_FOR_DG_CLEANING_MODE_TO_START_STATE; break; @@ -771,7 +844,14 @@ break; case DG_MODE_HEAT: - cmdStartDGHeatDisinfect(); + if ( DG_CMD_START_HEAT_DISINFECT == currentDGCleaningMode.startRequestCmdID ) + { + cmdStartDGHeatDisinfect(); + } + else + { + cmdStartDGNocturnalHeatDisinfect(); + } break; case DG_MODE_CHEM: @@ -785,6 +865,10 @@ case DG_MODE_ROPS: cmdStartDGROPermeateSampleMode(); break; + + case DG_MODE_HCOL: + cmdStartDGActiveCool(); + break; } state = STANDBY_WAIT_FOR_DG_CLEANING_MODE_CMD_RESPONSE_STATE; } @@ -799,7 +883,7 @@ case DG_MODE_ROPS: // This is for the situations that any of the disinfect modes are started using the proxy commands while the HD // is in this state of the Standby Mode. - setRequestedCleaningMode( getDGOpMode() ); + setRequestedCleaningMode( getDGOpMode(), FALSE ); state = STANDBY_WAIT_FOR_DG_CLEANING_MODE_TO_START_STATE; currentDGCleaningMode.startCleaningMode = FALSE; break; @@ -978,9 +1062,11 @@ * @details Inputs: currentDGCleaningMode * @details Outputs: none * @param opMode DG operation mode that has been requested (i.e. heat disinfect) + * @param isNocturnalHeatDis boolean flag to indicate whether this is a nocturnal + * heat disinfect or not. * @return none *************************************************************************/ -static void setRequestedCleaningMode( DG_OP_MODE_T opMode ) +static void setRequestedCleaningMode( DG_OP_MODE_T opMode, BOOL isNocturnalHeatDis ) { switch ( opMode ) { @@ -995,7 +1081,7 @@ case DG_MODE_HEAT: currentDGCleaningMode.startCleaningMode = TRUE; - currentDGCleaningMode.startRequestCmdID = DG_CMD_START_HEAT_DISINFECT; + currentDGCleaningMode.startRequestCmdID = ( FALSE == isNocturnalHeatDis ? DG_CMD_START_HEAT_DISINFECT : DG_CMD_START_NOCTURNAL_HEAT_DISINFECT ); currentDGCleaningMode.dgOpMode = DG_MODE_HEAT; currentDGCleaningMode.sampleRqstTrgrd = FALSE; currentDGCleaningMode.alarmID = ALARM_ID_HD_DISINFECT_HEAT; @@ -1021,9 +1107,8 @@ break; case DG_MODE_HCOL: - // Cannot start active cool from settings in the UI currentDGCleaningMode.startCleaningMode = FALSE; - currentDGCleaningMode.startRequestCmdID = DG_CMD_NONE; + currentDGCleaningMode.startRequestCmdID = DG_CMD_START_ACTIVE_COOL; currentDGCleaningMode.dgOpMode = DG_MODE_HCOL; currentDGCleaningMode.sampleRqstTrgrd = FALSE; currentDGCleaningMode.alarmID = ALARM_ID_HD_DISINFECT_HEAT_COOL;