Index: firmware/App/Controllers/DrainPump.h =================================================================== diff -u -ra75923f40bea362b44fc082ce8eebde7bfa97c9a -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision a75923f40bea362b44fc082ce8eebde7bfa97c9a) +++ firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -47,8 +47,8 @@ BOOL testSetDrainPumpDataPublishIntervalOverride( U32 value ); BOOL testResetDrainPumpDataPublishIntervalOverride( void ); -BOOL testSetTargetDrainPumpPressureOverride( U32 value ); -BOOL testResetTargetDrainPumpPressureOverride( void ); +BOOL testSetTargetDrainPumpSpeedOverride( U32 value ); +BOOL testResetTargetDrainPumpSpeedOverride( void ); /**@}*/ Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -ref5ef16518466c92687b869cabfa16eaf3365dc0 -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ef5ef16518466c92687b869cabfa16eaf3365dc0) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -1,233 +1,237 @@ -/**********************************************************************//** - * - * 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 Heaters.c - * - * @date 21-Apr-2020 - * @author Dara Navaei - * - * @brief DG heaters controller - * - **************************************************************************/ - -#include "etpwm.h" - -// TODO for testing only remove -#include "mibspi.h" -// TODO for testing only remove - -#include "AlarmMgmt.h" -#include "Common.h" -#include "Heaters.h" -#include "TemperatureSensors.h" -#include "PIControllers.h" - -#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.795 ///< Main primary heater (heater A) max duty cycle (79.5%) -#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.25 ///< Small Primary heater (heater B) max duty cycle (25%) -#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.25 ///< Trimmer heater max duty cycle (25%) -#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters min duty cycle (0.00%) - -#define PRIMARY_HEATERS_P_COEFFICIENT 0.005 -#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 - -#define TRIMMER_HEATER_P_COEFFICIENT 0.003 -#define TRIMMER_HEATER_I_COEFFICIENT 0.001 - -// TODO make these macros functions -#define INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER 0.50 -#define INITIAL_DUTY_CYCLE_SMALL_PRIMARY_HEATER 0.10 -#define INITIAL_DUTY_CYCLE_TRIMMER_HEATER 0.10 - -typedef enum heaters_self_tesst_states -{ - HEATERS_SELF_TEST_START = 0, - HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER, - HEATERS_SELF_TEST_START_MAIN_PRIMARY, - HEATERS_SELF_TEST_COMPLETE, - NUM_OF_HEATERS_SELF_TEST_STATES -} HEATERS_SELF_TEST_STATES_T ; - -typedef enum primary_heaters_exec_states -{ - PRIMARY_HEATERS_EXEC_STATE_OFF = 0, - PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, - NUM_OF_PRIMARY_HEATERS_EXEC_STATES -} PRIMARY_HEATERS_EXEC_STATES_T; - -typedef enum trimmer_heater_exec_states -{ - TRIMMER_HEATER_EXEC_STATE_OFF = 0, - TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, - NUM_OF_TRIMMER_HEATER_EXEC_STATES -} TRIMMER_HEATER_EXEC_STATES_T; - -// Private variables - -static SELF_TEST_STATUS_T heatersSelfTestResult; -static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; -static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; -static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; -static F32 smallPrimaryHeaterPWMDutyCycle; -static F32 mainPrimaryHeaterPWMDutyCycle; -static F32 trimmerHeaterPWMDutyCycle; - -// private functions prototypes - -static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ); -static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ); - -static void setMainPrimaryHeaterPWM( F32 pwm ); -static void setSmallPrimaryHeaterPWM ( F32 pwm ); -static void setTrimmerHeaterPWM( F32 pwm ); - -// TODo GPIO for enabling the primary heater -#define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) -#define TOGGLEPRIMAYHEATER() ( ( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0 ) - -// Public functions - -void initHeaters ( void ) -{ - heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; - heatersSelfTestState = HEATERS_SELF_TEST_START; - primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; - trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; - smallPrimaryHeaterPWMDutyCycle = 0.0; - mainPrimaryHeaterPWMDutyCycle = 0.0; - trimmerHeaterPWMDutyCycle = 0.0; -} - -void startPrimaryHeater ( void ) -{ - setMainPrimaryHeaterPWM ( 0.5 ); - setSmallPrimaryHeaterPWM ( 0.25 ); -} - -void startTrimmerHeater ( void ) -{ - setTrimmerHeaterPWM ( INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER ); -} - -void stopPrimaryHeater ( void ) -{ - setMainPrimaryHeaterPWM ( 0.0 ); - setSmallPrimaryHeaterPWM ( 0.0 ); -} - -SELF_TEST_STATUS_T execHeatersSelfTest ( void ) -{ - switch ( heatersSelfTestState ) - { - case HEATERS_SELF_TEST_START: - - break; - case HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER: - - break; - case HEATERS_SELF_TEST_START_MAIN_PRIMARY: - - break; - case HEATERS_SELF_TEST_COMPLETE: - - break; - - default: - - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, - heatersSelfTestState ); - heatersSelfTestState = HEATERS_SELF_TEST_COMPLETE; - break; - } - - return heatersSelfTestResult; -} - - -void execPrimaryHeaters ( void ) -{ - switch ( primaryHeatersExecState ) - { - case PRIMARY_HEATERS_EXEC_STATE_OFF: - - primaryHeatersExecState = handlePrimaryHeaterStateOff(); - break; - - case PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET: - - primaryHeatersExecState = handlePrimaryHeaterStateControlToTarget(); - break; - - default: - - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, - primaryHeatersExecState ); - primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - break; - } -} - -void execTrimmerHeater ( void ) -{ - switch ( trimmerHeaterExecState ) - { - case TRIMMER_HEATER_EXEC_STATE_OFF: - - break; - - case TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET: - - break; - - default: - - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, - trimmerHeaterExecState ); - trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; - break; - } -} - -static void setMainPrimaryHeaterPWM( F32 pwm ) -{ - etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} - -static void setSmallPrimaryHeaterPWM ( F32 pwm ) -{ - etpwmSetCmpB( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} -static void setTrimmerHeaterPWM( F32 pwm ) -{ - etpwmSetCmpA( etpwmREG3, (U32)( (S32)( ( pwm * (F32)(etpwmREG3->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} - -static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ) -{ - PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - - return state; -} -static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ) -{ - PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - - // TODO remove this code for testing - if ( TOGGLEPRIMAYHEATER() ) - { - startPrimaryHeater(); - } - - if ( !TOGGLEPRIMAYHEATER() ) - { - stopPrimaryHeater(); - } - // TODO remove this code for testing - - - return state; -} - +/**********************************************************************//** + * + * 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 Heaters.c + * + * @date 21-Apr-2020 + * @author Dara Navaei + * + * @brief DG heaters controller + * + **************************************************************************/ + +#include "etpwm.h" + +// TODO for testing only remove +#include "mibspi.h" +// TODO for testing only remove + +#include "AlarmMgmt.h" +#include "Common.h" +#include "Heaters.h" +#include "TemperatureSensors.h" +#include "PIControllers.h" + +#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.795 ///< Main primary heater (heater A) max duty cycle (79.5%) +#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.25 ///< Small Primary heater (heater B) max duty cycle (25%) +#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.25 ///< Trimmer heater max duty cycle (25%) +#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters min duty cycle (0.00%) + +#define PRIMARY_HEATERS_P_COEFFICIENT 0.005 +#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 + +#define TRIMMER_HEATER_P_COEFFICIENT 0.003 +#define TRIMMER_HEATER_I_COEFFICIENT 0.001 + +// TODO make these macros functions +#define INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER 0.50 +#define INITIAL_DUTY_CYCLE_SMALL_PRIMARY_HEATER 0.10 +#define INITIAL_DUTY_CYCLE_TRIMMER_HEATER 0.10 + +typedef enum heaters_self_tesst_states +{ + HEATERS_SELF_TEST_START = 0, + HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER, + HEATERS_SELF_TEST_START_MAIN_PRIMARY, + HEATERS_SELF_TEST_COMPLETE, + NUM_OF_HEATERS_SELF_TEST_STATES +} HEATERS_SELF_TEST_STATES_T ; + +typedef enum primary_heaters_exec_states +{ + PRIMARY_HEATERS_EXEC_STATE_OFF = 0, + PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, + NUM_OF_PRIMARY_HEATERS_EXEC_STATES +} PRIMARY_HEATERS_EXEC_STATES_T; + +typedef enum trimmer_heater_exec_states +{ + TRIMMER_HEATER_EXEC_STATE_OFF = 0, + TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, + NUM_OF_TRIMMER_HEATER_EXEC_STATES +} TRIMMER_HEATER_EXEC_STATES_T; + +// Private variables + +static SELF_TEST_STATUS_T heatersSelfTestResult; +static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; +static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; +static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; +static F32 smallPrimaryHeaterPWMDutyCycle; +static F32 mainPrimaryHeaterPWMDutyCycle; +static F32 trimmerHeaterPWMDutyCycle; + +// private functions prototypes + +static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ); +static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ); + +static void setMainPrimaryHeaterPWM( F32 pwm ); +static void setSmallPrimaryHeaterPWM ( F32 pwm ); +static void setTrimmerHeaterPWM( F32 pwm ); + +// TODo GPIO for enabling the primary heater +#define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) +#define TOGGLEPRIMAYHEATER() ( ( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0 ) + +// Public functions + +void initHeaters ( void ) +{ + heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + heatersSelfTestState = HEATERS_SELF_TEST_START; + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; + smallPrimaryHeaterPWMDutyCycle = 0.0; + mainPrimaryHeaterPWMDutyCycle = 0.0; + trimmerHeaterPWMDutyCycle = 0.0; +} + +void startPrimaryHeater ( void ) +{ + setMainPrimaryHeaterPWM ( 0.5 ); + setSmallPrimaryHeaterPWM ( 0.25 ); +} + +void startTrimmerHeater ( void ) +{ + setTrimmerHeaterPWM ( INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER ); +} + +void stopPrimaryHeater ( void ) +{ + setMainPrimaryHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); + setSmallPrimaryHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); +} + +void stopTrimmerHeater ( void ) +{ + setTrimmerHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); +} + +SELF_TEST_STATUS_T execHeatersSelfTest ( void ) +{ + switch ( heatersSelfTestState ) + { + case HEATERS_SELF_TEST_START: + + break; + case HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER: + + break; + case HEATERS_SELF_TEST_START_MAIN_PRIMARY: + + break; + case HEATERS_SELF_TEST_COMPLETE: + + break; + + default: + + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, + heatersSelfTestState ); + heatersSelfTestState = HEATERS_SELF_TEST_COMPLETE; + break; + } + + return heatersSelfTestResult; +} + + +void execPrimaryHeaters ( void ) +{ + switch ( primaryHeatersExecState ) + { + case PRIMARY_HEATERS_EXEC_STATE_OFF: + + primaryHeatersExecState = handlePrimaryHeaterStateOff(); + break; + + case PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET: + + primaryHeatersExecState = handlePrimaryHeaterStateControlToTarget(); + break; + + default: + + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, + primaryHeatersExecState ); + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + break; + } +} + +void execTrimmerHeater ( void ) +{ + switch ( trimmerHeaterExecState ) + { + case TRIMMER_HEATER_EXEC_STATE_OFF: + + break; + + case TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET: + + break; + + default: + + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, + trimmerHeaterExecState ); + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + break; + } +} + +static void setMainPrimaryHeaterPWM( F32 pwm ) +{ + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +static void setSmallPrimaryHeaterPWM ( F32 pwm ) +{ + etpwmSetCmpB( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} +static void setTrimmerHeaterPWM( F32 pwm ) +{ + etpwmSetCmpA( etpwmREG3, (U32)( (S32)( ( pwm * (F32)(etpwmREG3->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ) +{ + PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + + return state; +} +static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ) +{ + PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + + // TODO remove this code for testing + if ( TOGGLEPRIMAYHEATER() ) + { + startPrimaryHeater(); + } + + if ( !TOGGLEPRIMAYHEATER() ) + { + stopPrimaryHeater(); + } + // TODO remove this code for testing + + + return state; +} Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -ref5ef16518466c92687b869cabfa16eaf3365dc0 -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision ef5ef16518466c92687b869cabfa16eaf3365dc0) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -1,42 +1,42 @@ -/**********************************************************************//** - * - * 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 Heaters.h - * - * @date 21-Apr-2020 - * @author Dara Navaei - * - * @brief DG heaters controller - * - **************************************************************************/ - -#ifndef _HEATERS_H_ -#define _HEATERS_H_ - -void initHeaters ( void ); - -void setPrimaryHeaterTargetTemperature ( F32 targetTemp ); -void setTrimmerHeaterTargetTemperature ( F32 targetTemp ); - -void startPrimaryHeater ( void ); -void startTrimmerHeater ( void ); - -void stopPrimaryHeater ( void ); -void stopTrimmerHeater ( void ); - -void execHeatersMonitor ( void ); // Todo decide the functionality - -SELF_TEST_STATUS_T execHeatersSelfTest ( void ); - -void execPrimaryHeaters ( void ); - -void execTrimmerHeater ( void ); - - - - -#endif +/**********************************************************************//** + * + * 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 Heaters.h + * + * @date 21-Apr-2020 + * @author Dara Navaei + * + * @brief DG heaters controller + * + **************************************************************************/ + +#ifndef _HEATERS_H_ +#define _HEATERS_H_ + +void initHeaters ( void ); + +void setPrimaryHeaterTargetTemperature ( F32 targetTemp ); +void setTrimmerHeaterTargetTemperature ( F32 targetTemp ); + +void startPrimaryHeater ( void ); +void startTrimmerHeater ( void ); + +void stopPrimaryHeater ( void ); +void stopTrimmerHeater ( void ); + +void execHeatersMonitor ( void ); // Todo decide the functionality + +SELF_TEST_STATUS_T execHeatersSelfTest ( void ); + +void execPrimaryHeaters ( void ); + +void execTrimmerHeater ( void ); + + + + +#endif Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r228bdc53e9e88533429cd514d1d509a6fcd361d0 -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 228bdc53e9e88533429cd514d1d509a6fcd361d0) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -218,7 +218,7 @@ { F32 result = 0.0; - if ( pressureID <= NUM_OF_PRESSURE_SENSORS ) + if ( pressureID < NUM_OF_PRESSURE_SENSORS ) { if ( OVERRIDE_KEY == pressures[ pressureID ].override ) { Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -ref5ef16518466c92687b869cabfa16eaf3365dc0 -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision ef5ef16518466c92687b869cabfa16eaf3365dc0) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -1,631 +1,631 @@ -/**********************************************************************//** - * - * 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 - * - **************************************************************************/ -#include // For temperature calculation - -#include "TemperatureSensors.h" -#include "FPGA.h" - -// TODO: For testing only REMOVE -#include "Timers.h" -// TODO: For testing only REMOVE - -// Private variables - -#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 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 HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient - -#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_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 20U ///< Number of ADC reads for moving average calculations - -#define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index - -#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 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 READ_AND_ERROR_PREV_FPGA_COUNT_INDEX 0U -#define READ_AND_ERROR_INTERNAL_READ_COUNT_INDEX 1U -#define READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX 2U -#define READ_AND_ERROR_PREV_FPGA_ERROR_INDEX 3U -#define NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS 4U - -#define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors - -#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 3U ///< 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 -#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 -#define MASK_OFF_U32_MSB 0x00FFFFFF - -/// Temperature sensor self test states -typedef enum tempSensors_Self_Test_States -{ - TEMPSENSORS_SELF_TEST_START = 0, ///< Temperature sensors self test start - TEMPSENSORS_SELF_TEST_ADC_CHECK, ///< Temperature sensors self ADC check - TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK, ///< Temperature sensors self test consistency check - TEMPSENSORS_SELF_TEST_COMPLETE, ///< Temperature sensors self test complete - NUM_OF_TEMPSENSORS_SELF_TEST_STATES ///< Total number of self test states -} TEMPSENSORS_SELF_TEST_STATES_T; - -/// Temperature sensor exec states -typedef enum tempSensors_Exec_States -{ - TEMPSENSORS_EXEC_STATE_START = 0, ///< Temperature sensors exec start - TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, ///< Temperature sensors exec get ADC values - NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states -} TEMPSENSORS_EXEC_STATES_T; - -/// FPGA error and read counts -typedef struct -{ - U08 RTDErrorCount; ///< RTD error count (include all 4 conductivity and temperature sensors) - U08 RTDReadCount; ///< RTD read count (include all 4 conductivity and temperature sensors) - U08 TRoErrorCount; ///< THDo (outlet redundant temperature sensor) error count - U08 TRoReadCount; ///< THDo (outlet redundant temperature sensor) read count - U08 TDiErrorCount; ///< TDi (inlet dialysate) temperature sensor error count - U08 TDiReadCount; ///< TDi (inlet dialysate) temperature sensor read count - U08 primaryHeaterFlags; ///< Primary heater internal temperature sensor error flags - U08 primaryHeaterReadCount; ///< Primary heater internal temperature sensor read count - U08 trimmerHeaterFlags; ///< Trimmer heater internal temperature sensor error flags - U08 trimmerHeaterReadCount; ///< Trimmer heater internal temperature sensor read count -} FPGA_READ_AND_ERROR_COUNTS_T; // TODO REmove - -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 U32 sampleCount; ///< Initial ADC read index until the array if filled up for the first time -static U32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] ///< Raw ADC reads array - [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; -static U32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] ///< Running sum and next ADC index array - [ NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS ]; -static U32 tempSensorsConstants [ NUM_OF_TEMPERATURE_SENSORS ] ///< Temperature sensors constants - [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ]; -static F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; //TODO remove ///< Temperature sensors averaged ADC values -static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; -static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; - -// Private functions prototypes - -static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ); -static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestADCCheck ( void ); -static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestConsistencyCheck ( void ); - -static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ); -static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ); - -static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ); -static void processADCRead ( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); - -// Public functions - -/************************************************************************* - * @brief initTemperatureSensors - * 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; - sampleCount = 0; - - // Initialize TPi and TPo constants - for ( i = TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR; i < TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; 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; - } - // 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; - } - // Initialize TRo and TDi constants - for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_INTERNAL_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; - } - - // Initialize primary heater internal temperature sensor - // The heaters do not need gain, reference resistance, and zero degree resistance - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; - // Initialize trimmer heater internal temperature sensor - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; -} -/************************************************************************* - * @brief execTemperatureSensorsSelfTest - * The execTemperatureSensorsSelfTest function runs the TemperatureSensors - * POST during the self test - * @details - * Inputs : none - * Outputs : SELF_TEST_STATUS_T - * @param none - * @return SELF_TEST_STATUS_T - *************************************************************************/ -SELF_TEST_STATUS_T execTemperatureSensorsSelfTest ( void ) -{ - switch ( tempSensorsSelfTestState ) - { - case TEMPSENSORS_SELF_TEST_START: - - tempSensorsSelfTestState = handleSelfTestStart(); - break; - - case TEMPSENSORS_SELF_TEST_ADC_CHECK: - - tempSensorsSelfTestState = handleSelfTestADCCheck(); - break; - - case TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK: - - tempSensorsSelfTestState = handleSelfTestConsistencyCheck(); - break; - - case TEMPSENSORS_SELF_TEST_COMPLETE: - - // Done with self test, do nothing - break; - - default: - - 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 function runs the TemperatureSensors main - * tasks - * @details - * Inputs : none - * Outputs : none - * @param none - * @return none - *************************************************************************/ -void execTemperatureSensors ( void ) -{ - // read the sensors all the time - switch ( tempSensorsExecState ) - { - case TEMPSENSORS_SELF_TEST_START: - - tempSensorsExecState = handleExecStart(); - break; - - case TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES: - - tempSensorsExecState = handleExecGetADCValues(); - break; - - default: - - 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; - } -} -/************************************************************************* - * @brief getTemperatureValue - * The getTemperatureValue function gets the enum of the requested - * temperature sensor, converts the ADC of it to temperature in degree C - * and returns the temperature - * @details - * Inputs : TEMPERATURE_SENSORS_T (sensor) - * Outputs : F32 (temperature in deg C) - * @param none - * @return F32 (temperature in deg C) - *************************************************************************/ -F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ) -{ - F32 temperature; - switch ( sensor ) - { - case TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ]; - break; - - case TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR: - - temperature = temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ]; - break; - - default: - // ToDo: Warning? - break; - } - - return temperature; -} - -// Private functions - -/************************************************************************* - * @brief getADC2TempConversion - * 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 ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ) -{ - //R(RTD) = R(ref) * (adc – 2^N-1) / (G *2^N-1); - F32 resistance = (refResistance * (avgADC - pow(2,(TEMP_SENSORS_ADC_BITS - 1)))) / (gain * pow(2,(TEMP_SENSORS_ADC_BITS - 1))); - //T=(-A+√(A^2-4B(1-R_T/R_0 )))/2B - F32 secondSqrtPart = 4 * TEMP_EQUATION_COEFF_B * (1 - (resistance / zeroDegResistance)); - F32 temperature = (-TEMP_EQUATION_COEFF_A + sqrt(pow(TEMP_EQUATION_COEFF_A, 2) - secondSqrtPart)) / (2 * TEMP_EQUATION_COEFF_B); - - 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 fpgaError, U32 fpgaCount ) -{ - U32 error; - U32 heatersTemperature; - BOOL isADCValid = FALSE; - F32 temperature; - - - // TODO For testing only. REMOVE - /*temperature = getADC2TempConversion ( adc, - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] );*/ - // TODO for testing only. REMOVE - - /* - * check if the index is not the heaters - * Mask the values accordingly - * if error is 0x80 for the external sensors, increment - * if count has not changed, update the previous count, increment the internal error count - * if the internal error count is above the threshold, set alarm, set the bool avGCalc to false - * if count is greater than previous, update the previous and reset the internal count - * set the avgCalc to true - * if the avgCalc in true, calculate all the steps and immediately convert to temperature - */ - if ( sensorIndex != TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR || sensorIndex != TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ) - { - error = adc & MASK_OFF_U32_MSB; - /* - * what if the fpga channel error is not zero? - * what if the fpga channel error is zero but the individual is not? - */ - - if ( fpgaError != 0 ) - { - if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) - { - // TODO: alarm? - } - isADCValid = FALSE; - } - if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) - { - //tODO: FILL UP - isADCValid = FALSE; - } - } - else - { - // Fault state is the 17th bit - U32 fault = adc & MASK_OFF_LSW; - fault = fault & 0x0001; - - if ( fault == HEATERS_INTERNAL_TEMP_SENSOR_FAULT ) - { - // Fault alarm? or have a threshold? - // If the fault is 1, should we check the individuals? - } - - heatersTemperature = adc & 0xFF05; - heatersTemperature = (heatersTemperature & 0x7FFF) >> 2; - } - - U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; - if ( fpgaCount == previousReadCount ) - { - U32 internalErrorCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ]; - if ( internalErrorCount > MAX_ALLOWED_UNCHANGED_ADC_READS ) - { - // TODO alarm - } - else - { - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = internalErrorCount++; - } - isADCValid = FALSE; - } - else if ( fpgaCount > previousReadCount ) - { - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = 0; - isADCValid = TRUE; - } - - if ( isADCValid ) - { - // Update the values in the folders - U32 index = runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; - U32 runningSum = runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; - U32 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; - - rawADCReads [ sensorIndex ] [ index ] = adc; - runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; - runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; - - // If the buffer array is being filled for the first time, the number of samples - // are changing. When the array is filled up completely, max number of samples are used - if ( sampleCount < MAX_NUM_OF_RAW_ADC_SAMPLES ) - { - sampleCount++; - } - else - { - sampleCount = MAX_NUM_OF_RAW_ADC_SAMPLES; - } - // Calculate average - F32 avgADCReads = runningSum / sampleCount; - - // The external temperature sensors have gain and other parameters for temperature - // calculations. The heaters internal temperature sensors do not have any parameters - // this is used to decide whether to call the quadratic equation or not - if ( tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ] != 0 ) - { - temperature = getADC2TempConversion ( avgADCReads, - tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ], - tempSensorsConstants [ sensorIndex ] [ ADC_READ_REF_RESISTANCE_INDEX ], - tempSensorsConstants [ sensorIndex ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); - } - else - { - temperature = avgADCReads * HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF; - } - - temperatureValues [ sensorIndex ] = temperature; - } -} -/************************************************************************* - * @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; -} -/************************************************************************* - * @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_CONSISTENCY_CHECK; - - U08 i; - for ( i = 0; i < sizeof(avgADCReads); i++ ) - { - U32 avgADC = avgADCReads [ i ]; - - 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 ); - } - } - - 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 ) -{ - //TODO Consider edge cases for the consistency check - TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_COMPLETE; - - U32 largestDelta; - U08 i, j; - - // Check if all the sensors are within a certain degree c - // from each other - for ( i = 0; i < sizeof(temperatureValues); i++ ) - { - for ( j = 0; j < sizeof(temperatureValues); j++ ) - { - if ( i != j ) - { - largestDelta = MAX( largestDelta, fabs(temperatureValues [ i ] - temperatureValues [ j ]) ); - } - if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) - { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT, TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK ); - } - } - } - - 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 ) -{ - return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; -} -/************************************************************************* - * @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_GET_ADC_VALUES; - - // Check the read count for a change before inserting - // Need to remember the fpga counter and if it has not changed increment another counter and - // zero it if it changed. if it is above a certain number throw fault - // error counter from fpga same as above remember, if it is incremented: - - // 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 - //processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp() ); - //processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp() ); - //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp() ); - //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp() ); - //processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp() ); - //processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp() ); - //processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp() ); - //processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp() ); - - // TODO REMOVE THIS CODE. FOR TESTING ONLY - - - /*U08 dara; - U32 test [20] = {16327313, 16330313, 16333313, 16336313, 16339313, 16342313, 16345313, 16348313, 16351313, 16354313, - 16357313, 16360313, 16363313, 16366313, 16369313, 16372313, 16375313, 16378313, 16381313, 16384313}; - - U32 test2 [20] = {16348313, 16358313, 16368313, 16378313, 16388313, 16398313, 16408313, 16418313, 16428313, 16438313, - 16448313, 16458313, 16468313, 16478313, 16488313, 16498313, 16508313, 16518313, 16528313, 16538313}; - - for ( dara = 0; dara<20; dara++) - { - processADCRead(0, test[dara]); - } - dara = 0; - for ( dara = 0; dara<20; dara++) - { - processADCRead(0, test2[dara]); - }*/ - // TODO REMOVE THE ABOVE CODE - - return state; -} +/**********************************************************************//** + * + * 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 + * + **************************************************************************/ +#include // For temperature calculation + +#include "TemperatureSensors.h" +#include "FPGA.h" + +// TODO: For testing only REMOVE +#include "Timers.h" +// TODO: For testing only REMOVE + +// Private variables + +#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 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 HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient + +#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_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 20U ///< Number of ADC reads for moving average calculations + +#define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index + +#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 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 READ_AND_ERROR_PREV_FPGA_COUNT_INDEX 0U +#define READ_AND_ERROR_INTERNAL_READ_COUNT_INDEX 1U +#define READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX 2U +#define READ_AND_ERROR_PREV_FPGA_ERROR_INDEX 3U +#define NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS 4U + +#define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors + +#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 3U ///< 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 +#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 +#define MASK_OFF_U32_MSB 0x00FFFFFF + +/// Temperature sensor self test states +typedef enum tempSensors_Self_Test_States +{ + TEMPSENSORS_SELF_TEST_START = 0, ///< Temperature sensors self test start + TEMPSENSORS_SELF_TEST_ADC_CHECK, ///< Temperature sensors self ADC check + TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK, ///< Temperature sensors self test consistency check + TEMPSENSORS_SELF_TEST_COMPLETE, ///< Temperature sensors self test complete + NUM_OF_TEMPSENSORS_SELF_TEST_STATES ///< Total number of self test states +} TEMPSENSORS_SELF_TEST_STATES_T; + +/// Temperature sensor exec states +typedef enum tempSensors_Exec_States +{ + TEMPSENSORS_EXEC_STATE_START = 0, ///< Temperature sensors exec start + TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, ///< Temperature sensors exec get ADC values + NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states +} TEMPSENSORS_EXEC_STATES_T; + +/// FPGA error and read counts +typedef struct +{ + U08 RTDErrorCount; ///< RTD error count (include all 4 conductivity and temperature sensors) + U08 RTDReadCount; ///< RTD read count (include all 4 conductivity and temperature sensors) + U08 TRoErrorCount; ///< THDo (outlet redundant temperature sensor) error count + U08 TRoReadCount; ///< THDo (outlet redundant temperature sensor) read count + U08 TDiErrorCount; ///< TDi (inlet dialysate) temperature sensor error count + U08 TDiReadCount; ///< TDi (inlet dialysate) temperature sensor read count + U08 primaryHeaterFlags; ///< Primary heater internal temperature sensor error flags + U08 primaryHeaterReadCount; ///< Primary heater internal temperature sensor read count + U08 trimmerHeaterFlags; ///< Trimmer heater internal temperature sensor error flags + U08 trimmerHeaterReadCount; ///< Trimmer heater internal temperature sensor read count +} FPGA_READ_AND_ERROR_COUNTS_T; // TODO REmove + +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 U32 sampleCount; ///< Initial ADC read index until the array if filled up for the first time +static U32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] ///< Raw ADC reads array + [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; +static U32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] ///< Running sum and next ADC index array + [ NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS ]; +static U32 tempSensorsConstants [ NUM_OF_TEMPERATURE_SENSORS ] ///< Temperature sensors constants + [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ]; +static F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; //TODO remove ///< Temperature sensors averaged ADC values +static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; +static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; + +// Private functions prototypes + +static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ); +static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestADCCheck ( void ); +static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestConsistencyCheck ( void ); + +static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ); +static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ); + +static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ); +static void processADCRead ( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); + +// Public functions + +/************************************************************************* + * @brief initTemperatureSensors + * 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; + sampleCount = 0; + + // Initialize TPi and TPo constants + for ( i = TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR; i < TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; 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; + } + // 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; + } + // Initialize TRo and TDi constants + for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_INTERNAL_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; + } + + // Initialize primary heater internal temperature sensor + // The heaters do not need gain, reference resistance, and zero degree resistance + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; + // Initialize trimmer heater internal temperature sensor + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; +} +/************************************************************************* + * @brief execTemperatureSensorsSelfTest + * The execTemperatureSensorsSelfTest function runs the TemperatureSensors + * POST during the self test + * @details + * Inputs : none + * Outputs : SELF_TEST_STATUS_T + * @param none + * @return SELF_TEST_STATUS_T + *************************************************************************/ +SELF_TEST_STATUS_T execTemperatureSensorsSelfTest ( void ) +{ + switch ( tempSensorsSelfTestState ) + { + case TEMPSENSORS_SELF_TEST_START: + + tempSensorsSelfTestState = handleSelfTestStart(); + break; + + case TEMPSENSORS_SELF_TEST_ADC_CHECK: + + tempSensorsSelfTestState = handleSelfTestADCCheck(); + break; + + case TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK: + + tempSensorsSelfTestState = handleSelfTestConsistencyCheck(); + break; + + case TEMPSENSORS_SELF_TEST_COMPLETE: + + // Done with self test, do nothing + break; + + default: + + 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 function runs the TemperatureSensors main + * tasks + * @details + * Inputs : none + * Outputs : none + * @param none + * @return none + *************************************************************************/ +void execTemperatureSensors ( void ) +{ + // read the sensors all the time + switch ( tempSensorsExecState ) + { + case TEMPSENSORS_SELF_TEST_START: + + tempSensorsExecState = handleExecStart(); + break; + + case TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES: + + tempSensorsExecState = handleExecGetADCValues(); + break; + + default: + + 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; + } +} +/************************************************************************* + * @brief getTemperatureValue + * The getTemperatureValue function gets the enum of the requested + * temperature sensor, converts the ADC of it to temperature in degree C + * and returns the temperature + * @details + * Inputs : TEMPERATURE_SENSORS_T (sensor) + * Outputs : F32 (temperature in deg C) + * @param none + * @return F32 (temperature in deg C) + *************************************************************************/ +F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ) +{ + F32 temperature; + switch ( sensor ) + { + case TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR: + + temperature = temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ]; + break; + + case TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR: + + temperature = temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ]; + break; + + default: + // ToDo: Warning? + break; + } + + return temperature; +} + +// Private functions + +/************************************************************************* + * @brief getADC2TempConversion + * 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 ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ) +{ + //R(RTD) = R(ref) * (adc – 2^N-1) / (G *2^N-1); + F32 resistance = (refResistance * (avgADC - pow(2,(TEMP_SENSORS_ADC_BITS - 1)))) / (gain * pow(2,(TEMP_SENSORS_ADC_BITS - 1))); + //T=(-A+√(A^2-4B(1-R_T/R_0 )))/2B + F32 secondSqrtPart = 4 * TEMP_EQUATION_COEFF_B * (1 - (resistance / zeroDegResistance)); + F32 temperature = (-TEMP_EQUATION_COEFF_A + sqrt(pow(TEMP_EQUATION_COEFF_A, 2) - secondSqrtPart)) / (2 * TEMP_EQUATION_COEFF_B); + + 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 fpgaError, U32 fpgaCount ) +{ + U32 error; + U32 heatersTemperature; + BOOL isADCValid = FALSE; + F32 temperature; + + + // TODO For testing only. REMOVE + /*temperature = getADC2TempConversion ( adc, + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] );*/ + // TODO for testing only. REMOVE + + /* + * check if the index is not the heaters + * Mask the values accordingly + * if error is 0x80 for the external sensors, increment + * if count has not changed, update the previous count, increment the internal error count + * if the internal error count is above the threshold, set alarm, set the bool avGCalc to false + * if count is greater than previous, update the previous and reset the internal count + * set the avgCalc to true + * if the avgCalc in true, calculate all the steps and immediately convert to temperature + */ + if ( sensorIndex != TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR || sensorIndex != TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ) + { + error = adc & MASK_OFF_U32_MSB; + /* + * what if the fpga channel error is not zero? + * what if the fpga channel error is zero but the individual is not? + */ + + if ( fpgaError != 0 ) + { + if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) + { + // TODO: alarm? + } + isADCValid = FALSE; + } + if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) + { + //tODO: FILL UP + isADCValid = FALSE; + } + } + else + { + // Fault state is the 17th bit + U32 fault = adc & MASK_OFF_LSW; + fault = fault & 0x0001; + + if ( fault == HEATERS_INTERNAL_TEMP_SENSOR_FAULT ) + { + // Fault alarm? or have a threshold? + // If the fault is 1, should we check the individuals? + } + + heatersTemperature = adc & 0xFF05; + heatersTemperature = (heatersTemperature & 0x7FFF) >> 2; + } + + U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; + if ( fpgaCount == previousReadCount ) + { + U32 internalErrorCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ]; + if ( internalErrorCount > MAX_ALLOWED_UNCHANGED_ADC_READS ) + { + // TODO alarm + } + else + { + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = internalErrorCount++; + } + isADCValid = FALSE; + } + else if ( fpgaCount > previousReadCount ) + { + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = 0; + isADCValid = TRUE; + } + + if ( isADCValid ) + { + // Update the values in the folders + U32 index = runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; + U32 runningSum = runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; + U32 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; + + rawADCReads [ sensorIndex ] [ index ] = adc; + runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; + runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; + + // If the buffer array is being filled for the first time, the number of samples + // are changing. When the array is filled up completely, max number of samples are used + if ( sampleCount < MAX_NUM_OF_RAW_ADC_SAMPLES ) + { + sampleCount++; + } + else + { + sampleCount = MAX_NUM_OF_RAW_ADC_SAMPLES; + } + // Calculate average + F32 avgADCReads = runningSum / sampleCount; + + // The external temperature sensors have gain and other parameters for temperature + // calculations. The heaters internal temperature sensors do not have any parameters + // this is used to decide whether to call the quadratic equation or not + if ( tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ] != 0 ) + { + temperature = getADC2TempConversion ( avgADCReads, + tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ sensorIndex ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ sensorIndex ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + } + else + { + temperature = avgADCReads * HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF; + } + + temperatureValues [ sensorIndex ] = temperature; + } +} +/************************************************************************* + * @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; +} +/************************************************************************* + * @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_CONSISTENCY_CHECK; + + U08 i; + for ( i = 0; i < sizeof(avgADCReads); i++ ) + { + U32 avgADC = avgADCReads [ i ]; + + 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 ); + } + } + + 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 ) +{ + //TODO Consider edge cases for the consistency check + TEMPSENSORS_SELF_TEST_STATES_T state = TEMPSENSORS_SELF_TEST_COMPLETE; + + U32 largestDelta; + U08 i, j; + + // Check if all the sensors are within a certain degree c + // from each other + for ( i = 0; i < sizeof(temperatureValues); i++ ) + { + for ( j = 0; j < sizeof(temperatureValues); j++ ) + { + if ( i != j ) + { + largestDelta = MAX( largestDelta, fabs(temperatureValues [ i ] - temperatureValues [ j ]) ); + } + if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) + { + SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT, TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK ); + } + } + } + + 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 ) +{ + return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; +} +/************************************************************************* + * @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_GET_ADC_VALUES; + + // Check the read count for a change before inserting + // Need to remember the fpga counter and if it has not changed increment another counter and + // zero it if it changed. if it is above a certain number throw fault + // error counter from fpga same as above remember, if it is incremented: + + // 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 + //processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp() ); + //processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp() ); + //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp() ); + //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp() ); + //processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp() ); + //processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp() ); + //processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp() ); + //processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp() ); + + // TODO REMOVE THIS CODE. FOR TESTING ONLY + + + /*U08 dara; + U32 test [20] = {16327313, 16330313, 16333313, 16336313, 16339313, 16342313, 16345313, 16348313, 16351313, 16354313, + 16357313, 16360313, 16363313, 16366313, 16369313, 16372313, 16375313, 16378313, 16381313, 16384313}; + + U32 test2 [20] = {16348313, 16358313, 16368313, 16378313, 16388313, 16398313, 16408313, 16418313, 16428313, 16438313, + 16448313, 16458313, 16468313, 16478313, 16488313, 16498313, 16508313, 16518313, 16528313, 16538313}; + + for ( dara = 0; dara<20; dara++) + { + processADCRead(0, test[dara]); + } + dara = 0; + for ( dara = 0; dara<20; dara++) + { + processADCRead(0, test2[dara]); + }*/ + // TODO REMOVE THE ABOVE CODE + + return state; +} Index: firmware/App/Controllers/TemperatureSensors.h =================================================================== diff -u -rc12bff518c0b58065eede15469ad8a2a6f6e317b -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision c12bff518c0b58065eede15469ad8a2a6f6e317b) +++ firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -1,43 +1,43 @@ -/**********************************************************************//** - * - * 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.h - * - * @date 7-Apr-2020 - * @author Dara Navaei - * - * @brief DG temperature sensors controller - * - **************************************************************************/ - -#ifndef __TEMPERATURESENSORS_H__ -#define __TEMPERATURESENSORS_H__ - -#include "Common.h" - -typedef enum SENSORS_NAME -{ - TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, - TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, - TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, - TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, - TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, - TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, - TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, - TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, - NUM_OF_TEMPERATURE_SENSORS -} TEMPERATURE_SENSORS_T; - -void initTemperatureSensors ( void ); - -SELF_TEST_STATUS_T execTemperatureSensorsSelfTest ( void ); - -void execTemperatureSensors ( void ); - -F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ); - -#endif +/**********************************************************************//** + * + * 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.h + * + * @date 7-Apr-2020 + * @author Dara Navaei + * + * @brief DG temperature sensors controller + * + **************************************************************************/ + +#ifndef __TEMPERATURESENSORS_H__ +#define __TEMPERATURESENSORS_H__ + +#include "Common.h" + +typedef enum SENSORS_NAME +{ + TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, + TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, + TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, + TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, + TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, + TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, + TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, + TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, + NUM_OF_TEMPERATURE_SENSORS +} TEMPERATURE_SENSORS_T; + +void initTemperatureSensors ( void ); + +SELF_TEST_STATUS_T execTemperatureSensorsSelfTest ( void ); + +void execTemperatureSensors ( void ); + +F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ); + +#endif Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r8638b207699a3a48e3657e838e24ae838369c867 -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8638b207699a3a48e3657e838e24ae838369c867) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -124,6 +124,11 @@ SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, + SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, + SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, + SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rc48a99d2d1c852adcc986253b6c420a90dab7bfe -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision c48a99d2d1c852adcc986253b6c420a90dab7bfe) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -97,7 +97,7 @@ * @param resID : ID of reservoir to set as active. * @return TRUE if set active reservoir command successful, FALSE if not. *************************************************************************/ -BOOL setActiveReservoir( RESERVOIR_ID_T resID ) +BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ) { BOOL result = FALSE; @@ -124,7 +124,7 @@ * @param fillToVolMl : Target volume (in mL) to fill reservoir to. * @return TRUE if fill command successful, FALSE if not. *************************************************************************/ -BOOL startFill( U32 fillToVolMl ) +BOOL startFillCmd( U32 fillToVolMl ) { BOOL result = FALSE; @@ -151,7 +151,7 @@ * Outputs : move to standby mode * @return TRUE if stop fill command successful, FALSE if not. *************************************************************************/ -BOOL stopFill( void ) +BOOL stopFillCmd( void ) { BOOL result = FALSE; @@ -174,7 +174,7 @@ * @param drainToVolMl : Target volume (in mL) to drain reservoir to. * @return TRUE if drain command successful, FALSE if not. *************************************************************************/ -BOOL startDrain( U32 drainToVolMl ) +BOOL startDrainCmd( U32 drainToVolMl ) { BOOL result = FALSE; @@ -200,7 +200,7 @@ * Outputs : move to standby mode * @return TRUE if stop drain command successful, FALSE if not. *************************************************************************/ -BOOL stopDrain( void ) +BOOL stopDrainCmd( void ) { BOOL result = FALSE; @@ -223,7 +223,7 @@ * Outputs : start trimmer heater * @return TRUE if stop drain command successful, FALSE if not. *************************************************************************/ -BOOL startTrimmerHeater( void ) +BOOL startTrimmerHeaterCmd( void ) { BOOL result = FALSE; // TODO @@ -239,7 +239,7 @@ * Outputs : stop trimmer heater * @return TRUE if stop drain command successful, FALSE if not. *************************************************************************/ -BOOL stopTrimmerHeater( void ) +BOOL stopTrimmerHeaterCmd( void ) { BOOL result = FALSE; // TODO Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -rc48a99d2d1c852adcc986253b6c420a90dab7bfe -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision c48a99d2d1c852adcc986253b6c420a90dab7bfe) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -43,13 +43,13 @@ void initReservoirs( void ); void execReservoirs( void ); -BOOL setActiveReservoir( RESERVOIR_ID_T resID ); // handle switch reservoirs command from HD -BOOL startFill( U32 fillToVolMl ); // handle fill command from HD -BOOL stopFill( void ); // handle stop fill command from HD -BOOL startDrain( U32 drainToVolMl ); // handle drain command from HD -BOOL stopDrain( void ); // handle stop drain command from HD -BOOL startTrimmerHeater( void ); // handle start trimmer heater control command from HD -BOOL stopTrimmerHeater( void ); // handle stop trimmer heater control command from HD +BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ); // handle switch reservoirs command from HD +BOOL startFillCmd( U32 fillToVolMl ); // handle fill command from HD +BOOL stopFillCmd( void ); // handle stop fill command from HD +BOOL startDrainCmd( U32 drainToVolMl ); // handle drain command from HD +BOOL stopDrainCmd( void ); // handle stop drain command from HD +BOOL startTrimmerHeaterCmd( void ); // handle start trimmer heater control command from HD +BOOL stopTrimmerHeaterCmd( void ); // handle stop trimmer heater control command from HD DATA_GET_PROTOTYPE( RESERVOIR_ID_T, getActiveReservoir ); DATA_GET_PROTOTYPE( U32, getReservoirFillVolumeTargetMl ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rab6ac1bb140201e5737d594b3456038ea9e4725f -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ab6ac1bb140201e5737d594b3456038ea9e4725f) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -19,11 +19,13 @@ #include // for memcpy() #include "DrainPump.h" +#include "Heaters.h" #include "LoadCell.h" #include "MsgQueues.h" #include "ModeStandby.h" #include "ModeRecirculate.h" #include "OperationModes.h" +#include "Pressures.h" #include "Reservoirs.h" #include "ROPump.h" #include "RTC.h" @@ -91,6 +93,12 @@ U32 drainToVolumeMl; } RESERVOIR_DATA_T; +typedef struct +{ + U32 targetPrimaryHeaterTemp; + U32 targetTrimmerHeaterTemp; +} TARGET_TEMPS_PAYLOAD_T; + #pragma pack(pop) // ********** private data ********** @@ -580,7 +588,18 @@ *************************************************************************/ void handleSetDialysateTemperatureCmd( MESSAGE_T *message ) { - // TODO - parse and send temp targets to heaters module + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(TARGET_TEMPS_PAYLOAD_T) ) + { + TARGET_TEMPS_PAYLOAD_T payload; + + result = TRUE; + memcpy( &payload, message->payload, sizeof(TARGET_TEMPS_PAYLOAD_T) ); + //setPrimaryHeaterTargetTemperature( (F32)payload.targetPrimaryHeaterTemp ); + //setTrimmerHeaterTargetTemperature( (F32)payload.targetTrimmerHeaterTemp ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } /************************************************************************* @@ -635,7 +654,7 @@ result = TRUE; memcpy( &reservoirID, message->payload, sizeof(U32) ); - setActiveReservoir( (RESERVOIR_ID_T)reservoirID ); + setActiveReservoirCmd( (RESERVOIR_ID_T)reservoirID ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } @@ -659,7 +678,7 @@ result = TRUE; memcpy( &fillToVolumeMl, message->payload, sizeof(U32) ); - startFill( fillToVolumeMl ); + startFillCmd( fillToVolumeMl ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } @@ -684,7 +703,7 @@ result = TRUE; memcpy( &drainToVolMl, message->payload, sizeof(U32) ); - startDrain( drainToVolMl ); + startDrainCmd( drainToVolMl ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -18,6 +18,7 @@ #include "lin.h" #include "DrainPump.h" +#include "Heaters.h" #include "OperationModes.h" #include "Reservoirs.h" #include "ROPump.h" @@ -51,6 +52,9 @@ // manage drain pump execDrainPumpController(); + // manage heaters + execPrimaryHeaters(); + // manage time-based reservoir tasks execReservoirs(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -21,6 +21,7 @@ #include "LoadCell.h" #include "Pressures.h" #include "ROPump.h" +#include "TemperatureSensors.h" #include "WatchdogMgmt.h" #include "TaskPriority.h" @@ -49,6 +50,9 @@ // monitor RO pump execROPumpMonitor(); + // Temperature sensors read + execTemperatureSensors(); + // 2nd pass for FPGA execFPGAOut(); Index: firmware/DG.dil =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/DG.dil (.../DG.dil) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/DG.dil (.../DG.dil) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -1,4 +1,4 @@ -# RM46L852PGE 04/10/20 10:43:10 +# RM46L852PGE 04/24/20 09:47:06 # ARCH=RM46L852PGE # @@ -9348,10 +9348,10 @@ DRIVER.PMM.VAR.PMM_PWR_DOMAIN4_ENABLE.VALUE=0 DRIVER.PMM.VAR.PMM_PWR_DOMAIN2_ENABLE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM6_OSHT_WIDTH.VALUE=100 -DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD_REG.VALUE=43056 DRIVER.ETPWM.VAR.ETPWM2_PWMA_COMPARE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM5_CHOPPER_PERIOD.VALUE=100.000 -DRIVER.ETPWM.VAR.ETPWM3_PWMA_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM3_PWMA_ACTUALPERIOD.VALUE=1666679.570 DRIVER.ETPWM.VAR.ETPWM3_PWMA_DUTY.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_PWMB_PERIOD.VALUE=1000 DRIVER.ETPWM.VAR.ETPWM3_PWMB_DEADBAND_OUT.VALUE=0 @@ -9387,10 +9387,10 @@ DRIVER.ETPWM.VAR.ETPWM1_OSHT4.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM5_OSHT_WIDTH_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM1_OSHT5.VALUE=0x0000 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD_REG.VALUE=10333 DRIVER.ETPWM.VAR.ETPWM1_OSHT6.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_PERIOD.VALUE=100.000 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD.VALUE=66667 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD.VALUE=100000 DRIVER.ETPWM.VAR.ETPWM2_CBC.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM4_CLKDIV.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_PWMB_ENA.VALUE=1 @@ -9446,7 +9446,7 @@ DRIVER.ETPWM.VAR.ETPWM6_PWMA_FALLING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM6_PWMA_RISING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM4_CHOPPER_MODE.VALUE=0 -DRIVER.ETPWM.VAR.ETPWM3_CLKDIV_REG.VALUE=0 +DRIVER.ETPWM.VAR.ETPWM3_CLKDIV_REG.VALUE=2 DRIVER.ETPWM.VAR.ETPWM2_PWMB_DEADBAND_OUT.VALUE=0 DRIVER.ETPWM.VAR.ETPWM6_TB_FREQUENCY.VALUE=110.000 DRIVER.ETPWM.VAR.ETPWM4_CBC.VALUE=0x0000 @@ -9503,7 +9503,7 @@ DRIVER.ETPWM.VAR.ETPWM3_PWMA_COMPARE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_OSHT5.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM3_DEADBAND_OUTPUT.VALUE=PWMA_PWMB_NIL -DRIVER.ETPWM.VAR.ETPWM3_PWMB_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM3_PWMB_ACTUALPERIOD.VALUE=1666679.570 DRIVER.ETPWM.VAR.ETPWM2_OSHT6.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM6_CBC.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM2_PWMB_DUTYTIME.VALUE=0.000 @@ -9545,7 +9545,7 @@ DRIVER.ETPWM.VAR.ETPWM2_CBC4.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_OST.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_ACTUALPERIOD.VALUE=77.418 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_ACTUALPERIOD.VALUE=100004.839 DRIVER.ETPWM.VAR.ETPWM7_PWMB_DUTYTIME.VALUE=0.000 DRIVER.ETPWM.VAR.ETPWM3_FDELAY_SOURCE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_CBC5.VALUE=0x0000 @@ -9562,7 +9562,7 @@ DRIVER.ETPWM.VAR.ETPWM6_ENABLE_SOCB.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_PWMB_ENA.VALUE=1 DRIVER.ETPWM.VAR.ETPWM5_CHOPPER_ACTUALPERIOD.VALUE=77.418 -DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD.VALUE=66667 +DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD.VALUE=1666667 DRIVER.ETPWM.VAR.ETPWM1_DEADBAND_OUTPUT.VALUE=PWMA_PWMB_NIL DRIVER.ETPWM.VAR.ETPWM4_TB_ACTUALFREQUENCY.VALUE=103.335 DRIVER.ETPWM.VAR.ETPWM2_OSHT_WIDTH_REG.VALUE=0 @@ -9701,16 +9701,16 @@ DRIVER.ETPWM.VAR.ETPWM3_PWMB_FALLING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM6_DEADBAND_OUTPUT.VALUE=PWMA_PWMB_NIL DRIVER.ETPWM.VAR.ETPWM3_INTERRUPT_PERIOD.VALUE=1 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD.VALUE=66667 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD.VALUE=100000 DRIVER.ETPWM.VAR.ETPWM7_RDELAY_SOURCE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_PWMA_DUTYTIME.VALUE=0.000 DRIVER.ETPWM.VAR.ETPWM1_TB_FREQUENCY.VALUE=110.000 -DRIVER.ETPWM.VAR.ETPWM3_CLKDIV.VALUE=0 +DRIVER.ETPWM.VAR.ETPWM3_CLKDIV.VALUE=3 DRIVER.ETPWM.VAR.ETPWM2_PWMA_DEADBAND_INVERT.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_CHOPPER_PERIOD_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM6_CLKDIV_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM4_SOCA_PERIOD.VALUE=1 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_ACTUALPERIOD.VALUE=100004.839 DRIVER.ETPWM.VAR.ETPWM5_CBC1.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM5_PWMB_RISING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM5_CBC2.VALUE=0x0000 @@ -9769,7 +9769,7 @@ DRIVER.ETPWM.VAR.ETPWM1_DCBEVT1.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM4_CHOPPER_PERIOD.VALUE=100.000 DRIVER.ETPWM.VAR.ETPWM1_DCBEVT2.VALUE=0x0000 -DRIVER.ETPWM.VAR.ETPWM3_TB_ACTUALFREQUENCY.VALUE=103.335 +DRIVER.ETPWM.VAR.ETPWM3_TB_ACTUALFREQUENCY.VALUE=25.834 DRIVER.ETPWM.VAR.ETPWM2_ENABLE_SOCA.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM2_ENABLE_SOCB.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM2_HSPCLKDIV.VALUE=0 @@ -9799,7 +9799,7 @@ DRIVER.ETPWM.VAR.ETPWM1_CLKDIV.VALUE=0 DRIVER.ETPWM.VAR.ETPWM6_CHOPPER_DUTY.VALUE=50 DRIVER.ETPWM.VAR.ETPWM6_PWMA_POLARITY.VALUE=0 -DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD_REG.VALUE=43056 DRIVER.ETPWM.VAR.ETPWM4_PWMB_DEADBAND_OUT.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_FDELAY_SOURCE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM4_RDELAY_SOURCE.VALUE=0 @@ -9847,7 +9847,7 @@ DRIVER.ETPWM.VAR.ETPWM5_PWMA_COMPARE.VALUE=52 DRIVER.ETPWM.VAR.ETPWM3_PWMA_RISING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_PERIOD_REG.VALUE=0 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD_REG.VALUE=10333 DRIVER.ETPWM.VAR.ETPWM7_PWMA_FALLING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM7_PWMA_RISING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM6_BASE.VALUE=0xFCF79100 @@ -9870,7 +9870,7 @@ DRIVER.ETPWM.VAR.ETPWM7_PWMA_DEADBAND_OUT.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_HSPCLKDIV_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_CHOPPER_DUTY_NEW.VALUE=50.0 -DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD.VALUE=66667 +DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD.VALUE=1666667 DRIVER.ETPWM.VAR.ETPWM2_TB_FREQUENCY.VALUE=110.000 DRIVER.ETPWM.VAR.ETPWM6_DCAEVT1.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM3_PWMA_POLARITY.VALUE=0 Index: firmware/include/etpwm.h =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/include/etpwm.h (.../etpwm.h) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/include/etpwm.h (.../etpwm.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -468,7 +468,7 @@ #define ETPWM1_TBCTL_CONFIGVALUE ((uint16)((uint16)0U << 7U) | (uint16)((uint16)0U << 10U)) #define ETPWM1_TBPHS_CONFIGVALUE 0x00000000U -#define ETPWM1_TBPRD_CONFIGVALUE 6888U +#define ETPWM1_TBPRD_CONFIGVALUE 10333U #define ETPWM1_CMPCTL_CONFIGVALUE 0x00000000U #define ETPWM1_CMPA_CONFIGVALUE 0U #define ETPWM1_CMPB_CONFIGVALUE 0U @@ -518,9 +518,9 @@ #define ETPWM2_DCFWINDOW_CONFIGVALUE 0x00000000U #define ETPWM2_DCFWINDOWCNT_CONFIGVALUE 0x00000000U -#define ETPWM3_TBCTL_CONFIGVALUE ((uint16)((uint16)0U << 7U) | (uint16)((uint16)0U << 10U)) +#define ETPWM3_TBCTL_CONFIGVALUE ((uint16)((uint16)0U << 7U) | (uint16)((uint16)2U << 10U)) #define ETPWM3_TBPHS_CONFIGVALUE 0x00000000U -#define ETPWM3_TBPRD_CONFIGVALUE 6888U +#define ETPWM3_TBPRD_CONFIGVALUE 43056U #define ETPWM3_CMPCTL_CONFIGVALUE 0x00000000U #define ETPWM3_CMPA_CONFIGVALUE 0U #define ETPWM3_CMPB_CONFIGVALUE 0U Index: firmware/source/etpwm.c =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/source/etpwm.c (.../etpwm.c) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/source/etpwm.c (.../etpwm.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -82,7 +82,7 @@ etpwmREG1->TBCTL |= (uint16)((uint16)0U << 10U); /** - Sets time period or frequency for ETPWM block both PWMA and PWMB*/ - etpwmREG1->TBPRD = 6888U; + etpwmREG1->TBPRD = 10333U; /** - Setup the duty cycle for PWMA */ etpwmREG1->CMPA = 0U; @@ -269,10 +269,10 @@ etpwmREG3->TBCTL = (uint16)0U << 7U; /** - Sets time-base clock prescale bits */ - etpwmREG3->TBCTL |= (uint16)((uint16)0U << 10U); + etpwmREG3->TBCTL |= (uint16)((uint16)2U << 10U); /** - Sets time period or frequency for ETPWM block both PWMA and PWMB*/ - etpwmREG3->TBPRD = 6888U; + etpwmREG3->TBPRD = 43056U; /** - Setup the duty cycle for PWMA */ etpwmREG3->CMPA = 0U; Index: firmware/source/sys_main.c =================================================================== diff -u -r216bd924f989182e648ee5f33f4c91c43ac438ac -r2496e9225fa1b2c627d625def02515a0f0dd5793 --- firmware/source/sys_main.c (.../sys_main.c) (revision 216bd924f989182e648ee5f33f4c91c43ac438ac) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) @@ -66,6 +66,7 @@ #include "CPLD.h" #include "DrainPump.h" #include "FPGA.h" +#include "Heaters.h" #include "InternalADC.h" #include "MsgQueues.h" #include "OperationModes.h" @@ -76,6 +77,7 @@ #include "SafetyShutdown.h" #include "SystemComm.h" #include "TaskBG.h" +#include "TemperatureSensors.h" #include "Timers.h" #include "WatchdogMgmt.h" @@ -163,6 +165,8 @@ initFPGA(); initInternalADC(); initPressures(); + initHeaters(); + initTemperatureSensors(); initROPump(); initDrainPump(); initRTC();