Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -r2475e55c224cbd841d61b76f1618451efe6be1f5 -r787995d24d9bf765628516fa3fd02bffcd585d47 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 2475e55c224cbd841d61b76f1618451efe6be1f5) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 787995d24d9bf765628516fa3fd02bffcd585d47) @@ -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" @@ -34,37 +35,50 @@ // ********** private definitions ********** -#define INLET_TEMPERATURE_LOW_THRESHOLD_C 5.0F ///< Minimum allowed Inlet temperature in C. -#define INLET_TEMPERATURE_HIGH_THRESHOLD_C 30.0F ///< Maximum allowed Inlet temperature in C. -#define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to trigger alarm in ms. -#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to clear alarm in ms. +#define INLET_TEMPERATURE_LOW_THRESHOLD_C 5.0F ///< Minimum allowed P10/D1 inlet temperature in C. +#define INLET_TEMPERATURE_HIGH_THRESHOLD_C 30.0F ///< Maximum allowed P10/D1 inlet temperature in C. +#define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer for P10/D1 inlet temperature to trigger alarm in milliseconds. +#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer for P10/D1 inlet temperature to clear alarm in milliseconds. -#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG 120.0F ///< Maximum allowed Input pressure to the RO membrane. -#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_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. -#define MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG 13.0F ///< Minimum pressure relief warning in psi -#define MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG 17.0F ///< Maximum pressure relief warning in psi +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG 120.0F ///< Maximum allowed Input warning pressure to the RO membrane. +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG 58.0F ///< Minimum Input warning pressure to the RO membrane. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 25.0F ///< Minimum allowed M3 Input warning low pressure value in psig for RO featured. +#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 40.0F ///< Maximum allowed M3 Input warning high pressure value in psig for RO featured. +#define MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG 75.0F ///< Maximum allowed M3 Input fault high pressure value in psig for RO featured. +#define MIN_INLET_WATER_PRESSURE_PSIG 1.0F ///< Minimum allowed P8 Input fault pressure value in psig for RO featured. +#define MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG 5.0F ///< Minimum allowed M3 Input warning low pressure value in psig for RO Defeatured. +#define MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG 10.0F ///< Maximum allowed M3 Input warning high pressure value in psig for RO Defeatured. +#define MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG 40.0F ///< Maximum allowed M3 Input fault high pressure value in psig for RO Defeatured. +#define MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG 13.0F ///< Minimum P17 pressure relief warning in psi +#define MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG 17.0F ///< Maximum P17 pressure relief warning in psi #define MAX_PERMEATE_FLOW_FAULT_THRESHOLD 1.25F ///< Maximum permeate flow threshold value in percentage. -#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. -#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 ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. -#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for M3 pressure out of range error in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for M3 pressure out of range clear in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for P17 pressure out of range error in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for P17 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 OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US 200.0F ///< Minimum allowed P18 permeate 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. #define INLET_WATER_COND_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity out of range clear in milliseconds. -#define INLET_CONDUCTIVITY_HIGH_THRESHOLD_US 2000.0F ///< Maximum allowed outlet conductivity in uS/cm. +#define INLET_CONDUCTIVITY_HIGH_THRESHOLD_US 2000.0F ///< Maximum allowed P9 inlet conductivity in uS/cm. #define MIN_RO_REJECTION_RATIO_PCT 90.0F ///< Minimum RO rejection ration in percentage #define PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define PERMEATE_FLOW_FAULT_MIN_THRESHOLD 200.0F ///< Permeate flow low tolerance limit #define PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Permeate flow low tolerance out of range timeout +#define RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle in warning range in milliseconds. +#define RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle warning range clear in milliseconds. + +// pump manufacturer's data for pump current draw based on pump speed and outlet pressure If 58 PSI ≤ P13 < 120 PSI, +// the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x) + 193.23, where x = measured P13 pressure in PSI +#define QUADRATIC_COEFFICIENT 0.0065F ///< X2 quadratic coefficient +#define LINEAR_COEFFICIENT 1.9895F ///< X linear coefficient +#define CONSTANT_TERM 193.23F ///< Constant term + // ********** private data ********** // ********** private function prototypes ********** @@ -81,9 +95,12 @@ // Pressure alarms initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); 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 ); - initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); // Temperature Alarms initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS, INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ); @@ -97,19 +114,23 @@ initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_CLEAR_MS, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIMEOUT_MS ); // fault , clearing timeout is not applicable initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, 0, PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ); + + // duty cycle warning alarm + initPersistentAlarm( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS, RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ); } /*********************************************************************//** * @brief * The checkInletPressures function checks the inlet water pressure * against the pressure threshold and alarm if the pressure is out of range. + * RO Featured, Water Production and RO Defeatured, Water Supply * @details \b Inputs: pressureM3 * @details \b Outputs: none * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE when * M3 pressure goes beyond low pressure limit. * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE when * M3 pressure goes beyond high pressure limit - * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE when + * @details \b Alarms: when * M3 pressure goes beyond fault high pressure limit * @return none *************************************************************************/ @@ -122,18 +143,18 @@ if ( TRUE == isFPDefeatured() ) { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ); } else { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ); @@ -156,7 +177,7 @@ BOOL isFlowOutOfRange = FALSE; F32 maxAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() * MAX_PERMEATE_FLOW_FAULT_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE); + isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, isFlowOutOfRange, permeateFlow, maxAllowedPermeateFlow ); } @@ -176,12 +197,30 @@ BOOL isFlowOutOfRange = FALSE; F32 minimumAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() - PERMEATE_FLOW_FAULT_MIN_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow); + isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow ); } /*********************************************************************//** * @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 @@ -194,14 +233,56 @@ { F32 pressureP13 = getPressure( P13_PRES ); - if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) } } /*********************************************************************//** * @brief + * The getCalculatedRODutyCycle function get the RO calculated dutycycle based on P13 pressure + * @details \b Inputs: none + * @details \b Outputs: none + * @return dutyCyclePct + *************************************************************************/ +F32 getCalculatedRODutyCycle( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + // TODO verify the calculated dutycycle unit + // If 58 PSI ≤ P13 < 120 PSI, the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x) + 193.23, where x = measured P13 pressure in PSI + F32 dutyCyclePct = ( ( QUADRATIC_COEFFICIENT * ( pressureP13 * pressureP13 ) ) - ( LINEAR_COEFFICIENT * ( pressureP13 ) ) ) + CONSTANT_TERM; + + return dutyCyclePct; +} + +/*********************************************************************//** + * @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: none + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE when + * P13 pressure goes beyond high pressure limit. + * @return none + *************************************************************************/ +void checkRODutyCycle( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + F32 currentDutyCyclePct = getCurrentROPumpDutyCyclePCT(); + BOOL isFdutyCycleOfRange = FALSE; + // TODO verify the calculated dutycycle unit + F32 calculatedDutyCyclePct = getCalculatedRODutyCycle(); + + if ( ( pressureP13 >= MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG ) && ( pressureP13 < MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) ) + { + isFdutyCycleOfRange = currentDutyCyclePct > calculatedDutyCyclePct; + checkPersistentAlarm( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, isFdutyCycleOfRange, calculatedDutyCyclePct, getCurrentROPumpDutyCyclePCT() ); + } +} + +/*********************************************************************//** + * @brief * The checkROPressures function checks the RO membrane outlet pressure * against the pressure threshold and alarm if the pressure is out of range. * @details \b Inputs: pressureP17 @@ -218,8 +299,9 @@ BOOL isPresReliefOutOfLowRange = FALSE; BOOL isPresReliefOutOfHighRange = FALSE; - isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE); + 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 ); } @@ -228,30 +310,39 @@ * @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 + * @details \b Inputs: temperatureP10 for featured or temperatureD1 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. + * P10 or D1 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 + * P10 or S1 temperature goes beyond high temperature limit * @return none *************************************************************************/ void checkInletTemperatures( void ) { - F32 temperatureP10 = getFilteredConductivitySensorTemperature( P9_COND ); - F32 temperatureM3 = getFilteredPressureSensorTemperature( M3_PRES ); + F32 temperatureD1; + F32 temperatureP10; BOOL isTempOutOfLowRange = FALSE; BOOL isTempOutOfHighRange = FALSE; - 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 ); + 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 ); - isTempOutOfLowRange = ( ( temperatureM3 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureM3 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureM3, INLET_TEMPERATURE_LOW_THRESHOLD_C ); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureM3, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + 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 + { + temperatureD1 = getTemperatureValue( D1_TEMP ); + isTempOutOfLowRange = ( ( temperatureD1 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureD1 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureD1, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureD1, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + } } /*********************************************************************//** @@ -269,7 +360,7 @@ F32 conductivityP9 = getFilteredConductivity( P9_COND ); BOOL isConductivtyOutOfLowRange = FALSE; - isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE, isConductivtyOutOfLowRange, conductivityP9, INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); } @@ -288,7 +379,7 @@ F32 conductivityP18 = getFilteredConductivity( P18_COND ); BOOL isConductivityOutOfLowRange = FALSE; - isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE, isConductivityOutOfLowRange, conductivityP18, OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); } @@ -306,9 +397,10 @@ { F32 avgRORR = getRORRAverage(); // Alarm if the filtered average is less than allowed RO rejection limit + //TODO update the macro with value from institutional configuration if ( avgRORR < MIN_RO_REJECTION_RATIO_PCT ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT ) } } @@ -318,4 +410,26 @@ *************************************************************************/ +/*********************************************************************//** + * @brief + * The testROGetCurrentCalculatedDutyCycle function + * return RO calculated duty cycle at instantaneous pressure + * @details \b Inputs: none + * @details \b Outputs: calculated RO pump duty cycle response msg constructed and sent + * @details \b Message: \b Sent: MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE + * @param message a pointer to the message requesting calculated RO pump + * duty cycle from Dialin + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROGetCurrentCalculatedDutyCycle( MESSAGE_T *message ) +{ + BOOL result = FALSE; + CURRENT_RO_PUMP_CAL_DUTY_CYCLE_DATA_T CalculatedRODutyCycle; + + CalculatedRODutyCycle.curentCalculatedDutyCycle = getCalculatedRODutyCycle(); + result = sendMessage( MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE, COMM_BUFFER_OUT_DD_CAN_PC, (U08*)&CalculatedRODutyCycle, sizeof( CURRENT_RO_PUMP_CAL_DUTY_CYCLE_DATA_T ) ); + + return result; +} + /**@}*/