Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rff82c2f697e729f16098416acad3d98e337a38cd -rf40a7a70ad79b1dfba9d3b19887326d0a923a775 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision ff82c2f697e729f16098416acad3d98e337a38cd) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision f40a7a70ad79b1dfba9d3b19887326d0a923a775) @@ -7,8 +7,8 @@ * * @file ModeGenDialysate.c * -* @author (last) Vinayakam Mani -* @date (last) 14-Nov-2025 +* @author (last) Varshini Nagabooshanam +* @date (last) 12-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -1022,12 +1022,6 @@ data.genDialysateExecState = (U32)getCurrentGenDialysateState(); data.isDialDelInProgress = (BOOL)getDialDeliveryProgressStatus(); - data.d6Level = (U32)getLevelStatus( D6_LEVL ); - data.d63Level = (U32)getLevelStatus( D63_LEVL ); - data.d46Level = (U32)getLevelStatus( D46_LEVL ); - data.d9Pressure = getFilteredPressure( D9_PRES ); - data.d18Pressure = getFilteredPressure( D18_PRES ); - data.d51Pressure = getFilteredPressure( D51_PRES ); data.isDialysateGoodtoDeliver = (BOOL)getDialGoodToDeliverStatus(); data.currentQd = dialysateToDialyzerFlowRate; Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r4954a58fad7d100068baed367ae074ca6c132813 -rf40a7a70ad79b1dfba9d3b19887326d0a923a775 --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 4954a58fad7d100068baed367ae074ca6c132813) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision f40a7a70ad79b1dfba9d3b19887326d0a923a775) @@ -7,8 +7,8 @@ * * @file Temperature.c * -* @author (last) “rkallala” -* @date (last) 19-Jan-2026 +* @author (last) Varshini Nagabooshanam +* @date (last) 27-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 25-Sep-2024 @@ -47,6 +47,7 @@ #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 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 D99_TEMP_MOVING_AVG_NUM_OF_SAMPLES 50 ///< D99 temperature sensor moving average number of samples #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. @@ -103,6 +104,13 @@ static U32 d50TempSamplesNextIndex; ///< D50 temperature sample next index number. static U32 d50TempCount; ///< D50 Number of samples in average buffer. +static F32 d99TempAvgC; ///< D99 temperature average in C. +static F32 d99TempRunningSumC; ///< D99 temperature running sum in C. +static F32 d99TempSamplesC[ D99_TEMP_MOVING_AVG_NUM_OF_SAMPLES ]; ///< D99 temperature samples array in C. +static U32 d99TempSamplesNextIndex; ///< D99 temperature sample next index number. +static U32 d99TempCount; ///< D99 Number of samples in average buffer. +static U32 d99TempSampleIntervalCounter; ///< D99 temperature sensor sample collection timer counter. + static U32 ddTempDataPublicationTimerCounter; ///< DD Temperature sensors data publish timer counter. static U32 fpTempDataPublicationTimerCounter; ///< FP Temperature sensors data publish timer counter. static OVERRIDE_U32_T ddTempSensorsPublishInterval; ///< DD Temperature sensors publish time interval override. @@ -138,7 +146,12 @@ d50TempAvgC = 0.0F; d50TempSamplesNextIndex = 0; d50TempCount = 0; + d99TempRunningSumC = 0.0F; + d99TempAvgC = 0.0F; + d99TempSamplesNextIndex = 0; + d99TempCount = 0; d4TempSampleIntervalCounter = 0; + d99TempSampleIntervalCounter = 0; tempDataColTimeInterval = 0; tempDriftEventCheck = FALSE; @@ -286,10 +299,11 @@ * @brief * The filterTemperatureReadings function adds a new temperature sensor * sample to the filters. - * @details \b Inputs: D4 and D50 Temperature + * @details \b Inputs: D4, D50 and D99 Temperature * @details \b Outputs: d4TempSamplesC[], d4TempSamplesNextIndex, d4TempRunningSumC, * d4TempCount, d4TempAvgC, d50TempSamplesC, d50TempRunningSumC, d50TempSamplesNextIndex, - * d50TempCount, d50TempAvgC + * d50TempCount, d50TempAvgC, d99TempSamplesC, d99TempRunningSumC, d99TempSamplesNextIndex, + * d99TempCount, d99TempAvgC * @return none *************************************************************************/ static void filterTemperatureReadings( void ) @@ -325,6 +339,25 @@ d50TempCount = INC_CAP( d50TempCount, D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); d50TempAvgC = d50TempRunningSumC / (F32)d50TempCount; + + // Moving average sample collection interval varies based on the dialysate flow rate + if ( ++d99TempSampleIntervalCounter >= tempDataColTimeInterval ) + { + + // Filter D99 Temperature for fresh dialysate temperature + if ( d99TempCount >= D99_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) + { + d99TempRunningSumC -= d99TempSamplesC[ d99TempSamplesNextIndex ]; + } + + F32 d99Temp = getTemperatureValue( D99_TEMP ); + d99TempSamplesC[ d99TempSamplesNextIndex ] = d99Temp; + d99TempRunningSumC += d99Temp; + d99TempSamplesNextIndex = INC_WRAP( d99TempSamplesNextIndex, 0, D99_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); + d99TempCount = INC_CAP( d99TempCount, D99_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); + d99TempAvgC = d99TempRunningSumC / (F32)d99TempCount; + } + // dailysate temperature moving average filterDialTemperatureReadings(); } @@ -433,6 +466,19 @@ /*********************************************************************//** * @brief + * The getD99AverageTemperature function returns the average temperature + * for D99 temperature sensor. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the D99 average temperature + *************************************************************************/ +F32 getD99AverageTemperature( void ) +{ + return d99TempAvgC; +} + +/*********************************************************************//** + * @brief * The getTempMovingAverageTimeInterval function calculates the temperature * interval used for sample collection based on the dialysate flow rate, * to find the average value. @@ -471,6 +517,7 @@ data.d78Temp = getTemperatureValue( D78_TEMP ); data.d4Temp = getTemperatureValue( D4_TEMP ); data.d50Temp = getTemperatureValue( D50_TEMP ); + data.d99Temp = getTemperatureValue( D99_TEMP ); data.boardTemp = getTemperatureValue( BRD_TEMP ); #ifdef __TEENSY_CONDUCTIVITY_DRIVER__ data.d16CondTemp = getTeensyConductivityTemperatureValue( D17_COND ); @@ -487,13 +534,15 @@ #endif data.d4AvgTemp = getD4AverageTemperature(); data.d50AvgTemp = getD50AverageTemperature(); + data.d99AvgTemp = getD99AverageTemperature(); data.d28AvgTemp = dialTempMovingAvgData[ DIAL_TEMP_D28 ].dialTempAvgC; data.d30AvgTemp = dialTempMovingAvgData[ DIAL_TEMP_D30 ].dialTempAvgC; data.d9PresTemp = getFilteredPressureSensorTemperature( D9_PRES ); data.d66PresTemp = getFilteredPressureSensorTemperature( D66_PRES ); data.d51PresTemp = getFilteredPressureSensorTemperature( D51_PRES ); data.d18PresTemp = getFilteredPressureSensorTemperature( D18_PRES ); data.d41PresTemp = getFilteredPressureSensorTemperature( D41_PRES ); + data.d87PresTemp = getFilteredPressureSensorTemperature( D87_PRES ); broadcastData( MSG_ID_DD_TEMPERATURE_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( TEMPERATURE_SENSORS_DD_DATA_T ) ); ddTempDataPublicationTimerCounter = 0; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r2dd5f57796fa2b5412a1797d3d42bbf8ba11da7d -rf40a7a70ad79b1dfba9d3b19887326d0a923a775 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 2dd5f57796fa2b5412a1797d3d42bbf8ba11da7d) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision f40a7a70ad79b1dfba9d3b19887326d0a923a775) @@ -7,8 +7,8 @@ * * @file Messaging.c * -* @author (last) “rkallala” -* @date (last) 16-Jan-2026 +* @author (last) Varshini Nagabooshanam +* @date (last) 27-Jan-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -249,6 +249,9 @@ { MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST, &testSetGeneratePermeateSignal }, { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, + { MSG_ID_FP_SET_TEST_CONFIGURATION, &testSetTestConfiguration }, + { MSG_ID_FP_GET_TEST_CONFIGURATION, &testGetTestConfiguration }, + { MSG_ID_FP_RESET_ALL_TEST_CONFIGURATIONS, &testResetAllTestConfigurations }, { MSG_ID_FP_RO_GET_CALCULATED_DUTY_CYCLE_REQUEST, &testROGetCurrentCalculatedDutyCycle }, { MSG_ID_FP_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFilterFlushDataPublishIntervalOverride }, { MSG_ID_FP_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST, &testFilterFlushTimerOverride },