Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r750a8b61a1e9a63823ecc6ed441cd01524ffc02b -r95eefee71702fbf031025dc35ebaf553dfb050b7 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 750a8b61a1e9a63823ecc6ed441cd01524ffc02b) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 95eefee71702fbf031025dc35ebaf553dfb050b7) @@ -50,8 +50,10 @@ #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 @@ -120,21 +122,20 @@ pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, 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_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 TURE is pressure is in range otherwise, FALSE + * @return none *************************************************************************/ -BOOL isInletPressureInRange( void ) +void checkInletWaterPressure( void ) { #ifndef DISABLE_WATER_QUALITY_CHECK - BOOL status = TRUE; F32 pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); BOOL isPressureTooLow = ( pressure < MAX_INLET_WATER_PRESSURE_WARNING_LOW ? TRUE : FALSE ); @@ -147,13 +148,6 @@ { checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); } - - if ( TRUE == isAlarmActive( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE ) ) - { - status = FALSE; - } - - return status; #endif } @@ -227,13 +221,13 @@ 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; + 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: @@ -270,16 +264,18 @@ * @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 ]; @@ -301,15 +297,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 @@ -318,11 +314,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 @@ -334,11 +330,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; @@ -380,13 +375,27 @@ *************************************************************************/ 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;