Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -r145fd716a856f864f39fb0f9884865f6e45b9256 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 145fd716a856f864f39fb0f9884865f6e45b9256) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -108,7 +108,7 @@ static U32 bcSwitchingBasedOnClosedPeriodCounter; ///< Valve-close segments remaining before first-cycle relaxations clear after Qd timing apply. //TODO: remove later once level sensor working -static U32 bicarbChamberPeriodicFillCounter; +static U32 bicarbChamberPeriodicFillCounter; // ********** private function prototypes ********** @@ -632,7 +632,7 @@ freshDialPressure = getFilteredPressure( D18_PRES ); spentDialPressure = getFilteredPressure( D51_PRES ); - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) == TRUE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) ) { //Set Trimmer heater Target temp every BC cycle to catch up fresh dialysate temp setHeaterTargetTemperature( D45_HEAT, getFilteredTemperatureValue( D4_TEMP ) ); @@ -946,10 +946,11 @@ acidVolume = getF32OverrideValue( &acidDoseVolume ); bicarbVolume = getF32OverrideValue( &bicarbDoseVolume ); } + freshDialPressure = getFilteredPressure( D18_PRES ); spentDialPressure = getFilteredPressure( D51_PRES ); - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) == TRUE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) ) { //Set Trimmer heater Target temp every BC cycle to catch up fresh dialysate temp setHeaterTargetTemperature( D45_HEAT, getFilteredTemperatureValue( D4_TEMP ) ); @@ -1219,7 +1220,7 @@ // Check if a request made was to activate the balancing chamber switching. if ( TRUE == isBalChamberSwitchingOnRequested ) { - //Clear the request flag to indicate that the request was processed. + //Clear request was processed. isBalChamberSwitchingOnRequested = FALSE; // Set flag to indicate that balancing chamber switching is active Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r145fd716a856f864f39fb0f9884865f6e45b9256 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 145fd716a856f864f39fb0f9884865f6e45b9256) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -41,7 +41,7 @@ #define CONCENTRATE_PUMP_CLEANING_SPD_OUT_OF_RANGE_TOL_PCT 0.05F ///< Concentrate pump cleaning mode speed out of range tolerance when on in percentage. #define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 0.5F ///< Concentrate pump speed out of range tolerance when slow in mL/min. #define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 5.0F ///< Concentrate pump low speed threshold in mL/min. -#define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFFFFFF ///< Pulse width value when zero flow rate or pump is off +#define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFFFFFF ///< Pulse width value when zero flow rate or pump is off. #define CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER 0.4F ///< Volume output every revolution (mL). #define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -rff6b765b44991e46891475022fa819cf3af05156 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision ff6b765b44991e46891475022fa819cf3af05156) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -8,7 +8,7 @@ * @file DryBiCart.c * * @author (last) Sameer Kalliadan Poyil -* @date (last) 30-Apr-2026 +* @date (last) 16-Jun-2026 * * @author (original) Vinayakam Mani * @date (original) 19-Nov-2025 @@ -56,7 +56,7 @@ #define DRY_BICART_FILL_INITIATE_PRESSURE_PSI 1.5F ///< Minimum pressure required to initiate the dry bicart fill process. #define DRY_BICART_FILL_COMPLETE_SUPPLY_PRESSURE_PSI 10.0F ///< Maximum pressure allowed at bicart fill during supply process/state #define DRY_BICART_FILL_INITIATE_SUPPLY_PRESSURE_PSI 3.0F ///< Minimum pressure required to initiate the dry bicart fill during supply process/state -#define MAX_DRY_BICART_FILL_COMPLETE_PRESSURE 20.0F ///< Very max dry bicart fill complete pressure for persistence on d66 +#define MAX_DRY_BICART_FILL_COMPLETE_PRESSURE 22.0F ///< Very max dry bicart fill complete pressure for persistence on d66 #define DRY_BICART_DEFAULT_MAX_FILL_CYCLE_CNT 10 ///< Default max fill cycle allowed for dry bicart fill/mix with water. #define DRY_BICART_MAX_FILL_CYCLE_CNT 15 ///< Max fill cycle allowed (by override) for dry bicart fill/mix with water. #define DRY_BICART_MINIMUM_FILL_CYCLE_CNT 3 ///< Minimum fill cycle count for filling dry bicart @@ -738,19 +738,7 @@ { dryBiCartPersistenceStartTime = getMSTimerCount(); } - //check the the maximum cart pressure during persistence on D66 - if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) - { - setValveState( D65_VALV, VALVE_STATE_CLOSED ); - lastFillDurationInMS = currentFillDurationInMS; - currentFillDurationInMS = calcTimeSince( dryBiCartFillStartTime ); - //Increment number of fill cycle - biCartFillCycleCounter++; - dryBiCartPersistenceStartTime = 0; - - state = DRY_BICART_DEGAS_START_STATE; - } // 200 ms persistence on D66 pressure since pressure overshoot just after D65 opening if ( TRUE == didTimeout( dryBiCartPersistenceStartTime, DRY_BICART_PERSISTENCE_DURATION_MS ) ) { @@ -765,6 +753,10 @@ state = DRY_BICART_DEGAS_START_STATE; } } + else + { + dryBiCartPersistenceStartTime = 0; + } //TODO:Handle timeout alarm for opening D65 valve too long return state; @@ -839,6 +831,10 @@ state = DRY_BICART_FILL_DURATION_CHECK_STATE; } + else + { + dryBiCartPersistenceStartTime = 0; + } } //TODO: Alarm when vent timeout exceeded, but pressure not dropped below expected PSI (0 psi) @@ -1005,15 +1001,7 @@ { dryBiCartPersistenceStartTime = getMSTimerCount(); } - // check the the maximum cart pressure during persistence on D66 - if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) - { - // Close water inlet valve as D66 pressure reaches max PSI(20) after persistence - setValveState( D65_VALV, VALVE_STATE_CLOSED ); - dryBiCartPersistenceStartTime = 0; - state = BICARB_CHAMBER_SUPPLY_STATE; - } // 200 ms persistence on D66 pressure since pressure overshoot just after D65 opening if ( TRUE == didTimeout( dryBiCartPersistenceStartTime, DRY_BICART_PERSISTENCE_DURATION_MS ) ) { @@ -1024,6 +1012,10 @@ state = BICARB_CHAMBER_SUPPLY_STATE; } } + else + { + dryBiCartPersistenceStartTime = 0; + } return state; } @@ -1130,6 +1122,11 @@ dryBiCartPersistenceStartTime = 0; } } + else + { + dryBiCartPersistenceStartTime = 0; + drybicartPersistenceOnLowercartPressureStartTime = 0; + } return state; } @@ -1241,9 +1238,6 @@ // open bypass valve setValveState( D34_VALV, VALVE_STATE_OPEN ); - // open DD drain - setValveState( D53_VALV, VALVE_STATE_OPEN ); - // open iofp drain valve setValveState( M12_VALV, VALVE_STATE_OPEN ); Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -rff3abe5d9c85e6c0431be7310ab771aebd9a8823 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision ff3abe5d9c85e6c0431be7310ab771aebd9a8823) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -7,8 +7,8 @@ * * @file ConductivitySensors.c * -* @author (last) Jashwant Gantyada -* @date (last) 21-May-2026 +* @author (last) Michael Garthwaite +* @date (last) 16-Jun-2026 * * @author (original) Vinayakam Mani * @date (original) 13-Sep-2024 @@ -917,7 +917,6 @@ if ( sensor < NUM_OF_CONDUCTIVITY_SENSORS ) { result = conductivitySensorStatus[ sensor ].rawResistance; - } else { @@ -944,7 +943,6 @@ if ( sensor < NUM_OF_CONDUCTIVITY_SENSORS ) { result = conductivitySensorStatus[ sensor ].rawTemperature; - } else { Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r145fd716a856f864f39fb0f9884865f6e45b9256 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 145fd716a856f864f39fb0f9884865f6e45b9256) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -61,11 +61,11 @@ #define ZERO_DIAL_FLOW_RATE 0.0F ///< Zero dialysate flow rate #define SPENT_CHAMBER_FILL_MAX_COUNT 10 ///< Total number of spent chamber fill allowed. #define BICARB_CHAMBER_FILL_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Bicarb chamber fill timeout. - #define PUMP_SPEED_SLOPE_FACTOR_DIENER_2000 1.24F ///< D48 Diener 2000 pump speed slope (y = 1.24x + 30). #define PUMP_SPEED_INTERCEPT_FACTOR_DIENER_2000 30.0F ///< D48 Diener 2000 pump speed intercept. #define PUMP_SPEED_SLOPE_FACTOR_DIENER_1000 2.869F ///< D48 Diener 1000 pump speed slope (y = 2.869x + 25.956). #define PUMP_SPEED_INTERCEPT_FACTOR_DIENER_1000 25.956F ///< D48 Diener 1000 pump speed intercept. + #define BICARB_CHAMBER_FILL_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Bicarb chamber fill timeout. //Testing @@ -270,7 +270,7 @@ startHeater( D5_HEAT ); //Turn on Trimmer heater - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) == TRUE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) ) { setHeaterTargetTemperature( D45_HEAT, getFilteredTemperatureValue( D4_TEMP ) ); } @@ -319,7 +319,7 @@ startHeater( D5_HEAT ); //Turn on Trimmer heater - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) == TRUE ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) ) { setHeaterTargetTemperature( D45_HEAT, getFilteredTemperatureValue( D4_TEMP ) ); } Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r145fd716a856f864f39fb0f9884865f6e45b9256 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 145fd716a856f864f39fb0f9884865f6e45b9256) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -30,6 +30,7 @@ #include "PermeateTank.h" #include "RinsePump.h" #include "ROPump.h" +#include "SubstitutionPump.h" #include "SystemCommDD.h" #include "TaskGeneral.h" #include "WatchdogMgmt.h" @@ -104,6 +105,9 @@ execDryBicart(); } + // Control Substitution pump + execSubstitutionPumpController(); + // Control RO pump execROPumpController(); Index: firmware/source/sys_main.c =================================================================== diff -u -rb265dcfa9029a6db5ab4b6a966aae70103004781 -r99e330b5b872f68fdf2d842bd0597e54044d9ba9 --- firmware/source/sys_main.c (.../sys_main.c) (revision b265dcfa9029a6db5ab4b6a966aae70103004781) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 99e330b5b872f68fdf2d842bd0597e54044d9ba9) @@ -211,6 +211,7 @@ initRinsePump(); initDryBiCart(); initSubstitutionPump(); + initMixingControl(); initIntegrity(); // FP Modules