Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -ra631e128cd6be44aa232e23b58a229bfb8fe9043 -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision a631e128cd6be44aa232e23b58a229bfb8fe9043) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) @@ -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 ********** @@ -660,7 +660,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 ) ); @@ -974,10 +974,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 ) ); @@ -1247,7 +1248,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/DryBiCart.c =================================================================== diff -u -ra631e128cd6be44aa232e23b58a229bfb8fe9043 -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision a631e128cd6be44aa232e23b58a229bfb8fe9043) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) @@ -48,7 +48,6 @@ #define DRY_BICART_PERSISTENCE_DURATION_MS 200 ///< Fill persistence duration to overcome the pressure overshoot/ drop for beta 1.9 and above. // Dry Bicart Fill - #define DRY_BICART_FILL_COMPLETE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to reset the request flag after fill complete #define DRY_BICART_WCID2_FILL_COMPLETE_PRESSURE_PSI ( 10.0F + WCDI2_PRESSURE_OFFSET_PSI ) ///< Maximum pressure reached to indicate the dry bicart fill being completed for WCID2 #define DRY_BICART_WCID1_FILL_COMPLETE_PRESSURE_PSI ( 10.0F + WCID1_PRESSURE_OFFSET_PSI ) ///< Maximum pressure reached to indicate the dry bicart fill being completed for WCID1 @@ -83,6 +82,10 @@ #define DRY_BICART_DRAIN_COND_ZERO_THRESH 0.05F ///< Zero conductivity threshold #define DRY_BICART_DRAIN_COND_STABLE_SAMPLES 10U ///< De-bounce samples (10*50ms=500ms) +#define STD_MIX_BC_VOLUME 30.0F ///< Standard balancing chamber volume +#define TARGET_ADJ_BICARB_SETTING 137.0F ///< User defined Bicarb setting +#define TARGET_ADJ_NA_SETTINGS 32.0F ///< User defined Na setting + /// Payload record structure for dry bicart fill request typedef struct { Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r35ccc443e6440d79231ab4a3951bebc0e9789b68 -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 35ccc443e6440d79231ab4a3951bebc0e9789b68) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) @@ -886,7 +886,10 @@ } else { - checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON, FALSE, 0.0F, 0.0F ); + if ( getTestConfigStatus( TEST_CONFIG_DD_DISABLE_CONDUCTIVE_LEVEL_SENSOR_ERROR ) != TRUE ) + { + checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON, FALSE, 0.0F, 0.0F ); + } } } } Index: firmware/App/Controllers/MixingControl.c =================================================================== diff -u -ra631e128cd6be44aa232e23b58a229bfb8fe9043 -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 --- firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision a631e128cd6be44aa232e23b58a229bfb8fe9043) +++ firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) @@ -69,8 +69,10 @@ #define MIX_NO_FEED_FORWARD 0.0F ///< Feed forward term for dialysate closed loop control -#define BICARB_MIX_CONTROL_INTERVAL ( 9 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bicarb mix is controlled. -#define ACID_MIX_CONTROL_INTERVAL ( 15 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. +#define BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER ( 3 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bicarb mix is controlled. +#define ACID_MIX_CONTROL_INTERVAL_MULTIPLIER ( 5 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. +//#define BICARB_MIX_CONTROL_INTERVAL ( 9 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bicarb mix is controlled. +//#define ACID_MIX_CONTROL_INTERVAL ( 15 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. #define BICARB_DEADBAND_CONTROL 15.0F ///< Bicarb dead band control #define ACID_DEADBAND_CONTROL 50.0F ///< Acid dead band control @@ -201,6 +203,7 @@ static void setBicarbMixVol( F32 targetValue ); static void setAcidMixVol( F32 targetValue ); +static void updatedConcentrateControlInterval( void ); static F32 getBicarbDeltaConductivity( void ); static F32 getBicarbTargetConductivity( void ); @@ -257,6 +260,9 @@ mixingControlBicarbVolume.ovInitData = 0.0F; mixingControlBicarbVolume.override = OVERRIDE_RESET; + lastAcidMixVolume = DEFAULT_ACID_VOLUME_ML; + lastBicarbMixVolume = DEFAULT_BICARB_VOLUME_ML; + mixingControlAcidVolumeKpGain.data = ACID_VOL_CONTROL_P_COEFFICIENT; mixingControlAcidVolumeKpGain.ovData = ACID_VOL_CONTROL_P_COEFFICIENT; mixingControlAcidVolumeKpGain.ovInitData = 0.0F; @@ -312,13 +318,13 @@ mixingControlTargetAdjBicarbSettings.ovInitData = 0.0F; mixingControlTargetAdjBicarbSettings.override = OVERRIDE_RESET; - mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL; - mixingControlBicarbControlInterval.ovData = BICARB_MIX_CONTROL_INTERVAL; + mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER; + mixingControlBicarbControlInterval.ovData = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER; mixingControlBicarbControlInterval.ovInitData = 0; mixingControlBicarbControlInterval.override = OVERRIDE_RESET; - mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL; - mixingControlAcidControlInterval.ovData = ACID_MIX_CONTROL_INTERVAL; + mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER; + mixingControlAcidControlInterval.ovData = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER; mixingControlAcidControlInterval.ovInitData = 0; mixingControlAcidControlInterval.override = OVERRIDE_RESET; @@ -361,6 +367,8 @@ { if ( getCurrentBalancingChamberExecState() > BAL_CHAMBER_STATE_IDLE ) { + updatedConcentrateControlInterval(); + // closed loop bicarb and acid mixing controller handleDialysateCompositionMixing(); } @@ -427,6 +435,36 @@ /*********************************************************************//** * @brief + * The updatedConcentrateControlInterval function sets both acid and bicarb + * Mix volume provided by the controller + * @details \b Inputs: none + * @details \b Outputs: mixingControlBicarbMixVolume + * @param targetValue bicarb Mix volume + * @return TRUE if successful, FALSE if not. + *************************************************************************/ +static void updatedConcentrateControlInterval( void ) +{ + F32 tdDialysateFlowRate = 0.0F; + F32 balChamberSwitchingFreq = 0.0F; + U32 balChamberSwitchingPeriod = 0; + + tdDialysateFlowRate = getTDDialysateFlowrate(); + + balChamberSwitchingFreq = tdDialysateFlowRate / 30.0; + balChamberSwitchingPeriod = ( SEC_PER_MIN ) / (U32)balChamberSwitchingFreq; + + // For acid control period, we are using 3 cycles of balancing chamber switching period (for ex: At Qd = 600, switching period = 3sec, so acid control interval = 3*3 = 9sec + // For bicarb control period, we are using 5 cycles of balancing chamber switching period (for ex: At Qd = 600, switching period = 3sec, so bicarb control interval = 3*5 = 15sec + + if ( balChamberSwitchingPeriod > 0) + { + mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER * balChamberSwitchingPeriod; + mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER * balChamberSwitchingPeriod; + } +} + +/*********************************************************************//** + * @brief * The getBicarbDeltaConductivity function gets the delta target conductivity * @details \b Inputs: mixingControlBicarbDeltaConductivity * @details \b Outputs: none @@ -1101,7 +1139,7 @@ *************************************************************************/ BOOL testMixingControlBicarbControlIntervalOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &mixingControlBicarbControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL ); + BOOL result = u32Override( message, &mixingControlBicarbControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER ); return result; } @@ -1118,7 +1156,7 @@ *************************************************************************/ BOOL testMixingControlAcidControlIntervalOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &mixingControlAcidControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL ); + BOOL result = u32Override( message, &mixingControlAcidControlInterval, 0, ACID_MIX_CONTROL_INTERVAL_MULTIPLIER ); return result; } Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -ra631e128cd6be44aa232e23b58a229bfb8fe9043 -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision a631e128cd6be44aa232e23b58a229bfb8fe9043) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) @@ -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" @@ -81,7 +82,7 @@ execConcentratePumpMonitor(); // Monitor DD voltages - ///execVoltagesMonitor(); + execVoltagesMonitor(); // run DD operation mode state machine execDDOperationModes(); @@ -104,6 +105,9 @@ execDryBicart(); } + // Control Substitution pump + execSubstitutionPumpController(); + // Control closed loop mixing of bicarb and acid execMixingControl();