Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -rda0deea71ed5770d98a00943369b9c17321e139f -r704415d4a27cdff6d2cdc9c3641477ee7ccde6af --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision da0deea71ed5770d98a00943369b9c17321e139f) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 704415d4a27cdff6d2cdc9c3641477ee7ccde6af) @@ -73,6 +73,10 @@ #define RSRVR_ACTIVE_COOL_BELOW_TARGET_TEMP_TIMEOUT_MS ( 15 * MS_PER_SECOND ) ///< Reservoir active cool temperature below target timeout in milliseconds. #define RSRVR_ACTIVE_COOL_TARGET_TEMP_TIMEOUT_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir active cool target temperature met in milliseconds. +// Complete states, de-pressurize the concentrate lines +#define ACID_BICARB_DEPRESSURIZE_TUBING_SPEED_MLPM 20.0F ///< Acid and bicarb de-pressurize tubing speed in mL/min. +#define ACID_BICARB_DEPRESSURIZE_TUBING_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Acid and bicarb de-pressurize tubing timeout in milliseconds. + /// Non-volatile write structure typedef struct { @@ -576,11 +580,15 @@ { DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE; - writeDisinfectDataToNV( USAGE_INFO_HEAT_DIS_ACTIVE_COOL ); - - if ( TRUE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) + if ( TRUE == didTimeout( stateStartTimeMS, ACID_BICARB_DEPRESSURIZE_TUBING_TIMEOUT_MS ) ) { - stopDGHeatDisinfectActiveCool(); + deenergizeActuators( NO_PARK_CONC_PUMPS ); + writeDisinfectDataToNV( USAGE_INFO_HEAT_DIS_ACTIVE_COOL ); + + if ( TRUE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) + { + stopDGHeatDisinfectActiveCool(); + } } return state; @@ -1035,10 +1043,37 @@ setDrainPumpTargetRPM( RSRVR_DRAIN_TARGET_RPM ); break; + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE: + // Valves + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VSP, VALVE_STATE_CLOSED ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRD1, VALVE_STATE_CLOSED ); + setValveState( VRD2, VALVE_STATE_CLOSED ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + // UV reactors + turnOffUVReactor( INLET_UV_REACTOR ); + turnOffUVReactor( OUTLET_UV_REACTOR ); + // Concentrate pumps + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, ACID_BICARB_DEPRESSURIZE_TUBING_SPEED_MLPM ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, ACID_BICARB_DEPRESSURIZE_TUBING_SPEED_MLPM ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + // RO pump + signalROPumpHardStop(); + // Drain pump + signalDrainPumpHardStop(); + break; + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START: case DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE: case DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_BASIC_PATH_STATE: - case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE: // De-energize the actuators in the state upon transitioning to these states deenergizeActuators( NO_PARK_CONC_PUMPS ); break; @@ -1343,14 +1378,14 @@ rsrvrsStatus.rsrvr[ switchRsrvrID ].rStatus = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_ACTIVE_COOL_DRAIN_R2_STATE; - setHeatDisinfectActiveCoolActuators( state ); } else if ( DG_HEAT_DISINFECT_ACTIVE_COOL_DRAIN_R2_STATE == state ) { - deenergizeActuators( NO_PARK_CONC_PUMPS ); state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE; } + // Set the actuators state after setting the next state + setHeatDisinfectActiveCoolActuators( state ); stateStartTimeMS = getMSTimerCount(); }