Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -rd19c1bf780832d5c4617a9038bd87ec8f49136ee -r4b25bf00656b9067a13541014fa1333386a7ed95 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision d19c1bf780832d5c4617a9038bd87ec8f49136ee) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 4b25bf00656b9067a13541014fa1333386a7ed95) @@ -8,7 +8,7 @@ * @file Pressures.c * * @author (last) Dara Navaei -* @date (last) 09-Oct-2022 +* @date (last) 22-Nov-2022 * * @author (original) Sean * @date (original) 04-Apr-2020 @@ -28,7 +28,8 @@ #include "TaskGeneral.h" #include "TaskPriority.h" #include "TemperatureSensors.h" -#include "Timers.h" +#include "Timers.h" +#include "Utilities.h" /** * @addtogroup DGPressures @@ -37,12 +38,14 @@ // ********** private definitions ********** -#define PUMP_PRESSURE_ZERO 759 ///< ADC counts equivalent to 0 PSI for pump in/out pressure sensors. +#define PUMP_PRESSURE_ZERO 759 ///< ADC counts equivalent to 0 PSI for pump in/out pressure sensors. #define PUMP_PRESSURE_PSIA_PER_COUNT 0.06583F ///< PSIA per ADC count conversion factor for pump in/out pressure sensors. +#define PUMP_V3_PRESSURE_ZERO 782 ///< Beta ADC counts equivalent to 0 psi for pump in/out pressure sensors. +#define PUMP_V3_PRESSURE_PSIA_PER_COUNT 0.065359F ///< Beta PSIA 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. #define ONE_BAR_TO_PSI_CONVERSION 14.5F ///< 1 bar to PSI conversion. -#define ONE_BAR_TO_MILLI_BAR 1000 ///< 1 bar to milli bar conversion. -#define COUNTS_TO_MILLI_BAR 100 ///< Counts to milli bar conversion. +#define ONE_BAR_TO_MILLI_BAR 1000 ///< 1 bar to milli-bar conversion. +#define COUNTS_TO_MILLI_BAR 100 ///< Counts to milli-bar conversion. #define PRESSURE_SAMPLES_TO_AVERAGE ( 200 / TASK_PRIORITY_INTERVAL ) ///< Averaging pressure data over the reporting interval. #define PRESSURE_AVERAGE_MULTIPLIER ( 1.0F / (F32)PRESSURE_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. @@ -52,8 +55,7 @@ #define MIN_VALID_BARO_PRESSURE_PSIA 10.1F ///< Minimum valid barometric pressure in psia. #define MAX_VALID_BARO_PRESSURE_PSIA 15.4F ///< Maximum valid barometric pressure in psia. -#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 MIN_INLET_WATER_PRESSURE_WARNING_LOW 14.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. @@ -117,6 +119,7 @@ static F32 calculateBaroPressure( U32 adcSum ); static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ); static F32 getBaroPressurePSI( void ); +static void monitorPressureSensors( void ); /*********************************************************************//** * @brief @@ -162,16 +165,16 @@ #endif { F32 pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - BOOL isPressureTooLow = ( pressure < MAX_INLET_WATER_PRESSURE_WARNING_LOW ? TRUE : FALSE ); + BOOL isPressureTooLow = ( pressure < MIN_INLET_WATER_PRESSURE_WARNING_LOW ? TRUE : FALSE ); // Alarm per PRS 401 if ( TRUE == isPressureTooLow ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, isPressureTooLow, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE_WARNING_LOW ); } else { - checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MIN_INLET_WATER_PRESSURE_WARNING_LOW ); } } } @@ -301,15 +304,23 @@ static PRESSURE_STATE_T handlePressuresContReadState( void ) { PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; + U32 zeroPressureOffset = PUMP_PRESSURE_ZERO; + F32 count2PressureConv = PUMP_PRESSURE_PSIA_PER_COUNT; U08 sensorId; - F32 pressureReading; - BOOL isPressureOutOfRange; +#ifndef _RELEASE_ + if ( ( HW_CONFIG_BETA == getHardwareConfigStatus() ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + { + zeroPressureOffset = PUMP_V3_PRESSURE_ZERO; + count2PressureConv = PUMP_V3_PRESSURE_PSIA_PER_COUNT; + } +#endif + // Update sums for pressure average calculations - msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - zeroPressureOffset; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - zeroPressureOffset; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - zeroPressureOffset; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - zeroPressureOffset; msrdPressureSum[ PRESSURE_SENSOR_BAROMETRIC ] += (S32)( getFPGABaroPressure() & MASK_OFF_U32_MSB ); // Check if a new calibration is available @@ -337,7 +348,7 @@ case PRESSURE_SENSOR_RO_PUMP_OUTLET: case PRESSURE_SENSOR_DRAIN_PUMP_OUTLET: case PRESSURE_SENSOR_DRAIN_PUMP_INLET: - pressureBeforeCal = ( adcSum * PUMP_PRESSURE_PSIA_PER_COUNT ) - baroPressure; + pressureBeforeCal = ( adcSum * count2PressureConv ) - baroPressure; pressures[ sensorId ].data = getCalibrationAppliedPressure( sensorId, pressureBeforeCal ); msrdPressureSum[ sensorId ] = 0; break; @@ -361,35 +372,7 @@ } } - for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) - { - switch ( sensorId ) - { - case PRESSURE_SENSOR_RO_PUMP_INLET: - case PRESSURE_SENSOR_RO_PUMP_OUTLET: - case PRESSURE_SENSOR_DRAIN_PUMP_INLET: - case PRESSURE_SENSOR_DRAIN_PUMP_OUTLET: - pressureReading = getMeasuredDGPressure( sensorId ) + getBaroPressurePSI(); - isPressureOutOfRange = ( ( pressureReading < MIN_VALID_PRESSURE_RANGE_PSIA ) || ( pressureReading > MAX_VALID_PRESSURE_RANGE_PSIA ) ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorId, pressureReading ); - break; - - case PRESSURE_SENSOR_BAROMETRIC: - if ( baroConvConsts.pressureSensitivity != 0 ) - { - pressureReading = getBaroPressurePSI(); - isPressureOutOfRange = ( ( pressureReading < MIN_VALID_BARO_PRESSURE_PSIA ) || ( pressureReading > MAX_VALID_BARO_PRESSURE_PSIA ) ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DG_BARO_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorId, pressureReading ); - } - break; - -#ifndef _VECTORCAST_ - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_PRESSURE_SENSOR_SELECTED, sensorId ); - break; -#endif - } - } + monitorPressureSensors(); return result; } @@ -510,14 +493,72 @@ F32 baroPressure = getF32OverrideValue( &pressures[ PRESSURE_SENSOR_BAROMETRIC ] ); #ifndef _RELEASE_ - if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + if ( ( HW_CONFIG_BETA == getHardwareConfigStatus() ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) { baroPressure = PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; } #endif return baroPressure; } + +/*********************************************************************//** + * @brief + * The monitorPressureSensors function monitors the pressure sensors to be + * in range. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +static void monitorPressureSensors( void ) +{ + U08 sensorId; + BOOL isPressureOutOfRange = FALSE; + BOOL isCurrentPressureOut = FALSE; + BOOL isBaroOutOfRange = FALSE; + F32 pressureOutID = 0.0F; + F32 pressureReading = 0.0F; + + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) + { + switch ( sensorId ) + { + case PRESSURE_SENSOR_RO_PUMP_INLET: + case PRESSURE_SENSOR_RO_PUMP_OUTLET: + case PRESSURE_SENSOR_DRAIN_PUMP_INLET: + case PRESSURE_SENSOR_DRAIN_PUMP_OUTLET: + // Get the pressure and convert it back to absolute by adding back the baro pressure value + // Check if the pressure is out of the upper or lower range + // Bitwise OR the current pressure sensor with the total pressure sensor to persistent alarm check + // Remember the ID of the pressure sensor that is out of range. The ID is converted to float since the check persistent alarm function + // accepts only floats. + pressureReading = getMeasuredDGPressure( sensorId ) + getBaroPressurePSI(); + isCurrentPressureOut = ( ( pressureReading < MIN_VALID_PRESSURE_RANGE_PSIA ) || ( pressureReading > MAX_VALID_PRESSURE_RANGE_PSIA ) ? TRUE : FALSE ); + isPressureOutOfRange |= isCurrentPressureOut; + pressureOutID = ( TRUE == isCurrentPressureOut ? (F32)sensorId : pressureOutID ); + break; + + case PRESSURE_SENSOR_BAROMETRIC: + if ( baroConvConsts.pressureSensitivity != 0 ) + { + // Check the baro and alarm if out of range. Make sure the conversion coefficients of the sensor has been read and received from FPGA + pressureReading = getBaroPressurePSI(); + isBaroOutOfRange = ( ( pressureReading < MIN_VALID_BARO_PRESSURE_PSIA ) || ( pressureReading > MAX_VALID_BARO_PRESSURE_PSIA ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_DG_BARO_PRESSURE_OUT_OF_RANGE, isBaroOutOfRange, (F32)sensorId, pressureReading ); + } + break; + +#ifndef _VECTORCAST_ + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_PRESSURE_SENSOR_SELECTED, sensorId ); + break; +#endif + } + } + + // Once the sensors were all checked to be out of range, check the persistent alarm + checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, pressureOutID, pressureReading ); +} /*************************************************************************