Index: firmware/App/Modes/ModeChemicalDisinfectFlush.c =================================================================== diff -u -refc7f297febee73bf520b4c5646e49c8f53caf41 -r3f19c30ddaa6677778f7e74447cfcdbcfe4cd77e --- firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision efc7f297febee73bf520b4c5646e49c8f53caf41) +++ firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 3f19c30ddaa6677778f7e74447cfcdbcfe4cd77e) @@ -5,13 +5,13 @@ * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file ModeChemicalDisinfect.c +* @file ModeChemicalDisinfectFlush.c * -* @author (last) Bill Bracken -* @date (last) 24-Oct-2022 +* @author (last) +* @date (last) * -* @author (original) Sean -* @date (original) 04-Apr-2020 +* @author (original) Steve Jarpe +* @date (original) 10-Dec-2022 * ***************************************************************************/ @@ -40,7 +40,7 @@ #include "Valves.h" /** - * @addtogroup DGChemicalDisinfectMode + * @addtogroup DGChemicalDisinfectFlushMode * @{ */ @@ -263,7 +263,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_CHEM_DISINFECT_INVALID_EXEC_STATE, chemDisinfectFlushState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_CHEM_DISINFECT_FLUSH_INVALID_EXEC_STATE, chemDisinfectFlushState ) chemDisinfectFlushState = DG_CHEM_DISINFECT_FLUSH_STATE_START; break; } @@ -332,9 +332,6 @@ // Start overall chemical disinfect timer overallChemDisinfectFlushTimer = getMSTimerCount(); - // Set all the actuators to reset and de-energized state - deenergizeActuators(); - // Close VPi to prevent wasting water setValveState( VPI, VALVE_STATE_CLOSED ); @@ -426,6 +423,7 @@ setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); setValveState( VRD2, VALVE_STATE_CLOSED ); setValveState( VPI, VALVE_STATE_OPEN ); + turnOnUVReactor( INLET_UV_REACTOR ); stateTrialCounter = 0; stateTimer = getMSTimerCount(); @@ -435,7 +433,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectFlushState = state; - state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; } return state; @@ -467,20 +465,19 @@ // set pumps and valves for next state, flush disinfectant line setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); - // Set the concentrate pump to run at a constant speed during flushing in reverse + // Set the acid concentrate pump to run at a constant speed during flushing in reverse setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, -1.0 * CONC_PUMP_CP1_FLUSH_SPEED_ML_PER_MIN ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); - // Turn on the bicarb line with forward direction, to flush the line that contains acid from the disinfect + // Turn on the bicarb line pump with forward direction, to flush the line that contains acid from the disinfect setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONC_PUMP_CP2_FLUSH_SPEED_ML_PER_MIN ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); - turnOnUVReactor( INLET_UV_REACTOR ); turnOnUVReactor( OUTLET_UV_REACTOR ); stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_DISINFECTANT_LINE; } else - { // If the number of failures have not exceeded the limit, try again. + { // If the number of failures have not exceeded the limit, try again. if ( ++stateTrialCounter < MAX_ALLOWED_FLUSH_DRAIN_PERIODS ) { stateTimer = getMSTimerCount(); @@ -551,7 +548,7 @@ setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; drainTimer = getMSTimerCount(); numberOfPostDisinfectRinses = 0; @@ -562,7 +559,6 @@ return state; } - /*********************************************************************//** * @brief * The handleChemicalDisinfectFlushFlushR2ToR1DrainR1State function handles @@ -608,6 +604,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectFlushState = state; + alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT; state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; } } @@ -679,6 +676,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectFlushState = state; + alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT; state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; } } @@ -689,7 +687,7 @@ if ( ++numberOfPostDisinfectRinses < NUM_OF_RINSE_CYCLES ) { // Set the valves to flush R2 to R1 and drain R1 - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); setValveState( VRD1, VALVE_STATE_OPEN ); setValveState( VRD2, VALVE_STATE_CLOSED ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); @@ -717,7 +715,7 @@ initDrainParameters( DG_RESERVOIR_2 ); rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - // Turn off CP1 and CP2 and ROP + // Turn off CP1 and CP2 and ROP signalROPumpHardStop(); requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); @@ -809,7 +807,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectFlushState = state; - state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete @@ -826,7 +824,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectFlushState = state; - state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH; } } @@ -1045,15 +1043,16 @@ } #endif if ( hasInletTemperatureFailed || hasConductivityFailed || hasInletPressureFailed ) - { // Inlet check failed, alarm unless in the start, drain, or flush drain states + { // Inlet check failed, alarm unless in the start, drain, or flush drain states haveInletWaterChecksPassed= FALSE; // set flag for flush drain state - switch( chemDisinfectFlushState ) + switch( chemDisinfectFlushState ) { case DG_CHEM_DISINFECT_FLUSH_STATE_START: case DG_CHEM_DISINFECT_FLUSH_STATE_DRAIN_R1: case DG_CHEM_DISINFECT_FLUSH_STATE_DRAIN_R2: case DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_DRAIN: - break; + // The inlet water checks do not apply for the states before flush drain. + break; case DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_DISINFECTANT_LINE: case DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_UF: @@ -1062,7 +1061,7 @@ prevChemDisinfectFlushState = chemDisinfectFlushState; alarmDetectedPendingTrigger = ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE; //TODO: ALARM_ID_NEW_WAT; chemDisinfectFlushState = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; - break; + break; } } }