Index: firmware/App/Controllers/Buttons.c =================================================================== diff -u -r24b2fe72608344e67ef37234085d15ad5e4fcc37 -r22dc8daefbb24bd2a2ea6f0a2465c6714267638c --- firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision 24b2fe72608344e67ef37234085d15ad5e4fcc37) +++ firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision 22dc8daefbb24bd2a2ea6f0a2465c6714267638c) @@ -296,8 +296,13 @@ offRequestAwaitingUserConfirmation = FALSE; // If we are in a mode that allows power off, initiate power off sequence if ( TRUE == isCurrentOpModeOkToTurnOff() ) - { - broadcastData( MSG_ID_POWER_OFF_WARNING, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)0, 0 ); + { + POWER_OFF_WARNING_DATA_T data; + + data.powerOffWarning = 0; + + //broadcastData( MSG_ID_POWER_OFF_WARNING, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)0, 0 ); + broadcastData( MSG_ID_POWER_OFF_WARNING, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( POWER_OFF_WARNING_DATA_T ) ); signalPowerOffWarning(); offButtonPressPending = TRUE; offRequestPulseCount = OFF_REQUEST_PULSE_COUNT; Index: firmware/App/Controllers/Buttons.h =================================================================== diff -u -r24b2fe72608344e67ef37234085d15ad5e4fcc37 -r22dc8daefbb24bd2a2ea6f0a2465c6714267638c --- firmware/App/Controllers/Buttons.h (.../Buttons.h) (revision 24b2fe72608344e67ef37234085d15ad5e4fcc37) +++ firmware/App/Controllers/Buttons.h (.../Buttons.h) (revision 22dc8daefbb24bd2a2ea6f0a2465c6714267638c) @@ -46,6 +46,11 @@ } OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T; #pragma pack(pop) +typedef struct +{ + U32 powerOffWarning; ///< Power off warning message. +} POWER_OFF_WARNING_DATA_T; + // ********** public function prototypes ********** void initButtons( void ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rcc067242d41776eb2a598212413e25df5a58b1fe -r22dc8daefbb24bd2a2ea6f0a2465c6714267638c --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision cc067242d41776eb2a598212413e25df5a58b1fe) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 22dc8daefbb24bd2a2ea6f0a2465c6714267638c) @@ -372,7 +372,7 @@ *************************************************************************/ BOOL signalUserInitiateFlushMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -382,9 +382,9 @@ if ( TRUE == isDGCommunicating() ) { flushStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -408,7 +408,7 @@ *************************************************************************/ BOOL signalUserInitiateHeatDisinfectMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -418,9 +418,9 @@ if ( TRUE == isDGCommunicating() ) { heatDisinfectStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { @@ -444,7 +444,7 @@ *************************************************************************/ BOOL signalUserInitiateChemicalDisinfectMode( void ) { - BOOL result = FALSE; + BOOL result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; if ( MODE_STAN == getCurrentOperationMode() ) @@ -454,18 +454,19 @@ if ( TRUE == isDGCommunicating() ) { chemDisinfectStartReqReceived = TRUE; - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; - sendDisinfectConfirmResponse( result, rejReason ); } } } + sendDisinfectConfirmResponse( result, rejReason ); + return result; } @@ -479,16 +480,16 @@ *************************************************************************/ BOOL signalInitiateStandbyDisinfectSubmode( void ) { - BOOL result = FALSE; + 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; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } else { Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r22dc8daefbb24bd2a2ea6f0a2465c6714267638c --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 22dc8daefbb24bd2a2ea6f0a2465c6714267638c) @@ -472,7 +472,8 @@ dilutionLevelPct = volSpentUFML / (F32)FILL_RESERVOIR_TO_VOLUME_ML; // Check if the dilution level has exceeded the limit or the spent volume is more than the amount of volume in the reservoir - // If it has, trigger the fill command + // If it has, trigger the fill command. This if should not happen and the predictive dilution level should trigger just in time + // in advance if ( ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)FILL_RESERVOIR_TO_VOLUME_ML ) ) { if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) @@ -590,7 +591,8 @@ TREATMENT_RESERVOIR_MGMT_STATE_T state = TREATMENT_RESERVOIR_MGMT_WAIT_FOR_FILL_SETTLE_STATE; // Wait for the reservoir to settle and then send the commands to switch the active reservoir - if ( ( TRUE == didTimeout( reservoirSwitchStartTimeMS, RESERVOIR_SETTLE_TIME_MS ) ) && ( volSpentML >= (F32)FILL_RESERVOIR_TO_VOLUME_ML ) ) + if ( ( TRUE == didTimeout( reservoirSwitchStartTimeMS, RESERVOIR_SETTLE_TIME_MS ) ) && + ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)FILL_RESERVOIR_TO_VOLUME_ML ) ) { DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir();