Index: firmware/App/Modes/FlushConcentrate.c =================================================================== diff -u -r60df6fda52be699d377d3d5ec62cfb337f920706 -rb110edbfea44736075d89212a7529df6df64e521 --- firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 60df6fda52be699d377d3d5ec62cfb337f920706) +++ firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision b110edbfea44736075d89212a7529df6df64e521) @@ -20,6 +20,7 @@ #include "FlowSensor.h" #include "FlushConcentrate.h" #include "FPOperationModes.h" +#include "Level.h" #include "MessageSupport.h" #include "Messaging.h" #include "PermeateTank.h" @@ -39,11 +40,13 @@ #define CONCENTRATE_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define CONCENTRATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define CONCENTRATE_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< Concentrate flush timer (in ms) -#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.8F ///< target in PWM % for the RO pump during concentrate flush. +#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.75F ///< target in PWM % for the RO pump during concentrate flush. #define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML 1000.0F ///< Integrated volume threshold in ml #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT 0.9F ///< Integrated volume threshold percentage #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML * CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT ///< alarm threshold for integrated volume +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Concentrate flush wait for tank full timer (in ms) +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TGT_FLOW 700 ///< target flow rate for waiting for tank state // ********** private data ********** @@ -53,6 +56,7 @@ static OVERRIDE_U32_T concentrateFlushDataPublishInterval; ///< Concentrate Flush mode data publish interval. static OVERRIDE_U32_T concentrateFlushTimeout; ///< Concentrate Flush timeout value static U32 concentrateFlushTimer; ///< Concentrate Flush timeout timer +static U32 concentrateFlushTankFullTimer; ///< Concentrate Flush timeout timer static BOOL pendingStartConcentrateFlushRequest; ///< signal to start flushing. static BOOL isFlushComplete; ///< Concentrate Flush complete BOOL static F32 cumulativeConcentrateVolume_mL; ///< cumulative concentrate volume for integrated volume @@ -62,6 +66,7 @@ static void publishConcentrateFlushData( void ); static FP_CONC_FLUSH_STATE_T handleConcentrateFlushProgressState( void ); static FP_CONC_FLUSH_STATE_T handleConcentrateFlushPausedState( void ); +static FP_CONC_FLUSH_STATE_T handleConcentrateFlushWaitForTankFullState( void ); static void setConcentrateFlushTransition( FP_CONC_FLUSH_STATE_T state ); static U32 getConcentrateFlushTimeout( void ); static U32 getConcentrateFlushPublishInterval( void ); @@ -89,6 +94,7 @@ isFlushComplete = FALSE; pendingStartConcentrateFlushRequest = FALSE; cumulativeConcentrateVolume_mL = 0.0F; + concentrateFlushTankFullTimer = 0; } /*********************************************************************//** @@ -110,6 +116,10 @@ concentrateFlushState = handleConcentrateFlushProgressState(); break; + case CONC_FLUSH_WAIT_FOR_TANK_FULL: + concentrateFlushState = handleConcentrateFlushWaitForTankFullState(); + break; + case CONC_FLUSH_PAUSED: concentrateFlushState = handleConcentrateFlushPausedState(); break; @@ -138,27 +148,41 @@ static FP_CONC_FLUSH_STATE_T handleConcentrateFlushProgressState( void ) { FP_CONC_FLUSH_STATE_T state = CONC_FLUSH_IN_PROGRESS; - BOOL isVolumeOutOfRange = FALSE; // if ( TRUE == 1 ) )// TODO Alarm and Stop State Rework // { // state = CONC_FLUSH_PAUSED; // } - // TODO - Condition is to be removed once P7 flow meter is removed. - cumulativeConcentrateVolume_mL = getFlowRate( P7_FLOW ) * CONCENTRATE_FLOW_INTEGRATOR; - if( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) + if ( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) { - isVolumeOutOfRange = ( cumulativeConcentrateVolume_mL >= CONCENTRATE_FLUSH_VOLUME_THRESHOLD ? TRUE : FALSE ); - - if( FALSE == isVolumeOutOfRange ) - { isFlushComplete = TRUE; state = CONC_FLUSH_PAUSED; - } - else + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleConcentrateFlushWaitForTankFullState handles the in progress state of Concentrate flush + * @details \b Inputs: none + * @details \b Outputs: none + * @return the next state of Concentrate flush state + *************************************************************************/ +static FP_CONC_FLUSH_STATE_T handleConcentrateFlushWaitForTankFullState( void ) +{ + FP_CONC_FLUSH_STATE_T state = CONC_FLUSH_WAIT_FOR_TANK_FULL; + + if ( LEVEL_STATE_HIGH == getLevelStatus() ) + { + state = CONC_FLUSH_IN_PROGRESS; + } + else + { + if ( TRUE == didTimeout( concentrateFlushTankFullTimer, CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TIMEOUT ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_CONCENTRATE_FLUSH_VOLUME_OUT_OF_RANGE, CONCENTRATE_FLUSH_VOLUME_THRESHOLD, cumulativeConcentrateVolume_mL) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_CONCENTRATE_FLUSH_TANK_FULL_TIMEOUT, concentrateFlushTankFullTimer, getPermeateTankState() ) state = CONC_FLUSH_PAUSED; } } @@ -181,7 +205,7 @@ { isFlushComplete = FALSE; pendingStartConcentrateFlushRequest = FALSE; - state = CONC_FLUSH_IN_PROGRESS; + state = CONC_FLUSH_WAIT_FOR_TANK_FULL; } return state; @@ -208,20 +232,37 @@ setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); - setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_OPEN ); setValveState( P20_VALV, VALVE_STATE_CLOSED ); setValveState( P43_VALV, VALVE_STATE_CLOSED ); - startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); } setROPumpTargetDutyCycle( CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM, TRUE ); concentrateFlushTimer = getMSTimerCount(); - cumulativeConcentrateVolume_mL = 0; break; + case CONC_FLUSH_WAIT_FOR_TANK_FULL: + setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_OPEN ); + setValveState( P33_VALV, VALVE_STATE_CLOSED ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); + concentrateFlushTankFullTimer = getMSTimerCount(); + if ( TRUE == isBoostPumpInstalled() ) + { + setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); + } + setROPumpTargetFlowRateMLPM( CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TGT_FLOW, TRUE ); + break; + case CONC_FLUSH_PAUSED: // Stop pumps and close only if we alarm ( pause ) during flush. if ( FALSE == isConcentrateFlushComplete() )