Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r8f861eb50b8c751db8c9c76a9ae63bb4ab3d1cdc -r3f88f2878bfb58d9b67e05ed0717f6fbff136232 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 8f861eb50b8c751db8c9c76a9ae63bb4ab3d1cdc) +++ 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; @@ -90,7 +95,7 @@ // TD status static TD_OP_MODE_T tdCurrentOpMode; ///< Current TD operation mode. static U32 tdSubMode; ///< Current state (sub-mode) of current TD operation mode. -static BOOL tdDialyzerBypass; ///< TD dialyzer bypass +static U32 tdRequestedGenDState; ///< TD-requested gen dialysate sub-state (DD_GEND_MODE_STATE_T). static BOOL tdOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh TD op mode data static OVERRIDE_F32_T tdDialysateFlowrate; ///< TD Dialysate flow rate @@ -100,10 +105,12 @@ 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 ********** static void checkTDDataFreshness( ALARM_ID_T alarmID, BOOL *tdFreshDataFlag ); +static BOOL isValidTDGenDStateRequest( U32 genDialysateState ); /*********************************************************************//** * @brief @@ -117,44 +124,49 @@ // Initialize unit state variables tdCurrentOpMode = MODE_INIT; tdSubMode = 0U; - tdDialyzerBypass = FALSE; + tdRequestedGenDState = DD_GEND_DIALYSATE_BYPASS_STATE; 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; } /**********************************************************************//** @@ -192,6 +204,31 @@ /*********************************************************************//** * @brief + * The isValidTDGenDStateRequest function validates a TD gen dialysate + * sub-state request. + * @details \b Inputs: genDialysateState + * @details \b Outputs: none + * @param genDialysateState Requested DD gen dialysate 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 ) ) + { + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The execTDInterfaceMonitor function executes the TD Interface monitoring * function. Ensures TD is sending fresh data in a timely manner. * @details \b Inputs: none @@ -297,16 +334,25 @@ /*********************************************************************//** * @brief - * The setTDDialyzerBypass function sets the latest TD dialyzer bypass - * enable. + * 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: tdDialyzerBypass - * @param Dialyzer Bypass enable. + * @details \b Outputs: tdRequestedGenDState + * @param genDialysateState Requested DD gen dialysate sub-state. * @return none. *************************************************************************/ -void setTDDialyzerBypass( BOOL dialBypass ) +void setTDRequestedGenDState( U32 genDialysateState ) { - tdDialyzerBypass = dialBypass; + 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 ); + } } /*********************************************************************//** @@ -368,16 +414,28 @@ /*********************************************************************//** * @brief - * The getTDDialyzerBypass function gets the latest TD dailyzer bypass valve - * enable flag. - * @details \b Inputs: tdDialyzerBypass + * The getTDSubstitutionFlowRate function gets the latest TD + * substitution flow rate. + * @details \b Inputs: tdSubstitutionFlowRate * @details \b Outputs: none - * @return Latest dialyzer bypass valve enable. + * @return Latest target substitution flow rate *************************************************************************/ -BOOL getTDDialyzerBypass( void ) +F32 getTDSubstitutionFlowRate( void ) { - return tdDialyzerBypass; + return getF32OverrideValue( &tdSubstitutionFlowRate ); } +/*********************************************************************//** + * @brief + * The getTDRequestedGenDState function gets the latest TD-requested gen + * dialysate sub-state. + * @details \b Inputs: tdRequestedGenDState + * @details \b Outputs: none + * @return Latest requested gen dialysate sub-state. + *************************************************************************/ +U32 getTDRequestedGenDState( void ) +{ + return tdRequestedGenDState; +} /****************************************************************************** * @brief @@ -538,10 +596,10 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer + // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - setTDDialyzerBypass( startTxRequest.bypassDialyzer ); + setTDRequestedGenDState( startTxRequest.genDialysateState ); // start dialysate generation result = requestDDGenDialStart(); @@ -567,10 +625,10 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer + // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - setTDDialyzerBypass( startTxRequest.bypassDialyzer ); + setTDRequestedGenDState( startTxRequest.genDialysateState ); // Signal to update treatement parameters setTreatmentParamUpdate(); @@ -632,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;