Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rf4f631761bb5d7fe936bfd80ba49ddc6aea115d6 --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision f4f631761bb5d7fe936bfd80ba49ddc6aea115d6) @@ -17,10 +17,11 @@ #include "BoostPump.h" #include "FlowSensor.h" -#include "InletPressureCheck.h" #include "FPOperationModes.h" +#include "InletPressureCheck.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PersistentAlarm.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" @@ -34,20 +35,23 @@ // ********** private definitions ********** -#define INLET_PRES_CHECK_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes +#define INLET_PRES_CHECK_MAX_TIMEOUT ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define INLET_PRES_CHECK_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. -#define INLET_PRES_CHECK_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) +#define INLET_PRES_CHECK_BP_TIMEOUT ( 10 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) for booster pump installed +#define INLET_PRES_CHECK_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) for featured and de-featured #define INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM 0.2F ///< target in PWM % for the BOOST pump during inlet pressure check. -#define INLET_PRES_CHECK_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check. +#define INLET_PRES_CHECK_WITH_BP_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check with booster pump. +#define INLET_PRES_CHECK_TGT_PSI 75 ///< Pressure target in PSI for the M3 during inlet pressure check without booster pump. #define INLET_PRES_CHECK_TOLERANCE_PSI 2 ///< Pressure tolerance in PSI for the M3 during inlet pressure check. -#define INLET_PRES_PERSISTENCE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check. +#define INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check with booster pump. +#define INLET_PRES_OUT_OF_RANGE_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. +#define INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. // ********** private data ********** static FP_INLET_PRES_CHECK_STATE_T inletPressureCheckState; ///< Currently active Inlet Pressure check state. static U32 inletPressureCheckDataPublicationTimerCounter; ///< Used to schedule Inlet Pressure Check data publication to CAN bus. static U32 inletPressureCheckTimer; ///< Inlet Pressure check timeout timer -static U32 inletPressureCheckPersistanceStartTimeMS; ///< Current time for inlet pressure check persistence time started in milliseconds. static BOOL isPressureCheckComplete; ///< Inlet Pressure Check complete BOOL static OVERRIDE_U32_T inletPressureCheckDataPublishInterval; ///< Inlet Pressure Check mode data publish interval. static OVERRIDE_U32_T inletPressureCheckTimeout; ///< Inlet Pressure check timeout value @@ -75,18 +79,48 @@ inletPressureCheckDataPublishInterval.ovData = INLET_PRES_CHECK_DATA_PUBLISH_INTERVAL; inletPressureCheckDataPublishInterval.ovInitData = 0; inletPressureCheckDataPublishInterval.override = OVERRIDE_RESET; - inletPressureCheckTimeout.data = INLET_PRES_CHECK_TIMEOUT; - inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_TIMEOUT; - inletPressureCheckTimeout.ovInitData = 0; - inletPressureCheckTimeout.override = OVERRIDE_RESET; inletPressureCheckDataPublicationTimerCounter = 0; inletPressureCheckTimer = 0; - inletPressureCheckPersistanceStartTimeMS = 0; isPressureCheckComplete = FALSE; + + if ( TRUE == isBoostPumpInstalled() ) + { + inletPressureCheckTimeout.data = INLET_PRES_CHECK_BP_TIMEOUT; + inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_BP_TIMEOUT; + inletPressureCheckTimeout.ovInitData = 0; + inletPressureCheckTimeout.override = OVERRIDE_RESET; + } + else + { + inletPressureCheckTimeout.data = INLET_PRES_CHECK_TIMEOUT; + inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_TIMEOUT; + inletPressureCheckTimeout.ovInitData = 0; + inletPressureCheckTimeout.override = OVERRIDE_RESET; + } + + // Pressure alarms + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** * @brief + * The transitionToInletPressureCheck function prepares for transition to + * inlet pressure check + * permeate mode. + * @details \b Inputs: inletPressureCheckState + * @details \b Outputs: none + * @return initial 0 + *************************************************************************/ +U32 transitionToInletPressureCheck( void ) +{ + initInletPressureCheck(); + return 0; +} + +/*********************************************************************//** + * @brief * The execInletPressureCheck function executes the inlet pressure check * state machine and publishes inlet pressure check data. * @details \b Inputs: inletPressureCheckState @@ -127,40 +161,56 @@ * The handleInletPressureCheckProgressState handles the in progress * state of inlet pressure check * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Outputs: isPressureCheckComplete * @return the next state of Inlet Pressure check state *************************************************************************/ static FP_INLET_PRES_CHECK_STATE_T handleInletPressureCheckProgressState( void ) { FP_INLET_PRES_CHECK_STATE_T state = INLET_PRES_CHECK_IN_PROGRESS; - F32 inletPressure = 0.0; + F32 pressureM3 = getFilteredPressure(M3_PRES); + F32 minThreshold = INLET_PRES_CHECK_WITH_BP_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI; + F32 maxThreshold = INLET_PRES_CHECK_WITH_BP_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI; + BOOL isPresOutOfLowRange = FALSE; + BOOL isPresOutOfHighRange = FALSE; - inletPressure = getFilteredPressure(M3_PRES); - // check for inlet pressure (M3) within range - if( ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) && ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) + if ( TRUE == isBoostPumpInstalled() ) { - if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + // timeout after 10 seconds + if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + isPresOutOfLowRange = ( ( pressureM3 < minThreshold ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > maxThreshold ) ) ? TRUE : FALSE ); + // check for inlet pressure (M3) within range + if( ( pressureM3 >= minThreshold ) && ( pressureM3 <= maxThreshold ) ) + { + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; + } + else + { + // check persistent alarm for 1 second + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfLowRange, pressureM3, minThreshold ); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfHighRange, pressureM3, maxThreshold ); + } } - else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_MS ) ) + } + else + { + // Change inlet pressure check for M3 criteria from 30 PSI to <75 PSI for both featured and de-featured + // ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE is defined for featured when > 75 and > 40 for de-featured so re using alarm ID + // INLET_PRES_CHECK_TGT_PSI = 75 + + isPresOutOfHighRange = ( ( pressureM3 >= INLET_PRES_CHECK_TGT_PSI ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfHighRange, pressureM3, INLET_PRES_CHECK_TGT_PSI ); + + // stay in this state for 1 second for checking the persistent alarm + if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - inletPressureCheckPersistanceStartTimeMS = 0; isPressureCheckComplete = TRUE; state = INLET_PRES_CHECK_PAUSED; } } - // reset the persistence timer when inlet pressure out of range - else if( ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) || ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) - { - inletPressureCheckPersistanceStartTimeMS = 0; - } - // Trigger alarm if M3 pressure is not within range - else if ( TRUE == didTimeout( inletPressureCheckTimer, getInletPressureCheckTimeout() ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TIMEOUT, inletPressure) - state = INLET_PRES_CHECK_PAUSED; - } return state; } @@ -201,18 +251,24 @@ case INLET_PRES_CHECK_IN_PROGRESS: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); - setValveState( P11_VALV, VALVE_STATE_CLOSED ); - setValveState( P33_VALV, VALVE_STATE_CLOSED ); - setValveState( P34_VALV, VALVE_STATE_CLOSED ); - setValveState( P37_VALV, VALVE_STATE_CLOSED ); - setValveState( P39_VALV, VALVE_STATE_CLOSED ); - - if ( TRUE == isBoostPumpInstalled() ) + if ( TRUE == isFPDefeatured() ) { - setBoostPumpTargetDutyCycle( INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM ); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); } - signalROPumpHardStop(); + else + { + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_CLOSED ); + setValveState( P33_VALV, VALVE_STATE_CLOSED ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == isBoostPumpInstalled() ) + { + setBoostPumpTargetDutyCycle( INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM ); + } + signalROPumpHardStop(); + } inletPressureCheckTimer = getMSTimerCount(); break; @@ -222,18 +278,26 @@ { setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); - setValveState( P11_VALV, VALVE_STATE_CLOSED ); - setValveState( P33_VALV, VALVE_STATE_CLOSED ); - setValveState( P34_VALV, VALVE_STATE_CLOSED ); - setValveState( P37_VALV, VALVE_STATE_CLOSED ); - setValveState( P39_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) + if ( TRUE == isFPDefeatured() ) { - signalBoostPumpHardStop(); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); } - signalROPumpHardStop(); + else + { + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_CLOSED ); + setValveState( P33_VALV, VALVE_STATE_CLOSED ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_CLOSED ); + + if ( TRUE == isBoostPumpInstalled() ) + { + signalBoostPumpHardStop(); + } + signalROPumpHardStop(); + } } break;