Index: firmware/App/Drivers/PressureSensor.c =================================================================== diff -u -re2e51b0219db0132cebb6f65f3dbd803e1f01e30 -re7fe0454b5b2d39009dc784dc8c156856df8bc86 --- firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision e2e51b0219db0132cebb6f65f3dbd803e1f01e30) +++ firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision e7fe0454b5b2d39009dc784dc8c156856df8bc86) @@ -20,6 +20,7 @@ #include "Messaging.h" #include "PersistentAlarm.h" #include "PressureSensor.h" +#include "TemperatureSensors.h" /** * @addtogroup PressureSensor @@ -29,17 +30,40 @@ // ********** private definitions ********** #define PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Pressure sensors read and error count timeout in milliseconds. +#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 BAR_TO_MMHG ( 750.062F ) ///< Conversion factor for converting bar to mmHg. +#define PRES_SENSORS_READ_ERR_MAX_CNT 255 ///< Pressure sensor read and error max count value + +/// Barometric sensor conversion coefficients +typedef struct +{ + U16 pressureSensitivity; ///< Barometric sensor pressure sensitivity constant. + U16 pressureOffset; ///< Barometric sensor pressure offset constant. + U16 pressureSensitivityTempCoeff; ///< Barometric sensor pressure sensitivity temperature coefficient. + U16 pressureOffsetTempCoeff; ///< Barometric sensor pressure offset temperature coefficient. +} BARO_SENSOR_CONSTS_T; // ********** private data ********** static OVERRIDE_F32_T currentPressureReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor pressure readings (overrideable). static OVERRIDE_F32_T currentPresTempReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor temperature readings (overrideable). static OVERRIDE_U32_T lastPressureReadCounter[ NUM_OF_PRESSURE_SENSORS ]; ///< Last pressure sensor read count (Overrideable). static OVERRIDE_U32_T lastPressureErrorCounter[ NUM_OF_PRESSURE_SENSORS ]; ///< Last pressure sensor error count (Overrideable). +static BARO_SENSOR_CONSTS_T baroConvConsts; ///< Barometric sensor conversion constants. + +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. // ********** private function prototypes ********** static void checkPressureSensors( void ); +static F32 convertBaroPressureReading2mmHg( U32 rawPressure ); +static F32 calculateBaroPressure( U32 pressure ); /*********************************************************************//** * @brief @@ -76,6 +100,12 @@ lastPressureErrorCounter[ i ].override = OVERRIDE_RESET; } + //Initialize baro variable + baroConvConsts.pressureOffset = 0; + baroConvConsts.pressureOffsetTempCoeff = 0; + baroConvConsts.pressureSensitivity = 0; + baroConvConsts.pressureSensitivityTempCoeff = 0; + // Initialize the FPGA persistent alarms initFPGAPersistentAlarm( FPGA_PERS_ERROR_HYDRAULICS_OUTLET_PRESSURE, ALARM_ID_DD_HYD_OUTLET_PRES_TIMEOUT_FAULT, PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS, PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS ); @@ -110,6 +140,7 @@ currentPressureReadings[ PRESSURE_SENSOR_SPENT_DIALYSATE ].data = convertPressureReading2mmHg( getFPGAPDsRawPressure() ); currentPressureReadings[ PRESSURE_SENSOR_FRESH_DIALYSATE ].data = convertPressureReading2mmHg( getFPGAPDfRawPressure() ); currentPressureReadings[ PRESSURE_SENSOR_TRANSMEMBRANE ].data = convertPressureReading2mmHg( getFPGAPtmRawPressure() ); + currentPressureReadings[ PRESSURE_SENSOR_BAROMETRIC ].data = convertBaroPressureReading2mmHg( getFPGABaroPressure() ); // Update and convert raw pressure sensor temperatures to deg C currentPresTempReadings[ PRESSURE_SENSOR_HYDRAULICS_OUTLET ].data = convertPressureTempReading2DegC( getFPGAPnRawTemperature() ); @@ -137,6 +168,52 @@ /*********************************************************************//** * @brief + * The convertBaroPressureReading2mmHg function converts the raw pressure counts + * in to mmHg unit. + * @details \b Inputs: FPGA + * @details \b Outputs: baroConvConsts + * @param rawPressure the raw baro sensor reading from FPGA. + * @return the converted baro pressure (in mmHg). + *************************************************************************/ +static F32 convertBaroPressureReading2mmHg( U32 rawPressure ) +{ + F32 baroPressure = 0.0F; + + baroConvConsts.pressureSensitivity = getFPGABaroPressureSensitivity(); + baroConvConsts.pressureSensitivityTempCoeff = getFPGABaroTempCoeffOfPressSensitvity(); + baroConvConsts.pressureOffset = getFPGABaroPressureOffset(); + baroConvConsts.pressureOffsetTempCoeff = getFPGABaroTempCoeffOfPressOffset(); + baroPressure = calculateBaroPressure( rawPressure ); + + return baroPressure; +} + +/*********************************************************************//** + * @brief + * The calculateBaroPressure function performs the required calculations + * to compute the baro pressure readings. + * @details \b Inputs: baroConvConsts + * @details \b Outputs: none + * @param pressure the raw baro sensor reading from FPGA. + * @return converted baro pressure (in mmHg). + *************************************************************************/ +static F32 calculateBaroPressure( U32 pressure ) +{ + S32 tempDiff = getBaroSensorTemperatureDiff(); + S64 tempOffset = ( baroConvConsts.pressureOffsetTempCoeff * tempDiff ) / TWO_TO_POWER_OF_6; + S64 presOffset = baroConvConsts.pressureOffset * TWO_TO_POWER_OF_17; + S64 offset = presOffset + tempOffset; + S64 tempSensitivity = ( baroConvConsts.pressureSensitivityTempCoeff * tempDiff ) / TWO_TO_POWER_OF_7; + S64 presSensitivity = baroConvConsts.pressureSensitivity * TWO_TO_POWER_OF_16; + S64 sensitivity = tempSensitivity + presSensitivity; + S32 pres = (S32)( ( ( pressure * sensitivity ) / TWO_TO_POWER_OF_21 ) - offset ) / TWO_TO_POWER_OF_15; + F32 presmmHg = ( (F32)pres / (F32)( COUNTS_TO_MILLI_BAR * ONE_BAR_TO_MILLI_BAR ) ) * BAR_TO_MMHG; + + return presmmHg; +} + +/*********************************************************************//** + * @brief * The checkPressureSensors function checks the read and error counters for * each pressure sensor. * @details \b Alarm: ALARM_ID_DD_HYD_OUTLET_PRES_TIMEOUT_FAULT if the @@ -306,35 +383,8 @@ *************************************************************************/ BOOL testPressureSensorReadingsOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = f32ArrayOverride( message, ¤tPressureReadings[0], NUM_OF_PRESSURE_SENSORS - 1 ); - // Verify tester has logged in with DD and override type is valid - if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) - { - U32 sensor = override.index; - - // Verify pressure sensor index of override - if ( sensor < NUM_OF_PRESSURE_SENSORS ) - { - if ( OVERRIDE_OVERRIDE == ovType ) - { - F32 value = override.state.f32; - - currentPressureReadings[ sensor ].ovData = value; - currentPressureReadings[ sensor ].override = OVERRIDE_KEY; - } - else - { - currentPressureReadings[ sensor ].override = OVERRIDE_RESET; - currentPressureReadings[ sensor ].ovData = currentPressureReadings[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; } @@ -350,35 +400,8 @@ *************************************************************************/ BOOL testPressureSensorTemperatureReadingsOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = f32ArrayOverride( message, ¤tPresTempReadings[0], NUM_OF_PRESSURE_SENSORS - 1 ); - // Verify tester has logged in with DD and override type is valid - if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) - { - U32 sensor = override.index; - - // Verify pressure sensor index of override - if ( sensor < NUM_OF_PRESSURE_SENSORS ) - { - if ( OVERRIDE_OVERRIDE == ovType ) - { - F32 value = override.state.f32; - - currentPresTempReadings[ sensor ].ovData = value; - currentPresTempReadings[ sensor ].override = OVERRIDE_KEY; - } - else - { - currentPresTempReadings[ sensor ].override = OVERRIDE_RESET; - currentPresTempReadings[ sensor ].ovData = currentPresTempReadings[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; } @@ -394,35 +417,8 @@ *************************************************************************/ BOOL testPressureSensorReadCounterOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = u32ArrayOverride( message, &lastPressureReadCounter[0], NUM_OF_PRESSURE_SENSORS - 1, 0, PRES_SENSORS_READ_ERR_MAX_CNT ); - // Verify tester has logged in with DD and override type is valid - if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) - { - U32 sensor = override.index; - - // Verify pressure sensor index of override - if ( sensor < NUM_OF_PRESSURE_SENSORS ) - { - if ( OVERRIDE_OVERRIDE == ovType ) - { - U32 value = override.state.u32; - - lastPressureReadCounter[ sensor ].ovData = value; - lastPressureReadCounter[ sensor ].override = OVERRIDE_KEY; - } - else - { - lastPressureReadCounter[ sensor ].override = OVERRIDE_RESET; - lastPressureReadCounter[ sensor ].ovData = lastPressureReadCounter[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; } @@ -438,35 +434,8 @@ *************************************************************************/ BOOL testPressureSensorErrorCounterOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = u32ArrayOverride( message, &lastPressureErrorCounter[0], NUM_OF_PRESSURE_SENSORS - 1, 0, PRES_SENSORS_READ_ERR_MAX_CNT ); - // Verify tester has logged in with DD and override type is valid - if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) - { - U32 sensor = override.index; - - // Verify pressure sensor index of override - if ( sensor < NUM_OF_PRESSURE_SENSORS ) - { - if ( OVERRIDE_OVERRIDE == ovType ) - { - U32 value = override.state.u32; - - lastPressureErrorCounter[ sensor ].ovData = value; - lastPressureErrorCounter[ sensor ].override = OVERRIDE_KEY; - } - else - { - lastPressureErrorCounter[ sensor ].override = OVERRIDE_RESET; - lastPressureErrorCounter[ sensor ].ovData = lastPressureErrorCounter[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; }