Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -107,15 +107,6 @@ NUM_OF_CANCELLATION_MODES ///< Number of cancellation modes. } CANCELLATION_MODES_T; -/// Reservoirs status -typedef enum Reservoirs_status -{ - RESERVOIR_STATUS_EMPTY = 0, ///< Reservoir empty. - RESERVOIR_STATUS_FULL, ///< Reservoir full. - RESERVOIR_STATUS_UNKNOWN, ///< Reservoir timeout. - NUM_OF_RESERVOIR_STATUS ///< Number of reservoirs status. -} RESERVOIRS_STATUS_T; - /// Heat disinfect status typedef enum Heat_disinfect_status { @@ -136,8 +127,8 @@ static BOOL areTempSensorsInRange = FALSE; ///< Heat disinfect temperature sensors in/out range flag. /// Boolean flag to check whether draining R1 and R2 is at the end of the heat disinfect cycle or in the beginning. So the drain states can be reused. static BOOL isThisLastDrain = FALSE; -static RESERVOIRS_STATUS_T rsrvr1Status = RESERVOIR_STATUS_UNKNOWN; ///< Reservoir 1 status. -static RESERVOIRS_STATUS_T rsrvr2Status = RESERVOIR_STATUS_UNKNOWN; ///< Reservoir 2 status. +static DG_RESERVOIR_STATUS_T rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; ///< Reservoir 1 status. +static DG_RESERVOIR_STATUS_T rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; ///< Reservoir 2 status. static F32 R1HeatDisinfectVol = 0.0; ///< Reservoir 1 full volume during heat disinfect. static F32 R2HeatDisinfectVol = 0.0; ///< Reservoir 2 full volume during heat disinfect. static U32 heatDisinfectTimer = 0; ///< Heat disinfect timer. @@ -177,9 +168,9 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectCompleteState( void ); static void resetActuators( void ); -static void setModeToFailed( void ); -static RESERVOIRS_STATUS_T getRsrvrFillStatus( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout ); -static RESERVOIRS_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ); +static void failHeatDisinfect( void ); +static DG_RESERVOIR_STATUS_T getRsrvrFillStatus( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout ); +static DG_RESERVOIR_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ); static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ); static void publishHeatDisinfectData( void ); @@ -203,8 +194,8 @@ isThisLastDrain = FALSE; stateTrialCounter = 0; areTempSensorsInRange = FALSE; - rsrvr1Status = RESERVOIR_STATUS_UNKNOWN; - rsrvr2Status = RESERVOIR_STATUS_UNKNOWN; + rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; + rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; R1HeatDisinfectVol = 0.0; R2HeatDisinfectVol = 0.0; overallHeatDisinfectTimer = 0; @@ -362,15 +353,25 @@ * The stopDGHeatDisinfect function stops heat disinfect mode. * @details Inputs: none * @details Outputs: none - * @return none + * @return TRUE is current operation mode is heat disinfect, otherwise FALSE *************************************************************************/ -void stopDGHeatDisinfect( void ) +BOOL stopDGHeatDisinfect( void ) { - // Reset all the actuators - resetActuators(); + BOOL status = FALSE; - // Transition to mode standby - requestNewOperationMode( DG_MODE_STAN ); + // Check if the current operation mode is heat disinfect + if ( DG_MODE_HEAT == getCurrentOperationMode() ) + { + // Reset all the actuators + resetActuators(); + + // Transition to mode standby + requestNewOperationMode( DG_MODE_STAN ); + + status = TRUE; + } + + return status; } // ********** private functions ********** @@ -425,7 +426,7 @@ rsrvrFillStableTimeCounter = 0; // Assume reservoir 1 is full and drain it - rsrvr1Status = RESERVOIR_STATUS_FULL; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; stateTimer = getMSTimerCount(); } @@ -446,11 +447,11 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DRAIN_R1; - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { if ( TRUE == isThisLastDrain ) { @@ -476,7 +477,7 @@ else { // Assume reservoir 2 is full and drain it - rsrvr2Status = RESERVOIR_STATUS_FULL; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; // Request a tare for reservoir 2 tareReservoir(); // Set the actuators to drain R2. @@ -507,16 +508,16 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DRAIN_R2; - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr2Status ) { rsrvr2Status = getRsrvrDrainStatus( DG_RESERVOIR_2, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { if ( TRUE == isThisLastDrain ) { setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); - rsrvr1Status = RESERVOIR_STATUS_FULL; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_DRAIN_R1; } else @@ -554,7 +555,8 @@ { // If the inlet temperature and conductivity are in range, move onto the next state if ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C && - getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) > MIN_INLET_CONDUCTIVITY_US_PER_CM ) + getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) > MIN_INLET_CONDUCTIVITY_US_PER_CM && + getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) <= MAX_INLET_CONDUCTIVITY_US_PER_CM ) { setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -597,7 +599,7 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION; // Check if the flush circulation time has elapsed and the temperature sensors are not in range yet - if ( didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) && FALSE == areTempSensorsInRange ) + if ( didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) && ( FALSE == areTempSensorsInRange ) ) { F32 ThdTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); // TODO add THd later. This is the new temp sensor of the coldest spot. F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); @@ -641,8 +643,8 @@ //if ( didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) ) if ( TRUE ) { - rsrvr1Status = RESERVOIR_STATUS_EMPTY; - rsrvr2Status = RESERVOIR_STATUS_EMPTY; + rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); @@ -672,17 +674,17 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2; // If R1 is not full, keep monitoring for R1 level and timeout - if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); } // Once R1 is full, keep monitoring for R2 level and timeout - else if( rsrvr1Status == RESERVOIR_STATUS_FULL ) + else if( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); // Once R2 is full (to 500mL in this case), transition to the next state - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Set the actuators to flush R2 and drain R1 state setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); @@ -693,12 +695,12 @@ stateTimer = getMSTimerCount(); // Set both reservoirs status - rsrvr1Status = RESERVOIR_STATUS_FULL; - rsrvr2Status = RESERVOIR_STATUS_EMPTY; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; } } - else if ( rsrvr1Status == RESERVOIR_STATUS_UNKNOWN || rsrvr2Status == RESERVOIR_STATUS_UNKNOWN ) + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status || DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevHeatDisinfectState = state; state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; @@ -725,28 +727,28 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; // If reservoir 1 is empty, turn off the drain pump - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Done with draining R1 signalDrainPumpHardStop(); } // First reservoir 2 must be completely full - if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr2Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); } // Once R2 is full, R1 must be partially full - else if( rsrvr2Status == RESERVOIR_STATUS_FULL ) + else if( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); // Once R1 is partially full, transition to the next state - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Done with filing turn off the RO pump signalROPumpHardStop(); @@ -760,7 +762,7 @@ setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); // Start the timer for drain timeout stateTimer = getMSTimerCount(); - rsrvr2Status = RESERVOIR_STATUS_FULL; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2; } } @@ -784,16 +786,16 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2; // If reservoir 2 is empty, set the drain valve to drain R1 - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr2Status ) { rsrvr2Status = getRsrvrDrainStatus( DG_RESERVOIR_2, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); // Start the timer for drain timeout stateTimer = getMSTimerCount(); - rsrvr1Status = RESERVOIR_STATUS_FULL; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1; } @@ -816,11 +818,11 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1; // If reservoir 1 is empty, set the state to fill water state - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Done with draining the reservoirs signalDrainPumpHardStop(); @@ -841,6 +843,9 @@ setPrimaryHeaterTargetTemperature( HEAT_DISINFECT_TARGET_TEMPERATURE_C ); startPrimaryHeater(); + rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; + // Start the timer for drain timeout stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; @@ -868,17 +873,17 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; // First reservoir 1 must be full - if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); } // Once reservoir 1 is full, check the status of reservoir 2 since the water overflows to reservoir 2 - else if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); // Once reservoir 2 is full, set the actuators for recirculation - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Set the valves to drain R2 and no fill setValveState( VPI, VALVE_STATE_CLOSED ); @@ -946,8 +951,8 @@ setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); // Although there is fluid in both reservoirs, but they are set to empty // to begin the transition of hot water from R1 to R2. - rsrvr2Status = RESERVOIR_STATUS_EMPTY; - rsrvr1Status = RESERVOIR_STATUS_EMPTY; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; break; @@ -978,15 +983,15 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; // First reservoir 1 must be partially full - if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Get the current volumes to be monitored during R2 to R1 heat disinfect state R1HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); @@ -1098,7 +1103,7 @@ setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - rsrvr1Status = RESERVOIR_STATUS_FULL; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; } @@ -1131,16 +1136,16 @@ } else if ( isDrainPumpInMixDrainOn == TRUE ) { - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_MIX_DRAIN_TIMEOUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Set the drain valve to reservoir 2 setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); - rsrvr2Status = RESERVOIR_STATUS_FULL; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2; } @@ -1163,11 +1168,11 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2; - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr2Status ) { rsrvr2Status = getRsrvrDrainStatus( DG_RESERVOIR_2, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_MIX_DRAIN_TIMEOUT_MS ); } - else if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Done with draining the reservoirs signalDrainPumpHardStop(); @@ -1183,8 +1188,8 @@ setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); - rsrvr1Status = RESERVOIR_STATUS_EMPTY; - rsrvr2Status = RESERVOIR_STATUS_EMPTY; + rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2; @@ -1207,15 +1212,15 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2; - if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Set the valves to rinse R2 to R1 and drain R1 setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); @@ -1224,8 +1229,8 @@ setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); - rsrvr1Status = RESERVOIR_STATUS_FULL; - rsrvr2Status = RESERVOIR_STATUS_EMPTY; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; } @@ -1251,27 +1256,27 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) { rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); } - else if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Done with draining R1 signalDrainPumpHardStop(); } // First reservoir 2 must be completely full - if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_BELOW_TARGET == rsrvr2Status ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS ); } // Once reservoir 2 is completely full, monitor reservoir 1 - else if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS ); - if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { // Done with filling, turn off the RO pump signalROPumpHardStop(); @@ -1337,7 +1342,7 @@ // Set the cancellation mode cancellationMode = CANCELLATION_MODE_BASIC; - setModeToFailed(); + failHeatDisinfect(); return state; } @@ -1374,8 +1379,6 @@ if ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C && TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) { targetRPM = DRAIN_PUMP_TARGET_RPM; - rsrvr1Status = RESERVOIR_STATUS_FULL; - rsrvr2Status = RESERVOIR_STATUS_FULL; cancellationMode = CANCELLATION_MODE_COLD; } else @@ -1385,11 +1388,12 @@ setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); targetRPM = DRAIN_PUMP_RPM_IN_MIX_DRAIN; - rsrvr1Status = RESERVOIR_STATUS_FULL; - rsrvr2Status = RESERVOIR_STATUS_FULL; cancellationMode = CANCELLATION_MODE_HOT; } + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + // The drain is set to start from reservoir 2 since all the actuators have been de-energized // Start the drain pump setDrainPumpTargetRPM( targetRPM ); @@ -1399,27 +1403,27 @@ } // If reservoir 2 is empty, set to drain reservoir 1 - if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) + if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr2Status ) { // If the cancellation water path cannot be done, got to basic cancellation path rsrvr2Status = getRsrvrDrainStatus( DG_RESERVOIR_2, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); - if ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { // Set the drain valve to reservoir 1 setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); } } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete - if ( ( rsrvr2Status == RESERVOIR_STATUS_EMPTY ) && ( rsrvr1Status == RESERVOIR_STATUS_FULL ) ) + if ( ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) && ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) ) { // If the cancellation water path cannot be done, got to basic cancellation path rsrvr1Status = getRsrvrDrainStatus( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ); - if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) + if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) { - setModeToFailed(); + failHeatDisinfect(); } } @@ -1481,13 +1485,13 @@ /*********************************************************************//** * @brief - * The setModeToFailed function sets the alarm that failed the heat disinfect - * mode. + * The failHeatDisinfect function sets the alarm that failed the heat + * disinfect mode. * @details Inputs: alarm, prevHeatDisinfectState * @details Outputs: none * @return none *************************************************************************/ -static void setModeToFailed( void ) +static void failHeatDisinfect( void ) { SET_ALARM_WITH_1_U32_DATA( alarm, prevHeatDisinfectState ) } @@ -1504,9 +1508,9 @@ * @param timeout is the fill up timeout * @return the status of the reservoirs during filling *************************************************************************/ -static RESERVOIRS_STATUS_T getRsrvrFillStatus( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout ) +static DG_RESERVOIR_STATUS_T getRsrvrFillStatus( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout ) { - RESERVOIRS_STATUS_T status = RESERVOIR_STATUS_EMPTY; + DG_RESERVOIR_STATUS_T status = DG_RESERVOIR_BELOW_TARGET; F32 volume = 0.0; if ( r == DG_RESERVOIR_1 ) @@ -1523,7 +1527,7 @@ { if ( ++rsrvrFillStableTimeCounter >= RSRVRS_FULL_STABLE_TIME_COUNT ) { - status = RESERVOIR_STATUS_FULL; + status = DG_RESERVOIR_REACHED_TARGET; rsrvrFillStableTimeCounter = 0; // Set the state timer in case it needs to be used for another timeout check stateTimer = getMSTimerCount(); @@ -1533,7 +1537,7 @@ { // Failed to fill ontime. Update the previous heat disinfect state and transition to basic cancellation alarm = ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT; - status = RESERVOIR_STATUS_UNKNOWN; + status = DG_RESERVOIR_NOT_REACHED_TARGET; } return status; @@ -1554,25 +1558,23 @@ * then * @return the status of the reservoirs during draining *************************************************************************/ -static RESERVOIRS_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ) +static DG_RESERVOIR_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ) { - RESERVOIRS_STATUS_T status = RESERVOIR_STATUS_FULL; + DG_RESERVOIR_STATUS_T status = DG_RESERVOIR_ABOVE_TARGET; BOOL isDrainComplete = hasTargetDrainVolumeBeenReached( r, drainSteadyStateTimeout ); if ( TRUE == isDrainComplete ) { // Set the state timer in case it needs to be used for another timeout check stateTimer = getMSTimerCount(); - status = RESERVOIR_STATUS_EMPTY; + status = DG_RESERVOIR_REACHED_TARGET; } else if ( didTimeout( stateTimer, timeout ) ) { - // TODO fix this part - // Failed to drain ontime. Update the previous heat disinfect state and transition to basic cancellation - //prevHeatDisinfectState = heatDisinfectState; - //alarm = ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT; - //status = RESERVOIR_STATUS_UNKNOWN; + // Failed to drain on time. Update the previous heat disinfect state and transition to basic cancellation + alarm = ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT; + status = DG_RESERVOIR_NOT_REACHED_TARGET; } return status; @@ -1646,7 +1648,7 @@ isPartialDisinfectInProgress = TRUE; } - // If the flag is TRUE, check if this stage of heat disinfect is done + // If heat disinfect temperature has been reached, check if this stage of heat disinfect is done if ( isPartialDisinfectInProgress && didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) { // Done with this stage of heat disnfect. Reset the variables