Index: firmware/App/Monitors/Pressure.c =================================================================== diff -u -re2e51b0219db0132cebb6f65f3dbd803e1f01e30 -r67731d57db9a620418b3b848d8f75ff204902c36 --- firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision e2e51b0219db0132cebb6f65f3dbd803e1f01e30) +++ firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision 67731d57db9a620418b3b848d8f75ff204902c36) @@ -15,25 +15,43 @@ * ***************************************************************************/ -#include "AlarmMgmtDD.h" +#include "AlarmMgmtDD.h" #include "Messaging.h" #include "Pressure.h" -#include "TaskPriority.h" - -/** - * @addtogroup Pressure - * @{ - */ - -// ********** private definitions ********** +#include "PersistentAlarm.h" +#include "TaskPriority.h" +#include "Valves.h" +/** + * @addtogroup Pressure + * @{ + */ + +// ********** private definitions ********** +//TODO : Increasing the publish interval #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 ( 5 ) ///< Data publish counter start count. -#define PRESSURE_SAMPLE_FILTER_MS ( 200 ) ///< Filter pressure data for given time -#define PRESSURE_TEMP_SAMPLE_FILTER_MS ( 200 ) ///< Filter temperature data for given time +#define PRESSURE_SAMPLE_FILTER_MS ( 50 ) ///< Filter pressure data for given time +#define PRESSURE_TEMP_SAMPLE_FILTER_MS ( 50 ) +//#define PRESSURE_SAMPLE_FILTER_MS ( 200 ) ///< Filter pressure data for given time +//#define PRESSURE_TEMP_SAMPLE_FILTER_MS ( 200 ) ///< Filter temperature data for given time #define SIZE_OF_PRESSURE_ROLLING_AVG ( PRESSURE_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered pressure moving average. #define SIZE_OF_PRESSURETEMP_ROLLING_AVG ( PRESSURE_TEMP_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered pressure temprature w/ 1 second moving average. +#define MMHG_TO_PSI_CONVERSION 0.0193368F ///< MMHG to PSI conversion. +#define BAR_TO_PSI_CONVERSION 14.5038F ///< MMHG to PSI conversion. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 20.0F ///< Minimum allowed Input low pressure value in psig. +#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig. +#define MIN_INLET_PRESSURE_TO_CLEAR_WARINING_PSIG 24.0F ///< Minimum allowed Input low pressure value in psig ( to clear alarm) +#define MIN_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 78.0F ///< Minimum allowed Input high pressure value in psig. +#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 20 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 10 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. + +#define MIN_INLET_WATER_PRES_OUT_WARNING_LOW_PSIG 10.0F ///< Minimum allowed output low pressure value in psig. +#define MAX_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG 20.0F ///< Maximum allowed output high pressure value in psig. +#define MIN_INLET_PRES_OUT_TO_CLEAR_WARINING_PSIG 11.0F ///< Minimum allowed output low pressure value in psig ( to clear alarm) +#define MIN_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG 18.0F ///< Minimum allowed output high pressure value in psig. + /// Defined states for the pressures monitor state machine. typedef enum PresMonitor_States { @@ -59,23 +77,26 @@ F32 pressureTempReadingsTotal; ///< Rolling total - used to calc average. U32 pressureTempReadingsCount; ///< Number of samples in rolling average buffer }FILTER_PRESSURE_TEMPERATURE_READINGS_T; - -// ********** private data ********** +// ********** private data ********** + static OVERRIDE_F32_T filteredcurrentPressureReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< filtered current pressure sensor pressure readings (overrideable). static OVERRIDE_F32_T filteredcurrentPresTempReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< filtered current pressure sensor temperature readings (overrideable). +//static DD_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. static FILTER_PRESSURE_READINGS_T filteredPressureReadings[NUM_OF_PRESSURE_SENSORS]; ///< Filtered pressure reading for pressure sensors. static FILTER_PRESSURE_TEMPERATURE_READINGS_T filteredPressureTempReadings[NUM_OF_PRESSURE_SENSORS]; ///< Filtered pressure reading for pressure sensors. 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. - -// ********** private function prototypes ********** + PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; ///< Pressure data publish interval. +// ********** private function prototypes ********** + static void filterPressureSensorReadings( void ); static void filterPressureSensorTemperatureReadings( void ); +//static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ); +static F32 getConvertedPressure( PRESSURE_SENSORS_T sensor, F32 pressure ); static PRESSURE_STATE_T handlePressuresInitState( void ); static PRESSURE_STATE_T handlePressuresContReadState( void ); static void publishPressuresData( void ); @@ -136,7 +157,6 @@ //Filter pressure sensor temperature reading filterPressureSensorTemperatureReadings(); - } /*********************************************************************//** @@ -198,37 +218,37 @@ return result; } - -/*********************************************************************//** - * @brief + +/*********************************************************************//** + * @brief * The execPressureSensor function executes the pressure monitor state machine - * and publish pressure data. - * @details \b Inputs: pressuresState + * and publish pressure data. + * @details \b Inputs: pressuresState * @details \b Outputs: pressuresState - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if invalid pressure state seen - * @return none - *************************************************************************/ -void execPressureSensor( void ) -{ - // state machine - switch ( pressuresState ) - { - case PRESSURE_INIT_STATE: - pressuresState = handlePressuresInitState(); - break; - - case PRESSURE_CONTINUOUS_READ_STATE: - pressuresState = handlePressuresContReadState(); - break; - - default: + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if invalid pressure state seen + * @return none + *************************************************************************/ +void execPressureSensor( void ) +{ + // state machine + switch ( pressuresState ) + { + case PRESSURE_INIT_STATE: + pressuresState = handlePressuresInitState(); + break; + + case PRESSURE_CONTINUOUS_READ_STATE: + pressuresState = handlePressuresContReadState(); + break; + + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_PRESSURE_INVALID_EXEC_STATE, pressuresState ) - pressuresState = PRESSURE_INIT_STATE; - break; - } - - // publish pressure/occlusion data on interval - publishPressuresData(); + pressuresState = PRESSURE_INIT_STATE; + break; + } + + // publish pressure/occlusion data on interval + publishPressuresData(); } /*********************************************************************//** @@ -241,11 +261,12 @@ *************************************************************************/ static void filterPressureSensorReadings( void ) { - U32 i; + PRESSURE_SENSORS_T i; - for ( i = (U32)PRESSURE_SENSOR_FIRST; i < (U32)NUM_OF_PRESSURE_SENSORS; i++ ) + for ( i = PRESSURE_SENSOR_FIRST; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - F32 pressure = getPressure( (PRESSURE_SENSORS_T)i ); + F32 pressureinPSI = getPressure( i ); + F32 pressure = getConvertedPressure( i, pressureinPSI ); if ( filteredPressureReadings[i].pressureReadingsCount >= SIZE_OF_PRESSURE_ROLLING_AVG ) { @@ -269,11 +290,11 @@ *************************************************************************/ static void filterPressureSensorTemperatureReadings( void ) { - U32 i; + PRESSURE_SENSORS_T i; - for ( i = (U32)PRESSURE_SENSOR_FIRST; i < (U32)NUM_OF_PRESSURE_SENSORS; i++ ) + for ( i = PRESSURE_SENSOR_FIRST; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - F32 pressureTemperature = getPressureSensorTemperature( (PRESSURE_SENSORS_T)i ); + F32 pressureTemperature = getPressureSensorTemperature( i ); if ( filteredPressureTempReadings[i].pressureTempReadingsCount >= SIZE_OF_PRESSURETEMP_ROLLING_AVG ) { @@ -286,77 +307,122 @@ filteredcurrentPresTempReadings[i].data = filteredPressureTempReadings[i].pressureTempReadingsTotal / (F32)filteredPressureTempReadings[i].pressureTempReadingsCount; } } - -/*********************************************************************//** - * @brief - * The handlePressuresInitState function handles the pressures initialize state - * of the pressures monitor state machine. - * @details \b Inputs: none - * @details \b Outputs: none - * @return next state - *************************************************************************/ -static PRESSURE_STATE_T handlePressuresInitState( void ) -{ - return PRESSURE_CONTINUOUS_READ_STATE; -} - -/*********************************************************************//** - * @brief - * The handlePressuresContReadState function handles the continuous read state - * of the pressures monitor state machine. - * @details \b Inputs: pressureFilterCounter - * @details \b Outputs: pressure sensor values updated - * @return next state - *************************************************************************/ -static PRESSURE_STATE_T handlePressuresContReadState( void ) + +/*********************************************************************//** + * @brief + * The getConvertedPressure function converts the pressure in PSI unit and + * calibration applied to it. + * @details \b Inputs: none + * @details \b Outputs: none + * @param sensor sesnor id for the calibration to be applied for + * @param pressure pressure (mmHG) to be converted in PSI + * @return converted pressure in PSI. + *************************************************************************/ +static F32 getConvertedPressure( PRESSURE_SENSORS_T sensor, F32 pressure ) { + F32 baroPressurePSI = getPressure( BARO_PRES ) * MMHG_TO_PSI_CONVERSION; + + // calibrated pressure + //F32 calPressure = getCalibrationAppliedPressure( sensor, pressure ); + + return pressure; + //return calPressure; +} + +/*********************************************************************//** + * @brief + * The getCalibrationAppliedPressure function applies the calibration values + * to the provided pressure and returns the values. + * @details \b Inputs: pressuresCalRecord + * @details \b 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 handlePressuresInitState function handles the pressures initialize state + * of the pressures monitor state machine. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next state + *************************************************************************/ +static PRESSURE_STATE_T handlePressuresInitState( void ) +{ + return PRESSURE_CONTINUOUS_READ_STATE; +} + +/*********************************************************************//** + * @brief + * The handlePressuresContReadState function handles the continuous read state + * of the pressures monitor state machine. + * @details \b Inputs: pressureFilterCounter + * @details \b Outputs: pressure sensor values updated + * @return next state + *************************************************************************/ +static PRESSURE_STATE_T handlePressuresContReadState( void ) +{ PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; //Get raw pressure value readPressureSensors(); // filter pressure readings - filterPressureSensors(); - - return result; + filterPressureSensors(); + + return result; } -/*********************************************************************//** - * @brief - * The publishPressuresData function publishes DD pressures data at a set interval. - * @details \b Inputs: pressuresDataPublicationTimerCounter +/*********************************************************************//** + * @brief + * The publishPressuresData function publishes DD pressures data at a set interval. + * @details \b Inputs: pressuresDataPublicationTimerCounter * @details \b Outputs: pressuresDataPublicationTimerCounter - * @details \b Message \b Sent: MSG_ID_DD_PRESSURES_DATA to publish pressure data. - * @return none - *************************************************************************/ -static void publishPressuresData( void ) -{ - // publish pressure/occlusion data on interval - if ( ++pressuresDataPublicationTimerCounter >= getU32OverrideValue( &pressuresDataPublishInterval ) ) + * @details \b Message \b Sent: MSG_ID_DD_PRESSURES_DATA to publish pressure data. + * @return none + *************************************************************************/ +static void publishPressuresData( void ) +{ + // publish pressure/occlusion data on interval + if ( ++pressuresDataPublicationTimerCounter >= getU32OverrideValue( &pressuresDataPublishInterval ) ) { PRESSURE_TEMP_DATA_T data; - - data.filteredHydraulicsOutletPressure = getFilteredPressure( PRESSURE_SENSOR_HYDRAULICS_OUTLET ); - data.filteredBibagPressure = getFilteredPressure( PRESSURE_SENSOR_BIBAG ); - data.filteredSpentdialysatePressure = getFilteredPressure( PRESSURE_SENSOR_SPENT_DIALYSATE ); - data.filteredFreshdialysatePressure = getFilteredPressure( PRESSURE_SENSOR_FRESH_DIALYSATE ); - data.filteredTransmembranePressure = getFilteredPressure( PRESSURE_SENSOR_TRANSMEMBRANE ); - data.filteredHydraulicsOutletTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_HYDRAULICS_OUTLET ); - data.filteredBibagTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_BIBAG ); - data.filteredSpentdialysateTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_SPENT_DIALYSATE ); - data.filteredFreshdialysateTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_FRESH_DIALYSATE ); - data.filteredTransmembraneTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_TRANSMEMBRANE ); - pressuresDataPublicationTimerCounter = 0; - - broadcastData( MSG_ID_DD_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( PRESSURE_TEMP_DATA_T ) ); - } -} - - -/************************************************************************* - * TEST SUPPORT FUNCTIONS - *************************************************************************/ + data.m1Pressure = getFilteredPressure( M1_PRES ); + data.m3Pressure = getFilteredPressure( M3_PRES ); + data.d9Pressure = getFilteredPressure( D9_PRES ); + data.d66Pressure = getFilteredPressure( D66_PRES ); + data.d51Pressure = getFilteredPressure( D51_PRES ); + data.d18Pressure = getFilteredPressure( D18_PRES ); + data.d41Pressure = getFilteredPressure( D41_PRES ); + data.m1PresTemp = getFilteredPressureSensorTemperature( M1_PRES ); + data.m3PresTemp = getFilteredPressureSensorTemperature( M3_PRES ); + data.d9PresTemp = getFilteredPressureSensorTemperature( D9_PRES ); + data.d66PresTemp = getFilteredPressureSensorTemperature( D66_PRES ); + data.d51PresTemp = getFilteredPressureSensorTemperature( D51_PRES ); + data.d18PresTemp = getFilteredPressureSensorTemperature( D18_PRES ); + data.d41PresTemp = getFilteredPressureSensorTemperature( D41_PRES ); + pressuresDataPublicationTimerCounter = 0; + broadcastData( MSG_ID_DD_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( PRESSURE_TEMP_DATA_T ) ); + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + /*********************************************************************//** * @brief * The testPressureSensorDataPublishIntervalOverride function overrides the @@ -369,29 +435,8 @@ *************************************************************************/ BOOL testPressureSensorDataPublishIntervalOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &override ); + BOOL result = u32BroadcastIntervalOverride( message, &pressuresDataPublishInterval, TASK_PRIORITY_INTERVAL ); - // Verify tester has logged in with DD and override type is valid - if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) - { - if ( OVERRIDE_OVERRIDE == ovType ) - { - U32 intvl = override.state.u32 / TASK_PRIORITY_INTERVAL; - - result = TRUE; - pressuresDataPublishInterval.ovData = intvl; - pressuresDataPublishInterval.override = OVERRIDE_KEY; - } - else - { - result = TRUE; - pressuresDataPublishInterval.override = OVERRIDE_RESET; - pressuresDataPublishInterval.ovData = pressuresDataPublishInterval.ovInitData; - } - } - return result; } @@ -407,35 +452,8 @@ *************************************************************************/ BOOL testPressureSensorFilteredReadingsOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = f32ArrayOverride( message, &filteredcurrentPressureReadings[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; - - filteredcurrentPressureReadings[ sensor ].ovData = value; - filteredcurrentPressureReadings[ sensor ].override = OVERRIDE_KEY; - } - else - { - filteredcurrentPressureReadings[ sensor ].override = OVERRIDE_RESET; - filteredcurrentPressureReadings[ sensor ].ovData = filteredcurrentPressureReadings[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; } @@ -451,36 +469,9 @@ *************************************************************************/ BOOL testPressureSensorFilteredTemperatureReadingsOverride( MESSAGE_T *message ) { - BOOL result = FALSE; - TEST_OVERRIDE_ARRAY_PAYLOAD_T override; - OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); + BOOL result = f32ArrayOverride( message, &filteredcurrentPresTempReadings[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; - - filteredcurrentPresTempReadings[ sensor ].ovData = value; - filteredcurrentPresTempReadings[ sensor ].override = OVERRIDE_KEY; - } - else - { - filteredcurrentPresTempReadings[ sensor ].override = OVERRIDE_RESET; - filteredcurrentPresTempReadings[ sensor ].ovData = filteredcurrentPresTempReadings[ sensor ].ovInitData; - } - - result = TRUE; - } - } - return result; } - -/**@}*/ + +/**@}*/