Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r4ac01748d5c61f07470acfc6ae535d770f7e872d -r4ed5e33f4bb86748661754208699e66eca184792 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 4ac01748d5c61f07470acfc6ae535d770f7e872d) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 4ed5e33f4bb86748661754208699e66eca184792) @@ -13,46 +13,55 @@ * @brief DG temperature sensors controller * **************************************************************************/ -#include +#include // For temperature calculation #include "TemperatureSensors.h" #include "FPGA.h" -// TODO Clean up -// TODO Add Doxygen comments - // Private variables -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U +#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 -#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U -#define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U +#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 -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 5110U -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 100U +#define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gains +#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 -#define TEMP_SENSORS_ADC_MAX_COUNT (pow(2,TEMP_SENSORS_ADC_BITS)) +#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)) -#define TEMP_EQUATION_COEFF_B (-5.775 * pow(10,-7)) +#define NUMBER_OF_TEMP_SENSORS 8U ///< Number of temperature sensors +#define NUMBER_OF_ADC_READS 20U ///< Number of ADC reads for moving average calculations -// TODO Change this to 8 to add the internal heater sensors -#define NUMBER_OF_TEMP_SENSORS 6U -#define NUMBER_OF_ADC_READS 20U - -#define ADC_READ_FIRST_READ_INDEX 0U +#define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index // The last index is calculated by having the number of ADC reads // plus 1 that is read current index -#define ADC_READ_LAST_READ_INDEX (NUMBER_OF_ADC_READS - 1) -#define ADC_READ_NEXT_INDEX_INDEX (ADC_READ_LAST_READ_INDEX + 1) -#define ADC_READ_RUNNING_SUM_INDEX (ADC_READ_NEXT_INDEX_INDEX + 1) +#define ADC_READ_LAST_READ_INDEX (NUMBER_OF_ADC_READS - 1) ///< ADC array last ADC read index +#define ADC_READ_NEXT_INDEX_INDEX (ADC_READ_LAST_READ_INDEX + 1) ///< ADC array next insertion index +#define ADC_READ_RUNNING_SUM_INDEX (ADC_READ_NEXT_INDEX_INDEX + 1) ///< ARC array running sum index +#define ADC_READ_GAIN_INDEX (ADC_READ_RUNNING_SUM_INDEX + 1) +#define ADC_READ_REF_RESISTANCE_INDEX (ADC_READ_GAIN_INDEX + 1) +#define ADC_READ_0_DEG_RESISTANCE_INDEX (ADC_READ_REF_RESISTANCE_INDEX + 1) +#define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U + +#define INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX 0U +#define OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX 1U +#define CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX 2U +#define CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX 3U +#define OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX 4U +#define INPUT_DIALYSATE_TEMP_SENSOR_INDEX 5U +#define PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX 6U +#define TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX 7U + /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States { @@ -63,21 +72,20 @@ NUM_OF_TEMPSENSORS_SELF_TEST_STATES } TEMPSENSORS_SELF_TEST_STATES_T; -/// temperature sensor exec states +/// Temperature sensor exec states typedef enum tempSensors_Exec_States { TEMPSENSORS_EXEC_STATE_START = 0, - TEMPSENSORS_EXEC_STATE_READ_SENSORS, + TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, NUM_OF_TEMPSENSORS_EXEC_STATES, } TEMPSENSORS_EXEC_STATES_T; - static SELF_TEST_STATUS_T tempSensorsSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Self test result of the TemperatureSensors module static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; ///< TemperatureSensor self test state static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; ///< TemperatureSensor exec state -static U32 tempSensorsADCReads [ NUMBER_OF_TEMP_SENSORS ] [ NUMBER_OF_ADC_READS + 2 ] = {0}; ///< Number of ADC reads + the running sum -static F32 tempSensorsAveragedValues [ NUMBER_OF_TEMP_SENSORS ]; -static U32 initialADCReadIndex = 0; +static U32 tempSensorsADCReads [ NUMBER_OF_TEMP_SENSORS ] [ NUMBER_OF_ADC_READS + 5 ] = {0}; ///< Number of ADC reads + the running sum +static F32 tempSensorsAvgADCValues [ NUMBER_OF_TEMP_SENSORS ] = {0}; ///< Temperature sensors averaged ADC values +static U32 initialADCReadIndex = 0; ///< Initial ADC read index until the array if filled up for the first time // Private functions prototypes @@ -86,64 +94,73 @@ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestConsistencyCheck ( void ); static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ); -static TEMPSENSORS_EXEC_STATES_T handleExecReadSensors ( void ); +static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ); -static F32 getADC2TempConversion ( U32 adc, U32 gain, U32 refResistance, U32 zeroDegResistance ); +static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ); static void processADCRead ( U32 sensorIndex, U32 adc ); -static void processADCRead ( U32 sensorIndex, U32 adc ) -{ - U32 sampleCount; - U32 index = tempSensorsADCReads [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; - U32 runningSum = tempSensorsADCReads [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; - U32 indexValue = tempSensorsADCReads [ sensorIndex ] [ index ]; - U32 nextIndex = INC_WRAP( index, ADC_READ_FIRST_READ_INDEX, ADC_READ_LAST_READ_INDEX ); - runningSum = runningSum - indexValue + adc; - - tempSensorsADCReads [ sensorIndex ] [ index ] = adc; - tempSensorsADCReads [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; - tempSensorsADCReads [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; - - if ( initialADCReadIndex < ADC_READ_LAST_READ_INDEX ) - { - sampleCount = initialADCReadIndex + 1; - initialADCReadIndex++; - } - else - { - sampleCount = NUMBER_OF_ADC_READS; - } - F32 test = runningSum / sampleCount; // Remove this code - tempSensorsAveragedValues [ sensorIndex ] = runningSum / sampleCount; -} - - - // Public functions /************************************************************************* * @brief initTemperatureSensors - * The initTemperatureSensors initializes the module + * The initTemperatureSensors function initializes the module * @details * Inputs : none * Outputs : none * @param none * @return none *************************************************************************/ - void initTemperatureSensors ( void ) { + U08 i; tempSensorsSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; initialADCReadIndex = 0; - // TODO initialize the 2D and 1D arrays -} + // Initializing the tempSensorADCReads with the reference values + for ( i = 0; i < 3; i++ ) + { + tempSensorsADCReads [ i ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + } + /*tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE;*/ + + tempSensorsADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + tempSensorsADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; + + tempSensorsADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; +} /************************************************************************* * @brief execTemperatureSensorsSelfTest - * The execTemperatureSensorsSelfTest runs the TemperatureSensors POST - * during the self test + * The execTemperatureSensorsSelfTest function runs the TemperatureSensors + * POST during the self test * @details * Inputs : none * Outputs : SELF_TEST_STATUS_T @@ -175,15 +192,18 @@ break; default: - //TODO add software fault + + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, + tempSensorsSelfTestState ); tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_COMPLETE; + break; } return tempSensorsSelfTestResult; } - /************************************************************************* * @brief execTemperatureSensors - * The execTemperatureSensors runs the TemperatureSensors main tasks + * The execTemperatureSensors function runs the TemperatureSensors main + * tasks * @details * Inputs : none * Outputs : none @@ -200,34 +220,45 @@ tempSensorsExecState = handleExecStart(); break; - case TEMPSENSORS_EXEC_STATE_READ_SENSORS: + case TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES: - // overwrite structure for the sensors - tempSensorsExecState = handleExecReadSensors(); + tempSensorsExecState = handleExecGetADCValues(); break; default: - // TODO add software fault - tempSensorsExecState = TEMPSENSORS_EXEC_STATE_READ_SENSORS; + + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, + tempSensorsExecState ); + tempSensorsExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + break; } } +F32 getTPiTemperatureValue ( void ) +{ + F32 adc = tempSensorsAvgADCValues [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ]; + F32 temperature = getADC2TempConversion ( adc, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, + PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, + PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE ); + return temperature; +} + // Private functions /************************************************************************* * @brief getADC2TempConversion - * The getADC2TempConversion calculates the temperature from ADC read from - * FPGA + * The getADC2TempConversion function calculates the temperature from + * ADC read from FPGA * @details * Inputs : U32 (adc, gain, refResistance) * Outputs : F32 (temperature in deg C) * @param none * @return F32 (temperature in deg C) *************************************************************************/ -static F32 getADC2TempConversion ( U32 adc, U32 gain, U32 refResistance, U32 zeroDegResistance ) +static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ) { //R(RTD) = R(ref) * (adc – 2^N-1) / (G *2^N-1); - F32 resistance = (refResistance * (adc - pow(2,(TEMP_SENSORS_ADC_BITS - 1)))) / (gain * pow(2,(TEMP_SENSORS_ADC_BITS - 1))); + F32 resistance = (refResistance * (avgADC - pow(2,(TEMP_SENSORS_ADC_BITS - 1)))) / (gain * pow(2,(TEMP_SENSORS_ADC_BITS - 1))); // For testing in a separate workspace, loop through and do the equation, disable Irq and Fiq and enable Irq and // get the mstimer() //T=(-A+√(A^2-4B(1-R_T/R_0 )))/2B @@ -236,40 +267,164 @@ return temperature; } +/************************************************************************* + * @brief processADCRead + * The processADCRead function receives the ADC value and the sensor + * index and calculates the running sum and the moving average of the ADCs + * The temperatureSensorsADCRead and tempSensorsAvgADCValues are updated + * @details + * Inputs : U32 (sensorIndex, adc) + * Outputs : none + * @param none + * @return none + *************************************************************************/ +static void processADCRead ( U32 sensorIndex, U32 adc ) +{ + U32 sampleCount; + U32 index = tempSensorsADCReads [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; + U32 runningSum = tempSensorsADCReads [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; + U32 indexValue = tempSensorsADCReads [ sensorIndex ] [ index ]; + U32 nextIndex = INC_WRAP( index, ADC_READ_FIRST_READ_INDEX, ADC_READ_LAST_READ_INDEX ); + runningSum = runningSum - indexValue + adc; + tempSensorsADCReads [ sensorIndex ] [ index ] = adc; + tempSensorsADCReads [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; + tempSensorsADCReads [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; + + if ( initialADCReadIndex < ADC_READ_LAST_READ_INDEX ) + { + sampleCount = initialADCReadIndex + 1; + initialADCReadIndex++; + } + else + { + sampleCount = NUMBER_OF_ADC_READS; + } + // TODO Remove this code FOR TESTING + F32 test = runningSum / sampleCount; + // TODO Remove this code FOR TESTING + tempSensorsAvgADCValues [ sensorIndex ] = runningSum / sampleCount; +} +/************************************************************************* + * @brief handleSelfTestStart + * The handleSelfTestStart function waits for the ADC read array to be + * filled up for the first time. It then sets the state to next state + * @details + * Inputs : none + * Outputs : state (TEMPSENSORS_SELF_TEST_STATES_T) + * @param none + * @return state (TEMPSENSORS_SELF_TEST_STATES_T) + *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ) { - return TEMPSENSORS_SELF_TEST_ADC_CHECK; + TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_START; + + // Check if the ADC array has been filled at least once + if ( initialADCReadIndex >= ADC_READ_LAST_READ_INDEX ) + { + state = TEMPSENSORS_SELF_TEST_ADC_CHECK; + } + + return state; } +/************************************************************************* + * @brief handleSelfTestADCCheck + * The handleSelfTestADCCheck function checks whether the ADC reads. If the + * reads are above the maximum 24bit ADC count, it will throw an alarm and + * switches to the next state + * @details + * Inputs : none + * Outputs : state (TEMPSENSORS_SELF_TEST_STATES_T) + * @param none + * @return state (TEMPSENSORS_SELF_TEST_STATES_T) + *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestADCCheck ( void ) { - TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_ADC_CHECK; - // TODO: check ADC and stuff + TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK; - // REMOVE THIS CODE - state = TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK; - // REMOVE THIS CODEs + U08 i; + for ( i = 0; i < sizeof(tempSensorsAvgADCValues); i++ ) + { + U32 avgADC = tempSensorsAvgADCValues [ i ]; + if ( avgADC > TEMP_SENSORS_ADC_MAX_COUNT ) + { + //TODO error for ADC out of range + } + } + return state; } +/************************************************************************* + * @brief handleSelfTestConsistencyCheck + * The handleSelfTestConsistencyCheck function checks the values of the + * sensors to make sure they are within the allowed range from each other + * @details + * Inputs : none + * Outputs : state (TEMPSENSORS_SELF_TEST_STATES_T) + * @param none + * @return state (TEMPSENSORS_SELF_TEST_STATES_T) + *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestConsistencyCheck ( void ) { - TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK; - //TODO steps to consistency check + TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_COMPLETE; - // REMOVE THIS CODE - state = TEMPSENSORS_SELF_TEST_COMPLETE; - // REMOVE THIS CODE + U32 largestDelta; + U08 i, j, k; + F32 tempBuffer [ NUMBER_OF_TEMP_SENSORS ]; + F32 temperature; + + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; + tempSensorsADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; + + for ( k = 0; k < sizeof(tempBuffer); k++) + { + temperature = getADC2TempConversion ( tempSensorsAvgADCValues [ k ], + tempSensorsADCReads [ k ] [ ADC_READ_GAIN_INDEX ], + tempSensorsADCReads [ k ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsADCReads [ k ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + tempBuffer [ k ] = temperature; + } + //F32 adc = tempSensorsAvgADCValues [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ]; + //F32 temperature = getADC2TempConversion ( adc, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, + // PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, + // PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE ); + + + for ( i = 0; i < sizeof(tempSensorsAvgADCValues); i++ ) + { + for ( j = 0; j < sizeof(tempSensorsAvgADCValues); j++ ) + { + if ( i != j) + { + largestDelta = MAX( largestDelta, fabs(tempSensorsAvgADCValues [ i ] - tempSensorsAvgADCValues [ j ]) ); + } + if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) + { + // TODO Error + } + } + } + return state; } - +/************************************************************************* + * @brief handleExecStart + * The handleExecStart function switches the state to read + * @details + * Inputs : none + * Outputs : state (TEMPSENSORS_EXEC_STATES_T) + * @param none + * @return state (TEMPSENSORS_EXEC_STATES_T) + *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ) { - TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_READ_SENSORS; + TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + // TODO FOR TESTING, REMOVE THIS CODE /*if ( tempSensorsSelfTestState == TEMPSENSORS_SELF_TEST_COMPLETE ) { - // TODO FOR TESTING, REMOVE THIS CODE U32 testADC = 16327313; //F32 temp = getADC2TempConversion ( testADC, TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN, TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, @@ -278,16 +433,34 @@ F32 temp = getADC2TempConversion ( testADC, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE); - // TODO REMOVE THE ABOVE CODE - state = TEMPSENSORS_EXEC_STATE_READ_SENSORS; }*/ + // TODO REMOVE THE ABOVE CODE return state; } -static TEMPSENSORS_EXEC_STATES_T handleExecReadSensors ( void ) +/************************************************************************* + * @brief handleExecGetADCValues + * The handleExecGetADCValues function reads the ADC values from FPGA + * @details + * Inputs : none + * Outputs : state (TEMPSENSORS_EXEC_STATES_T) + * @param none + * @return state (TEMPSENSORS_EXEC_STATES_T) + *************************************************************************/ +static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ) { - TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_READ_SENSORS; + TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + processADCRead( INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX, getFPGATPiTemp() ); + processADCRead( OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + // TODO Updated the get functions from FPGA + processADCRead( CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + processADCRead( CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + processADCRead( OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + processADCRead( INPUT_DIALYSATE_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + processADCRead( PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + processADCRead( TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + // TODO REMOVE THIS CODE. FOR TESTING ONLY U32 test [20] = {16327313, 16330313, 16333313, 16336313, 16339313, 16342313, 16345313, 16348313, 16351313, 16354313, 16357313, 16360313, 16363313, 16366313, 16369313, 16372313, 16375313, 16378313, 16381313, 16384313}; @@ -298,6 +471,5 @@ } // TODO REMOVE THE ABOVE CODE - //TODO read the sensors return state; }