Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r60e6185c2c5df195ccb6b603f30548779b4f05c4 -r3f88f2878bfb58d9b67e05ed0717f6fbff136232 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 60e6185c2c5df195ccb6b603f30548779b4f05c4) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 3f88f2878bfb58d9b67e05ed0717f6fbff136232) @@ -7,8 +7,8 @@ * * @file TDInterface.c * -* @author (last) Raghu Kallala -* @date (last) 11-May-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 ********** @@ -122,40 +128,45 @@ 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; } /**********************************************************************//** @@ -198,12 +209,14 @@ * @details \b Inputs: genDialysateState * @details \b Outputs: none * @param genDialysateState Requested DD gen dialysate sub-state. - * @return TRUE if the request is a supported treatment sub-state. + * @return TRUE if the request is a TD-commandable treatment sub-state + * (bypass, delivery, or isolated UF). Internal DD states such as spent/ + * bicarb chamber fill and delivery pause are not TD-requestable. *************************************************************************/ static BOOL isValidTDGenDStateRequest( U32 genDialysateState ) { BOOL result = FALSE; - + if ( ( DD_GEND_DIALYSATE_BYPASS_STATE == genDialysateState ) || ( DD_GEND_DIALYSATE_DELIVERY_STATE == genDialysateState ) || ( DD_GEND_ISOLATED_UF_STATE == genDialysateState ) ) @@ -323,14 +336,23 @@ * @brief * The setTDRequestedGenDState function sets the latest TD-requested gen * dialysate sub-state. + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if requested state is not + * a TD-commandable gen dialysate sub-state. * @details \b Inputs: none * @details \b Outputs: tdRequestedGenDState * @param genDialysateState Requested DD gen dialysate sub-state. * @return none. *************************************************************************/ void setTDRequestedGenDState( U32 genDialysateState ) { - tdRequestedGenDState = genDialysateState; + if ( TRUE == isValidTDGenDStateRequest( genDialysateState ) ) + { + tdRequestedGenDState = genDialysateState; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_TD_GEND_STATE_REQUEST, genDialysateState ); + } } /*********************************************************************//** @@ -392,6 +414,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 getTDRequestedGenDState function gets the latest TD-requested gen * dialysate sub-state. * @details \b Inputs: tdRequestedGenDState @@ -565,10 +599,7 @@ // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - if ( TRUE == isValidTDGenDStateRequest( startTxRequest.genDialysateState ) ) - { - setTDRequestedGenDState( startTxRequest.genDialysateState ); - } + setTDRequestedGenDState( startTxRequest.genDialysateState ); // start dialysate generation result = requestDDGenDialStart(); @@ -597,10 +628,7 @@ // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - if ( TRUE == isValidTDGenDStateRequest( startTxRequest.genDialysateState ) ) - { - setTDRequestedGenDState( startTxRequest.genDialysateState ); - } + setTDRequestedGenDState( startTxRequest.genDialysateState ); // Signal to update treatement parameters setTreatmentParamUpdate(); @@ -662,6 +690,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;