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; } /**@}*/