Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -53,7 +53,7 @@ #define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count. /// Heaters data publish interval. -#define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / ( 2 * TASK_PRIORITY_INTERVAL ) ) +#define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / ( TASK_PRIORITY_INTERVAL ) ) #define SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE 40U ///< Small primary and trimmer heaters target temperature during POST. #define MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE 35U ///< Main primary heater target temperature during POST. Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -rfd5c3cff1d0beac03fb29c19f49f670568bc4178 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision fd5c3cff1d0beac03fb29c19f49f670568bc4178) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -20,7 +20,6 @@ #include "etpwm.h" #include "mibspi.h" -#include "AlarmDefs.h" #include "FPGA.h" #include "OperationModes.h" #include "PIControllers.h" @@ -53,7 +52,7 @@ #define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. #define ROP_RAMP_UP_CONTROL_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. -#define ROP_RAMP_UP_P_COEFFICIENT 0.22 ///< P term for RO pump ramp up to flow control. +#define ROP_RAMP_UP_P_COEFFICIENT 0.22 ///< P term for RO pump ramp up to flow control. #define ROP_FLOW_CONTROL_P_COEFFICIENT 0.25 ///< P term for RO pump flow control. #define ROP_FLOW_CONTROL_I_COEFFICIENT 0.25 ///< I term for RO pump flow control. #define ROP_MAX_PRESSURE_P_COEFFICIENT 0.01 ///< P term for RO pump max pressure control. @@ -110,23 +109,23 @@ // ********** private data ********** -static RO_PUMP_STATE_T roPumpState = RO_PUMP_OFF_STATE; ///< current state of RO pump controller state machine. -static U32 roPumpDataPublicationTimerCounter = 0; ///< used to schedule RO pump data publication to CAN bus. +static RO_PUMP_STATE_T roPumpState = RO_PUMP_OFF_STATE; ///< Current state of RO pump controller state machine. +static U32 roPumpDataPublicationTimerCounter = 0; ///< Used to schedule RO pump data publication to CAN bus. static BOOL isROPumpOn = FALSE; ///< RO pump is currently running. -static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle. -static F32 roPumpDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle. -static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. -static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. +static F32 roPumpPWMDutyCyclePct = 0.0; ///< Initial RO pump PWM duty cycle. +static F32 roPumpDutyCyclePctSet = 0.0; ///< Currently set RO pump PWM duty cycle. +static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Requested RO pump control mode. +static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set RO pump control mode. static F32 targetROPumpFlowRate = 0.0; ///< Target RO flow rate (in L/min). static F32 targetROPumpMaxPressure = 0.0; ///< Target RO max allowed pressure (in PSI). static OVERRIDE_U32_T roPumpDataPublishInterval = { RO_PUMP_DATA_PUB_INTERVAL, RO_PUMP_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. -static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in L/min). +static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< Measured RO flow rate (in L/min). -static U32 roControlTimerCounter = 0; ///< determines when to perform control on RO pump. +static U32 roControlTimerCounter = 0; ///< Determines when to perform control on RO pump. static F32 roPumpOpenLoopTargetDutyCycle = 0; ///< Target RO pump open loop PWM. /* TODO These variables are used for POST. POST has not been implemented yet Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -575,12 +575,10 @@ } } - // Check for FPGA errors - if ( ( FALSE == isFPGACountChanging ) || ( FALSE == isFPGAErrorZero ) ) - { - checkPersistentAlarm( ALARM_ID_TEMPERATURE_SENSORS_FAULT, TRUE, sensorIndex, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); - } + BOOL isThereAnError = isFPGACountChanging || isFPGAErrorZero; + checkPersistentAlarm( ALARM_ID_TEMPERATURE_SENSORS_FAULT, isThereAnError, sensorIndex, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + return isADCValid; } 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 Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r263a8e5e9d7314f92def1b5701db2a92cf537542 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 263a8e5e9d7314f92def1b5701db2a92cf537542) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -51,7 +51,7 @@ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode -void stopDGHeatDisinfect( void ); // Stop DG heat disinfect +BOOL stopDGHeatDisinfect( void ); // Stop DG heat disinfect /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -233,17 +233,18 @@ *************************************************************************/ BOOL startDGHeatDisinfect( void ) { - BOOL result = FALSE; + BOOL status = FALSE; - // If DG is in standby mode and the standby mode is in Idle state, request DG heat disinfection - if ( DG_MODE_STAN == getCurrentOperationMode() && DG_STANDBY_MODE_STATE_IDLE == standbyState ) + // If DG is in standby mode and the standby mode is in Idle state or if DG is in solo mode, request DG heat disinfect + if ( ( DG_MODE_STAN == getCurrentOperationMode() && DG_STANDBY_MODE_STATE_IDLE == standbyState ) || + DG_MODE_SOLO == getCurrentOperationMode() ) { requestNewOperationMode( DG_MODE_HEAT ); - result = TRUE; + status = TRUE; } - return result; + return status; } /*********************************************************************//** Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -r9f3943dcab5881216ef0119e7de3a36668dea3bc --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) @@ -27,7 +27,6 @@ #include "Heaters.h" #include "LoadCell.h" #include "MessagePayloads.h" -#include "ModeHeatDisinfect.h" #include "ModeStandby.h" #include "ModeRecirculate.h" #include "MsgQueues.h" @@ -43,7 +42,6 @@ #include "TemperatureSensors.h" #include "Thermistors.h" #include "Utilities.h" -#include "Utilities.h" #include "Valves.h" #include "WatchdogMgmt.h" #include "UVReactors.h" @@ -2477,7 +2475,7 @@ *************************************************************************/ BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL status = FALSE; if ( message->hdr.payloadLen == sizeof(U32) ) { @@ -2487,18 +2485,17 @@ if ( TRUE == startingDGHeatDisinfect ) { - startDGHeatDisinfect(); - result = TRUE; + status = startDGHeatDisinfect(); } else { - stopDGHeatDisinfect(); - result = TRUE; + status = stopDGHeatDisinfect(); } } - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); - return result; + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, status ); + + return status; } /**@}*/