Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -rdd0e9acd5f0fb570403be8908ac45e79840d4b70 -rfb0f180eb25dbcfd15d58ef584d535efd1c24e30 --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision dd0e9acd5f0fb570403be8908ac45e79840d4b70) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision fb0f180eb25dbcfd15d58ef584d535efd1c24e30) @@ -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,16 +35,16 @@ // ********** 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_TIMEOUT ( 10 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) #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_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_WITH_BP_MS ( 10 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check with booster pump. -#define INLET_PRES_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. - +#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. @@ -85,10 +86,29 @@ inletPressureCheckTimer = 0; inletPressureCheckPersistanceStartTimeMS = 0; isPressureCheckComplete = FALSE; + + // Pressure alarms + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_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 @@ -135,59 +155,51 @@ 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 thresholdMin = INLET_PRES_CHECK_WITH_BP_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI; - F32 thresholdMax = INLET_PRES_CHECK_WITH_BP_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI; + F32 m3Pressure = 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); - if ( TRUE == isBoostPumpInstalled() ) { - // check for inlet pressure (M3) within range - if( ( inletPressure >= thresholdMin ) && ( inletPressure <= thresholdMax ) ) + // timeout after 10 seconds + if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + isPresOutOfLowRange = ( ( m3Pressure < minThreshold ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( m3Pressure > maxThreshold ) ) ? TRUE : FALSE ); + + // SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TIMEOUT, m3Pressure ); // re-check the alarm ID + // check persistent alarm for 1 second + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, m3Pressure, minThreshold ); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, m3Pressure, maxThreshold ); + + // Trigger alarm if M3 pressure is not within range after 10 + 1 seconds + if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, getInletPressureCheckTimeout() + INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ) ) { - inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + // check for inlet pressure (M3) within range + if( ( m3Pressure >= minThreshold ) && ( m3Pressure <= maxThreshold ) ) + { + inletPressureCheckPersistanceStartTimeMS = 0; + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; + } } - else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ) ) - { - inletPressureCheckPersistanceStartTimeMS = 0; - isPressureCheckComplete = TRUE; - state = INLET_PRES_CHECK_PAUSED; - } } - // reset the persistence timer when inlet pressure out of range - else if ( ( inletPressure <= thresholdMin ) || ( inletPressure >= thresholdMax ) ) - { - inletPressureCheckPersistanceStartTimeMS = 0; - // Trigger alarm if M3 pressure is not within range - 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; - } - } } else - { - if ( inletPressure >= INLET_PRES_CHECK_TGT_PSI ) + { // 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 + // INLET_PRES_CHECK_TGT_PSI = 75 + if ( m3Pressure >= INLET_PRES_CHECK_TGT_PSI ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TGT_PSI, inletPressure ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, m3Pressure, INLET_PRES_CHECK_TGT_PSI ) state = INLET_PRES_CHECK_PAUSED; } else { - if ( 0 == inletPressureCheckPersistanceStartTimeMS ) - { - inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); - } - else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_MS ) ) - { - inletPressureCheckPersistanceStartTimeMS = 0; - isPressureCheckComplete = TRUE; - state = INLET_PRES_CHECK_PAUSED; - } + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; } } @@ -243,6 +255,7 @@ } signalROPumpHardStop(); inletPressureCheckTimer = getMSTimerCount(); + inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); break; case INLET_PRES_CHECK_PAUSED: