Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r6703d916afad5bfc0f5282e8ff6a09d8ce6d9180 -r28e9d54e3e8b43589cc06c33a563cb6fec8c576f --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 6703d916afad5bfc0f5282e8ff6a09d8ce6d9180) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 28e9d54e3e8b43589cc06c33a563cb6fec8c576f) @@ -74,7 +74,7 @@ #define BICARB_PUMP_SPEED_ML_PER_MIN -30.0F ///< Bicarb concentrate pump speed in mL/min. // Flush and drain R1 and R2 -#define RSRVRS_FULL_VOL_ML 1900.0F ///< Reservoirs 1 & 2 full volume in mL. +#define RSRVRS_FULL_VOL_ML 1850.0F ///< Reservoirs 1 & 2 full volume in mL. #define RSRVRS_PARTIAL_FILL_VOL_ML 500.0F ///< Reservoirs 1 & 2 partial volume in mL. #define RSRVRS_FULL_STABLE_TIME_COUNT ( ( 4 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Reservoirs 1 & 2 full stable time in counts. #define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. @@ -107,6 +107,7 @@ #define HEAT_DISINFECT_AT_82_C_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time at 82 C in milliseconds. #define HEAT_DISINFECT_AT_77_C_TIME_MS ( 32 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time at 77 C in milliseconds. #define HEAT_DISNFECT_MIN_OVERRIDE_TIME ( SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect minimum override time. +#define HEAT_DISINFECT_PREP_FOR_TRANSFER_TIME_MS ( 30 * MS_PER_SECOND ) ///< Heat disinfect prepare for transfer hot water time in milliseconds. // Mix drain R1 and R2 #define RSRVRS_MIX_DRAIN_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 mix drain timeout in ms. @@ -212,6 +213,7 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlushDrainR1State( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterState( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDisinfectR1ToR2State( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectPrepareForHotWaterTransitionState( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillR2WithHotWaterState( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDisinfectR2ToR1State( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectCoolDownHeatersState( void ); @@ -332,6 +334,28 @@ /*********************************************************************//** * @brief + * The isHeatDisinfectInTransitionHotWater function returns the status of + * heat disinfect that whether it is in transition hot water water mode or + * not + * @details Inputs: heatDisinfectState + * @details Outputs: none + * @return TRUE if the mode is transfer hot water mode otherwise, FALSE + *************************************************************************/ +BOOL isHeatDisinfectInTransitionHotWater( void ) +{ + BOOL status = FALSE; + + if ( ( DG_HEAT_DISINFECT_STATE_PREPARE_FOR_HOT_WATER_TRANSITION == heatDisinfectState ) || + ( DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER == heatDisinfectState ) ) + { + status = TRUE; + } + + return status; +} + +/*********************************************************************//** + * @brief * The execHeatDisinfectMode function executes the heat disinfect mode * state machine. * @details Inputs: heatDisinfectState @@ -399,6 +423,10 @@ heatDisinfectState = handleHeatDisinfectDisinfectR1ToR2State(); break; + case DG_HEAT_DISINFECT_STATE_PREPARE_FOR_HOT_WATER_TRANSITION: + heatDisinfectState = handleHeatDisinfectPrepareForHotWaterTransitionState(); + break; + case DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER: heatDisinfectState = handleHeatDisinfectFillR2WithHotWaterState(); break; @@ -1127,15 +1155,6 @@ case HEAT_DISINFECT_COMPLETE: requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, NO_PARK_CONC_PUMPS ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, NO_PARK_CONC_PUMPS ); - // Set the valves to transfer hot water from R1 to R2 and fill up R2. - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRD1, VALVE_STATE_OPEN ); - setValveState( VRD2, VALVE_STATE_CLOSED ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setDrainPumpTargetOutletFlowLPM( HEAT_DISINFECT_TARGET_RO_FLOW_TRANSFER_LPM ); - // Turn off trimmer heater for transition - stopHeater( DG_TRIMMER_HEATER ); // Although there is fluid in both reservoirs, but they are set to empty // to begin the transition of hot water from R1 to R2. @@ -1145,7 +1164,7 @@ rsrvr1RefVolML = 0.0F; rsrvr2RefVolML = 0.0F; tempGradOutOfRangeTimer = 0; - state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; + state = DG_HEAT_DISINFECT_STATE_PREPARE_FOR_HOT_WATER_TRANSITION; timeStatus[ RSRVR_AT_77_C ].startTimeMS = 0; timeStatus[ RSRVR_AT_82_C ].startTimeMS = 0; break; @@ -1161,6 +1180,39 @@ /*********************************************************************//** * @brief + * The handleHeatDisinfectPrepareForHotWaterTransitionState function handles + * the heat disinfect prepare for hot water state. In this state, the fluid is + * run a certain period of time with the heaters are at a much lower duty cycle + * and then the actuators are set to transition the hot water to reservoir 2. + * @details Inputs: stateTimer + * @details Outputs: stateTimer + * @return next state of the heat disinfect state machine + *************************************************************************/ +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectPrepareForHotWaterTransitionState( void ) +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_PREPARE_FOR_HOT_WATER_TRANSITION; + + if ( TRUE == didTimeout( stateTimer, HEAT_DISINFECT_PREP_FOR_TRANSFER_TIME_MS ) ) + { + // Set the valves to transfer hot water from R1 to R2 and fill up R2. + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRD1, VALVE_STATE_OPEN ); + setValveState( VRD2, VALVE_STATE_CLOSED ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setDrainPumpTargetOutletFlowLPM( HEAT_DISINFECT_TARGET_RO_FLOW_TRANSFER_LPM ); + // Turn off trimmer heater for transition + stopHeater( DG_TRIMMER_HEATER ); + + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleHeatDisinfectFillR2WithHotWaterState function handles fill R2 * with water state. The state transfers hot water from reservoir 1 to * reservoir 2 until hot water overflows from reservoir 2 to reservoir 1.