Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r986abcfcf047822cad1a10c1ee0924a80dd5f512 -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 986abcfcf047822cad1a10c1ee0924a80dd5f512) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Pressures.c * * @author (last) Dara Navaei -* @date (last) 01-Jan-2022 +* @date (last) 06-Jul-2022 * * @author (original) Sean * @date (original) 04-Apr-2020 @@ -37,19 +37,23 @@ // ********** private definitions ********** #define PUMP_PRESSURE_ZERO 777 ///< ADC counts equivalent to 0 PSI for pump in/out pressure sensors. -#define PUMP_PRESSURE_PSIA_PER_COUNT 0.06434 ///< PSIA per ADC count conversion factor for pump in/out pressure sensors. -#define PUMP_PRESSURE_PSIA_TO_PSI_OFFSET 14.7 ///< Subtract this offset to convert PSIA to PSI. TODO - use barometric sensor when available. +#define PUMP_PRESSURE_PSIA_PER_COUNT 0.06434F ///< PSIA per ADC count conversion factor for pump in/out pressure sensors. +#define PUMP_PRESSURE_PSIA_TO_PSI_OFFSET 14.7F ///< Subtract this offset to convert PSIA to PSI. TODO - use barometric sensor when available. #define PRESSURE_SAMPLES_TO_AVERAGE ( 200 / TASK_PRIORITY_INTERVAL ) ///< Averaging pressure data over the reporting interval. -#define PRESSURE_AVERAGE_MULTIPLIER ( 1.0 / (F32)PRESSURE_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. +#define PRESSURE_AVERAGE_MULTIPLIER ( 1.0F / (F32)PRESSURE_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. -#define MIN_VALID_PRESSURE_RANGE 0.0 ///< Minimum valid range on pressure reading. -#define MAX_VALID_PRESSURE_RANGE 200.0 ///< Maximum valid range on pressure reading. +#define MIN_VALID_PRESSURE_RANGE 0.0F ///< Minimum valid range on pressure reading. +#define MAX_VALID_PRESSURE_RANGE 200.0F ///< Maximum valid range on pressure reading. -#define MIN_INLET_WATER_PRESSURE 25 ///< Minimum water input pressure. +#define MAX_INLET_WATER_PRESSURE_WARNING_LOW 25.0F ///< Maximum allowed low pressure value. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW 28.0F ///< Minimum allowed low pressure value. + #define INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error. +#define PRESSURE_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Pressure out of range persistence period in milliseconds. #define PRESSURES_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the pressures data is published on the CAN bus. #define DATA_PUBLISH_COUNTER_START_COUNT 10 ///< Data publish counter start count. +#define PRESSURE_SENSORS_ADC_CHECK_ARRAY_LEN 4 ///< Pressure sensors ADC check array length. /// Defined states for the pressures monitor state machine. typedef enum PresOccl_States @@ -113,46 +117,41 @@ measuredPressureReadingsSum[ i ] = 0; } - pressuresState = PRESSURE_INIT_STATE; - pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; + pressuresState = PRESSURE_INIT_STATE; + pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_PRESSURE, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_FAULT, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, PRESSURE_OUT_OF_RANGE_TIMEOUT_MS, PRESSURE_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** * @brief - * The checkInletPressure function checks inlet water pressure value + * The checkInletWaterPressure function checks inlet water pressure value * and triggers an alarm when pressure value is out of allowed range. * @details Inputs: RO pump inlet pressure sensor value * @details Outputs: Triggers low pressure persistent alarm * @return none *************************************************************************/ -void checkInletPressure( void ) +void checkInletWaterPressure( void ) { -#ifndef DISABLE_WATER_QUALITY_CHECK - F32 const pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - BOOL const isPressureTooLow = ( pressure < MIN_INLET_WATER_PRESSURE ); - - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_PRESSURE, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE ); +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WATER_QUALITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif -} + { + F32 pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); + BOOL isPressureTooLow = ( pressure < MAX_INLET_WATER_PRESSURE_WARNING_LOW ? TRUE : FALSE ); -/*********************************************************************//** - * @brief - * The checkInletPressureFault function checks inlet water pressure value - * and triggers a machine fault when pressure value is out of allowed range. - * @details Inputs: RO pump inlet pressure sensor value - * @details Outputs: Triggers pressure fault persistent alarm - * @return none - *************************************************************************/ -void checkInletPressureFault( void ) -{ - F32 const pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - BOOL const isPressureTooLow = ( pressure < MIN_INLET_WATER_PRESSURE ); - - checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_FAULT, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE ); + // Alarm per PRS 401 + if ( TRUE == isPressureTooLow ) + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, isPressureTooLow, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + } + else + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + } + } } /*********************************************************************//** @@ -224,14 +223,14 @@ { case PRESSURE_SELF_TEST_STATE_START: getNVRecord2Driver( GET_CAL_PRESSURE_SENOSRS, (U08*)&pressuresCalRecord, sizeof( DG_PRES_SENSORS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_DG_PRESSURE_SENSORS_INVALID_CAL_RECORD ); - pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; + NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_NO_ALARM ); + pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; pressuresSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; break; case PRESSURE_TEST_STATE_IN_PROGRESS: pressuresSelfTestResult = handleSelfTestADCCheck(); - pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; + pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; break; case PRESSURE_TEST_STATE_COMPLETE: @@ -268,16 +267,17 @@ * @return next state *************************************************************************/ static PRESSURE_STATE_T handlePressuresContReadState( void ) -{ - PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; +{ S32 measuredPressureReadingsRaw[ NUM_OF_PRESSURE_SENSORS ]; U32 sensorID; F32 pressureReading; + BOOL isPressureOutOfRange; + PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; // get latest raw pressure readings - measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; // update sums for pressure average calculations measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ]; @@ -289,7 +289,7 @@ if ( TRUE == isNewCalibrationRecordAvailable() ) { getNVRecord2Driver( GET_CAL_PRESSURE_SENOSRS, (U08*)&pressuresCalRecord, sizeof( DG_PRES_SENSORS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_DG_PRESSURE_SENSORS_INVALID_CAL_RECORD ); + NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_NO_ALARM ); } // filter every 200ms @@ -299,15 +299,15 @@ F32 pressuresBeforeCal[ NUM_OF_PRESSURE_SENSORS ]; // Calculate average pressures - F32 avgRoIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; - F32 avgRoOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; - F32 avgDrnIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgRoIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgRoOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; F32 avgDrnOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; // Convert average pressure readings to PSI - pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_INLET ] = avgRoIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = avgRoOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - pressuresBeforeCal[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = avgDrnIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_INLET ] = avgRoIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = avgRoOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressuresBeforeCal[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = avgDrnIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; pressuresBeforeCal[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = avgDrnOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; // Reset average counter @@ -316,11 +316,11 @@ // Apply calibration to the pressure values prior to storing them for ( sensor = 0; sensor < NUM_OF_PRESSURE_SENSORS; sensor++ ) { - pressures[ sensor ].data = pow(pressuresBeforeCal[ sensor ], 4) * pressuresCalRecord.pressureSensors[ sensor ].fourthOrderCoeff + - pow(pressuresBeforeCal[ sensor ], 3) * pressuresCalRecord.pressureSensors[ sensor ].thirdOrderCoeff + - pow(pressuresBeforeCal[ sensor ], 2) * pressuresCalRecord.pressureSensors[ sensor ].secondOrderCoeff + - pressuresBeforeCal[ sensor ] * pressuresCalRecord.pressureSensors[ sensor ].gain + - pressuresCalRecord.pressureSensors[ sensor ].offset; + pressures[ sensor ].data = pow( pressuresBeforeCal[ sensor ], 4 ) * pressuresCalRecord.pressureSensors[ sensor ].fourthOrderCoeff + + pow( pressuresBeforeCal[ sensor ], 3 ) * pressuresCalRecord.pressureSensors[ sensor ].thirdOrderCoeff + + pow( pressuresBeforeCal[ sensor ], 2 ) * pressuresCalRecord.pressureSensors[ sensor ].secondOrderCoeff + + pressuresBeforeCal[ sensor ] * pressuresCalRecord.pressureSensors[ sensor ].gain + + pressuresCalRecord.pressureSensors[ sensor ].offset; } // reset sums for next averaging @@ -332,11 +332,10 @@ for ( sensorID = 0; sensorID < NUM_OF_PRESSURE_SENSORS; sensorID++ ) { - pressureReading = getMeasuredDGPressure( sensorID ) + PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - if ( ( pressureReading < MIN_VALID_PRESSURE_RANGE ) || ( pressureReading > MAX_VALID_PRESSURE_RANGE ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRESSURE_SENSOR_FAULT, sensorID, pressureReading ); - } + pressureReading = getMeasuredDGPressure( sensorID ) + PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + isPressureOutOfRange = ( ( pressureReading < MIN_VALID_PRESSURE_RANGE ) || ( pressureReading > MAX_VALID_PRESSURE_RANGE ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorID, pressureReading ); } return result; @@ -378,13 +377,26 @@ *************************************************************************/ static SELF_TEST_STATUS_T handleSelfTestADCCheck( void ) { + U08 i; + U16 sensorADC; + U16 sensorsADC[ PRESSURE_SENSORS_ADC_CHECK_ARRAY_LEN ]; SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; - U16 const inletPressureADCReading = getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ); - if ( ( 0 == inletPressureADCReading ) || ( inletPressureADCReading >= INT_ADC_FULL_SCALE_BITS ) ) + // Insert the pressure sensors ADC read into the array + sensorsADC[ 0 ] = getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ); + sensorsADC[ 1 ] = getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ); + sensorsADC[ 2 ] = getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ); + sensorsADC[ 3 ] = getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ); + + for ( i = 0; i < PRESSURE_SENSORS_ADC_CHECK_ARRAY_LEN; i++ ) { - result = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRESSURE_SENSOR_FAULT, inletPressureADCReading ); + sensorADC = sensorsADC[ i ]; + + if ( ( 0 == sensorADC ) || ( sensorADC >= INT_ADC_FULL_SCALE_BITS ) ) + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRESSURE_SENSOR_FAULT, i ); + } } return result;