Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r2ae6daaf7d4cf33e3e9b1ade40750f3eae04c128 -r145fd716a856f864f39fb0f9884865f6e45b9256 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 2ae6daaf7d4cf33e3e9b1ade40750f3eae04c128) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 145fd716a856f864f39fb0f9884865f6e45b9256) @@ -7,8 +7,8 @@ * * @file TDInterface.c * -* @author (last) Vinayakam Mani -* @date (last) 26-Feb-2026 +* @author (last) Sameer Kalliadan Poyil +* @date (last) 16-Jun-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -20,13 +20,15 @@ #include "FPOperationModes.h" #include "Messaging.h" #include "MessagePayloads.h" +#include "MixingControl.h" #include "ModeGenDialysate.h" #include "ModeInitPOST.h" #include "ModePreGenDialysate.h" #include "ModeStandby.h" #include "OperationModes.h" #include "PersistentAlarm.h" #include "SystemCommDD.h" +#include "SubstitutionPump.h" #include "TaskGeneral.h" #include "TDInterface.h" #include "Timers.h" @@ -55,6 +57,8 @@ #define TD_SODIUM_MIN ( 130U ) ///< TD Min acid type index #define TD_SODIUM_MAX ( 155U ) ///< TD Max acid type index + + #define TD_BICARBONATE_MIN ( 20U ) ///< TD Min acid type index #define TD_BICARBONATE_MAX ( 40U ) ///< TD Max acid type index @@ -82,6 +86,7 @@ TD_TREATMENT_OVERRIDE_DIALYSATE_TEMP, ///< TD Target Dialysate Temperature TD_TREATMENT_OVERRIDE_ACID_TYPE, ///< TD Acid type TD_TREATMENT_OVERRIDE_BICARB_TYPE, ///< TD Bicarb type + TD_TREATMENT_OVERRIDE_SUB_FLOWRATE, ///< TD Substitution flow rate NUM_OF_TD_TREATMENT_OVERRIDES, ///< Number of TD override treatment parameters } TD_TREATMENT_OVERRIDE_INDEX_T; @@ -100,6 +105,7 @@ static OVERRIDE_F32_T tdBicarbConvFactor; ///< TD Bicarb conversion factor static OVERRIDE_U32_T tdSodium; ///< TD Sodium concentrate static OVERRIDE_U32_T tdBicarbonate; ///< TD Bicarbonate concentrate +static OVERRIDE_F32_T tdSubstitutionFlowRate; ///< TD Subsitution flow rate // ********** private function prototypes ********** @@ -115,46 +121,51 @@ void initTDInterface( void ) { // Initialize unit state variables - tdCurrentOpMode = MODE_INIT; - tdSubMode = 0U; - tdDialyzerBypass = FALSE; - tdOpModeDataFreshFlag = FALSE; + tdCurrentOpMode = MODE_INIT; + tdSubMode = 0U; + tdDialyzerBypass = FALSE; + tdOpModeDataFreshFlag = FALSE; // Initialize treatment parameters from TD - tdDialysateFlowrate.data = 0.0F; - tdDialysateFlowrate.ovData = 0.0F; - tdDialysateFlowrate.ovInitData = TD_DIALYSATE_FLOWRATE_MIN_ML_MIN; - tdDialysateFlowrate.override = OVERRIDE_RESET; + tdDialysateFlowrate.data = 0.0F; + tdDialysateFlowrate.ovData = 0.0F; + tdDialysateFlowrate.ovInitData = TD_DIALYSATE_FLOWRATE_MIN_ML_MIN; + tdDialysateFlowrate.override = OVERRIDE_RESET; - tdUFRate.data = 0.0F; - tdUFRate.ovData = 0.0F; - tdUFRate.ovInitData = TD_UF_RATE_MIN_ML_MIN; - tdUFRate.override = OVERRIDE_RESET; + tdUFRate.data = 0.0F; + tdUFRate.ovData = 0.0F; + tdUFRate.ovInitData = TD_UF_RATE_MIN_ML_MIN; + tdUFRate.override = OVERRIDE_RESET; - tdDialysateTemp.data = 0.0F; - tdDialysateTemp.ovData = 0.0F; - tdDialysateTemp.ovInitData = TD_DIALYSATE_TEMP_MIN_DEGC; - tdDialysateTemp.override = OVERRIDE_RESET; + tdDialysateTemp.data = 0.0F; + tdDialysateTemp.ovData = 0.0F; + tdDialysateTemp.ovInitData = TD_DIALYSATE_TEMP_MIN_DEGC; + tdDialysateTemp.override = OVERRIDE_RESET; - tdAcidConvFactor.data = 0.0F; - tdAcidConvFactor.ovData = 0.0F; - tdAcidConvFactor.ovInitData = ACID_CONVERSION_FACTOR[ TD_ACID_TYPE_MIN ]; - tdAcidConvFactor.override = OVERRIDE_RESET; + tdAcidConvFactor.data = 0.0F; + tdAcidConvFactor.ovData = 0.0F; + tdAcidConvFactor.ovInitData = ACID_CONVERSION_FACTOR[ TD_ACID_TYPE_MIN ]; + tdAcidConvFactor.override = OVERRIDE_RESET; - tdBicarbConvFactor.data = 0.0F; - tdBicarbConvFactor.ovData = 0.0F; - tdBicarbConvFactor.ovInitData = BICARBONATE_CONVERSION_FACTOR; - tdBicarbConvFactor.override = OVERRIDE_RESET; + tdBicarbConvFactor.data = 0.0F; + tdBicarbConvFactor.ovData = 0.0F; + tdBicarbConvFactor.ovInitData = BICARBONATE_CONVERSION_FACTOR; + tdBicarbConvFactor.override = OVERRIDE_RESET; - tdSodium.data = 0.0F; - tdSodium.ovData = 0.0F; - tdSodium.ovInitData = TD_SODIUM_MIN; - tdSodium.override = OVERRIDE_RESET; + tdSodium.data = DIALYSATE_TARGET_STD_NA_SETTINGS; + tdSodium.ovData = 0.0F; + tdSodium.ovInitData = TD_SODIUM_MIN; + tdSodium.override = OVERRIDE_RESET; - tdBicarbonate.data = 0.0F; - tdBicarbonate.ovData = 0.0F; - tdBicarbonate.ovInitData = TD_BICARBONATE_MIN; - tdBicarbonate.override = OVERRIDE_RESET; + tdBicarbonate.data = DIALYSATE_TARGET_STD_BICARB_SETTING; + tdBicarbonate.ovData = 0.0F; + tdBicarbonate.ovInitData = TD_BICARBONATE_MIN; + tdBicarbonate.override = OVERRIDE_RESET; + + tdSubstitutionFlowRate.data = 0.0F; + tdSubstitutionFlowRate.ovData = 0.0F; + tdSubstitutionFlowRate.ovInitData = TD_BICARBONATE_MIN; + tdSubstitutionFlowRate.override = OVERRIDE_RESET; } /**********************************************************************//** @@ -368,6 +379,18 @@ /*********************************************************************//** * @brief + * The getTDSubstitutionFlowRate function gets the latest TD + * substitution flow rate. + * @details \b Inputs: tdSubstitutionFlowRate + * @details \b Outputs: none + * @return Latest target substitution flow rate + *************************************************************************/ +F32 getTDSubstitutionFlowRate( void ) +{ + return getF32OverrideValue( &tdSubstitutionFlowRate ); +} +/*********************************************************************//** + * @brief * The getTDDialyzerBypass function gets the latest TD dailyzer bypass valve * enable flag. * @details \b Inputs: tdDialyzerBypass @@ -538,10 +561,12 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer + // Set concentrate types, Bypass dialyzer and substitution rate setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); setTDDialyzerBypass( startTxRequest.bypassDialyzer ); + tdSubstitutionFlowRate.data = startTxRequest.substitutionRate; + setSubstitutionPumpTargetRate( D92_PUMP, getTDSubstitutionFlowRate() ); // start dialysate generation result = requestDDGenDialStart(); @@ -567,10 +592,12 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer + // Set concentrate types, Bypass dialyzer and substitution rate setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); setTDDialyzerBypass( startTxRequest.bypassDialyzer ); + tdSubstitutionFlowRate.data = startTxRequest.substitutionRate; + setSubstitutionPumpTargetRate( D92_PUMP, getTDSubstitutionFlowRate() ); // Signal to update treatement parameters setTreatmentParamUpdate(); @@ -632,6 +659,11 @@ result = f32Override( message, &tdBicarbConvFactor); break; + case TD_TREATMENT_OVERRIDE_SUB_FLOWRATE: + result = f32Override( message, &tdSubstitutionFlowRate); + setSubstitutionPumpTargetRate( D92_PUMP, getTDSubstitutionFlowRate() ); + break; + default: result = FALSE; break;