Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r3f88f2878bfb58d9b67e05ed0717f6fbff136232 -r1a15aa462c0db129606243a4761fa2978ce01730 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 3f88f2878bfb58d9b67e05ed0717f6fbff136232) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 1a15aa462c0db129606243a4761fa2978ce01730) @@ -8,7 +8,7 @@ * @file ModeGenDialysate.c * * @author (last) Jashwant Gantyada -* @date (last) 30-Jun-2026 +* @date (last) 29-Jul-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -767,14 +767,23 @@ { U32 rpm; U32 nominalRpm; + F32 dialFlowRate = getBalChamberActiveDialysateFlowrate(); nominalRpm = getD48PumpSpeed(); rpm = nominalRpm; - if ( nominalRpm <= BAL_CHAMBER_TIME_BASED_D48_SPEED_RPM ) + if ( ( dialFlowRate >= BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_1 ) && ( dialFlowRate <= BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_2 ) ) { - rpm = BAL_CHAMBER_TIME_BASED_D48_SPEED_RPM; + rpm = BAL_CHAMBER_TIME_BASED_BAND_1; } + else if ( ( dialFlowRate > BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_2 ) && ( dialFlowRate <= BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_3 ) ) + { + rpm = BAL_CHAMBER_TIME_BASED_BAND_2; + } + else if ( ( dialFlowRate > BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_3 ) && ( dialFlowRate <= BAL_CHAMBER_OPEN_LOOP_FLOW_RATE_BAND_4 ) ) + { + rpm = BAL_CHAMBER_TIME_BASED_BAND_3; + } return rpm; } Index: firmware/App/Modes/ModeGenDialysate.h =================================================================== diff -u -r60e6185c2c5df195ccb6b603f30548779b4f05c4 -r1a15aa462c0db129606243a4761fa2978ce01730 --- firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 60e6185c2c5df195ccb6b603f30548779b4f05c4) +++ firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 1a15aa462c0db129606243a4761fa2978ce01730) @@ -8,7 +8,7 @@ * @file ModeGenDialysate.h * * @author (last) Jashwant Gantyada -* @date (last) 07-May-2026 +* @date (last) 20-Jul-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -32,7 +32,7 @@ // ********** public definitions ********** #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. -#define FRESH_DIAL_PUMP_INITIAL_RPM_B1_9_B2_0 1250 ///< Nominal RPM target for fresh dialysate pump for beta 1.9 and 2.0 hardware. +#define FRESH_DIAL_PUMP_INITIAL_RPM_B1_9_B2_0 1600 ///< Nominal RPM target for fresh dialysate pump for beta 1.9 and 2.0 hardware. #define SPENT_DIAL_PUMP_INITIAL_RPM 2300 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. #define DIAL_PUMP_DRAIN_RPM 1000 ///< Nominal RPM target for dialysate pump to drain the dry bicart. #define SPENT_DIAL_PUMP_FILL_RPM 200 ///< Nominal RPM target for spent chamber fill operations. Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r3f88f2878bfb58d9b67e05ed0717f6fbff136232 -r1a15aa462c0db129606243a4761fa2978ce01730 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 3f88f2878bfb58d9b67e05ed0717f6fbff136232) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 1a15aa462c0db129606243a4761fa2978ce01730) @@ -7,8 +7,8 @@ * * @file AlarmMgmtSWFaults.h * -* @author (last) Jashwant Gantyada -* @date (last) 30-Jun-2026 +* @author (last) Arpita Srivastava +* @date (last) 13-Jul-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -161,7 +161,15 @@ SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID = 130, SW_FAULT_ID_SUBSTITUTION_PUMP_EXEC_INVALID_STATE = 131, SW_FAULT_ID_DRY_BICART_DEPRESURIZE_INVALID_EXEC_STATE = 132, - SW_FAULT_ID_INVALID_TD_GEND_STATE_REQUEST = 133, + SW_FAULT_ID_NVM_INVALID_EXEC_STATE = 133, + SW_FAULT_ID_NVM_INVALID_EXEC_SEND_STATE = 134, + SW_FAULT_ID_NVM_INVALID_SELF_TEST_STATE = 135, + SW_FAULT_ID_NVM_INVALID_USAGE_INFO_SELECTED = 136, + SW_FAULT_ID_NVM_WRITE_USAGE_INFO_FAILURE = 137, + SW_FAULT_ID_NVM_INVALID_RECORD_SELECTED = 138, + SW_FAULT_ID_NVM_OPS_TIMEOUT = 139, + SW_FAULT_ID_NVM_INVALID_OPS = 140, + SW_FAULT_ID_INVALID_TD_GEND_STATE_REQUEST = 141, NUM_OF_SW_FAULT_IDS } DD_SW_FAULT_ID_T; Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -rbd522c8ffdf75130571e5b6a79d1b1d6acd78b1c -r1a15aa462c0db129606243a4761fa2978ce01730 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision bd522c8ffdf75130571e5b6a79d1b1d6acd78b1c) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 1a15aa462c0db129606243a4761fa2978ce01730) @@ -93,7 +93,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 @@ -108,6 +108,7 @@ // ********** private function prototypes ********** static void checkTDDataFreshness( ALARM_ID_T alarmID, BOOL *tdFreshDataFlag ); +static BOOL isValidTDGenDStateRequest( U32 genDialysateState ); /*********************************************************************//** * @brief @@ -119,10 +120,10 @@ void initTDInterface( void ) { // Initialize unit state variables - tdCurrentOpMode = MODE_INIT; - tdSubMode = 0U; - tdDialyzerBypass = FALSE; - tdOpModeDataFreshFlag = FALSE; + tdCurrentOpMode = MODE_INIT; + tdSubMode = 0U; + tdRequestedGenDState = DD_GEND_DIALYSATE_BYPASS_STATE; + tdOpModeDataFreshFlag = FALSE; // Initialize treatment parameters from TD tdDialysateFlowrate.data = 0.0F; @@ -201,6 +202,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 @@ -306,16 +332,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 ); + } } /*********************************************************************//** @@ -389,15 +424,15 @@ } /*********************************************************************//** * @brief - * The getTDDialyzerBypass function gets the latest TD dailyzer bypass valve - * enable flag. - * @details \b Inputs: tdDialyzerBypass + * The getTDRequestedGenDState function gets the latest TD-requested gen + * dialysate sub-state. + * @details \b Inputs: tdRequestedGenDState * @details \b Outputs: none - * @return Latest dialyzer bypass valve enable. + * @return Latest requested gen dialysate sub-state. *************************************************************************/ -BOOL getTDDialyzerBypass( void ) +U32 getTDRequestedGenDState( void ) { - return tdDialyzerBypass; + return tdRequestedGenDState; } /****************************************************************************** @@ -558,12 +593,10 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer and substitution rate + // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - setTDDialyzerBypass( startTxRequest.bypassDialyzer ); - tdSubstitutionFlowRate.data = startTxRequest.substitutionRate; - setSubstitutionPumpTargetRate( D92_PUMP, getTDSubstitutionFlowRate() ); + setTDRequestedGenDState( startTxRequest.genDialysateState ); // start dialysate generation result = requestDDGenDialStart(); @@ -589,12 +622,10 @@ setTDUFRate( startTxRequest.ufRate ); setTDTargetDialysateTemperature( startTxRequest.dialTemp ); - // Set concentrate types, Bypass dialyzer and substitution rate + // Set concentrate types and requested gen dialysate sub-state setTDAcidAndBicarbType( startTxRequest.acidConvFactor, startTxRequest.bicarbConvFactor, startTxRequest.sodium, startTxRequest.bicarbonate ); - setTDDialyzerBypass( startTxRequest.bypassDialyzer ); - tdSubstitutionFlowRate.data = startTxRequest.substitutionRate; - setSubstitutionPumpTargetRate( D92_PUMP, getTDSubstitutionFlowRate() ); + setTDRequestedGenDState( startTxRequest.genDialysateState ); // Signal to update treatement parameters setTreatmentParamUpdate();