Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -26,7 +26,8 @@ #include "Pressures.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" -#include "TaskPriority.h" +#include "TaskPriority.h" +#include "TemperatureSensors.h" #include "Timers.h" /** @@ -39,6 +40,8 @@ #define PUMP_PRESSURE_ZERO 777 ///< ADC counts equivalent to 0 PSI for pump in/out pressure sensors. #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 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 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. @@ -54,47 +57,65 @@ #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. + +static const U32 TWO_TO_POWER_OF_6 = ( 1 << 6 ); ///< 2^6. +static const U32 TWO_TO_POWER_OF_7 = ( 1 << 7 ); ///< 2^7. +static const U32 TWO_TO_POWER_OF_15 = ( 1 << 15 ); ///< 2^15. +static const U32 TWO_TO_POWER_OF_16 = ( 1 << 16 ); ///< 2^16. +static const U32 TWO_TO_POWER_OF_17 = ( 1 << 17 ); ///< 2^17. +static const U32 TWO_TO_POWER_OF_21 = ( 1 << 21 ); ///< 2^21. /// Defined states for the pressures monitor state machine. typedef enum PresOccl_States { - PRESSURE_INIT_STATE = 0, ///< Initialization state - PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state - NUM_OF_PRESSURE_STATES ///< Number of pressure monitor states + PRESSURE_INIT_STATE = 0, ///< Initialization state. + PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state. + NUM_OF_PRESSURE_STATES ///< Number of pressure monitor states. } PRESSURE_STATE_T; /// Defined states for the pressures self-test state machine. typedef enum Pressures_Self_Test_States { - PRESSURE_SELF_TEST_STATE_START = 0, ///< Self-test start state - PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self-test in progress state - PRESSURE_TEST_STATE_COMPLETE, ///< Self-test completed state - NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure self-test states -} PRESSURE_SELF_TEST_STATE_T; + PRESSURE_SELF_TEST_STATE_START = 0, ///< Self-test start state. + PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self-test in progress state. + PRESSURE_TEST_STATE_COMPLETE, ///< Self-test completed state. + NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure self-test states. +} PRESSURE_SELF_TEST_STATE_T; + +/// Barometric sensor conversion coefficients +typedef struct +{ + U16 pressureSensitivity; + U16 pressureOffset; + U16 pressureSensitivityTempCoeff; + U16 pressureOffsetTempCoeff; +} BARO_SENSOR_CONSTS_T; // ********** private data ********** -static PRESSURE_STATE_T pressuresState; ///< current state of pressure monitor state machine. -static U32 pressuresDataPublicationTimerCounter; ///< used to schedule pressure data publication to CAN bus. +static PRESSURE_STATE_T pressuresState; ///< current state of pressure monitor state machine. +static U32 pressuresDataPublicationTimerCounter; ///< used to schedule pressure data publication to CAN bus. static OVERRIDE_U32_T pressuresDataPublishInterval = { PRESSURES_DATA_PUB_INTERVAL, - PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; /// Pressure data publish interval. -static OVERRIDE_F32_T pressures[ NUM_OF_PRESSURE_SENSORS ]; ///< Measured pressure from sensors. + PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; /// Pressure data publish interval. +static OVERRIDE_F32_T pressures[ NUM_OF_PRESSURE_SENSORS ]; ///< Measured pressure from sensors. -static S32 measuredPressureReadingsSum[ NUM_OF_PRESSURE_SENSORS ]; ///< Raw pressure sensor sums for averaging. -static U32 pressureFilterCounter = 0; ///< Used to schedule pressure sensor filtering. +static S32 msrdPressureSum[ NUM_OF_PRESSURE_SENSORS ]; ///< Raw pressure sensor sums for averaging. +static U32 pressureFilterCounter; ///< Used to schedule pressure sensor filtering. +static BARO_SENSOR_CONSTS_T baroConvConsts; ///< Barometric sensor conversion constants. +static PRESSURE_SELF_TEST_STATE_T pressuresSelfTestState; ///< Current pressure self-test state. +static SELF_TEST_STATUS_T pressuresSelfTestResult; ///< Self-test result of the Pressures module. +static DG_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. -static PRESSURE_SELF_TEST_STATE_T pressuresSelfTestState; ///< Current pressure self-test state. -static SELF_TEST_STATUS_T pressuresSelfTestResult; ///< Self-test result of the Pressures module. -static DG_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. - // ********** private function prototypes ********** static PRESSURE_STATE_T handlePressuresInitState( void ); static PRESSURE_STATE_T handlePressuresContReadState( void ); -static void publishPressuresData( void ); - +static void publishPressuresData( void ); static SELF_TEST_STATUS_T handleSelfTestADCCheck( void ); +static F32 calculateBaroPressure( U32 adcSum ); +static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ); +static F32 getBaroPressurePSI( void ); /*********************************************************************//** * @brief @@ -105,21 +126,20 @@ *************************************************************************/ void initPressures( void ) { - U32 i; + U08 i; + pressuresState = PRESSURE_INIT_STATE; + pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; + pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + pressureFilterCounter = 0; for ( i = 0; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - pressures[ i ].data = 0.0; - pressures[ i ].ovData = 0.0; + pressures[ i ].data = 0.0; + pressures[ i ].ovData = 0.0; pressures[ i ].ovInitData = 0.0; - pressures[ i ].override = OVERRIDE_RESET; - - measuredPressureReadingsSum[ i ] = 0; - } - - pressuresState = PRESSURE_INIT_STATE; - pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; - pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + pressures[ i ].override = OVERRIDE_RESET; + msrdPressureSum[ i ] = 0; + } 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 ); @@ -222,15 +242,29 @@ switch ( pressuresSelfTestState ) { 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_NO_ALARM ); - pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; - pressuresSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + { + BOOL calStatus = getNVRecord2Driver( GET_CAL_PRESSURE_SENOSRS, (U08*)&pressuresCalRecord, sizeof( DG_PRES_SENSORS_CAL_RECORD_T ), + NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_NO_ALARM ); + if ( TRUE == calStatus ) + { + pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; + pressuresSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + } + else + { + pressuresSelfTestResult = SELF_TEST_STATUS_FAILED; + } + } break; case PRESSURE_TEST_STATE_IN_PROGRESS: - pressuresSelfTestResult = handleSelfTestADCCheck(); - pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; + baroConvConsts.pressureSensitivity = getFPGABaroPressureSensitivity(); + baroConvConsts.pressureSensitivityTempCoeff = getFPGABaroTempCoeffOfPressSensitvity(); + baroConvConsts.pressureOffset = getFPGABaroPressureOffset(); + baroConvConsts.pressureOffsetTempCoeff = getFPGABaroTempCoeffOfPressOffset(); + pressuresSelfTestResult = handleSelfTestADCCheck(); + pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; + break; case PRESSURE_TEST_STATE_COMPLETE: @@ -268,23 +302,34 @@ *************************************************************************/ static PRESSURE_STATE_T handlePressuresContReadState( void ) { + PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; S32 measuredPressureReadingsRaw[ NUM_OF_PRESSURE_SENSORS ]; - U32 sensorID; + U08 sensorId; F32 pressureReading; - BOOL isPressureOutOfRange; - PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; + BOOL isPressureOutOfRange; - // get latest raw pressure readings - measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + // 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_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 ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ]; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_BAROMETRIC ] = (S32)getFPGABaroPressure(); + // TODO why is this needed? + // Update sums for pressure average calculations + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ]; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ]; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ]; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ]; + msrdPressureSum[ PRESSURE_SENSOR_BAROMETRIC ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_BAROMETRIC ];*/ + + // 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_BAROMETRIC ] += (S32)getFPGABaroPressure(); + // Check if a new calibration is available if ( TRUE == isNewCalibrationRecordAvailable() ) { @@ -295,47 +340,72 @@ // filter every 200ms if ( ++pressureFilterCounter >= PRESSURE_SAMPLES_TO_AVERAGE ) { - U32 sensor; - F32 pressuresBeforeCal[ NUM_OF_PRESSURE_SENSORS ]; + F32 adcSum; + F32 pressureBeforeCal = 0.0; + F32 baroPressure = getBaroPressurePSI(); + pressureFilterCounter = 0; + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) + { + adcSum = (F32)msrdPressureSum[ sensorId ] * PRESSURE_AVERAGE_MULTIPLIER; + + switch ( sensorId ) + { + case PRESSURE_SENSOR_RO_PUMP_INLET: + 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; + pressures[ sensorId ].data = getCalibrationAppliedPressure( sensorId, pressureBeforeCal ); + msrdPressureSum[ sensorId ] = 0; + break; + + case PRESSURE_SENSOR_BAROMETRIC: + pressureBeforeCal = calculateBaroPressure( (U32)adcSum ); + pressures[ sensorId ].data = getCalibrationAppliedPressure( sensorId, pressureBeforeCal ); + msrdPressureSum[ sensorId ] = 0; + break; + } + } + + // TODO remove // 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 avgDrnOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; + /*F32 avgRoIn = (F32)msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgRoOut = (F32)msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnIn = (F32)msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnOut = (F32)msrdPressureSum[ 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_DRAIN_PUMP_OUTLET ] = avgDrnOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - // Reset average counter - pressureFilterCounter = 0; + // Apply calibration to the pressure values prior to storing them - for ( sensor = 0; sensor < NUM_OF_PRESSURE_SENSORS; sensor++ ) + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) { - 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[ sensorId ].data = pow( pressuresBeforeCal[ sensorId ], 4 ) * pressuresCalRecord.pressureSensors[ sensorId ].fourthOrderCoeff + + pow( pressuresBeforeCal[ sensorId ], 3 ) * pressuresCalRecord.pressureSensors[ sensorId ].thirdOrderCoeff + + pow( pressuresBeforeCal[ sensorId ], 2 ) * pressuresCalRecord.pressureSensors[ sensorId ].secondOrderCoeff + + pressuresBeforeCal[ sensorId ] * pressuresCalRecord.pressureSensors[ sensorId ].gain + + pressuresCalRecord.pressureSensors[ sensorId ].offset; } // reset sums for next averaging - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = 0;*/ } - for ( sensorID = 0; sensorID < NUM_OF_PRESSURE_SENSORS; sensorID++ ) + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) { - pressureReading = getMeasuredDGPressure( sensorID ) + PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressureReading = getMeasuredDGPressure( sensorId ) + getBaroPressurePSI(); 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 ); + checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorId, pressureReading ); } return result; @@ -353,15 +423,13 @@ // publish pressure/occlusion data on interval if ( ++pressuresDataPublicationTimerCounter >= getU32OverrideValue( &pressuresDataPublishInterval ) ) { - PRESSURES_DATA_T data; - + PRESSURES_DATA_T data; data.roPumpInletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); data.roPumpOutletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); data.drainPumpInletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_INLET ); data.drainPumpOutletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - broadcastData( MSG_ID_DG_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( PRESSURES_DATA_T ) ); - + broadcastData( MSG_ID_DG_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( PRESSURES_DATA_T ) ); pressuresDataPublicationTimerCounter = 0; } } @@ -401,6 +469,70 @@ return result; } + +/*********************************************************************//** + * @brief + * The calculateBaroPressure function calculates the barometric pressure + * @details Inputs: measuredPressureReadingsSum + * @details Outputs: none + * @param adcSum sum of barometric pressure sensor ADC counts + * @return barometric pressure in millibars + *************************************************************************/ +static F32 calculateBaroPressure( U32 adcSum ) +{ + S32 tempDiff = getBaroSensorTemperatureDiff(); + U64 tempOffset = ( baroConvConsts.pressureOffsetTempCoeff * tempDiff ) / TWO_TO_POWER_OF_6; + U64 presOffset = baroConvConsts.pressureOffset * TWO_TO_POWER_OF_17; + U64 offset = presOffset + tempOffset; + U64 tempSensitivity = ( baroConvConsts.pressureSensitivityTempCoeff * tempDiff ) / TWO_TO_POWER_OF_7; + U64 presSensitivity = baroConvConsts.pressureSensitivity * TWO_TO_POWER_OF_16; + U64 sensitivity = tempSensitivity + presSensitivity; + S32 pres = (S32)( ( ( adcSum * sensitivity ) / TWO_TO_POWER_OF_21 ) - offset ) / TWO_TO_POWER_OF_15; + F32 presPSI = ( (F32)pres / (F32)ONE_BAR_TO_MILLI_BAR ) * ONE_BAR_TO_PSI_CONVERSION; + + return presPSI; +} + +/*********************************************************************//** + * @brief + * The getCalibrationAppliedPressure function applies the calibration values + * to the provided pressure and returns the values. + * @details Inputs: pressuresCalRecord + * @details Outputs: none + * @param sensorId the ID of the pressure sensor + * @param pressure the pressure before applying calibration to it + * @return calibration applied pressure + *************************************************************************/ +static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ) +{ + F32 calPressure = pow( pressure, 4 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].fourthOrderCoeff + + pow( pressure, 3 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].thirdOrderCoeff + + pow( pressure, 2 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].secondOrderCoeff + + pressure * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].gain + + pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].offset; + return calPressure; +} + +/*********************************************************************//** + * @brief + * The getBaroPressurePSI function returns the barometric pressure value. + * @details Inputs: none + * @details Outputs: none + * @return barometric pressure value + *************************************************************************/ +static F32 getBaroPressurePSI( void ) +{ + F32 baroPressure = getF32OverrideValue( &pressures[ PRESSURE_SENSOR_BAROMETRIC ] ); + +#ifndef _RELEASE_ + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + { + baroPressure = PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + } +#endif + + return baroPressure; +} /*************************************************************************