Index: firmware/App/Modes/FPModes/FlushConcentrate.c =================================================================== diff -u -rb9084c526c8ab28a605f4d2640288e2fc80796ff -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision b9084c526c8ab28a605f4d2640288e2fc80796ff) +++ firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -29,6 +29,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup FPConcentrateFlush @@ -40,7 +41,7 @@ #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.75F ///< target in PWM % for the RO pump during concentrate flush. +#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.8F ///< 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 @@ -175,6 +176,8 @@ setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); isTankFilled = FALSE; } + + checkROInletPressure(); } return state; Index: firmware/App/Modes/FPModes/FlushFilter.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -20,9 +20,11 @@ #include "FPOperationModes.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PersistentAlarm.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" +#include "Temperature.h" #include "Timers.h" #include "Valves.h" #include "WaterQualityMonitor.h" @@ -38,7 +40,11 @@ #define FILTER_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define FILTER_FLUSH_TIMEOUT ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Filter flush timeout for 3 minutes (in ms) #define FILTER_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during filter flush. +#define MAX_INLET_TEMPERATURE_HIGH_PSI_C 40.0F ///< Maximum allowed Inlet temperature in C. +#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to clear alarm in ms. +#define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to trigger alarm in ms. + // ********** private data ********** static FP_FILTER_FLUSH_STATE_T filterFlushState; ///< Currently active filter flush state. @@ -80,6 +86,8 @@ filterFlushTimer = 0; isFlushComplete = FALSE; pendingStartFilterFlushRequest = FALSE; + + initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS, INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ); } /*********************************************************************//** @@ -116,6 +124,10 @@ { setFilterFlushTransition( filterFlushState ); } + + // check inlet temperature m3 + checkInletTemperatures(); + // publish filter flush data on interval publishFilterFlushData(); } Index: firmware/App/Modes/FPModes/FlushPermeate.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -27,6 +27,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup FPPermeateFlush @@ -146,11 +147,6 @@ FP_PERM_FLUSH_STATE_T state = PERM_FLUSH_IN_PROGRESS; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); -// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework -// { -// state = PERM_FLUSH_PAUSED; -// } - // Manual control of Permeate tank while in Permeate Flush // to prevent overfill. if ( LEVEL_STATE_HIGH == level ) @@ -174,12 +170,24 @@ setBoostPumpTargetPressure( PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI ); isTankFilled = FALSE; } + + checkROInletPressure(); } if ( TRUE == didTimeout( permeateFlushTimer, getPermeateFlushTimeout() ) ) { F32 p18conductivity = getFilteredConductivity( P18_COND ); - //TODO add remaining checks per SRS-275 + // SRS-275 + + // inlet water pressure range M3 25- 40 PSI + checkInletPressures(); + + // inlet water conductivity p9 < 2000 + checkInletConductivity(); + + // inlet water temperature p10 range 5 - 30 + checkInletTemperatures(); + if ( ( PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD > p18conductivity ) && ( LEVEL_STATE_HIGH == level ) ) { isFlushComplete = TRUE; Index: firmware/App/Modes/FPModes/FlushPermeate.h =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/FlushPermeate.h (.../FlushPermeate.h) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/FlushPermeate.h (.../FlushPermeate.h) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -51,6 +51,7 @@ BOOL testPermeateFlushDataPublishIntervalOverride( MESSAGE_T *message ); BOOL testPermeateFlushTimerOverride( MESSAGE_T *message ); +BOOL testPermeateFlushAlarmTimerOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -37,7 +37,8 @@ #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 ( 10 * 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_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. @@ -77,17 +78,29 @@ 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; 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 ); } /*********************************************************************//** @@ -153,7 +166,7 @@ static FP_INLET_PRES_CHECK_STATE_T handleInletPressureCheckProgressState( void ) { FP_INLET_PRES_CHECK_STATE_T state = INLET_PRES_CHECK_IN_PROGRESS; - F32 m3Pressure = getFilteredPressure(M3_PRES); + 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; @@ -164,34 +177,36 @@ // timeout after 10 seconds if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - isPresOutOfLowRange = ( ( m3Pressure < minThreshold ) ? TRUE : FALSE ); - isPresOutOfHighRange = ( ( ( m3Pressure > maxThreshold ) ) ? TRUE : FALSE ); + isPresOutOfLowRange = ( ( pressureM3 < minThreshold ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > maxThreshold ) ) ? TRUE : FALSE ); // check for inlet pressure (M3) within range - if( ( m3Pressure >= minThreshold ) && ( m3Pressure <= maxThreshold ) ) + 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, m3Pressure, minThreshold ); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfHighRange, m3Pressure, maxThreshold ); + 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 - { // 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 + { + // 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 - if ( m3Pressure >= INLET_PRES_CHECK_TGT_PSI ) + + 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() ) ) { - 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 - { isPressureCheckComplete = TRUE; state = INLET_PRES_CHECK_PAUSED; } @@ -236,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; @@ -257,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; Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -r95a7e12ec9b9d70b13baf9aafd94e183beccd89c -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 95a7e12ec9b9d70b13baf9aafd94e183beccd89c) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -339,6 +339,8 @@ FP_GENP_MODE_STATE_T state = FP_GENP_TANK_FILL_STATE; PERMEATE_TANK_STATE_T permemeateTankState = getPermeateTankState(); + checkROInletPressure(); + if ( TRUE == didTimeout( tankFillAlarmTimer, getTankFillAlarmTimeout() ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT, permemeateTankState ) Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r2475e55c224cbd841d61b76f1618451efe6be1f5 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 2475e55c224cbd841d61b76f1618451efe6be1f5) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -21,7 +21,9 @@ #include "MessageSupport.h" #include "ModeGenPermeateDefeatured.h" #include "ModePreGenPermeateDefeatured.h" +#include "PersistentAlarm.h" #include "TaskGeneral.h" +#include "Temperature.h" #include "Timers.h" #include "Valves.h" #include "WaterQualityMonitor.h" @@ -34,6 +36,7 @@ // ********** private definitions ********** #define PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. +#define INLET_TEMPERATURE_LOW_THRESHOLD_C 5.0F ///< Minimum allowed Inlet temperature in C. // ********** private data ********** @@ -122,6 +125,9 @@ checkInletPressures(); + // check inlet temperature D1 + checkInletTemperatures(); + //Publish Gen Permeate mode data publishGenPDefModeData(); Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -338,6 +338,8 @@ FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_VERIFY_WATER; F32 roCurrentDutyCycle = getCurrentROPumpDutyCyclePCT(); + checkROInletPressure(); + //Stay in this state for 25 seconds to stablize flow control if ( TRUE == didTimeout( verifyWaterTimer, FLOW_CONTROL_STABLIZED_TIMEOUT_MS ) ) { Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -rfb0f180eb25dbcfd15d58ef584d535efd1c24e30 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision fb0f180eb25dbcfd15d58ef584d535efd1c24e30) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -38,6 +38,7 @@ #define PRE_GEN_DEF_FLUSH_TIMEOUT_MS ( 30 * MS_PER_SECOND ) #define PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ( 10 * MS_PER_SECOND ) + // ********** private data ********** static FP_PRE_GENP_DEF_MODE_STATE_T preGenPermeateDefState; ///< Currently active generate Permeate Defeatured state. Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -19,6 +19,7 @@ #include "Flow.h" #include "FPModeStandby.h" #include "FPOperationModes.h" +#include "Messaging.h" #include "PersistentAlarm.h" #include "Pressure.h" #include "ROPump.h" @@ -44,6 +45,7 @@ #define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 25.0F ///< Minimum allowed Input warning low pressure value in psig for RO featured. #define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 40.0F ///< Maximum allowed Input warning high pressure value in psig for RO featured. #define MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG 75.0F ///< Maximum allowed Input fault high pressure value in psig for RO featured. +#define MIN_INLET_WATER_PRESSURE_PSIG 1.0F ///< Minimum allowed Input fault pressure value in psig for RO featured. #define MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG 5.0F ///< Minimum allowed Input warning low pressure value in psig for RO Defeatured. #define MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG 10.0F ///< Maximum allowed Input warning high pressure value in psig for RO Defeatured. #define MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG 40.0F ///< Maximum allowed Input fault high pressure value in psig for RO Defeatured. @@ -54,6 +56,8 @@ #define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. #define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. #define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. +#define INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Persistence period for p8 pressure out of range error in milliseconds. +#define INLET_PRES_OUT_OF_RANGE_CLEAR_MS ( 3 * MS_PER_SECOND ) ///< Persistence period for p8 pressure out of range clear in milliseconds. #define OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US 200.0F ///< Minimum allowed inlet conductivity in uS/cm. #define INLET_WATER_COND_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity out of range error in milliseconds. @@ -93,6 +97,8 @@ initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS, INLET_PRES_OUT_OF_RANGE_CLEAR_MS ); + initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); @@ -197,6 +203,24 @@ /*********************************************************************//** * @brief + * The checkROInletPressure function checks the RO P8 pressure + * against the pressure threshold and alarm if the pressure is out of range. + * @details \b Inputs: pressureP8 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE when + * P8 pressure less than 1 PSI. + * @return none + *************************************************************************/ +void checkROInletPressure( void ) +{ + F32 pressureP8 = getFilteredPressure( P8_PRES ); + BOOL isFlowOutOfRange = ( ( pressureP8 < MIN_INLET_WATER_PRESSURE_PSIG ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE, isFlowOutOfRange, pressureP8, MIN_INLET_WATER_PRESSURE_PSIG ); +} + +/*********************************************************************//** + * @brief * The checkROPressures function checks the RO membrane pressure * against the pressure threshold and alarm if the pressure is out of range. * @details \b Inputs: pressureP13 @@ -278,12 +302,52 @@ isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ) ? TRUE : FALSE ); isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, isPresReliefOutOfLowRange, pressureP17, MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, isPresReliefOutOfHighRange, pressureP17, MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ); } /*********************************************************************//** * @brief + * The checkInletTemperature function checks the inlet water temperature + * against the temperature threshold and alarm if the temperature is out of range. + * @details \b Inputs: temperatureP10 for featured or temperatureM3 for de-featured + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE when + * P10 or M3 temperature goes beyond low temperature limit. + * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE when + * P10 or M3 temperature goes beyond high temperature limit + * @return none + *************************************************************************/ +void checkInletTemperature( void ) +{ + F32 d1Temperature; + F32 temperatureP10; + BOOL isTempOutOfLowRange = FALSE; + BOOL isTempOutOfHighRange = FALSE; + + if ( FALSE == isFPDefeatured() ) + { + temperatureP10 = getFilteredConductivitySensorTemperature( P9_COND ); + isTempOutOfLowRange = ( ( temperatureP10 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureP10 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureP10, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureP10, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + } + else + { + d1Temperature =getTemperatureValue( D1_TEMP ); + isTempOutOfLowRange = ( ( d1Temperature < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( d1Temperature > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, d1Temperature, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, d1Temperature, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + } +} + +/*********************************************************************//** + * @brief * The checkInletTemperatures function checks the inlet water temperature * against the temperature threshold and alarm if the temperature is out of range. * @details \b Inputs: temperatureP10, temperatureM3 @@ -378,15 +442,49 @@ /*********************************************************************//** * @brief + * The sendCalculatedRODutyCycleToDialin function sends the RO duty cycle + * status to dialin. + * @details \b Message \b sent: MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE + * @details \b Inputs: CalculatedRODutyCycle + * @details \b Outputs: none + * @return TRUE if the duty cycle message is successfully queued for + * transmit, otherwise FALSE + *************************************************************************/ +BOOL sendCalculatedRODutyCycleToDialin( void ) +{ + BOOL result = FALSE; + F32 CalculatedRODutyCycle = getCalculatedRODutyCycle(); + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE; + msg.hdr.payloadLen = sizeof(CalculatedRODutyCycle); + + memcpy( payloadPtr, (U08*)&CalculatedRODutyCycle, sizeof( CalculatedRODutyCycle ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_DD_CAN_PC, ACK_NOT_REQUIRED ); + // result = sendMessage( MSG_ID_DD_SEND_BLOOD_LEAK_EMB_MODE_RESPONSE, COMM_BUFFER_OUT_DD_CAN_PC, (U08*)&response, sizeof( BLOOD_LEAK_EMB_MODE_RESP_T ) ); + + return result; +} + +/*********************************************************************//** + * @brief * The testROGetCurrentCalcuclatedDutyCycle function * return RO calculated duty cycle at instantaneous pressure * @details \b Inputs: none * @details \b Outputs: none - * @return dutycycle + * @return TRUE if override successful, FALSE if not *************************************************************************/ -F32 testROGetCurrentCalcuclatedDutyCycle() +BOOL testROGetCurrentCalcuclatedDutyCycle() { - return getCalculatedRODutyCycle(); + BOOL result = FALSE; + result = sendCalculatedRODutyCycleToDialin(); + + return result; } /**@}*/ Index: firmware/App/Monitors/WaterQualityMonitor.h =================================================================== diff -u -r95a7e12ec9b9d70b13baf9aafd94e183beccd89c -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 95a7e12ec9b9d70b13baf9aafd94e183beccd89c) +++ firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -47,7 +47,8 @@ void checkPermeateHighFlow( void ); void checkPermeateLowFlow( void ); void checkRODutyCycle( void ); +void checkROInletPressure( void ); -F32 testROGetCurrentCalcuclatedDutyCycle(); +BOOL testROGetCurrentCalcuclatedDutyCycle(); #endif Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r26dca0a06faa2a79443d7bf2bc547c8dab0673a2 -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 26dca0a06faa2a79443d7bf2bc547c8dab0673a2) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) @@ -245,6 +245,13 @@ { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, { MSG_ID_FP_RO_GET_CALCULATED_DUTY_CYCLE_REQUEST, &testROGetCurrentCalcuclatedDutyCycle }, + { MSG_ID_FP_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFilterFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST, &testFilterFlushTimerOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPermeateFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_TIMER_OVERRIDE_REQUEST, &testPermeateFlushTimerOverride }, + { MSG_ID_FP_FLUSH_PERMEATE_ALARM_TIMER_OVERRIDE_REQUEST, &testPermeateFlushAlarmTimerOverride }, + { MSG_ID_FP_FLUSH_CONCENTRATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testConcentrateFlushDataPublishIntervalOverride }, + { MSG_ID_FP_FLUSH_CONCENTRATE_TIMER_OVERRIDE_REQUEST, &testConcentrateFlushTimerOverride }, }; /// Calculation for number of entries in the incoming message function handler look-up table.