Index: firmware/App/Controllers/Temperatures.c =================================================================== diff -u --- firmware/App/Controllers/Temperatures.c (revision 0) +++ firmware/App/Controllers/Temperatures.c (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -0,0 +1,145 @@ + + +#include // For temperature calculations + +#include "FPGA.h" +#include "InternalADC.h" +#include "PersistentAlarm.h" +#include "SystemCommMessages.h" +#include "Temperatures.h" +#include "TaskGeneral.h" + +/** + * @addtogroup Temperatures + * @{ + */ + +// ********** private definitions ********** + +#define TEMPERATURES_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Temperatures publish data time interval. +#define TEMPERATURES_ADC_READ_INTERVAL ( MS_PER_SECOND / ( 2 * TASK_GENERAL_INTERVAL ) ) ///< Temperatures ADC read time interval. +#define ADC_FPGA_READ_DELAY_COUNT 1.0 ///< FGPA read delay upon startup. +#define TWELVE_BIT_RESOLUTION 4096U ///< 12 bit resolution conversion. +#define THERMISTOR_REFERENCE_VOLTAGE 3.0 ///< Thermistors source voltage. +#define THERMISTOR_REFERENCE_RESISTOR_AT_25 10000.0 ///< Thermistors reference resistor in ohms. +#define THERMISTOR_REFERENCE_TEMPERATURE 298.0 ///< Thermistors reference temperature in kelvin. +#define ONBOARD_THERMISTOR_BETA_VALUE 3380.0 ///< Onboard thermistor beta value. +#define POWER_SUPPLY_THERMISTOR_BETA_VALUE 3345.0 ///< Power supply beta value. +#define CELSIUS_TO_KELVIN_CONVERSION 273.15 ///< Celsius to Kelvin temperature conversion. +#define MIN_ALLOWED_TEMPERATURE 0.0 ///< Thermistors/sensors minimum allowed temperature reading. +#define MAX_ALLOWED_TEMPERATURE 80.0 ///< Thermistors/sensors maximum allowed temperature reading. +#define MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ( 5 * MS_PER_SECOND ) ///< Thermistors/sensors maximum allowed temperature out of range period. + +/// Temperatures exec states +typedef enum thermistors_Exec_States +{ + TEMPERATURES_EXEC_STATE_START_STATE = 0, ///< Temperatures exec state start state. + TEMPERATURES_EXEC_STATE_GET_ADC_VALUES_STATE, ///< Temperatures exec state get ADC values state. + NUM_OF_TEMPERATURES_EXEC_STATES, ///< Number of temperatures exec state. +} TEMPERATURES_EXEC_STATES_T; + +/// Temperatures structure +typedef struct +{ + U32 rawADCRead; ///< Temperatures raw ADC read. + OVERRIDE_F32_T temperatureValue; ///< Temperatures value. +} TEMPERATURE_SENSORS_T; + +// ********** private data ********** + +static TEMPERATURES_EXEC_STATES_T temperaturesExecState; ///< Temperatures exec state. +static TEMPERATURE_SENSORS_T temperaturesStatus[ NUM_OF_TEMPERATURES ]; ///< Temperature sensors status. +static OVERRIDE_U32_T temperaturesPublishInterval = { TEMPERATURES_DATA_PUBLISH_INTERVAL, + TEMPERATURES_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperatures publish time interval override. +static U32 dataPublishCounter; ///< Temperatures data publish timer counter. +static U32 adcReadCounter; ///< Temperatures ADC read counter. + +static const F32 THERMISTOR_VOLTAGE_CONV_COEFF = THERMISTOR_REFERENCE_VOLTAGE / + (F32)TWELVE_BIT_RESOLUTION; ///< On board thermistor ADC to voltage conversion coefficient. +static const F32 ON_BOARD_THERMISTOR_REF_TEMP_INV = 1 / THERMISTOR_REFERENCE_TEMPERATURE; ///< On board thermistor reference inverse. + +// ********** private function prototypes ********** + +static TEMPERATURES_EXEC_STATES_T handleExecStart( void ); +static TEMPERATURES_EXEC_STATES_T handleExecGetADCValues( void ); + +static void monitorTemperatures( void ); +static void convertADC2Temperature( void ); +static F32 calculateTemperature( S32 adcValue ); +static void publishTemperaturesData( void ); +static U32 getPublishTemperaturesDataInterval( void ); + +/*********************************************************************//** + * @brief + * The initTemperatures function initializes the temperatures module. + * @details Inputs: none + * @details Outputs: temperaturesExecState, dataPublishCounter, temperaturesStatus + * @return none + *************************************************************************/ +void initTemperatures( void ) +{ + U08 i; + + temperaturesExecState = TEMPERATURES_EXEC_STATE_START_STATE; + dataPublishCounter = 0; + + for ( i = 0; i < NUM_OF_TEMPERATURES; i++ ) + { + memset( &temperaturesStatus[ i ], 0x0, sizeof( TEMPERATURE_SENSORS_T ) ); + } + + // Initialize a persistent alarm for temperatures temeprature out of range + initPersistentAlarm( ALARM_ID_HD_TEMPERATURES_OUT_OF_RANGE, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ); +} + +/*********************************************************************//** + * @brief + * The execTemperaturesSelfTest function runs the temperatures POST during + * the self-test. + * @details Inputs: none + * @details Outputs: none + * @return execTemperaturesSelfTest which is the status of the self test + *************************************************************************/ +SELF_TEST_STATUS_T execTemperaturesSelfTest( void ) +{ + SELF_TEST_STATUS_T status = SELF_TEST_STATUS_IN_PROGRESS; + + // TODO implement the calibration processing function. + // It returns a pass for now + + status = SELF_TEST_STATUS_PASSED; + + return status; +} + +/*********************************************************************//** + * @brief + * The execTemperatures function executes the temperature sensors' state machine. + * @details Inputs: temperaturesExecState + * @details Outputs: temperaturesExecState + * @return none + *************************************************************************/ +void execTemperatures( void ) +{ + // Read the sensors all the time + switch ( temperaturesExecState ) + { + case TEMPSENSORS_EXEC_STATE_START: + temperaturesExecState = handleExecStart(); + break; + + case TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES: + temperaturesExecState = handleExecGetADCValues(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, temperaturesExecState ); + temperaturesExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + break; + } + + // Publish the data + getPublishTemperaturesDataInterval(); +} + +/**@}*/ Index: firmware/App/Controllers/Temperatures.h =================================================================== diff -u --- firmware/App/Controllers/Temperatures.h (revision 0) +++ firmware/App/Controllers/Temperatures.h (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -0,0 +1,57 @@ + +#ifndef APP_CONTROLLERS_TEMPERATURES_H_ +#define APP_CONTROLLERS_TEMPERATURES_H_ + +#include "HDCommon.h" + +/** + * @defgroup Temperatures Temperatures + * @brief Thermistors driver module. Reads and processes the thermistors. + * Onboard thermistor manufacturer: Murata Manufacturing, PN: NCP14XH103J03RC + * Power supply thermistors manufacturer: Murata Manufacturing, PN: NCP18XH103F03RB or + * Epcos Manufacturing, PN: B57330V2103F260 + * + * @addtogroup Temperatures + * @{ + */ + +// ********** public definitions ********** + +/// Enumeration of temperatures +typedef enum HD_temperatures +{ + THERMISTOR_ONBOARD_NTC = 0, ///< Onboard thermistor + THERMISTOR_POWER_SUPPLY_1, ///< HD power supply 1 thermistor + TEMPSENSOR_FPGA_BOARD_SENSOR, ///< FPGA board temperature sensor + TEMPSENSOR_PBA_ADC_SENSOR, ///< PBA ADC temperature sensor + NUM_OF_TEMPERATURES, ///< Number of temperatures +} TEMPERATURES_T; + +/// Thermistors/temperature sensors data publish structure +typedef struct +{ + F32 onboardThermistor; ///< Onboard thermistor data + F32 powerSupply1Thermistor; ///< Power supply 1 thermistor + F32 fpgaBoardTempSensor; ///< FPGA board temperature sensor + F32 pbaADCTempSensor; ///< PBA ADC temperature sensor +} TEMPERATURES_DATA_T; + +// ********** public function prototypes ********** + +void initTemperatures( void ); + +SELF_TEST_STATUS_T execTemperaturesSelfTest( void ); + +void execTemperatures( void ); + +F32 getTemperatureValue( TEMPERATURES_T sensorID ); + +BOOL testSetMeasuredTemperatureOverride( U32 sensorID, F32 temperature ); +BOOL testResetMeasuredTemperatureOverride( U32 sensorID ); + +BOOL testSetTemperturesPublishIntervalOverride( U32 value ); +BOOL testResetTemperaturesPublishIntervalOverride( void ); + +/**@}*/ + +#endif Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -35,7 +35,7 @@ const INT_ADC_CHANNEL_T ADC_CHANNEL_NUM_TO_CHANNEL_ID[ MAX_ADC_CHANNELS ] = { INT_ADC_DIAL_IN_PUMP_SPEED, // 0 - INT_ADC_NOT_USED, // 1 + INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 1 INT_ADC_NOT_USED, // 2 INT_ADC_NOT_USED, // 3 INT_ADC_NOT_USED, // 4 @@ -44,7 +44,7 @@ INT_ADC_DIAL_IN_PUMP_MOTOR_CURRENT, // 7 INT_ADC_NOT_USED, // 8 INT_ADC_NOT_USED, // 9 - INT_ADC_NOT_USED, // 10 + INT_ADC_BOARD_THERMISTOR, // 10 INT_ADC_NOT_USED, // 11 INT_ADC_NOT_USED, // 12 INT_ADC_NOT_USED, // 13 Index: firmware/App/Drivers/InternalADC.h =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -45,7 +45,9 @@ INT_ADC_DIAL_IN_PUMP_SPEED, ///< Internal ADC channel for dialysate inlet pump speed. INT_ADC_DIAL_IN_PUMP_MOTOR_CURRENT, ///< Internal ADC channel for dialysate inlet pump current. INT_ADC_DIAL_OUT_PUMP_SPEED, ///< Internal ADC channel for dialysate outlet pump speed. - INT_ADC_DIAL_OUT_PUMP_MOTOR_CURRENT, ///< Internal ADC channel for dialysate outlet pump current. + INT_ADC_DIAL_OUT_PUMP_MOTOR_CURRENT, ///< Internal ADC channel for dialysate outlet pump current. + INT_ADC_POWER_SUPPLY_1_THERMISTOR, ///< Internal ADC channel for power supply 1 thermistor. + INT_ADC_BOARD_THERMISTOR, ///< Internal ADC channel for onboard thermistor. NUM_OF_INT_ADC_CHANNELS ///< Number of used internal ADC channels. } INT_ADC_CHANNEL_T; Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -271,7 +271,8 @@ // Ensure we do not sit in stopped state for too long if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + // TODO has this error been removed? + //activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); } } Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -142,7 +142,8 @@ // Ensure we do not sit in stopped state for too long if ( ++bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + // TODO has this error been removed? + //activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); } // Execute treatment stop sub-mode state machine Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r6c0750e3fad58595adcda4bcc26da0032daeff57 -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 6c0750e3fad58595adcda4bcc26da0032daeff57) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -142,7 +142,7 @@ U32 adc1Channel0; ///< Reg 292. ADC1 channel 0 data. U32 adc1Channel1; ///< Reg 296. ADC1 channel 1 data. U32 bloodFlowSoundSpeedData; ///< Reg 300. Blood flow sensor - sound speed data. - U32 bloodFlowAccFlowData; ///< Reg 304. Blood flow sensor - accumualted flow data. + U32 bloodFlowAccFlowData; ///< Reg 304. Blood flow sensor - accumulated flow data. F32 bloodFlowSignalStrength; ///< Reg 308. Blood flow sensor - signal strength. U08 adc1SequenceCount; ///< Reg 312. ADC1 round robin channel sequence count. U08 adc1ErrorCount; ///< Reg 313. ADC1 error count. @@ -161,7 +161,7 @@ U16 dialInPumpHallSensorCount; ///< Reg 336. Dialysate inlet pump hall sensor count. U16 dialOutPumpHallSensorCount; ///< Reg 338. Dialysate outlet pump hall sensor count. U32 dialysateFlowSoundSpeedData; ///< Reg 340. Dialysate flow sensor - sound speed data. - U32 dialysateFlowAccFlowData; ///< Reg 344. Dialysate flow sensor - accumualted flow data. + U32 dialysateFlowAccFlowData; ///< Reg 344. Dialysate flow sensor - accumulated flow data. F32 dialysateFlowSignalStrength; ///< Reg 348. Dialysate flow sensor - signal strength. U16 fan1PulseTime; ///< Reg 352. Fan 1 pulse time in 2.5 uSec resolution. 0xFFFF if fan RPM < 500 RPM. U16 fan2PUlseTime; ///< Reg 354. Fan 2 pulse time in 2.5 uSec resolution. 0xFFFF if fan RPM < 500 RPM. @@ -186,16 +186,16 @@ U16 syringePumpAdcDataReadCh1; ///< Reg 390. Syringe pump ADC channel 1 register (10 bit). U16 syringePumpAdcDataReadCh2; ///< Reg 392. Syringe pump ADC channel 2 register (10 bit). U16 syringePumpAdcDataReadCh3; ///< Reg 394. Syringe pump ADC channel 3 register (10 bit). - U16 VBASpeed; ///< Reg 396. VBA pinch valve speed (Register VAUX0) - U16 VBVSpeed; ///< Reg 398. VBV pinch valve speed (Register VAUX1) - U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2) - U16 VDoCurrent; ///< Reg 402. VDo pinch valve current (Register VAUX3) - U16 VBACurrent; ///< Reg 404. VBA pinch valve current (Register VAUX8) - U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX9) - U16 VDoSpeed; ///< Reg 408. VDo pinch valve speed (Register VAUX10) - U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX11) - U16 VSpareSpeed; ///< Reg 412. VSpare speed (Register VAUX5) - U16 VSpareCurrent; ///< Reg 414. VSpare current (Register VAUX13) + U16 VBASpeed; ///< Reg 396. VBA pinch valve speed (Register VAUX0). + U16 VBVSpeed; ///< Reg 398. VBV pinch valve speed (Register VAUX1). + U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2). + U16 VDoCurrent; ///< Reg 402. VDo pinch valve current (Register VAUX3). + U16 VBACurrent; ///< Reg 404. VBA pinch valve current (Register VAUX8). + U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX9). + U16 VDoSpeed; ///< Reg 408. VDo pinch valve speed (Register VAUX10). + U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX11). + U16 fpgaBoardTemperature; ///< Reg 412. FPGA board temperature. + U16 VAUX13; ///< Reg 414. Register VAUX13 } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -2041,6 +2041,30 @@ return fpgaSensorReadings.VBACurrent; } +/*********************************************************************//** + * @brief + * The getFPGABoardTemperature function reads the FPGA board temperature. + * @details Inputs: none + * @details Outputs: fpgaSensorReadings + * @return Current FPGA board temperature + *************************************************************************/ +U16 getFPGABoardTemperature( void ) +{ + return fpgaSensorReadings.fpgaBoardTemperature; +} + +/*********************************************************************//** + * @brief + * The getFPGAPBAADCTemperature function reads the PBA ADC temperature. + * @details Inputs: none + * @details Outputs: fpgaSensorReadings + * @return PBA ADC temperature + *************************************************************************/ +U32 getFPGAPBAADCTemperature( void ) +{ + return fpgaSensorReadings.adc1Channel1; +} + #ifdef DEBUG_ENABLED /*********************************************************************//** * @brief Index: firmware/App/Services/FPGA.h =================================================================== diff -u -rcaaba168f0caee9420acc13ce5287451483a58cd -r0c3533ac1aa509678a73a8177d648080fa567203 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision caaba168f0caee9420acc13ce5287451483a58cd) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 0c3533ac1aa509678a73a8177d648080fa567203) @@ -131,6 +131,8 @@ void setFPGAValveBloodArterialPosition( S16 setPoint ); S16 getFPGAValveBloodArterialPosition( void ); U16 getFPGAValveBloodArterialCurrentCounts( void ); +U16 getFPGABoardTemperature( void ); +U32 getFPGAPBAADCTemperature( void ); // The PWM functions are only used during debugging #ifdef DEBUG_ENABLED