Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r4fbaa823eb08d369ea24d4ce59e77b6f2ad8e97a -r28e9d54e3e8b43589cc06c33a563cb6fec8c576f --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 4fbaa823eb08d369ea24d4ce59e77b6f2ad8e97a) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 28e9d54e3e8b43589cc06c33a563cb6fec8c576f) @@ -24,6 +24,7 @@ #include "ModeFill.h" #include "OperationModes.h" #include "PersistentAlarm.h" +#include "Reservoirs.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" @@ -317,18 +318,19 @@ /*********************************************************************//** * @brief * The checkInletWaterConductivity function checks inlet water conductivity value - * and triggers an alarm when conductivity value is not within the specified - * values. + * and triggers an alarm when conductivity value is out of allowed range. * @details Inputs: CPi sensor conductivity - * @details Outputs: Trigger warning alarm if conductivity is in the warning - * range. Trigger alarm if conductivity is below minimum conductivity. + * @details Outputs: Trigger alarms when conductivity is out of allowed range * @return none *************************************************************************/ void checkInletWaterConductivity( void ) { F32 conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + HD_MODE_SUB_MODE_T opMode; + getHDOperationMode( &opMode ); - if ( VALVE_STATE_OPEN == getValveStateName( VPI ) ) + + if ( VALVE_STATE_OPEN == getValveStateName( VPI ) && ( opMode.hdMode <= MODE_TREA ) ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WATER_QUALITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r12ccb89bb747b00db71fff51238a245855c5d913 -r28e9d54e3e8b43589cc06c33a563cb6fec8c576f --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 12ccb89bb747b00db71fff51238a245855c5d913) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 28e9d54e3e8b43589cc06c33a563cb6fec8c576f) @@ -191,6 +191,7 @@ if( heater < NUM_OF_DG_HEATERS ) { +#ifndef DISABLE_HEATERS_AND_TEMPS // Assume the target temperature has not changed heatersStatus[ heater ].hasTargetTempChanged = FALSE; @@ -201,6 +202,7 @@ heatersStatus[ heater ].hasTargetTempChanged = TRUE; result = TRUE; } +#endif } else { @@ -246,6 +248,7 @@ { BOOL status = FALSE; + if( heater < NUM_OF_DG_HEATERS ) { if ( HEATER_EXEC_STATE_OFF == heatersStatus[ heater ].state ) 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. Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r12ccb89bb747b00db71fff51238a245855c5d913 -r28e9d54e3e8b43589cc06c33a563cb6fec8c576f --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 12ccb89bb747b00db71fff51238a245855c5d913) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 28e9d54e3e8b43589cc06c33a563cb6fec8c576f) @@ -51,6 +51,10 @@ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode BOOL stopDGHeatDisinfect( void ); // Stop DG heat disinfect +BOOL testSetDG77CStateTimerOverride( U32 timer ); // set override timer for disinfection at 77C +BOOL testResetDG77CStateTimerOverride( void ); // reset override timer for disinfection at 77C +BOOL testSetDG82CStateTimerOverride( U32 timer ); // set override timer for disinfection at 82C +BOOL testResetDG82CStateTimerOverride( void ); // reset override timer for disinfection at 77C #ifndef _RELEASE_ void setHeatNelsonSupportMode( NELSON_SUPPORT_T support );