Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -r4a80b214d221c1f64feb215d828a10d8fddbaf4d -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 4a80b214d221c1f64feb215d828a10d8fddbaf4d) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -38,7 +38,6 @@ // ********** private definitions ********** -#define BAL_CHAMBER_FILL_VOLUME_ML 30.0F ///< Balancing chamber fill/drain volume per batch operation. #define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. /// Payload record structure for balancing chamber switch only request Index: firmware/App/Controllers/BalancingChamber.h =================================================================== diff -u -r1d4d4b56b96a50cf32c9db93c322cc97a25cab7d -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision 1d4d4b56b96a50cf32c9db93c322cc97a25cab7d) +++ firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -37,6 +37,7 @@ #define SPENT_DIAL_PRESSURE_MAX_PSIG 31.0F ///< Maximum spent dialysate pressure (D51) limit for balancing chamber fill operations. #define BC_FILL_PRESSURE_MIN_PSIG 13.0F ///< Minimum pressure (drop) during balancing chamber switching, indicates fill has been started / in progress. #define BC_FILL_PRESSURE_MAX_PSIG 9.0F ///< Maximum pressure (drop) during balancing chamber switching, indicates fill has been started / in progress. +#define BAL_CHAMBER_FILL_VOLUME_ML 30.0F ///< Balancing chamber fill/drain volume per batch operation. /// balancing chamber data structure typedef struct Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r0df32171c99e44512f8ea90ab2068e25ef4bcce2 -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 0df32171c99e44512f8ea90ab2068e25ef4bcce2) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -49,11 +49,15 @@ #define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. #define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. #define HEATERS_ZERO_EFFICIENCY 0.0F ///< Zero heater efficiency +#define HEATER_CNTL_TRANSFER_DELTA_TEMP_C 0.25F ///< AC heater delta temperature to transfer control from open to close loop #define D5_HEAT_TX_INIT_FEED_FORWARD 0.0F ///< Initial Feed forward term for heater control -#define D5_HEAT_TX_P_COEFFICIENT 0.050F ///< P Term for AC primary heater control during treatment mode. -#define D5_HEAT_TX_I_COEFFICIENT 0.015F ///< I Term for AC primary heater control during treatment mode. +//#define D5_HEAT_TX_P_COEFFICIENT 0.050F ///< P Term for AC primary heater control during treatment mode. +//#define D5_HEAT_TX_I_COEFFICIENT 0.015F ///< I Term for AC primary heater control during treatment mode. +#define D5_HEAT_TX_P_COEFFICIENT 0.048F ///< P Term for AC primary heater control during treatment mode. +#define D5_HEAT_TX_I_COEFFICIENT 0.012F ///< I Term for AC primary heater control during treatment mode. + #define D45_HEAT_P_COEFFICIENT 0.20F ///< P Term for trimmer heater control. #define D45_HEAT_I_COEFFICIENT 0.05F ///< I Term for trimmer heater control. #define D45_HEAT_TX_INIT_FEED_FORWARD 0.0F ///< Initial Feed forward term for heater control @@ -68,8 +72,10 @@ #define HEATERS_MAX_OPERATING_VOLTAGE_V 24.0F ///< Heaters max operating voltage in volts. #define HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Heaters voltage out of range time out in milliseconds. #define HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL 0.2F ///< Heaters max voltage out of range tolerance. +#define D5_HEATER_DEADBAND_CONTROL 0.1F ///< Heater deadband range for conrtol. -#define D5_HEAT_CONTROL_INTERVAL_MS 30000 /// Primary heater control interval in milli seconds +//#define D5_HEAT_CONTROL_INTERVAL_MS 30000 /// Primary heater control interval in milli seconds +#define D5_HEAT_CONTROL_INTERVAL_MS 3000 /// Primary heater control interval in milli seconds #define D5_HEAT_CONTROL_INTERVAL_COUNT ( D5_HEAT_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) ///< Primary heater control interval count. #define D45_HEAT_CONTROL_INTERVAL_MS ( 1 * MS_PER_SECOND ) ///< Trimmer heater control interval in milli seconds #define D45_HEAT_CONTROL_INTERVAL_COUNT ( D45_HEAT_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. @@ -83,7 +89,6 @@ #define AC_HEATER_EFFICIENCY 0.90F ///< Approximated AC heater efficiency to be used in energy calcualtions. #define DC_HEATER_EFFICIENCY 1.0F ///< DC heater efficiency #define D5_HEAT_CONTROL_INTERVAL_START_COUNT ( D5_HEAT_CONTROL_INTERVAL_COUNT - 10 ) ///< AC heater control interval start count to jump feedforward control from open loop. - #define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. //static const F32 HEATERS_VOLTAGE_TOLERANCE_V = HEATERS_MAX_OPERATING_VOLTAGE_V * HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL; ///< Heaters voltage tolerance in volts. @@ -555,10 +560,10 @@ if ( DD_MODE_HEAT != opMode ) { - F32 deltaTempC = targetTemperature - measuredTemperature; - F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); + F32 deltaTempC = targetTemperature - measuredTemperature; + F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); - if ( capDeltaTempC <= HEATER_TEMP_CONTROL_TRANSFER ) + if ( capDeltaTempC <= HEATER_CNTL_TRANSFER_DELTA_TEMP_C ) { // Transfer Control to target when delta temp is minimal. state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; @@ -637,8 +642,6 @@ { startupHeaterControl = FALSE; F32 deltaTempC = targetTemperature - inletTemperature; - //TODO : testing - //F32 deltaTempC = 10.0F; // Hard code for testing, later remove it. F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 flowrate = getTDDialysateFlowrate() / LITER_IN_ML ; F32 feedforward = calculateDutyCycle( flowrate, capDeltaTempC, PRIMARY_HEATER_MAX_PWR_WATTS, AC_HEATER_EFFICIENCY, @@ -648,8 +651,13 @@ } else { - ctrl = runPIController( PI_CONTROLLER_ID_D5_HEAT, targetTemperature, measuredTemperature ); - control[ heater ].data = ctrl; + F32 deltaTempC = fabs( targetTemperature - measuredTemperature ); + + if ( deltaTempC >= D5_HEATER_DEADBAND_CONTROL ) + { + ctrl = runPIController( PI_CONTROLLER_ID_D5_HEAT, targetTemperature, measuredTemperature ); + control[ heater ].data = ctrl; + } } #ifdef __HEATERS_DEBUG__ U32 i; Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -ra85a030e1a424b6546c57e5e80f21500103e13ea -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision a85a030e1a424b6546c57e5e80f21500103e13ea) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -275,9 +275,12 @@ // Update any dynamic treatment parameter changes updateTreatmentSettings(); - //Check Dialysate Temperature + //Check dialysate temperature high/low alarms checkDialysateTemperature(); + //Check temperature drift between D30 and D28 + checkDialysateTemperatureSensors(); + //TODO: Transition to post gen dialysate then standby. if ( TRUE == pendingStopDDGenDialRequest ) { Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r0df32171c99e44512f8ea90ab2068e25ef4bcce2 -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 0df32171c99e44512f8ea90ab2068e25ef4bcce2) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -15,13 +15,16 @@ * ***************************************************************************/ +#include "BalancingChamber.h" #include "ConductivitySensors.h" #include "Messaging.h" #include "MessageSupport.h" #include "OperationModes.h" +#include "PersistentAlarm.h" #include "Temperature.h" #include "Timers.h" #include "TaskPriority.h" +#include "TDInterface.h" #include "Utilities.h" /** @@ -34,10 +37,24 @@ #define TEMP_SENSORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Temperature sensors publish data time interval. #define TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Temperature sensors FPGA error timeout in milliseconds. -#define D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ( 2 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< D4 temperature sensor moving average number of samples ( 2sec filter ). +#define D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES 50 ///< D4 temperature sensor moving average number of samples. #define D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES 25 ///< D50 temperature sensor moving average number of samples ( 250ms filter ). #define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. +#define DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES 30 ///< Dialysate temperature sensors moving average number of samples. +#define D28_D30_DATA_COLLECTION_TIME_MS ( 1 * MS_PER_SECOND ) ///< Dialysate temperature sensors data collection time in milliseconds. +#define D28_D30_TEMP_SENSORS_MAX_DEVIATION_C 3.0F ///< Dialysate temperature sensors maximum allowed deviation in C. +#define DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. +#define D28_D30_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C 5.0F ///< Dialysate temperature sensors maximum allowed deviation in heat disinfect in C. +/// Dialysate temperature sensors enums +typedef enum Dial_Temps_Sensors +{ + DIAL_TEMP_D28 = 0, ///< Dialysate temperature D28. + DIAL_TEMP_FIRST = DIAL_TEMP_D28, ///< Dialysate temperature first. + DIAL_TEMP_D30, ///< Dialysate temperature D30. + NUM_OF_DIAL_TEMPS ///< Number of Dialysate temperature sensors. +} DIAL_TEMPERATURE_SENSORS_T; + /// Temperature sensor exec states. typedef enum tempSensors_Exec_States { @@ -46,16 +63,31 @@ NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states } TEMPSENSORS_EXEC_STATES_T; +/// Dialysate temperature moving average structure +typedef struct +{ + BOOL dialTempColHasTimerBeenSet; ///< Dialysate temperature has data collection timer started boolean flag. + U32 dialTempDataColStartTimeMS; ///< Dialysate temperature data collection start time in milliseconds. + F32 dialTempRunningSumC; ///< Dialysate temperature running sum in C. + F32 dialTempAvgC; ///< Dialysate temperature average in C. + F32 dialTempSamplesC[ DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES ]; ///< Dialysate temperature samples array in C. + U32 dialTempSamplesNextIndex; ///< Dialysate temperature sample next index number. +} DIAL_TEMP_MOVING_AVG_DATA_T; + // ********** private data ********** static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state. static U32 startTime; ///< start time to read FPGA values. +static BOOL tempDriftEventCheck; ///< Temperature sensor drift event boolean. +static DIAL_TEMP_MOVING_AVG_DATA_T dialTempMovingAvgData[ NUM_OF_DIAL_TEMPS ]; ///< Dialysate temperature moving average data. static F32 d4TempAvgC; ///< D4 temperature average in C. static F32 d4TempRunningSumC; ///< D4 temperature running sum in C. static F32 d4TempSamplesC[ D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ]; ///< D4 temperature samples array in C. static U32 d4TempSamplesNextIndex; ///< D4 temperature sample next index number. static U32 d4TempCount; ///< D4 Number of samples in average buffer. +static U32 tempDataColStartTimeMS; ///< Temperature data collection start time in milliseconds. +static U32 tempDataColTimeInterval; ///< Temperature data collection time interval in milliseconds. static F32 d50TempAvgC; ///< D50 temperature average in C. static F32 d50TempRunningSumC; ///< D50 temperature running sum in C. @@ -72,6 +104,8 @@ static TEMPSENSORS_EXEC_STATES_T handleExecStart( void ); static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues( void ); static void filterTemperatureReadings( void ); +static void filterDialTemperatureReadings( void ); +static void getTempMovingAverageTimeInterval( void ); static void publishTemperatureSensorsData( void ); /*********************************************************************//** @@ -83,6 +117,8 @@ *************************************************************************/ void initTemperature( void ) { + DIAL_TEMPERATURE_SENSORS_T j; + startTime = 0; tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; @@ -94,9 +130,26 @@ d50TempAvgC = 0.0F; d50TempSamplesNextIndex = 0; d50TempCount = 0; + tempDataColStartTimeMS = 0; + tempDataColTimeInterval = 0; + tempDriftEventCheck = FALSE; + for ( j = DIAL_TEMP_FIRST; j < NUM_OF_DIAL_TEMPS; j++ ) + { + dialTempMovingAvgData[ j ].dialTempAvgC = 0.0F; + dialTempMovingAvgData[ j ].dialTempColHasTimerBeenSet = FALSE; + dialTempMovingAvgData[ j ].dialTempRunningSumC = 0.0F; + dialTempMovingAvgData[ j ].dialTempSamplesNextIndex = 0; + dialTempMovingAvgData[ j ].dialTempDataColStartTimeMS = getMSTimerCount(); + + memset( dialTempMovingAvgData[ j ].dialTempSamplesC, 0.0F, sizeof( F32 ) * DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); + } + // Initialize the temperature sensors initTemperatureSensors(); + + // Persistent alarm for the temperature sensors range check + initPersistentAlarm( ALARM_ID_DD_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, 0, DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** @@ -166,6 +219,9 @@ // Monitor the temperature values monitorTemperatureSenors(); + //Update the timeinterval + getTempMovingAverageTimeInterval(); + // Filter D4/D50 temperature readings filterTemperatureReadings(); @@ -229,19 +285,28 @@ *************************************************************************/ static void filterTemperatureReadings( void ) { - // Filter D4 Temperature ( 1sec filter) - if ( d4TempCount >= D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) + // Moving average sample collection interval varies based on the dialysate flow rate + if ( 0 == tempDataColStartTimeMS ) { - d4TempRunningSumC -= d4TempSamplesC[ d4TempSamplesNextIndex ]; + tempDataColStartTimeMS = getMSTimerCount(); } - F32 d4Temp = getTemperatureValue( D4_TEMP ); - d4TempSamplesC[ d4TempSamplesNextIndex ] = d4Temp; - d4TempRunningSumC += d4Temp; - d4TempSamplesNextIndex = INC_WRAP( d4TempSamplesNextIndex, 0, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); - d4TempCount = INC_CAP( d4TempCount, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); - d4TempAvgC = d4TempRunningSumC / (F32)d4TempCount; + else if ( TRUE == didTimeout( tempDataColStartTimeMS , tempDataColTimeInterval ) ) + { + // Filter D4 Temperature for AC heater + if ( d4TempCount >= D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) + { + d4TempRunningSumC -= d4TempSamplesC[ d4TempSamplesNextIndex ]; + } + F32 d4Temp = getTemperatureValue( D4_TEMP ); + d4TempSamplesC[ d4TempSamplesNextIndex ] = d4Temp; + d4TempRunningSumC += d4Temp; + d4TempSamplesNextIndex = INC_WRAP( d4TempSamplesNextIndex, 0, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); + d4TempCount = INC_CAP( d4TempCount, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); + d4TempAvgC = d4TempRunningSumC / (F32)d4TempCount; + tempDataColStartTimeMS = getMSTimerCount(); + } - // Filter D50 Temperature ( 250 ms filter ) + // Filter D50 Temperature ( 250 ms filter ) for trimmer heater if ( d50TempCount >= D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) { d50TempRunningSumC -= d50TempSamplesC[ d50TempSamplesNextIndex ]; @@ -252,10 +317,85 @@ d50TempSamplesNextIndex = INC_WRAP( d50TempSamplesNextIndex, 0, D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); d50TempCount = INC_CAP( d50TempCount, D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); d50TempAvgC = d50TempRunningSumC / (F32)d50TempCount; + + // dailysate temperature moving average + filterDialTemperatureReadings(); } /*********************************************************************//** * @brief + * The filterDialTemperatureReadings function adds a new dialysate temperature + * sensor sample to the filters. + * @details \b Inputs: dialysate temperature + * @details \b Outputs: dialTempMovingAvgData[] + * @return none + *************************************************************************/ +static void filterDialTemperatureReadings( void ) +{ + DIAL_TEMPERATURE_SENSORS_T i; + + for ( i = DIAL_TEMP_FIRST; i < NUM_OF_DIAL_TEMPS; i++ ) + { + if ( FALSE == dialTempMovingAvgData[ i ].dialTempColHasTimerBeenSet ) + { + dialTempMovingAvgData[ i ].dialTempDataColStartTimeMS = getMSTimerCount(); + dialTempMovingAvgData[ i ].dialTempColHasTimerBeenSet = TRUE; + } + else if ( TRUE == didTimeout( dialTempMovingAvgData[ i ].dialTempDataColStartTimeMS, D28_D30_DATA_COLLECTION_TIME_MS ) ) + { + CONDUCTIVITY_SENSORS_T sensor = ( DIAL_TEMP_D28 == i ? D27_COND : D29_COND ); + F32 temperatureC = getConductivityTemperatureValue( sensor ); + U32 currentIndex = dialTempMovingAvgData[ i ].dialTempSamplesNextIndex; + F32 prevSampleToRemoveC = dialTempMovingAvgData[ i ].dialTempSamplesC[ currentIndex ]; + + dialTempMovingAvgData[ i ].dialTempDataColStartTimeMS = getMSTimerCount(); + dialTempMovingAvgData[ i ].dialTempColHasTimerBeenSet = TRUE; + dialTempMovingAvgData[ i ].dialTempSamplesC[ currentIndex ] = temperatureC; + dialTempMovingAvgData[ i ].dialTempRunningSumC = dialTempMovingAvgData[ i ].dialTempRunningSumC + temperatureC - prevSampleToRemoveC; + dialTempMovingAvgData[ i ].dialTempSamplesNextIndex = INC_WRAP( dialTempMovingAvgData[ i ].dialTempSamplesNextIndex, 0, DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); + dialTempMovingAvgData[ i ].dialTempAvgC = dialTempMovingAvgData[ i ].dialTempRunningSumC / (F32)DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES; + } + } +} + +/*********************************************************************//** + * @brief + * The checkDialysateTemperatureSensors function checks whether the + * dialysate temperature sensors have drifted. If they are drifted, it raises + * an alarm. + * @details \b Inputs: dialysate temperature + * @details \b Outputs: None + * @return none + *************************************************************************/ +void checkDialysateTemperatureSensors( void ) +{ + DD_OP_MODE_T op = getCurrentOperationMode(); + + if ( ( DD_MODE_GEND == op ) || ( DD_MODE_HEAT == op ) ) + { + F32 d28Temp = dialTempMovingAvgData[ DIAL_TEMP_D28 ].dialTempAvgC; + F32 d30Temp = dialTempMovingAvgData[ DIAL_TEMP_D30 ].dialTempAvgC; + F32 driftC = ( DD_MODE_HEAT == op ? D28_D30_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C : D28_D30_TEMP_SENSORS_MAX_DEVIATION_C ); + BOOL isDriftOut = ( fabs( d28Temp - d30Temp ) > driftC ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_DD_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut, fabs( d28Temp - d30Temp ), driftC ); + + if ( ( FALSE == tempDriftEventCheck ) && ( TRUE == isDriftOut ) ) + { + // Send event only condition trigger, not continuously. + tempDriftEventCheck = TRUE; + SEND_EVENT_WITH_2_U32_DATA(DD_EVENT_TEMPERATURE_DRIFT, d28Temp, d30Temp) + } + + if ( ( TRUE == tempDriftEventCheck ) && ( FALSE == isDriftOut ) ) + { + tempDriftEventCheck = FALSE; + } + } +} + +/*********************************************************************//** + * @brief * The getD4AverageTemperature function returns the average temperature * for D4 temp sensor. * @details \b Inputs: none @@ -282,6 +422,22 @@ /*********************************************************************//** * @brief + * The getTempMovingAverageTimeInterval function calculates the temperature + * interval used for sample collection based on the dialysate flow rate, + * to find the average value. + * @details \b Inputs: dialysate flow rate + * @details \b Outputs: none + * @return the temperature interval for sample collection + *************************************************************************/ +static void getTempMovingAverageTimeInterval( void ) +{ + F32 period = (F32)SEC_PER_MIN / ( getTDDialysateFlowrate() / BAL_CHAMBER_FILL_VOLUME_ML ) ; + + tempDataColTimeInterval = (U32)( ( period / (F32)D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); +} + +/*********************************************************************//** + * @brief * The publishTemperatureSensorsData function broadcasts the temperature * sensors data at the publication interval. * @details \b Inputs: dataPublicationTimerCounter and publish interval time. @@ -309,6 +465,8 @@ data.d75CondTemp = getConductivityTemperatureValue( D74_COND ); data.d4AvgTemp = getD4AverageTemperature(); data.d50AvgTemp = getD50AverageTemperature(); + data.d28AvgTemp = dialTempMovingAvgData[ DIAL_TEMP_D28 ].dialTempAvgC; + data.d30AvgTemp = dialTempMovingAvgData[ DIAL_TEMP_D30 ].dialTempAvgC; broadcastData( MSG_ID_DD_TEMPERATURE_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); dataPublicationTimerCounter = 0; Index: firmware/App/Monitors/Temperature.h =================================================================== diff -u -rf6fb03f1e20395a61a5d5996f11f802ab8eacb2f -r1781335a8c1833fad17b275bf44c7f6675e68423 --- firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision f6fb03f1e20395a61a5d5996f11f802ab8eacb2f) +++ firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) @@ -47,6 +47,8 @@ F32 d75CondTemp; ///< D75 temperature value F32 d4AvgTemp; ///< D4 moving average temperature value F32 d50AvgTemp; ///< D50 moving average temperature value + F32 d28AvgTemp; ///< D28 moving average temperature value + F32 d30AvgTemp; ///< D30 moving average temperature value } TEMPERATURE_SENSORS_DATA_T; @@ -57,6 +59,7 @@ void execTemperatureSensors( void ); F32 getD4AverageTemperature( void ); F32 getD50AverageTemperature( void ); +void checkDialysateTemperatureSensors( void ); BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message );