Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r0d7e60088d514e93c95313bea52b05afc81ba20f -r3f88f2878bfb58d9b67e05ed0717f6fbff136232 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 0d7e60088d514e93c95313bea52b05afc81ba20f) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 3f88f2878bfb58d9b67e05ed0717f6fbff136232) @@ -7,8 +7,8 @@ * * @file ModeGenDialysate.c * -* @author (last) Vinayakam Mani -* @date (last) 28-May-2026 +* @author (last) Jashwant Gantyada +* @date (last) 30-Jun-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -95,6 +95,7 @@ static F32 dialysateToDialyzerFlowRate; ///< Current dialysate to dialyzer flow rate (ml/min) static U32 d48PumpSpeed; ///< Initial D48 pump speed based on the Qd. static DD_GEND_ISO_UF_SUB_STATE_T isolatedUFSubState; ///< Isolated UF run/pause sub-state. +static BOOL isolatedUFVolumeSessionActive; ///< Flag indicating if an isolated UF volume session is in progress. // ********** private function prototypes ********** @@ -104,7 +105,7 @@ static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryPauseState( void ); static DD_GEND_MODE_STATE_T handleGenDSpentChamberFillState( void ); static DD_GEND_MODE_STATE_T handleGenDBicarbChamberFillState( void ); -static DD_GEND_MODE_STATE_T handleGenDDialysateIsolatedUFState( void ); +static DD_GEND_MODE_STATE_T handleGenDIsolatedUFState( void ); static F32 getGenDialysateTargetTemperature( void ); static void updateDialysateToDialyzerFlowRate( void ); static DD_GEND_MODE_STATE_T applyTDRequestedGenDialysateState( DD_GEND_MODE_STATE_T state ); @@ -152,6 +153,7 @@ delayBypassStateFlag = TRUE; dialysateToDialyzerFlowRate = 0.0F; isolatedUFSubState = DD_GEND_ISO_UF_PAUSE_STATE; + isolatedUFVolumeSessionActive = FALSE; //Initialize balancing chamber module initBalanceChamber(); @@ -261,7 +263,7 @@ setValveState( D85_VALV, VALVE_STATE_CLOSED ); setValveState( D31_VALV, VALVE_STATE_CLOSED ); - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); // Bicarb valve setValveState( D64_VALV, VALVE_STATE_CLOSED ); @@ -346,7 +348,7 @@ setValveState( D35_VALV, VALVE_STATE_OPEN ); // VDI setValveState( D40_VALV, VALVE_STATE_OPEN ); // VDO - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); // Bicarb valve setValveState( D64_VALV, VALVE_STATE_CLOSED ); @@ -369,7 +371,7 @@ setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); // Bicarb valve setValveState( D64_VALV, VALVE_STATE_CLOSED ); @@ -416,7 +418,7 @@ setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); // Bicarb valve setValveState( D64_VALV, VALVE_STATE_OPEN ); // Bicarb chamber purge valve @@ -474,7 +476,7 @@ setValveState( D34_VALV, VALVE_STATE_OPEN ); setValveState( D53_VALV, VALVE_STATE_OPEN ); - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); setValveState( D64_VALV, VALVE_STATE_CLOSED ); @@ -483,8 +485,13 @@ case DD_GEND_ISOLATED_UF_STATE: isolatedUFSubState = getIsolatedUFSubStateForUFRate(); - resetUFVolumeDelivered(); + if ( FALSE == isolatedUFVolumeSessionActive ) + { + resetUFVolumeDelivered(); + isolatedUFVolumeSessionActive = TRUE; + } + transitionToBalChamberFill(); // Activate Balancing Chamber Switching requestBalChamberSwitching( TRUE ); @@ -504,7 +511,7 @@ setValveState( D81_VALV, VALVE_STATE_CLOSED ); setValveState( D85_VALV, VALVE_STATE_CLOSED ); - if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DRY_BICARB ) == FALSE ) + if ( getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) == FALSE ) { setValveState( D80_VALV, VALVE_STATE_OPEN ); setValveState( D64_VALV, VALVE_STATE_CLOSED ); @@ -612,7 +619,7 @@ break; case DD_GEND_ISOLATED_UF_STATE: - genDialysateState = handleGenDDialysateIsolatedUFState(); + genDialysateState = handleGenDIsolatedUFState(); break; default: @@ -783,7 +790,8 @@ *************************************************************************/ static DD_GEND_MODE_STATE_T applyTDRequestedGenDialysateState( DD_GEND_MODE_STATE_T state ) { - DD_GEND_MODE_STATE_T requested = (DD_GEND_MODE_STATE_T)getTDRequestedGenDState(); + DD_GEND_MODE_STATE_T requested = (DD_GEND_MODE_STATE_T)getTDRequestedGenDState(); + DD_GEND_MODE_STATE_T priorState = state; if ( state != requested ) { @@ -802,6 +810,12 @@ isDialDeliveryInProgress.data = TRUE; state = DD_GEND_DIALYSATE_DELIVERY_STATE; } + else if ( DD_GEND_ISOLATED_UF_STATE == state ) + { + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_DIALYSATE_BYPASS_STATE; + } break; case DD_GEND_ISOLATED_UF_STATE: @@ -815,6 +829,12 @@ } } + if ( ( DD_GEND_ISOLATED_UF_STATE == priorState ) && + ( DD_GEND_ISOLATED_UF_STATE != state ) ) + { + isolatedUFVolumeSessionActive = FALSE; + } + return state; } @@ -840,19 +860,24 @@ /*********************************************************************//** * @brief - * The handleGenDDialysateIsolatedUFState function performs the + * The handleGenDIsolatedUFState function performs the * isolated ultrafiltration operations. * @details \b Inputs: none * @details \b Outputs: none * @return the current state of gen dialysate mode *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDDialysateIsolatedUFState( void ) +static DD_GEND_MODE_STATE_T handleGenDIsolatedUFState( void ) { DD_GEND_MODE_STATE_T state = DD_GEND_ISOLATED_UF_STATE; BOOL balancingChambFillInProgress = getBalancingChamberFillinProgressStatus(); - if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_ENABLE_SPENT_CHAMBER_H_FILL ) ) + // if TD asks for a different sub-state, transition out of isolated UF + if ( DD_GEND_ISOLATED_UF_STATE != getTDRequestedGenDState() ) { + state = applyTDRequestedGenDialysateState( state ); + } + else if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_SPENT_CHAMBER_H_FILL ) == TRUE ) + { if ( ( TRUE == pendingSpentChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) { setModeGenDStateTransition( DD_GEND_SPENT_CHAMBER_FILL_STATE ); @@ -862,7 +887,7 @@ } } #ifdef __BICARB_CHAMBER_FILL__ - if ( ( TRUE == pendingBicarbChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) + else if ( ( TRUE == pendingBicarbChamberFill ) && ( FALSE == balancingChambFillInProgress ) ) { setModeGenDStateTransition( DD_GEND_BICARB_CHAMBER_FILL_STATE ); pendingBicarbChamberFill = FALSE; @@ -871,9 +896,6 @@ } #endif - // If TD requests bypass, delivery, or another allowed sub-state, transition out of iso UF - state = applyTDRequestedGenDialysateState( state ); - if ( DD_GEND_ISOLATED_UF_STATE == state ) { DD_GEND_ISO_UF_SUB_STATE_T desiredSubState = getIsolatedUFSubStateForUFRate(); @@ -883,8 +905,13 @@ isolatedUFSubState = desiredSubState; } - execUFControl(); + // Perform ultrafiltration + handleUFControl(); } + else + { + stopUltrafiltration(); + } return state; } @@ -989,8 +1016,8 @@ #endif else { - //Execute ultrafiltration - execUFControl(); + // Perform ultrafiltration + handleUFControl(); } return state;