Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -rf373b6c38077c7e6071939e702fab65db58c1146 -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision f373b6c38077c7e6071939e702fab65db58c1146) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -1054,6 +1054,23 @@ /*********************************************************************//** * @brief + * The cmdStartDGNocturnalHeatDisinfect function sends a start nocturnal + * heat disinfect command message to DG. + * @details Inputs: none + * @details Outputs: start nocturnal heat disinfect mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStartDGNocturnalHeatDisinfect( void ) +{ + BOOL start = TRUE; + + dgCmdResp[ DG_CMD_START_NOCTURNAL_HEAT_DISINFECT ].commandID = DG_CMD_NONE; + + sendDGStartNocturnalHeatDisinfectModeCommand( start ); +} + +/*********************************************************************//** + * @brief * The cmdStartDGChemicalDisinfect function sends a start chemical disinfect * command message to the DG. * @details Inputs: none @@ -1118,6 +1135,23 @@ /*********************************************************************//** * @brief + * The cmdStartDGActiveCool function sends a start active cool command + * message to the DG. + * @details Inputs: none + * @details Outputs: start active cool mode command sent to DG. + * @return none + *************************************************************************/ +void cmdStartDGActiveCool( void ) +{ + BOOL start = TRUE; + + dgCmdResp[ DG_CMD_START_ACTIVE_COOL ].commandID = DG_CMD_NONE; + sendDGStopActiveCoolModeCommand( start ); + +} + +/*********************************************************************//** + * @brief * The cmdStopDGActiveCool function sends a stop active cool command * message to the DG. * @details Inputs: none @@ -1126,8 +1160,10 @@ *************************************************************************/ void cmdStopDGActiveCool( void ) { + BOOL start = FALSE; + dgCmdResp[ DG_CMD_STOP_ACTIVE_COOL ].commandID = DG_CMD_NONE; - sendDGStopActiveCoolModeCommand(); + sendDGStopActiveCoolModeCommand( start ); } /*********************************************************************//** Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -re8edb83fcba5c355198efc30944d51c54814bdbe -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision e8edb83fcba5c355198efc30944d51c54814bdbe) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -148,10 +148,12 @@ void cmdStopDGFlush( void ); void cmdStartDGHeatDisinfect( void ); void cmdStopDGHeatDisinfect( void ); +void cmdStartDGNocturnalHeatDisinfect( void ); void cmdStartDGChemicalDisinfect( void ); void cmdStopDGChemicalDisinfect( void ); void cmdStartDGChemicalFlushDisinfect( void ); void cmdStopDGChemFlushDisinfect( void ); +void cmdStartDGActiveCool( void ); void cmdStopDGActiveCool( void ); void cmdStartDGROPermeateSampleMode( void ); void cmdStopDGROPermeateSampleMode( void ); 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; Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rc3043e70dbb4f955d76510073f739d53d61707fe -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision c3043e70dbb4f955d76510073f739d53d61707fe) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -45,6 +45,8 @@ BOOL signalUserInitiateChemicalDisinfectMode( void ); BOOL signalUserInitiateChemicalDisinfectFlushMode( void ); BOOL signalUserInitiateROPermeateSampleMode( void ); +BOOL signalUserInitiateNocturnalHeatDisinfectMode( void ); +BOOL signalUserInitiateHeatDisinfectActiveCoolMode( void ); BOOL signalInitiateStandbyDisinfectSubmode( U32 cmd ); void signalROPermeateSampleDGReadyToDispense( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r8cf0fafa78ce14b5dbdf95510e957846660ac2b9 -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8cf0fafa78ce14b5dbdf95510e957846660ac2b9) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -891,6 +891,14 @@ { result = signalUserInitiateROPermeateSampleMode(); } + else if ( DG_DISINFECT_NOCTURNAL_HEAT_STATE == cmd ) // Command 5 nocturnal heat disinfect + { + result = signalUserInitiateNocturnalHeatDisinfectMode(); + } + else if ( DG_DISINFECT_ACTIVE_COOL == cmd ) // Command 6 heat disinfect active cool + { + result = signalUserInitiateHeatDisinfectActiveCoolMode(); + } } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); @@ -3542,13 +3550,14 @@ * active cool mode command * @details Inputs: none * @details Outputs: none + * @param start the boolean flag to indicate whether to start or stop the + * active cool * @return TRUE if the command was serialized successfully *************************************************************************/ -BOOL sendDGStopActiveCoolModeCommand( void ) +BOOL sendDGStopActiveCoolModeCommand( BOOL start ) { BOOL result; MESSAGE_T msg; - BOOL start = FALSE; // Create a message record blankMessage( &msg ); @@ -3714,7 +3723,37 @@ sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } +/*********************************************************************//** + * @brief + * The sendDGStartNocturnalHeatDisinfectModeCommand function handles the send + * request to start or stop nocturnal heat disinfect. + * @details Inputs: none + * @details Outputs: none + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +BOOL sendDGStartNocturnalHeatDisinfectModeCommand( BOOL start ) +{ + BOOL result; + MESSAGE_T msg; + DG_HEAT_DISINFECTION_MODE_CMD_T cmd; + cmd.start = start; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_START_STOP_NOCTURNAL_HEAT_DISINFECT; + msg.hdr.payloadLen = sizeof( DG_HEAT_DISINFECTION_MODE_CMD_T ); + + memcpy( &msg.payload, &cmd, sizeof( DG_HEAT_DISINFECTION_MODE_CMD_T ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_DG, ACK_REQUIRED ); + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r8cf0fafa78ce14b5dbdf95510e957846660ac2b9 -r688bd3abbe26cdde15368c8769511d8cf152a721 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8cf0fafa78ce14b5dbdf95510e957846660ac2b9) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 688bd3abbe26cdde15368c8769511d8cf152a721) @@ -547,7 +547,7 @@ void handleSendChemFlushPassFailToDG( U32 status ); // MSG_ID_DG_START_STOP_HEAT_DISINFECT_ACTIVE_COOL -BOOL sendDGStopActiveCoolModeCommand( void ); +BOOL sendDGStopActiveCoolModeCommand( BOOL start ); // MSG_ID_DG_START_STOP_RO_PERMEATE_SAMPLE_MODE_CMD_REQUEST BOOL sendDGStartStopDGROPermeateSampleModeCommand( BOOL start ); @@ -564,6 +564,9 @@ // MSG_ID_UI_HD_RESET_IN_SERVICE_MODE_REQUEST void handleUIHDResetInServiceModeRequest( MESSAGE_T* message ); +// MSG_ID_DG_START_STOP_NOCTURNAL_HEAT_DISINFECT +BOOL sendDGStartNocturnalHeatDisinfectModeCommand( BOOL start ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN