Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -re48bec7b1330b195afadcbf8bc58bdb4f1d5b03e -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision e48bec7b1330b195afadcbf8bc58bdb4f1d5b03e) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -42,7 +42,7 @@ #define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. #define BAL_CHAMBER_FILL_PRES_DROP_MS ( 200 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber filling started and corresponding valves opened. #define BAL_CHAMBER_FILL_COMPLETE_MS ( 300 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber fill completed and pressure is within range -#define BAL_CHAMBER_BICARB_CHAMBER_FILL_TIMEOUT_COUNT ( 1 * SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ) ///< Periodic bicarb chamber fill request. +#define BICARB_CHAMBER_PERIODIC_FILL_TIME ( 1 * SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ) ///< Periodic bicarb chamber fill request 60 sec x 20 = 1200 /// Payload record structure for balancing chamber switch only request typedef struct @@ -75,7 +75,7 @@ static F32 spentDialPressure; ///< Spent side dialysate pressure #ifdef __DRY_BICARB__ -static U32 dryBiCarbChamberFillTimeoutCount; ///< Counter for checking the timeout for drybicart chamber fill request. +static U32 bicarbChamberPeriodicFillCounter; ///< Counter for checking the timeout for drybicart chamber fill request. #endif // ********** private function prototypes ********** @@ -132,7 +132,7 @@ freshDialPressure = 0.0F; spentDialPressure = 0.0F; #ifdef __DRY_BICARB__ - dryBiCarbChamberFillTimeoutCount = 0; + bicarbChamberPeriodicFillCounter = 0; #endif } @@ -203,12 +203,12 @@ #ifdef __DRY_BICARB__ //Increment counter for dry bicarb chamber fill - dryBiCarbChamberFillTimeoutCount += 1; + bicarbChamberPeriodicFillCounter += 1; // Fill bicarb chamber once every 60secs. - if ( dryBiCarbChamberFillTimeoutCount >= BAL_CHAMBER_BICARB_CHAMBER_FILL_TIMEOUT_COUNT) + if ( bicarbChamberPeriodicFillCounter >= BICARB_CHAMBER_PERIODIC_FILL_TIME ) { setBicarbChamberFillRequested(); - dryBiCarbChamberFillTimeoutCount = 0; + bicarbChamberPeriodicFillCounter = 0; } #endif @@ -536,8 +536,8 @@ if ( TRUE != getBalChamberSwitchingOnlyStatus() ) { // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); } @@ -750,8 +750,8 @@ if ( TRUE != getBalChamberSwitchingOnlyStatus() ) { // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, acidVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, bicarbVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); } Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -590,7 +590,7 @@ } else { - pumpTargetSpeed[ pumpId ].data = CONCENTRATE_PUMP_MAX_SPEED; + pumpTargetSpeed[ pumpId ].data = DOSING_CONCENTRATE_PUMP_MAX_SPEED; } } else @@ -1427,7 +1427,7 @@ { // Handle start command if ( ( TRUE == payload.startStop ) && - ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) && + ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= DOSING_CONCENTRATE_PUMP_MAX_SPEED ) ) && ( payload.volume > 0.0 ) ) { setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed, payload.volume ); Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -31,12 +31,14 @@ // ********** public definitions ********** // For 150 RPM, Diener pump delivers 60ml/min -#define CONCENTRATE_PUMP_MAX_SPEED 60.0F ///< Maximum Diener pump speed for concentrate pump in mL/min +#define CONCENTRATE_PUMP_MAX_SPEED 200.0F ///< Maximum Diener pump speed for concentrate pump in mL/min +#define DOSING_CONCENTRATE_PUMP_MAX_SPEED 60.0F ///< Maximum Diener pump speed for concentrate pump in mL/min +#define DRAIN_CONCENTRATE_PUMP_MAX_SPEED 200.0F ///< Maximum Diener pump speed for concentrate pump in mL/min #define DEFAULT_ACID_VOLUME_ML 0.67F ///< Acid concentrate volume in ml. #define DEFAULT_BICARB_VOLUME_ML 1.15F ///< Bicarb concentrate volume in ml. -#define DOSING_CONT_VOLUME 0xFFFF ///< Volume set to 0xFFFF enables contineous delivery based on the speed set. +#define DOSING_CONT_VOLUME 0xFFFF ///< Volume set to 0xFFFF enables continuous delivery based on the speed set. #define PARK_CONC_PUMPS TRUE ///< For park parameter to requestConcentratePumpOff(). #define NO_PARK_CONC_PUMPS FALSE ///< For park parameter to requestConcentratePumpOff(). @@ -47,7 +49,7 @@ D11_PUMP = 0, ///< Acid concentrate pump CONCENTRATEPUMPS_FIRST = D11_PUMP, ///< First concentrate pump in list D10_PUMP, ///< Bicarbonate concentrate pump - D76_PUMP, ///< Ultrafilteration pump + D76_PUMP, ///< ultrafiltration pump NUM_OF_CONCENTRATE_PUMPS ///< Number of concentrate pumps } CONCENTRATE_PUMPS_T; Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -r8d2a2aec6986e58a1f6f75d4ba8864ee689fde48 -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 8d2a2aec6986e58a1f6f75d4ba8864ee689fde48) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -22,6 +22,7 @@ #include "DialysatePumps.h" #include "DDDefs.h" #include "DryBiCart.h" +#include "FPOperationModes.h" #include "Level.h" #include "Messaging.h" #include "ModeGenDialysate.h" @@ -42,31 +43,28 @@ #define DRY_BICART_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. -// Bicart Fill +// Dry Bicart Fill #define DRY_BICART_FILL_DURATION_MIN_MS (2 * MS_PER_SECOND) ///< Minimum fill duration to be met to end the fill cycle. #define DRY_BICART_FILL_DURATION_DIFF_MS 750 ///< Fill duration difference between last and current fill cycle. -#define DRY_BICART_FILL_MAX_PRESSURE 12.0F ///< Maximum pressure that drybicart can withstand. -#define DRY_BICART_FILL_COMPLETE_PRESSURE 15.0F ///< Maximum pressure reached to inidcate the drybicart fill being completed. -#define DRY_BICART_FILL_INITIATE_PRESSURE 5.0F ///< Minimum pressure required to initiate the drybicart fill process. +#define DRY_BICART_FILL_COMPLETE_PRESSURE 15.0F ///< Maximum pressure reached to indicate the dry bicart fill being completed. +#define DRY_BICART_FILL_INITIATE_PRESSURE 5.0F ///< Minimum pressure required to initiate the dry bicart fill process. #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 30 ///< Max fill cycle allowed (by override) for dry bicart fill/mix with water. +// Dry Bicart Fill Vent +#define DRY_BICART_FILL_VENT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to vent dry bicart gas before actuating Bicarb chamber(F) venting. +#define DRY_BICART_FILL_VENT_MAX_TIME_MS ( 10 * MS_PER_SECOND ) ///< Max time to vent both dry bicart and Chamber F. +#define DRY_BICART_FILL_VENT_COMPLETE_PRESSURE 1.5F ///< Pressure reached to indicate the dry bicart venting being completed. -// Bicart Vent -#define DRY_BICART_VENT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to vent dry bibag gas before actuating Bicarb chamber(F) venting. -#define DRY_BICART_VENT_MAX_TIME_MS ( 10 * MS_PER_SECOND ) ///< Max time to vent both bicart and Chamber F. -#define DRY_BICART_VENT_COMPLETE_PRESSURE 1.5F ///< Pressure reached to inidcate the drybicart venting being completed. - // Bicarb chamber fill/Supply -#define DRY_BICART_SUPPLY_VALVE_D80_OPEN_TIME_MS ( 3 * MS_PER_SECOND ) ///< Max time allowed for opening D80 valve during bicarb chamber (F) fill. +#define DRY_BICART_SUPPLY_VALVE_D80_OPEN_TIME_MS ( 3 * MS_PER_SECOND ) ///< Max time allowed for supply (opening D80 valve) during bicarb chamber (F) fill. -// Bicart Drain -#define DRY_BICART_MAX_DRAIN_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max drain time for bicart chamber in ms. +// Dry Bicart Drain +#define DRY_BICART_MAX_DRAIN_TIME_MS ( 8 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max drain time for dry bicart in ms. #define DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ( 3 * MS_PER_SECOND ) ///< Time to stay in fluid drain per cycle #define DRY_BICART_DRAIN_VENT_PHASE_TIME_MS ( 8 * MS_PER_SECOND ) ///< Time to keep D64 open per vent cycle #define DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS 500 ///< Conductivity sample period #define DRY_BICART_DRAIN_COND_ZERO_THRESH 0.05F ///< "Zero" conductivity threshold #define DRY_BICART_DRAIN_COND_STABLE_SAMPLES 10U ///< Debounce samples (10*50ms=500ms) -#define DRY_BICART_DRAIN_COND_STABLE_COUNT_MAX 0xFFFFU /// Payload record structure for dry bicart fill request typedef struct @@ -83,7 +81,7 @@ static U32 biCartFillCycleCounter; ///< Number of drybicart fill cycle static OVERRIDE_U32_T biCartMaxFillCycleCount; ///< Maximum number of drybicart fill cycle ( overrideable) static U32 lastFillDurationInMS; ///< Previous time duration to fill the bicart fill. -static U32 currentFillDurationInMS; ///< Current time duartion to fill the bicart fill. +static U32 currentFillDurationInMS; ///< Current time duration to fill the bicart fill. static OVERRIDE_U32_T dryBiCartFillRequested; ///< Start/stop Dry bicart fill. static OVERRIDE_U32_T dryBiCartDrainRequested; ///< Start/stop Dry bicart drain. static OVERRIDE_U32_T dryBiCartFillRequested; ///< Start/stop Dry bicart fill. @@ -108,10 +106,13 @@ static BICARB_CHAMBER_FILL_EXEC_STATE_T handleBicarbChamberCheckLevelState( void ); static BICARB_CHAMBER_FILL_EXEC_STATE_T handleBicarbChamberFillState( void ); static BICARB_CHAMBER_FILL_EXEC_STATE_T handleBicarbChamberPressureCheckState( void ); + +static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartDrainStartState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartPressureEquillibriumState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainDurationCheckState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainEndState( void ); + static void publishDryBicartData( void ); static U32 getDryBicartFillDataPublishInterval( void ); @@ -127,33 +128,39 @@ { dryBiCartFillExecState = DRY_BICART_START_STATE; bicarbChamberFillExecState = BICARB_CHAMBER_START_STATE; + dryBiCartDrainExecState = DRY_BICART_DRAIN_START_STATE; + dryBiCartDataPublishInterval.data = DRY_BICART_DATA_PUBLISH_INTERVAL; dryBiCartDataPublishInterval.ovData = DRY_BICART_DATA_PUBLISH_INTERVAL; dryBiCartDataPublishInterval.ovInitData = 0; dryBiCartDataPublishInterval.override = OVERRIDE_RESET; + biCartMaxFillCycleCount.data = DRY_BICART_DEFAULT_MAX_FILL_CYCLE_CNT; biCartMaxFillCycleCount.ovData = DRY_BICART_DEFAULT_MAX_FILL_CYCLE_CNT; biCartMaxFillCycleCount.ovInitData = 0; biCartMaxFillCycleCount.override = OVERRIDE_RESET; + dryBiCartFillRequested.data = FALSE; dryBiCartFillRequested.ovData = FALSE; dryBiCartFillRequested.ovInitData = FALSE; dryBiCartFillRequested.override = 0; + dryBiCartDrainRequested.data = FALSE; dryBiCartDrainRequested.ovData = FALSE; dryBiCartDrainRequested.ovInitData = FALSE; dryBiCartDrainRequested.override = 0; + bicarbChamberFillRequested.data = FALSE; bicarbChamberFillRequested.ovData = FALSE; bicarbChamberFillRequested.ovInitData = FALSE; bicarbChamberFillRequested.override = 0; + dryBiCartFillStartTime = 0; lastFillDurationInMS = 0; currentFillDurationInMS = 0; dryBiCartDataPublicationTimerCounter = 0; biCartFillCycleCounter = 0; dryBiCarbSupplyStartTime = 0; - dryBiCartDrainExecState = DRY_BICART_DRAIN_START_STATE; dryBiCartDrainStartTime = 0; dryBiCartDrainPhaseStartTime = 0; dryBiCartDrainLastCondSampleTime = 0; @@ -215,7 +222,15 @@ case DRY_BICART_START_STATE: if ( TRUE == getU32OverrideValue( &dryBiCartFillRequested ) ) { - dryBiCartFillExecState = DRY_BICART_FILL_WATER_START_STATE; + // fill drybicart only if iofp state is in FP_MODE_GENP + //if(FP_MODE_GENP == getCurrentFPOperationMode()) + { + // TODO: pre gen should start the D12 pump and D14 valve + setValveState( D14_VALV, VALVE_STATE_OPEN ); + setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); + + dryBiCartFillExecState = DRY_BICART_FILL_WATER_START_STATE; + } } break; @@ -270,8 +285,10 @@ //Open D65 setValveState( D65_VALV, VALVE_STATE_OPEN ); + //Open D64 setValveState( D64_VALV, VALVE_STATE_OPEN ); + //Initiate timer to measure length of fill dryBiCartFillStartTime = getMSTimerCount(); state = DRY_BICART_FILL_WATER_END_STATE; @@ -322,6 +339,7 @@ //Close D64 setValveState( D64_VALV, VALVE_STATE_CLOSED); + //Vent bicart setValveState( D85_VALV, VALVE_STATE_OPEN ); @@ -345,15 +363,15 @@ DRY_BICART_FILL_EXEC_STATE_T state = DRY_BICART_DEGAS_END_STATE; F32 d66Pressure = getFilteredPressure( D66_PRES ); - if ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_VENT_TIME_MS ) ) + if ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_FILL_VENT_TIME_MS ) ) { //Vent chamber F setValveState( D64_VALV, VALVE_STATE_OPEN ); } // D66 pressure drops or time out - if ( ( d66Pressure <= DRY_BICART_VENT_COMPLETE_PRESSURE ) || - ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_VENT_MAX_TIME_MS ) ) ) + if ( ( d66Pressure <= DRY_BICART_FILL_VENT_COMPLETE_PRESSURE ) || + ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_FILL_VENT_MAX_TIME_MS ) ) ) { setValveState( D64_VALV, VALVE_STATE_OPEN ); setValveState( D85_VALV, VALVE_STATE_CLOSED ); @@ -387,6 +405,12 @@ ( biCartFillCycleCounter >= dryBiCartMaxFillCount ) ) { state = DRY_BICART_FILL_COMPLETE_STATE; + + // TODO: stop the D12 pump + signalDialysatePumpHardStop( D12_PUMP ); + + // TODO: close the D14 valve + setValveState( D14_VALV, VALVE_STATE_CLOSED ); } else { @@ -415,10 +439,21 @@ *************************************************************************/ static DRY_BICART_FILL_EXEC_STATE_T handleDryBicartFillCompleteState( void ) { + // stay in this state till bicart request is cleared so that fill complete status can be checked DRY_BICART_FILL_EXEC_STATE_T state = DRY_BICART_FILL_COMPLETE_STATE; - //TODO : Do nothing or any cleanup later + // stop the D12 pump + //signalDialysatePumpHardStop( D12_PUMP ); + // close the D14 valve + //setValveState( D14_VALV, VALVE_STATE_CLOSED ); + + // Go idle when request cleared + if ( FALSE == getU32OverrideValue( &dryBiCartFillRequested ) ) + { + state = DRY_BICART_START_STATE; + } + return state; } @@ -466,10 +501,8 @@ switch ( bicarbChamberFillExecState ) { case BICARB_CHAMBER_START_STATE: - if ( TRUE == getU32OverrideValue( &bicarbChamberFillRequested ) ) { - bicarbChamberFillExecState = BICARB_CHAMBER_CHECK_LEVEL_STATE; bicarbChamberFillRequested.data = FALSE; } @@ -577,7 +610,6 @@ { setValveState( D65_VALV, VALVE_STATE_CLOSED ); setValveState( D80_VALV, VALVE_STATE_CLOSED ); - state = BICARB_CHAMBER_START_STATE; } @@ -607,18 +639,7 @@ case DRY_BICART_DRAIN_START_STATE: if ( TRUE == getU32OverrideValue( &dryBiCartDrainRequested ) ) { - dryBiCartDrainStartTime = getMSTimerCount(); - dryBiCartDrainPhaseStartTime = dryBiCartDrainStartTime; - dryBiCartDrainLastCondSampleTime = dryBiCartDrainStartTime; - dryBiCartDrainCondStableCount = 0; - dryBiCartDrainExecState = DRY_BICART_FLUID_DRAIN_STATE; - - // 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 ); + dryBiCartDrainExecState = handleDryBicartDrainStartState(); } break; @@ -648,34 +669,63 @@ /*********************************************************************//** * @brief - * The handleDryBicartFluidDrainState function initiates the water drain + * The handleDryBicartDrainStartState function set the one time actuation for bicarb drain request * from dry bicarbonate cartridge. - * @details \b Inputs: none - * @details \b Outputs: valve states + * @details \b Inputs: dryBiCartDrainRequested + * @details \b Outputs: valve states, dryBiCartDrainStartTime, dryBiCartDrainExecState * @return the next drybicart drain state. *************************************************************************/ -static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ) +static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartDrainStartState( void ) { DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_STATE; - // Open vent valves and close descaling valve - setValveState( D80_VALV, VALVE_STATE_OPEN ); - setValveState( D81_VALV, VALVE_STATE_CLOSED ); - setValveState( D85_VALV, VALVE_STATE_OPEN ); + // open bypass valve + setValveState( D34_VALV, VALVE_STATE_OPEN ); + // TODO: open DD drain + setValveState( D53_VALV, VALVE_STATE_OPEN ); + + // TODO: open iofp drain valve + setValveState( M12_VALV, VALVE_STATE_OPEN ); + // Open balancing chamber pressure valves valveControlForBCOpenState(); //Close D14 valve setValveState( D14_VALV, VALVE_STATE_CLOSED ); - // Run D10 IN Open loop mode(max speed) - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, DOSING_CONT_VOLUME ); + // Run D10 In Open loop mode(max speed 200ml/min) + setConcentratePumpTargetSpeed( D10_PUMP, DRAIN_CONCENTRATE_PUMP_MAX_SPEED, DOSING_CONT_VOLUME ); requestConcentratePumpOn( D10_PUMP ); - // Run D48 + // Run D48, 2300 rpm setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + dryBiCartDrainStartTime = getMSTimerCount(); + dryBiCartDrainPhaseStartTime = dryBiCartDrainStartTime; + dryBiCartDrainLastCondSampleTime = dryBiCartDrainStartTime; + dryBiCartDrainCondStableCount = 0; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDryBicartFluidDrainState function initiates the water drain + * from dry bicarbonate cartridge. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return the next drybicart drain state. + *************************************************************************/ +static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ) +{ + DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_STATE; + + // Open vent valves and close descaling valve + setValveState( D80_VALV, VALVE_STATE_OPEN ); + setValveState( D81_VALV, VALVE_STATE_CLOSED ); + setValveState( D85_VALV, VALVE_STATE_OPEN ); + // After a fluid drain window, go to duration/condition check (which alternates phases) if ( TRUE == didTimeout( dryBiCartDrainPhaseStartTime, DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ) ) { @@ -706,7 +756,9 @@ setValveState( D64_VALV, VALVE_STATE_CLOSED ); setValveState( D80_VALV, VALVE_STATE_CLOSED ); setValveState( D85_VALV, VALVE_STATE_CLOSED ); + dryBiCartDrainPhaseStartTime = getMSTimerCount(); + state = DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE; } @@ -716,23 +768,48 @@ /*********************************************************************//** * @brief * The handleDryBicartFluidDrainDurationCheckState function monitors conductivity - * through D17 and D74 and determines drain completion, otherwise alternates phases. + * through D17 and D74 and determines drain completion, otherwise switch back and forth between + * DRY_BICART_FLUID_DRAIN_STATE and DRY_BICART_PRESSURE_EQUILLIBRIUM_STATE * @details \b Inputs: P17_COND, P74_COND * @details \b Outputs: next state decision * @return the next drybicart drain state. *************************************************************************/ static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainDurationCheckState( void ) { - DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE; + // switch back to DRY_BICART_FLUID_DRAIN_STATE if not fully drained or not timeout + DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_STATE; - // Max drain time fallback + // Max drain time fallback, it would be different for small and large bicart, + // 4 minutes for small bicart with full of water and 8 minutes for large bicart if ( TRUE == didTimeout( dryBiCartDrainStartTime, DRY_BICART_MAX_DRAIN_TIME_MS ) ) { state = DRY_BICART_FLUID_DRAIN_END_STATE; - } + // Stop pumps + requestConcentratePumpOff( D10_PUMP, FALSE ); + signalDialysatePumpHardStop( D48_PUMP ); + + // Close valves used for drain + setValveState( D64_VALV, VALVE_STATE_CLOSED ); + setValveState( D80_VALV, VALVE_STATE_CLOSED ); + setValveState( D85_VALV, VALVE_STATE_CLOSED ); + + // close bypass valve + setValveState( D34_VALV, VALVE_STATE_CLOSED ); + + // TODO: close DD drain + setValveState( D53_VALV, VALVE_STATE_CLOSED ); + + // TODO : close iofp drain valve + setValveState( M12_VALV, VALVE_STATE_CLOSED ); + + //close all balancing chamber valves + valveControlForBCClosedState(); + } else { + //TODO , disabling conductivity related checks since cond17 and cond74 values reading as zero now +#if 0 // Sample conductivity periodically if ( TRUE == didTimeout( dryBiCartDrainLastCondSampleTime, DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS ) ) { @@ -744,21 +821,18 @@ if ( ( cond17 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) && ( cond74 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) ) { - if ( dryBiCartDrainCondStableCount < DRY_BICART_DRAIN_COND_STABLE_COUNT_MAX ) - { - dryBiCartDrainCondStableCount++; - } + dryBiCartDrainCondStableCount++; } if ( dryBiCartDrainCondStableCount >= DRY_BICART_DRAIN_COND_STABLE_SAMPLES ) { state = DRY_BICART_FLUID_DRAIN_END_STATE; } } +#endif } dryBiCartDrainPhaseStartTime = getMSTimerCount(); - state = DRY_BICART_FLUID_DRAIN_STATE; return state; } @@ -773,24 +847,9 @@ *************************************************************************/ static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainEndState( void ) { + // stay in this state till drain request is cleared so that Drain completion status can be checked DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_END_STATE; - // Stop pumps - requestConcentratePumpOff( D10_PUMP, FALSE ); - signalDialysatePumpHardStop( D48_PUMP ); - - // Close valves used for drain - setValveState( D64_VALV, VALVE_STATE_CLOSED ); - setValveState( D80_VALV, VALVE_STATE_CLOSED ); - setValveState( D85_VALV, VALVE_STATE_CLOSED ); - - // close bypass valve - setValveState( D34_VALV, VALVE_STATE_CLOSED ); - // close DD drain - setValveState( D53_VALV, VALVE_STATE_CLOSED ); - // close iofp drain valve - setValveState( M12_VALV, VALVE_STATE_CLOSED ); - // Go idle when request cleared if ( FALSE == getU32OverrideValue( &dryBiCartDrainRequested ) ) { @@ -813,7 +872,6 @@ bicarbChamberFillRequested.data = TRUE; } - /*********************************************************************//** * @brief * The setBicartFillRequested function sets the bicart fill request @@ -932,7 +990,7 @@ /*********************************************************************//** * @brief - * The testDryBiCartFillRequestOverride function starts/stops the bicarb + * The testBiCarbChamberFillRequestOverride function starts/stops the bicarb * chamber F fill. * @details \b Inputs: tester logged in * @details \b Outputs: bicarbChamberFillRequested @@ -963,4 +1021,5 @@ return result; } + /**@}*/ Index: firmware/App/Controllers/SpentChamberFill.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Controllers/SpentChamberFill.c (.../SpentChamberFill.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Controllers/SpentChamberFill.c (.../SpentChamberFill.c) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -228,8 +228,8 @@ //Valve control for state 1 spent chamber fill valveControlForSCFillState1FillStart(); // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); @@ -317,8 +317,8 @@ // Valve control for state 2 fill valveControlForSCFillState2FillStart(); // start acid and bicarb pump with the expected quantity - setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); + setConcentratePumpTargetSpeed( D11_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, acidDoseVolume ); + setConcentratePumpTargetSpeed( D10_PUMP, DOSING_CONCENTRATE_PUMP_MAX_SPEED, bicarbDoseVolume ); requestConcentratePumpOn( D11_PUMP ); requestConcentratePumpOn( D10_PUMP ); Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -r8d2a2aec6986e58a1f6f75d4ba8864ee689fde48 -rf6b5a627c4f735ea5f425e0804defded0d6ed224 --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 8d2a2aec6986e58a1f6f75d4ba8864ee689fde48) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision f6b5a627c4f735ea5f425e0804defded0d6ed224) @@ -249,13 +249,6 @@ //TODO: Change to wet self test state later DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DRY_BICART_FILL_CHECK; - if ( getTestConfigStatus( TEST_CONFIG_ENABLE_DRY_BICART_FILL ) == TRUE ) - { - setValveState( D14_VALV, VALVE_STATE_OPEN ); - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - - } - //execWetSelfTest(); return state; @@ -278,13 +271,15 @@ { setBicartFillRequested(); + // stay in this state till bicart fill complete. if ( getCurrentDryBiCartFillExecState() == DRY_BICART_FILL_COMPLETE_STATE ) { state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; } } else { + // not bicart fill, move to next state state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; }