Index: firmware/App/Modes/ModePreGenPermeate.c =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 --- firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) @@ -15,17 +15,21 @@ * ***************************************************************************/ +#include "BoostPump.h" #include "DDInterface.h" #include "FlushFilter.h" #include "FlushPermeate.h" +#include "FlushConcentrate.h" #include "MessageSupport.h" #include "Messaging.h" #include "ModeGenPermeate.h" #include "ModePreGenPermeate.h" #include "ModeStandby.h" #include "OperationModes.h" +#include "ROPump.h" #include "TaskGeneral.h" #include "Timers.h" +#include "Valves.h" /** * @addtogroup FPPreGenPermeateMode @@ -35,13 +39,18 @@ // ********** private definitions ********** #define PRE_GENP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre gen Permeate mode data published. +#define VERIFY_WATER_RO_PUMP_TGT_PSI 15 +#define VERIFY_WATER_BOOST_PUMP_TGT_PSI 25 +#define VERIFY_WATER_TIMEOUT_MS ( 5 * MS_PER_SECOND ) // ********** private data ********** static FP_PRE_GENP_MODE_STATE_T preGenPState; ///< Currently active pre generate Permeate state. static U32 preGenPDataPublicationTimerCounter; ///< Used to schedule pre generate Permeate data publication to CAN bus. static OVERRIDE_U32_T preGenPDataPublishInterval; ///< Pre Generate Permeate mode data publish interval. +static BOOL isPreGenComplete; ///< Flag indicating if Pre generation has completed. static U32 pendingStartPreGenRequest; ///< Flag indicating DD has requested FP start the generate permeate. +static U32 verifyWaterTimer; // ********** private function prototypes ********** @@ -70,6 +79,8 @@ preGenPDataPublishInterval.override = OVERRIDE_RESET; preGenPDataPublicationTimerCounter = 0; pendingStartPreGenRequest = FALSE; + isPreGenComplete = FALSE; + verifyWaterTimer = 0; } /*********************************************************************//** @@ -84,7 +95,6 @@ { initPreGenPMode(); setCurrentSubState( preGenPState ); - return preGenPState; } @@ -98,6 +108,7 @@ *************************************************************************/ U32 execPreGenPMode( void ) { + FP_PRE_GENP_MODE_STATE_T previouspreGenPState = preGenPState; // execute current pre gen Permeate state switch ( preGenPState ) { @@ -110,11 +121,11 @@ break; case FP_PRE_GENP_PERMEATE_FLUSH: - preGenPState = handlePreGenPConcentrateFlushState(); + preGenPState = handlePreGenPPermeateFlushState(); break; case FP_PRE_GENP_CONCENTRATE_FLUSH: - preGenPState = handlePreGenPPermeateFlushState(); + preGenPState = handlePreGenPConcentrateFlushState(); break; case FP_PRE_GENP_VERIFY_WATER: @@ -129,6 +140,12 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, SW_FAULT_ID_FP_INVALID_PGEN_STATE, preGenPState ) break; } + + if( previouspreGenPState != preGenPState ) + { + setModePreGenPTransition( preGenPState ); + SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_PRE_GEN_CHANGE, preGenPState, previouspreGenPState ) + } //Publish pre Gen Permeate mode data publishPreGenPModeData(); @@ -165,7 +182,20 @@ break; case FP_PRE_GENP_VERIFY_WATER: - // Actuator transitions happen within Verify Water exec + setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_OPEN ); + setValveState( P33_VALV, VALVE_STATE_CLOSED ); // TODO - Change valves to handle RO rejection config + setValveState( P34_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_OPEN ); + + if ( TRUE == isBoostPumpInstalled() ) + { + setBoostPumpTargetPressure( VERIFY_WATER_BOOST_PUMP_TGT_PSI ); + } + setROPumpTargetPressure( VERIFY_WATER_RO_PUMP_TGT_PSI ); + verifyWaterTimer = getMSTimerCount(); break; case FP_PRE_GENP_PAUSED: @@ -188,9 +218,15 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_INLET_PRESSURE_CHECK; + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = FP_PRE_GENP_PAUSED; + } + if ( FALSE == isBoostPumpInstalled() ) { signalStartFilterFlush(); + state = FP_PRE_GENP_FILTER_FLUSH; } else { @@ -210,10 +246,16 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_FILTER_FLUSH; + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = FP_PRE_GENP_PAUSED; + } + execFilterFlush(); if( TRUE == isFilterFlushComplete() ) { + signalStartPermeateFlush(); state = FP_PRE_GENP_PERMEATE_FLUSH; } @@ -232,10 +274,16 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_PERMEATE_FLUSH; + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = FP_PRE_GENP_PAUSED; + } + execPermeateFlush(); if( TRUE == isPermeateFlushComplete() ) { + signalStartConcentrateFlush(); state = FP_PRE_GENP_CONCENTRATE_FLUSH; } @@ -254,9 +302,14 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_CONCENTRATE_FLUSH; - execFilterFlush(); + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = FP_PRE_GENP_PAUSED; + } - if( TRUE == isFilterFlushComplete() ) + execConcentrateFlush(); + + if( TRUE == isConcentrateFlushComplete() ) { state = FP_PRE_GENP_VERIFY_WATER; } @@ -269,13 +322,28 @@ * The handlePreGenPVerifyWaterState handles the verify water state of * pre gen water. * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Outputs: isPreGenComplete * @return the next state of pre gen water mode *************************************************************************/ static FP_PRE_GENP_MODE_STATE_T handlePreGenPVerifyWaterState( void ) { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_VERIFY_WATER; + F32 roCurrentDutyCycle = getCurrentROPumpDutyCyclePCT(); + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = FP_PRE_GENP_PAUSED; + } + + if( TRUE == didTimeout( verifyWaterTimer, VERIFY_WATER_TIMEOUT_MS ) ) + { + setGenPermeateRODutyCycle( roCurrentDutyCycle ); + transitionToGenPermeateMode(); + requestGenWaterStart(); // transition function will clear start flag + isPreGenComplete = TRUE; + SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_PRE_GEN_RO_SET_PWM, roCurrentDutyCycle, getFluidPumpReadPWMDutyCycle( P12_PUMP ) ) + } + return state; } @@ -310,6 +378,18 @@ /*********************************************************************//** * @brief + * The isPreGenPComplete function returns isPreGenComplete. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the complete boolean for Pre-Gen Mode. + *************************************************************************/ +BOOL isPreGenPComplete( void ) +{ + return isPreGenComplete; +} + +/*********************************************************************//** + * @brief * The getPreGenRequest function returns the current state of the * pre gen water mode. * @details \b Inputs: pendingStartPreGenRequest @@ -375,6 +455,7 @@ { result = TRUE; pendingStartPreGenRequest = TRUE; + requestNewOperationMode( FP_MODE_PGEN ); } return result; @@ -391,6 +472,12 @@ { BOOL result = TRUE; pendingStartPreGenRequest = FALSE; + signalROPumpHardStop(); + + if ( TRUE == isBoostPumpInstalled() ) + { + signalBoostPumpHardStop(); + } requestNewOperationMode( FP_MODE_STAN ); return result;