Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -raa7b1f5f68aae23c1c52b32658fcb625c29accfb -r4b17eafaab61aef5766ffd0c17769561bdbb159c --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision aa7b1f5f68aae23c1c52b32658fcb625c29accfb) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 4b17eafaab61aef5766ffd0c17769561bdbb159c) @@ -45,11 +45,14 @@ /// Interval (ms/task time) at which the post-treatment state data is published on the CAN bus. #define POST_TREATMENT_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) +#define DIP_DRAIN_DG_FLOW_RATE_ML_MIN 60 ///< DG drain inlet pump flow rate in mL/min. +#define DIP_DRAIN_DG_RUNTIME_MS 20000 ///< DG drain inlet pump run time. /// Post-Treatment drain reservoirs state machine. typedef enum Drain_States { - DRAIN_RESERVOIR_SWITCH_STATE = 0, ///< Switch reservoir state. + DRAIN_DG_STATE = 0, ///< Drain DG excess fluid state. + DRAIN_RESERVOIR_SWITCH_STATE, ///< Switch reservoir state. DRAIN_RESERVOIR_START_DRAIN_STATE, ///< Drain reservoir start drain state. DRAIN_RESERVOIR_DRAIN_STATE, ///< Drain first reservoir state. DRAIN_RESERVOIR_COMPLETE_STATE, ///< Drain complete state. @@ -78,6 +81,7 @@ static HD_POST_TREATMENT_STATE_T handlePostTreatmentVerifyState( void ); static void execDrainReservoirs( void ); +static DRAIN_STATE_T handleDrainDGState( void ); static DRAIN_STATE_T handleDrainReservoirSwitchState( void ); static DRAIN_STATE_T handleDrainReservoirStartDrainState( void ); static DRAIN_STATE_T handleDrainReservoirDrainState( void ); @@ -98,7 +102,7 @@ rinseConcentrateLines = FALSE; isThisFirstDrain = TRUE; currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; - currentDrainReservoirState = DRAIN_RESERVOIR_SWITCH_STATE; + currentDrainReservoirState = DRAIN_DG_STATE; // DRAIN_RESERVOIR_SWITCH_STATE; postTreatmentPublishTimerCounter = 0; // Reset treatment log data @@ -502,6 +506,10 @@ { switch ( currentDrainReservoirState ) { + case DRAIN_DG_STATE: + currentDrainReservoirState = handleDrainDGState(); + break; + case DRAIN_RESERVOIR_SWITCH_STATE: currentDrainReservoirState = handleDrainReservoirSwitchState(); break; @@ -526,6 +534,44 @@ /*********************************************************************//** * @brief + * The handleDrainDGState function waits for DG to complete + * reservoir switch. + * @details Inputs: + * @details Outputs: + * @return next state + *************************************************************************/ +static DRAIN_STATE_T handleDrainDGState( void ) +{ + static BOOL drain_dg_active = FALSE; + static U32 drain_dg_starttime = 0; + DRAIN_STATE_T state = DRAIN_DG_STATE; + + if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) + { + if ( FALSE == drain_dg_active ) + { + // First entry - Run DPi slow reverse, VDi, VDo closed in init, DPo Off in init. + setDialInPumpTargetFlowRate( DIP_DRAIN_DG_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); + drain_dg_starttime = getMSTimerCount(); + drain_dg_active = TRUE; + } + } + if ( TRUE == drain_dg_active ) + { + // Thereafter, check for time elapsed + if ( TRUE == didTimeout( drain_dg_starttime, DIP_DRAIN_DG_RUNTIME_MS ) ) + { + drain_dg_active = FALSE; + setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + state = DRAIN_RESERVOIR_SWITCH_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrainReservoirSwitchState function waits for DG to complete * reservoir switch. * @details Inputs: isThisFirstDrain