Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -ra6930e0a28c615868a988a7d0e9bf7425a781af6 -r8c3db9c2d3957a1a9d53ad5d20d9594a09bc21be --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision a6930e0a28c615868a988a7d0e9bf7425a781af6) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 8c3db9c2d3957a1a9d53ad5d20d9594a09bc21be) @@ -1,95 +1,79 @@ -/**********************************************************************//** - * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. - * - * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN - * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. - * - * @file TemperatureSensors.c - * - * @date 7-Apr-2020 - * @author Dara Navaei - * - * @brief DG temperature sensors controller - * - **************************************************************************/ +/************************************************************************** +* +* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file TemperatureSensors.c +* +* @author (last) Quang Nguyen +* @date (last) 03-Aug-2020 +* +* @author (original) Dara Navaei +* @date (original) 08-Apr-2020 +* +***************************************************************************/ #include // For temperature calculation #include "TemperatureSensors.h" #include "FPGA.h" #include "SystemCommMessages.h" #include "Timers.h" #include "TaskPriority.h" +#include "TaskGeneral.h" +#include "Utilities.h" /** * @addtogroup TemperatureSensors * @{ */ -// Private defines +// ********** private definitions ********** -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U ///< Primary heater external temperature sensors gain -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U ///< Primary heater external temperature sensors reference resistance -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater external temperature sensors zero degree resistance +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U ///< Primary heater external temperature sensors gain +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U ///< Primary heater external temperature sensors reference resistance +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater external temperature sensors zero degree resistance -#define COND_SENSORS_TEMP_SENSOR_GAIN 16U ///< Conductivity sensor gain -#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U ///< Conductivity sensor reference resistance -#define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Conductivity sensor zero degree resistance +#define COND_SENSORS_TEMP_SENSOR_GAIN 16U ///< Conductivity sensor gain +#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U ///< Conductivity sensor reference resistance +#define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Conductivity sensor zero degree resistance -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gain -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 5110U ///< Trimmer heater external temperature sensors reference resistance -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 100U ///< Trimmer heater external temperature sensors zero degree resistance +#define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gain +#define TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 5110U ///< Trimmer heater external temperature sensors reference resistance +#define TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 100U ///< Trimmer heater external temperature sensors zero degree resistance -#define TEMP_SENSORS_ADC_BITS 24U ///< External temperature sensors ADC bits -#define TEMP_SENSORS_ADC_MAX_COUNT (pow(2,TEMP_SENSORS_ADC_BITS)) ///< Temperature sensors max ADC count +#define TEMP_SENSORS_ADC_BITS 24U ///< External temperature sensors ADC bits +#define TEMP_SENSORS_ADC_MAX_COUNT ( pow(2,TEMP_SENSORS_ADC_BITS) - 1 ) ///< Temperature sensors max ADC count -#define TEMP_EQUATION_COEFF_A (3.9083 * pow(10,-3)) ///< ADC to temperature conversion coefficient A -#define TEMP_EQUATION_COEFF_B (-5.775 * pow(10,-7)) ///< ADC to temperature conversion coefficient B +#define TEMP_EQUATION_COEFF_A (3.9083 * pow(10,-3)) ///< ADC to temperature conversion coefficient A +#define TEMP_EQUATION_COEFF_B (-5.775 * pow(10,-7)) ///< ADC to temperature conversion coefficient B -#define MAX_NUM_OF_RAW_ADC_SAMPLES 32U ///< Number of ADC reads for moving average calculations +#define ADC_FPGA_READ_DELAY 30U ///< Delay in ms before reading the ADC values from FPGA +#define MAX_NUM_OF_RAW_ADC_SAMPLES 32U ///< Number of ADC reads for moving average calculations +#define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors +#define MAX_ALLOWED_UNCHANGED_ADC_READS 4U ///< Maximum number of times that the read of a sensor cannot change +#define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 +#define SHIFT_BITS_BY_5_FOR_AVERAGING 5U ///< Shift the ADCs of the temperature sensors by 5 to average them +#define INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT (5 * MS_PER_SECOND / TASK_GENERAL_INTERVAL) ///< Number of persistence count for temperature sensors out of range error -#define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index +#define MIN_WATER_INPUT_TEMPERATURE 10U ///< Minimum water input temperature +#define MAX_WATER_INPUT_TEMPERATURE 35U ///< Maximum water input temperature -#define ADC_READ_NEXT_INDEX_INDEX 0U ///< ADC array next insertion index -#define ADC_READ_RUNNING_SUM_INDEX 1U ///< ADC array running sum index +#define HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL 20U ///< Time interval that is used to calculate the heaters internal temperature +#define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient +#define HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters cold junction temperature sensors ADC to temperature conversion coefficient -#define ADC_READ_GAIN_INDEX 0U ///< ADC array gain index -#define ADC_READ_REF_RESISTANCE_INDEX 1U ///< ADC array reference resistances index -#define ADC_READ_0_DEG_RESISTANCE_INDEX 2U ///< ADC array zero degree resistance index -#define ADC_READ_2_TEMP_CONVERSION_COEFFICIENT 3U ///< ADC array ADC to temperature conversion coefficient (will be used for heaters internal sensors) +#define K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF 0.041276 ///< K thermocouple temperature to millivolt conversion coefficient +#define SIZE_OF_THERMOCOUPLE_COEFFICIENTS 10U ///< Size of the thermocouple coefficients -#define READ_AND_ERROR_PREV_FPGA_COUNT_INDEX 0U ///< Read and error previous FPGA count index -#define READ_AND_ERROR_INTERNAL_READ_COUNT_INDEX 1U ///< Read and error internal read count index -#define READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX 2U ///< Read and error internal error count index -#define READ_AND_ERROR_PREV_FPGA_ERROR_INDEX 3U ///< Read and error previous FPGA error index -#define NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS 4U ///< Number of read and error array columns +#define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 ///< External temperature sensors error value +#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault -#define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors +#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (MS_PER_SECOND / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval +#define MAX_TEMPERATURE_SENSOR_FAILURES 10 ///< Maximum number of temperature sensor errors within window period before alarm +#define MAX_TEMPERATURE_SENSOR_FAILURE_WINDOW_MS (10 * MS_PER_SECOND) ///< Temperature sensor error window -#define NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS 2U ///< Number of columns in running sum and index array -#define NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS 4U ///< Number of columns in temperature sensors constants - -#define MAX_ALLOWED_UNCHANGED_ADC_READS 4U ///< Maximum number of times that the read of a sensor cannot change - -#define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 ///< External temperature sensors error value -#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault -#define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 -#define MIN_WATER_INPUT_TEMPERATURE 10U ///< Minimum water input temperature -#define MAX_WATER_INPUT_TEMPERATURE 40U ///< Maximum water input temperature -#define ADC_FPGA_READ_DELAY 30U ///< Delay in ms before reading the ADC values from FPGA -#define INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL 100U ///< Time interval that is used to check the input water -#define HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL 20U ///< Time interval that is used to calculate the heaters internal temperature - -#define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient -#define HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters cold junction temperature sensors ADC to temperature conversion coefficient - -#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (5000 / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval - -#define K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF 0.041276 ///< K thermocouple temperature to millivolt conversion coefficient - -#define SHIFT_BITS_BY_5_FOR_AVERAGING 5U ///< Shift the ADCs of the temperature sensors by 5 to average them -#define SIZE_OF_THERMOCOUPLE_COEFFICIENTS 10U ///< Size of the thermocouple coefficients - /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States { @@ -108,44 +92,63 @@ NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states } TEMPSENSORS_EXEC_STATES_T; -// Private variables +/// Temperature sensor struct +typedef struct +{ + F32 gain; ///< ADC gain + F32 refResistance; ///< ADC reference resistance + F32 conversionCoef; ///< ADC conversion coefficient + F32 zeroDegreeResistance; ///< ADC zero degree resistance -static SELF_TEST_STATUS_T tempSensorsSelfTestResult; ///< Self test result of the TemperatureSensors module -static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self test state -static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state -static S32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] - [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Raw ADC reads array -static S32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] - [ NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS ]; ///< Running sum and next ADC index array -static F32 tempSensorsConstants [ NUM_OF_TEMPERATURE_SENSORS ] - [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ]; ///< Temperature sensors constants array -static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] - [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; ///< Read and error counts from FPGA array -static OVERRIDE_F32_T temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature values array -static U32 elapsedTime; ///< Elapsed time variable -static U32 internalHeatersConversionTimer; ///< Conversion timer variable to calculate the heaters internal temperature -static OVERRIDE_U32_T tempSensorsPublishInterval = { TEMP_SENSORS_DATA_PUBLISH_INTERVAL, - TEMP_SENSORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperature sensors publish time interval override -static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter -static F32 tempValuesForPublication [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors data publication array + S32 rawADCReads[ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Raw ADC reads array + S32 adcNextIndex; ///< Next ADC read index + S32 adcRunningSum; ///< ADC running sum -static const F32 positiveTCExpA0 = 0.118597600000E0; ///< K TC positive temperature exponent coefficient A0 -static const F32 positiveTCExpA1 = -0.118343200000E-3; ///< K TC positive temperature exponent coefficient A1 -static const F32 positiveTCExpA2 = 0.126968600000E3; ///< K TC positive temperature exponent coefficient A2 + U32 readCount; ///< Read counts from FPGA + U32 internalErrorCount; ///< Internal error counts + OVERRIDE_F32_T temperatureValues; ///< Temperature values with override +} TEMP_SENSOR_T; + +// ********** private data ********** + +static SELF_TEST_STATUS_T tempSensorsSelfTestResult; ///< Self test result of the TemperatureSensors module +static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self test state +static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state +static TEMP_SENSOR_T tempSensors [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors' data structure + +static U32 elapsedTime; ///< Elapsed time variable +static U32 internalHeatersConversionTimer; ///< Conversion timer variable to calculate the heaters internal temperature + +static U32 inletWaterHighTempCounter; ///< Temperature too high persistence counter +static U32 inletWaterLowTempCounter; ///< Temperature too low persistence counter +static U32 inletWaterTempInRangeCounter; ///< Temperature in range persistence counter + +static F32 tempValuesForPublication [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors data publication array +static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter +static OVERRIDE_U32_T tempSensorsPublishInterval = { TEMP_SENSORS_DATA_PUBLISH_INTERVAL, + TEMP_SENSORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperature sensors publish time interval override + +static const F32 positiveTCExpA0 = 0.118597600000E0; ///< K TC positive temperature exponent coefficient A0 +static const F32 positiveTCExpA1 = -0.118343200000E-3; ///< K TC positive temperature exponent coefficient A1 +static const F32 positiveTCExpA2 = 0.126968600000E3; ///< K TC positive temperature exponent coefficient A2 + +/// Thermocouple correction coefficients for positive cold junction temperature static const F32 positiveTCCoeffs [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { - -0.176004136860E-1, 0.389212049750E-1, - 0.185587700320E-4, -0.994575928740E-7, - 0.318409457190E-9, -0.560728448890E-12, - 0.560750590590E-15,-0.320207200030E-18, - 0.971511471520E-22,-0.121047212750E-25 }; ///< Thermocouple correction coefficients for positive cold junction temperature + -0.176004136860E-1, 0.389212049750E-1, + 0.185587700320E-4, -0.994575928740E-7, + 0.318409457190E-9, -0.560728448890E-12, + 0.560750590590E-15,-0.320207200030E-18, + 0.971511471520E-22,-0.121047212750E-25 +}; +/// Thermcouple inverse coefficient for positive cold junction temperature static const F32 positiveTCInverserCoeffs [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { - 0.0, 2.508355E1, 7.860106E-2, -2.503131E-1, 8.315270E-2, - -1.228034E-2, 9.804036E-4, -4.413030E-5, 1.057734E-6, - -1.052755E-8 }; ///< Thermcouple inverse coefficient for positive cold junction temperature + 0.0, 2.508355E1, 7.860106E-2, -2.503131E-1, 8.315270E-2, + -1.228034E-2, 9.804036E-4, -4.413030E-5, 1.057734E-6, -1.052755E-8 +}; -// Private functions prototypes +// ********** private function prototypes ********** static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ); static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestADCCheck ( void ); @@ -164,26 +167,27 @@ static void publishTemperatureSensorsData ( void ); static DATA_GET_PROTOTYPE( U32, getPublishTemperatureSensorsDataInterval ); -// Public functions +// ********** Public functions ********** /************************************************************************* * @brief * The initTemperatureSensors function initializes the module * @details * Inputs : none - * Outputs : tempSensorsSelfTestResult, tempSensorsSelfTestState, - * tempSensorsExecState, sampleCount, elapsedTime, tempSensorsConstants - * @param none + * Outputs : TemperatureSensors module initialized * @return none *************************************************************************/ void initTemperatureSensors ( void ) { U08 i; - tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; - tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; - elapsedTime = 0; - internalHeatersConversionTimer = 0; - dataPublicationTimerCounter = 0; + tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; + tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; + elapsedTime = 0; + internalHeatersConversionTimer = 0; + inletWaterLowTempCounter = 0; + inletWaterHighTempCounter = 0; + inletWaterTempInRangeCounter = 0; + dataPublicationTimerCounter = 0; /* NOTE: The temperature sensors do not have conversion coefficient. * The conversion coefficients are used for the heaters internal temperature sensors and @@ -192,54 +196,52 @@ * The heaters cold junction sensor has 0.0625 conversion coefficient * The conversion coefficient will be set to 0 for the temperature sensors */ - // Initialize TPi and TPo constants - for ( i = TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR; i < TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; i++ ) + + for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; ++i ) { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = 0; + memset(&tempSensors[ i ], 0x0, sizeof( TEMP_SENSOR_T ) ); } + + // Initialize TPi and TPo constants + tempSensors [ TEMPSENSORS_INLET_PRIMARY_HEATER ].gain = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensors [ TEMPSENSORS_INLET_PRIMARY_HEATER ].refResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_INLET_PRIMARY_HEATER ].zeroDegreeResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensors [ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].gain = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensors [ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].refResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].zeroDegreeResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + // Initialize TD1 and TD2 constants - for ( i = TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; i < TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i++ ) - { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = COND_SENSORS_TEMP_SENSOR_GAIN; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = 0; - } + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].gain = COND_SENSORS_TEMP_SENSOR_GAIN; + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].refResistance = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].zeroDegreeResistance = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; + + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].gain = COND_SENSORS_TEMP_SENSOR_GAIN; + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].refResistance = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].zeroDegreeResistance = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; + // Initialize TRo and TDi constants - for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR; i++ ) - { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = 0; - } + tempSensors [ TEMPSENSORS_OUTLET_REDUNDANCY ].gain = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensors [ TEMPSENSORS_OUTLET_REDUNDANCY ].refResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_OUTLET_REDUNDANCY ].zeroDegreeResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensors [ TEMPSENSORS_INLET_DIALYSATE ].gain = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensors [ TEMPSENSORS_INLET_DIALYSATE ].refResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensors [ TEMPSENSORS_INLET_DIALYSATE ].zeroDegreeResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + // Initialize the heaters internal thermocouples constants - for ( i = TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR; i++ ) - { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF; - } + tempSensors [ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ].conversionCoef = HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF; + tempSensors [ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ].conversionCoef = HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF; + // Initialize the heaters cold junction constants - for ( i = TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP; i++ ) - { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; - } + tempSensors [ TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ].conversionCoef = HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; + tempSensors [ TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ].conversionCoef = HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; + // Initialize the heaters calculated internal temperature sensors. The constants are zero since they will not be used for conversion - for ( i = TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) - { - tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ i ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] = 0; - } + + // Windowed time count for FPGA temperature sensor error + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_TEMPERATURE_SENSOR_ERROR, + MAX_TEMPERATURE_SENSOR_FAILURES, MAX_TEMPERATURE_SENSOR_FAILURE_WINDOW_MS ); } /************************************************************************* @@ -249,7 +251,6 @@ * @details * Inputs : tempSensorsSelfTestState * Outputs : tempSensorsSelfTestState - * @param none * @return tempSensorsSelfTestState *************************************************************************/ SELF_TEST_STATUS_T execTemperatureSensorsSelfTest ( void ) @@ -273,7 +274,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, tempSensorsSelfTestState ); tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_COMPLETE; break; @@ -289,7 +290,6 @@ * @details * Inputs : tempSensorsExecState * Outputs : tempSensorsExecState - * @param none * @return none *************************************************************************/ void execTemperatureSensors ( void ) @@ -306,7 +306,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, tempSensorsExecState ); tempSensorsExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; @@ -316,40 +316,88 @@ /************************************************************************* * @brief + * The checkInletWaterTemperature checks inlet water temperature value + * and triggers an alarm when temperature value is out of allowed range. + * @details + * Inputs : Inlet water temperature value + * Outputs : Trigger alarms when temperature is out of allowed range + * @param none + * @return none + *************************************************************************/ +void checkInletWaterTemperature( void ) +{ + F32 const temperature = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ); + if ( temperature < MIN_WATER_INPUT_TEMPERATURE ) + { + ++inletWaterLowTempCounter; + inletWaterTempInRangeCounter = 0; + if ( inletWaterLowTempCounter > INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, temperature ); + } + } + else if ( temperature > MAX_WATER_INPUT_TEMPERATURE ) + { + ++inletWaterHighTempCounter; + inletWaterTempInRangeCounter = 0; + if ( inletWaterHighTempCounter > INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, temperature ); + } + } + else + { + ++inletWaterTempInRangeCounter; + inletWaterLowTempCounter = 0; + inletWaterHighTempCounter = 0; + if ( inletWaterTempInRangeCounter > INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT ) + { + clearAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE ); + clearAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE ); + } + } +} + +/************************************************************************* + * @brief * The getTemperatureValue function gets the enum of the requested * temperature sensor and returns the temperature * @details * Inputs : none * Outputs : none - * @param sensor + * @param sensor : Temperature sensor index * @return temperature *************************************************************************/ -F32 getTemperatureValue ( U32 sensor ) +F32 getTemperatureValue ( U32 sensorIndex ) { F32 temperature; - if ( temperatureValues [ sensor ].override == OVERRIDE_KEY ) + if ( tempSensors[ sensorIndex ].temperatureValues.override == OVERRIDE_KEY ) { - temperature = temperatureValues [ sensor ].ovData; + temperature = tempSensors[ sensorIndex ].temperatureValues.ovData; } else { - temperature = temperatureValues [ sensor ].data; + temperature = tempSensors[ sensorIndex ].temperatureValues.data; } return temperature; } -// Private functions +// ********** Private functions ********** /************************************************************************* * @brief * The getADC2TempConversion function calculates the temperature from * ADC read from FPGA * @details * Inputs : none - * Outputs : temperatureValues - * @param avgADC, gain, refResistance, zeroDegResistance + * Outputs : none + * @param avgADC : Running average ADC + * @param gain : ADC gain + * @param refResistance : ADC reference resistance + * @param zeroDegResistance : ADC zero degree resistance + * @param adcConversionCoeff : ADC conversion coefficient * @return temperature *************************************************************************/ static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance, F32 adcConversionCoeff ) @@ -379,21 +427,23 @@ * @details * Inputs : temperatureValues * Outputs : temperatureValues - * @param TCIndex, CJIndex + * @param TCIndex : Heater thermo couple index + * @param CJIndex : Heater cold junction index * @return none *************************************************************************/ static void getHeaterInternalTemp ( U32 TCIndex, U32 CJIndex ) { F32 temperature = 0.0; F32 equiVoltage = 0.0; F32 correctedVoltage = 0.0; - F32 TCTemp = temperatureValues [ TCIndex ].data; - F32 CJTemp = temperatureValues [ CJIndex ].data; + F32 TCTemp = tempSensors[ TCIndex ].temperatureValues.data; + F32 CJTemp = tempSensors[ CJIndex ].temperatureValues.data; - // Value in milli-volts + // Value in mV F32 rawVoltage = ( TCTemp - CJTemp ) * K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF; U08 i; + // Check if cold junction is positive if ( CJTemp > 0 ) { for ( i = 0; i < SIZE_OF_THERMOCOUPLE_COEFFICIENTS; i++ ) @@ -410,14 +460,19 @@ temperature = temperature + ( positiveTCInverserCoeffs [ i ] * pow(correctedVoltage, i) ); } } + else + { + //TODO Alarm + temperature = -1.0; + } - if ( TCIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ) + if ( TCIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ) { - temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP ].data = temperature; + tempSensors[ TEMPSENSORS_PRIMARY_HEATER_INTERNAL ].temperatureValues.data = temperature; } - else if ( TCIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SENSOR ) + else { - temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP ].data = temperature; + tempSensors[ TEMPSENSORS_TRIMMER_HEATER_INTERNAL ].temperatureValues.data = temperature; } } @@ -430,7 +485,10 @@ * @details * Inputs : none * Outputs : none - * @param sensorIndex, adc, fpgaError, fpgaCount + * @param sensorIndex : Temperature sensor index + * @param adc : ADC reading from FPGA + * @param fpgaError : FPGA error count + * @param fpgaCount : FPGA read count * @return none *************************************************************************/ static void processTempSnsrsADCRead ( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ) @@ -453,25 +511,28 @@ * @details * Inputs : none * Outputs : none - * @param sensorIndex, adc, fpgaError, fpgaCount + * @param sensorIndex : Temperature sensor index + * @param adc : ADC reading from FPGA + * @param fpgaError : FPGA error count + * @param fpgaCount : FPGA read count * @return none *************************************************************************/ static void processHtrsTempSnsrsADCRead ( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ) { U16 adcConv; S16 convertedADC; - if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR || - sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SENSOR ) + if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE || + sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ) { // Cast the adc from U32 to U16 and shit it to left by 2 adcConv = ( (U16)adc ) << SHIFT_BITS_BY_2; // Cast from U16 to S16 and shift the bits to right by 2 // so if the sign bit is 1, the sign bit is extended convertedADC = ( (S16)adcConv ) >> SHIFT_BITS_BY_2; } - else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR || - sensorIndex == TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR ) + else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION || + sensorIndex == TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ) { // Cast the adc from U32 to U16 and shift it by 4 adcConv = ( (U16)adc ) << SHIFT_BITS_BY_4; @@ -489,13 +550,15 @@ /************************************************************************* * @brief * The isADCReadValid function checks if there is an FPGA error and FPGA - * count. If there is any error in the FPGA error, it raises and alarm. - * If the count has changed and the ADC value is not the same as the previous - * ADC read, it returns a TRUE, signaling that the ADC is valid to be processed + * count. If there is any FPGA, it raises an alarm. If the count has changed + * and the ADC value is not the same as the previous ADC read, it returns a + * TRUE, signaling that the ADC is valid to be processed. * @details - * Inputs : readAndErrorCounts - * Outputs : readAndErrorCounts - * @param sensorIndex, fpgaError, fpgaCount + * Inputs : readCount + * Outputs : readCount, internalErrorCount + * @param sensorIndex : Temperature sensor index + * @param fpgaError : FPGA error count + * @param fpgaCount : FPGA read count * @return isADCValid (BOOL) *************************************************************************/ static BOOL isADCReadValid ( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ) @@ -504,35 +567,29 @@ #ifndef _VECTORCAST_ isADCValid = TRUE; // TODO remove this line. Temporary set to true until FPGA error count is fixed #endif - U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; - - if ( fpgaError != 0 ) + if ( fpgaError == 0 ) { - /*if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) + if ( tempSensors[ sensorIndex ].readCount != fpgaCount ) { - // TODO: alarm? - }*/ - } - else if ( fpgaCount == previousReadCount ) - { - U32 internalErrorCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ]; - - if ( internalErrorCount > MAX_ALLOWED_UNCHANGED_ADC_READS ) - { - // TODO alarm + tempSensors[ sensorIndex ].readCount = fpgaCount; + tempSensors[ sensorIndex ].internalErrorCount = 0; + isADCValid = TRUE; } else { - internalErrorCount = internalErrorCount + 1; - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = internalErrorCount; + ++tempSensors[ sensorIndex ].internalErrorCount; + if ( tempSensors[ sensorIndex ].internalErrorCount > MAX_ALLOWED_UNCHANGED_ADC_READS ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TEMPERATURE_SENSORS_FAULT, sensorIndex ); + } } } - else if ( fpgaCount > previousReadCount ) + else { - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = 0; - isADCValid = TRUE; + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_TEMPERATURE_SENSOR_ERROR ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TEMPERATURE_SENSORS_FAULT, sensorIndex ); + } } return isADCValid; @@ -544,34 +601,31 @@ * index and calculates the running sum and the moving average of the ADCs * The temperatureSensorsADCRead and tempSensorsAvgADCValues are updated * @details - * Inputs : runningSumAndIndex, rawADCReads, sampleCount, temperatureValues - * Outputs : runningSumAndIndex, rawADCReads, sampleCount, temperatureValues - * @param sensorIndex, adc + * Inputs : adcNextIndex, rawADCReads, adcRunningSum + * Outputs : adcNextIndex, rawADCReads, adcRunningSum, temperatureValues + * @param sensorIndex : Temperature sensor index + * @param adc : adc reading from fpga * @return none *************************************************************************/ static void processADCRead ( U32 sensorIndex, S32 adc ) { - // Update the values in the folders - U32 index = runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; - S32 runningSum = runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; - S32 indexValue = rawADCReads [ sensorIndex ] [ index ]; - U32 nextIndex = INC_WRAP( index, ADC_READ_FIRST_READ_INDEX, MAX_NUM_OF_RAW_ADC_SAMPLES - 1 ); - runningSum = runningSum - indexValue + adc; + U32 const index = tempSensors[ sensorIndex ].adcNextIndex; + S32 const indexValue = tempSensors[ sensorIndex ].rawADCReads [ index ]; - rawADCReads [ sensorIndex ] [ index ] = adc; - runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; - runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; + tempSensors[ sensorIndex ].rawADCReads[ index ] = adc; + tempSensors[ sensorIndex ].adcNextIndex = INC_WRAP( index, 0, MAX_NUM_OF_RAW_ADC_SAMPLES - 1 ); + tempSensors[ sensorIndex ].adcRunningSum = tempSensors[ sensorIndex ].adcRunningSum - indexValue + adc; // Calculate the average - F32 avgADCReads = runningSum >> SHIFT_BITS_BY_5_FOR_AVERAGING; + F32 const avgADCReads = tempSensors[ sensorIndex ].adcRunningSum >> SHIFT_BITS_BY_5_FOR_AVERAGING; - F32 temperature = getADC2TempConversion ( avgADCReads, - (U32)tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ], - (U32)tempSensorsConstants [ sensorIndex ] [ ADC_READ_REF_RESISTANCE_INDEX ], - (U32)tempSensorsConstants [ sensorIndex ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ], - tempSensorsConstants [ sensorIndex ] [ ADC_READ_2_TEMP_CONVERSION_COEFFICIENT ] ); + F32 const temperature = getADC2TempConversion( avgADCReads, + (U32)tempSensors [ sensorIndex ].gain, + (U32)tempSensors [ sensorIndex ].refResistance, + (U32)tempSensors [ sensorIndex ].zeroDegreeResistance, + tempSensors [ sensorIndex ].conversionCoef ); - temperatureValues [ sensorIndex ].data = temperature; + tempSensors[ sensorIndex ].temperatureValues.data = temperature; } /************************************************************************* @@ -599,25 +653,21 @@ * Inputs : none * Outputs : none * @param none - * @return state (TEMPSENSORS_SELF_TEST_STATES_T) + * @return TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK (TEMPSENSORS_SELF_TEST_STATES_T) *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestADCCheck ( void ) { - TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK; - // TODo Remove - F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; //TODO remove - U08 i; - for ( i = 0; i < sizeof(avgADCReads); i++ ) - { - U32 avgADC = avgADCReads [ i ]; + S32 const tpiADC = (S32)getFPGATPiTemp(); - if ( avgADC > TEMP_SENSORS_ADC_MAX_COUNT ) - { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE, TEMPSENSORS_SELF_TEST_ADC_CHECK ); - } + BOOL const isLessThanZero = tpiADC <= 0; + BOOL const isGreaterThanFullScale = tpiADC >= TEMP_SENSORS_ADC_MAX_COUNT; + if ( isLessThanZero || isGreaterThanFullScale ) + { + tempSensorsSelfTestResult = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_FAULT, TEMPSENSORS_SELF_TEST_ADC_CHECK ); } - return state; + return TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK; } /************************************************************************* @@ -628,37 +678,36 @@ * Inputs : none * Outputs : none * @param none - * @return state (TEMPSENSORS_SELF_TEST_STATES_T) + * @return TEMPSENSORS_SELF_TEST_COMPLETE (TEMPSENSORS_SELF_TEST_STATES_T) *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestConsistencyCheck ( void ) { - //TODO Consider edge cases for the consistency check - TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_COMPLETE; + S32 const tpiConvertedADC = ( (S32)getFPGATPiTemp() & MASK_OFF_U32_MSB ); + F32 const tpiTemperature = getADC2TempConversion( tpiConvertedADC, + (U32) tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].gain, + (U32) tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].refResistance, + (U32) tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].zeroDegreeResistance, + tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].conversionCoef ); - U32 largestDelta; - U08 i, j; + S32 const tpoConvertedADC = ( (S32)getFPGATPoTemp() & MASK_OFF_U32_MSB ); + F32 const tpoTemperature = getADC2TempConversion( tpoConvertedADC, + (U32) tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].gain, + (U32) tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].refResistance, + (U32) tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].zeroDegreeResistance, + tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].conversionCoef ); - // Check if all the sensors are within a certain degree c - // from each other - for ( i = 0; i < sizeof(temperatureValues); i++ ) + F32 const tempDiff = fabs(tpiTemperature - tpoTemperature); + if ( tempDiff > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) { - for ( j = 0; j < sizeof(temperatureValues); j++ ) - { - if ( i != j ) - { - largestDelta = MAX( largestDelta, fabs(temperatureValues [ i ].data - temperatureValues [ j ].data) ); - } - if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) - { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT, TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK ); - } - } + tempSensorsSelfTestResult = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT, TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK ); } + else + { + tempSensorsSelfTestResult = SELF_TEST_STATUS_PASSED; + } - // TODO finalize the results - tempSensorsSelfTestResult = SELF_TEST_STATUS_PASSED; - - return state; + return TEMPSENSORS_SELF_TEST_COMPLETE; } /************************************************************************* @@ -691,9 +740,8 @@ /************************************************************************* * @brief * The handleExecGetADCValues function reads the ADC values from FPGA and - * at the specified time intervals, checks the temperature range of the - * inlet water and calls other functions to calculate the internal temperature - * of the heaters + * at the specified time intervals and calls other functions to calculate + * the internal temperature of the heaters * @details * Inputs : none * Outputs : internalHeatersConversionTimer, elapsedTime, temperatureValues @@ -702,45 +750,28 @@ *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ) { - TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - // Look at the error counter and the specific error flag to make sure the error is a temp sensor // Add a byte array to have bits for each sensor to find out exactly what sensor failed - processTempSnsrsADCRead ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processTempSnsrsADCRead ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processTempSnsrsADCRead ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processTempSnsrsADCRead ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processTempSnsrsADCRead ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp(), getFPGATHDoErrorCount(), getFPGATHDoReadCount() ); - processTempSnsrsADCRead ( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_INLET_PRIMARY_HEATER, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_OUTLET_PRIMARY_HEATER, getFPGATPoTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1, getFPGACD1Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2, getFPGACD2Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_OUTLET_REDUNDANCY, getFPGATHDoTemp(), getFPGATHDoErrorCount(), getFPGATHDoReadCount() ); + processTempSnsrsADCRead ( TEMPSENSORS_INLET_DIALYSATE, getFPGATDiTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount() ); - processHtrsTempSnsrsADCRead ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, getFPGAPrimaryHeaterTemp(), getFPGAPrimaryHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); - processHtrsTempSnsrsADCRead ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SENSOR, getFPGATrimmerHeaterTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); - processHtrsTempSnsrsADCRead ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGAPRimaryColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); - processHtrsTempSnsrsADCRead ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGATrimmerColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); + processHtrsTempSnsrsADCRead ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE, getFPGAPrimaryHeaterTemp(), getFPGAPrimaryHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); + processHtrsTempSnsrsADCRead ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE, getFPGATrimmerHeaterTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); + processHtrsTempSnsrsADCRead ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION, getFPGAPRimaryColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); + processHtrsTempSnsrsADCRead ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION, getFPGATrimmerColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); - // Check the inlet water is within temperature range at the desired time interval - if ( elapsedTime == 0 ) - { - elapsedTime = getMSTimerCount(); - } - else if ( didTimeout( elapsedTime, INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL ) && - temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].override != OVERRIDE_KEY ) - { - elapsedTime = 0; - F32 inletTemperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].data; - if ( inletTemperature < MIN_WATER_INPUT_TEMPERATURE || inletTemperature >= MAX_WATER_INPUT_TEMPERATURE ) - { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, inletTemperature ); - } - } // Check if time has elapsed to calculate the internal temperature of the heaters if ( internalHeatersConversionTimer >= HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL ) { - getHeaterInternalTemp ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, - TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR); + getHeaterInternalTemp ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE, + TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION); - getHeaterInternalTemp ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SENSOR, - TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR); + getHeaterInternalTemp ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE, + TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION); internalHeatersConversionTimer = 0; } else @@ -750,7 +781,7 @@ publishTemperatureSensorsData(); - return state; + return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; } /************************************************************************* @@ -789,15 +820,14 @@ { if ( ++dataPublicationTimerCounter >= getPublishTemperatureSensorsDataInterval() ) { - U08 i; + U32 i; + for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) { tempValuesForPublication [ i ] = getTemperatureValue ( i ); } - - broadcastTemperatureSensorsData ( (U08*)&tempValuesForPublication, - sizeof(tempValuesForPublication) ); - + broadcastTemperatureSensorsData ( (U08*)(&tempValuesForPublication), + NUM_OF_TEMPERATURE_SENSORS * sizeof(F32) ); dataPublicationTimerCounter = 0; } } @@ -813,20 +843,21 @@ * @details * Inputs : temperatureValues * Outputs : temperatureValues - * @param sensor, temperature + * @param sensorIndex : Temperature sensor index + * @param temperature : Temperature value to override if testing activated * @return result *************************************************************************/ -BOOL testSetMeasuredTemperatureOverride ( U32 sensor, F32 temperature ) +BOOL testSetMeasuredTemperatureOverride ( U32 sensorIndex, F32 temperature ) { BOOL result = FALSE; - if ( sensor < NUM_OF_TEMPERATURE_SENSORS ) + if ( sensorIndex < NUM_OF_TEMPERATURE_SENSORS ) { if ( isTestingActivated() ) { result = TRUE; - temperatureValues [ sensor ].ovData = temperature; - temperatureValues [ sensor ].override = OVERRIDE_KEY; + tempSensors[ sensorIndex ].temperatureValues.ovData = temperature; + tempSensors[ sensorIndex ].temperatureValues.override = OVERRIDE_KEY; } } @@ -840,20 +871,20 @@ * @details * Inputs : temperatureValues * Outputs : temperatureValues - * @param sensor + * @param sensorIndex : Temperature index * @return result *************************************************************************/ -BOOL testResetMeasuredTemperatureOverride ( U32 sensor ) +BOOL testResetMeasuredTemperatureOverride ( U32 sensorIndex ) { BOOL result = FALSE; - if ( sensor < NUM_OF_TEMPERATURE_SENSORS ) + if ( sensorIndex < NUM_OF_TEMPERATURE_SENSORS ) { if ( isTestingActivated() ) { result = TRUE; - temperatureValues [ sensor ].override = OVERRIDE_RESET; - temperatureValues [ sensor ].ovData = temperatureValues [ sensor ].ovInitData; + tempSensors[ sensorIndex ].temperatureValues.override = OVERRIDE_RESET; + tempSensors[ sensorIndex ].temperatureValues.ovData = tempSensors[ sensorIndex ].temperatureValues.ovInitData; } } @@ -867,7 +898,7 @@ * @details * Inputs : tempSensorsPublishInterval * Outputs : tempSensorsPublishInterval - * @param value + * @param value : Publish interval in ms to override if testing activated * @return result *************************************************************************/ BOOL testSetTemperatureSensorsPublishIntervalOverride ( U32 value ) @@ -893,7 +924,6 @@ * @details * Inputs : tempSensorsPublishInterval * Outputs : tempSensorsPublishInterval - * @param none * @return result *************************************************************************/ BOOL testResetTemperatureSensorsPublishIntervalOverride ( void )