Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -rbd522c8ffdf75130571e5b6a79d1b1d6acd78b1c -rc6f1f887955f6f7a9624ad1418644e56f78b0a67 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision bd522c8ffdf75130571e5b6a79d1b1d6acd78b1c) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision c6f1f887955f6f7a9624ad1418644e56f78b0a67) @@ -80,10 +80,13 @@ #define SMALL_DRY_BICART_MAX_DRAIN_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max drain time for small 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 ///< De-bounce samples (10*50ms=500ms) +#define DRY_BICART_DRAIN_D85_CLOSE_TIME_MS ( 10 * MS_PER_SECOND ) +#define DRY_BICART_DRAIN_D85_OPEN_TIME_MS ( 10 * MS_PER_SECOND ) +#define DRY_BICART_DRAIN_TIMEOUT_INCREMENT_MS ( 2 * MS_PER_SECOND ) ///< Amount to increase each time +#define DRY_BICART_DRAIN_MAX_ALLOWED_CLOSE_TIME_MS ( 20 * MS_PER_SECOND ) +#define DRY_BICART_DRAIN_D18_PRESSURE_PSI 8 + /// Payload record structure for dry bicart fill request typedef struct { @@ -133,10 +136,10 @@ static U32 dryBiCarbSypplyVentStartTime; ///< Bicarb supply vent start time for both bicart & Chamber F. // drain static U32 dryBiCartDrainStartTime; ///< Drain overall start time (for max timeout) -//TODO: implement draining -//static U32 dryBiCartDrainLastCondSampleTime; ///< Last time conductivity was sampled -//static U32 dryBiCartDrainCondStableCount; ///< Debounce counter for "zero" conductivity +static U32 dryBiCartValveOnOffStartTime ; +static U32 dryBiCartPumpStartStopStartTime ; static U32 dryBiCartDrainTimePeriod; ///< Dry bicart drain time period +static U32 dryBiCartCurrentCloseTimeoutMs; static U32 dryBiCartPersistenceStartTime; ///< Dry bicart Persistence time. static U32 drybicartPersistenceOnLowercartPressureStartTime; ///< Dry bicart Persistence on lower cart pressure start time. @@ -169,6 +172,8 @@ static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainDurationCheckState( void ); static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainEndState( void ); +static prepareSystemForDrain( void ); +static terminateDrainSequence( void ); static DRY_BICART_DEPRESSURIZE_EXEC_STATE_T handleDryBicartDepressurizeStartState( void ); static DRY_BICART_DEPRESSURIZE_EXEC_STATE_T handleDryBicartDepressurizeVentStartState( void ); @@ -246,11 +251,14 @@ dryBiCarbSupplyStartTime = 0; dryBiCarbSypplyVentStartTime = 0; dryBiCartDrainStartTime = 0; + dryBiCartValveOnOffStartTime = 0; + dryBiCartPumpStartStopStartTime = 0; //dryBiCartDrainLastCondSampleTime = 0; //dryBiCartDrainCondStableCount = 0; dryBiCartDrainTimePeriod = 0; dryBiCartPersistenceStartTime = 0; drybicartPersistenceOnLowercartPressureStartTime = 0; + dryBiCartCurrentCloseTimeoutMs = DRY_BICART_DRAIN_TIMEOUT_INCREMENT_MS; prevDryBicartState = DRY_BICART_IDLE; } @@ -1326,19 +1334,14 @@ if ( TRUE == getU32OverrideValue( &dryBiCartDrainRequested ) ) { - if ( TRUE == getU32OverrideValue( &dryBiCartType ) ) - { - dryBiCartDrainTimePeriod = LARGE_DRY_BICART_MAX_DRAIN_TIME_MS; - } - else - { - dryBiCartDrainTimePeriod = SMALL_DRY_BICART_MAX_DRAIN_TIME_MS; - } - dryBiCartDrainStartTime = getMSTimerCount(); - //dryBiCartDrainLastCondSampleTime = dryBiCartDrainStartTime; - //dryBiCartDrainCondStableCount = 0; + // Prepares the system fluid matrix by establishing the correct valve states. + // This function acts as an initialization guard, ensuring that all + // non-essential lines are isolated and all active lines are open + // before downstream equipment (pumps) can be energized. + prepareSystemForDrain(); + state = DRY_BICART_FLUID_DRAIN_STATE; } @@ -1347,112 +1350,181 @@ /*********************************************************************//** * @brief - * The handleDryBicartFluidDrainState function initiates the water drain - * from dry bicarbonate cartridge. - * @details \b Inputs: none + * The prepareSystemForDrain function open all necessary valves for drain + * @details \b Inputs: None * @details \b Outputs: valve states - * @return the next drybicart drain duration check state. + * @return None. *************************************************************************/ -static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ) +static prepareSystemForDrain() { - DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_STATE; - - //Close D14 valve + //Close valves setValveState( D14_VALV, VALVE_STATE_CLOSED ); setValveState( D65_VALV, VALVE_STATE_CLOSED ); setValveState( D35_VALV, VALVE_STATE_CLOSED ); setValveState( D40_VALV, VALVE_STATE_CLOSED ); - setValveState( D91_VALV, VALVE_STATE_CLOSED ); + setValveState( D64_VALV, VALVE_STATE_CLOSED ); setValveState( D81_VALV, VALVE_STATE_CLOSED ); + setValveState( D83_VALV, VALVE_STATE_CLOSED ); + setValveState( D91_VALV, VALVE_STATE_CLOSED ); - // Open vent valves and close descaling valve + // Open vent valves and supply valve setValveState( D80_VALV, VALVE_STATE_OPEN ); setValveState( D85_VALV, VALVE_STATE_OPEN ); - // Open D64 valve (vent for equilibrium) + + // Open D64 valve (vent for chamber F) setValveState( D64_VALV, VALVE_STATE_OPEN ); + // open bypass valve setValveState( D34_VALV, VALVE_STATE_OPEN ); + // TODO: open iofp drain valve, remove, this should be handled in IO/FP module. setValveState( M12_VALV, VALVE_STATE_OPEN ); + // Open balancing chamber valves valveControlForBCOpenState(); +} - // Run D10 In Open loop mode(max speed 200ml/min) - setConcentratePumpTargetSpeed( D10_PUMP, DRAIN_BICART_PUMP_SPEED, DOSING_CONT_VOLUME ); - requestConcentratePumpOn( D10_PUMP ); +/*********************************************************************//** + * @brief + * The handleDryBicartFluidDrainState function initiates the water drain + * from dry bicarbonate cartridge by turning on the pumps + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return the next drybicart drain duration check state. + *************************************************************************/ +static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainState( void ) +{ + DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_STATE; - // Run D48 at 1000 rpm,There is no improvement over above 1000 rpm for drain duration. - setDialysatePumpTargetRPM( D48_PUMP, DIAL_PUMP_DRAIN_RPM, TRUE ); + if ( TRUE == didTimeout( dryBiCartPumpStartStopStartTime, DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ) ) + { + // Run D10 In Open loop mode(max speed 200ml/min) + setConcentratePumpTargetSpeed( D10_PUMP, DRAIN_BICART_PUMP_SPEED, DOSING_CONT_VOLUME ); + requestConcentratePumpOn( D10_PUMP ); - state = DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE; + // Run D48 at 1000 rpm,There is no improvement over above 1000 rpm for drain duration. + setDialysatePumpTargetRPM( D48_PUMP, DIAL_PUMP_DRAIN_RPM, TRUE ); + dryBiCartValveOnOffStartTime = getMSTimerCount(); + + if( 0 == dryBiCartDrainStartTime ) + { + dryBiCartDrainStartTime = getMSTimerCount(); + } + + state = DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE; + } + return state; } /*********************************************************************//** * @brief - * The handleDryBicartFluidDrainDurationCheckState function monitors conductivity - * through D17 and D74 and determines drain completion or drain complete by max timeout - * @details \b Inputs: P17_COND, P74_COND, dryBiCartDrainCondStableCount, dryBiCartDrainStartTime - * @details \b Outputs: dryBiCartDrainLastCondSampleTime + * The terminateDrainSequence function close all valves opened for drain and stop the pumps + * @details \b Inputs: None + * @details \b Outputs: valve states, pumps state + * @return None. + *************************************************************************/ +static terminateDrainSequence( void ) +{ + // 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( D83_VALV, VALVE_STATE_CLOSED ); + setValveState( D85_VALV, VALVE_STATE_CLOSED ); + + // close bypass valve + setValveState( D34_VALV, VALVE_STATE_CLOSED ); + + // TODO : close iofp drain valve, remove this should be handled in IO/FP module. + setValveState( M12_VALV, VALVE_STATE_CLOSED ); + + //close all balancing chamber valves + valveControlForBCClosedState(); +} + +/*********************************************************************//** + * @brief + * The handleDryBicartFluidDrainDurationCheckState function monitors and + * determines drain complete by max timeout or cancel request + * @details \b Inputs: dryBiCartDrainStartTime, dryBiCartValveOnOffStartTime, + * dryBiCartType, dryBiCartDrainRequested and dryBiCartDrainTimePeriod, dryBiCartCurrentCloseTimeoutMs + * @details \b Outputs: None * @return the next drybicart drain end state. *************************************************************************/ static DRY_BICART_DRAIN_EXEC_STATE_T handleDryBicartFluidDrainDurationCheckState( void ) { - // 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_DURATION_CHECK_STATE; - // Max drain time fall back, it is different for small and large bicart, - // 4 minutes for small bicart with full of water and 8 minutes for large bicart - // TODO: user settings should be derived for large and small dry bicart for drain time out - // right now dialin override is provided. - if ( TRUE == didTimeout( dryBiCartDrainStartTime, dryBiCartDrainTimePeriod ) ) + F32 d18Pressure = getFilteredPressure( D18_PRES ); + + if ( TRUE == getU32OverrideValue( &dryBiCartType ) ) { - state = DRY_BICART_FLUID_DRAIN_END_STATE; + dryBiCartDrainTimePeriod = LARGE_DRY_BICART_MAX_DRAIN_TIME_MS; + } + else + { + dryBiCartDrainTimePeriod = SMALL_DRY_BICART_MAX_DRAIN_TIME_MS; + } - // Stop pumps + if ( d18Pressure >= DRY_BICART_DRAIN_D18_PRESSURE_PSI ) + { 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 ); + dryBiCartPumpStartStopStartTime = getMSTimerCount(); - // TODO : close iofp drain valve, remove this should be handled in IO/FP module. - setValveState( M12_VALV, VALVE_STATE_CLOSED ); + // move back to the previous state and wait for 3 second and then turn on the D10 pump + state = DRY_BICART_FLUID_DRAIN_STATE; + } - //close all balancing chamber valves - valveControlForBCClosedState(); + if ( ( VALVE_STATE_OPEN == getValveStateName(D85_VALV)) && + ( TRUE == didTimeout( dryBiCartValveOnOffStartTime, DRY_BICART_DRAIN_D85_OPEN_TIME_MS ) ) ) + { + // Vent using D85 , we need to create exact opposite step of the initial fill, first fill large , + // a little second fill and a little third fill + setValveState( D85_VALV, VALVE_STATE_CLOSED ); + setValveState( D64_VALV, VALVE_STATE_CLOSED ); + + dryBiCartValveOnOffStartTime = getMSTimerCount(); } - else + else if ( ( VALVE_STATE_CLOSED == getValveStateName(D85_VALV)) && + ( TRUE == didTimeout( dryBiCartValveOnOffStartTime, dryBiCartCurrentCloseTimeoutMs ) ) ) { - //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 ) ) - { - F32 cond17 = getFilteredConductivity( D17_COND ); - F32 cond74 = getFilteredConductivity( D74_COND ); - dryBiCartDrainLastCondSampleTime = getMSTimerCount(); + // order of opening the valve is important here, if we open the D85 first , + // more negative pressure created at the upper part of the bicart + setValveState( D64_VALV, VALVE_STATE_OPEN ); + setValveState( D85_VALV, VALVE_STATE_OPEN ); - // Debounce "zero conductivity" detection - if ( ( cond17 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) && - ( cond74 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) ) - { - dryBiCartDrainCondStableCount++; - } + dryBiCartValveOnOffStartTime = getMSTimerCount(); - if ( dryBiCartDrainCondStableCount >= DRY_BICART_DRAIN_COND_STABLE_SAMPLES ) - { - state = DRY_BICART_FLUID_DRAIN_END_STATE; - } + // --- Increment Timeout For The Next Off Cycle to create more negative pressure in the Chamber F --- + dryBiCartCurrentCloseTimeoutMs += DRY_BICART_DRAIN_TIMEOUT_INCREMENT_MS; + + if ( dryBiCartCurrentCloseTimeoutMs > DRY_BICART_DRAIN_MAX_ALLOWED_CLOSE_TIME_MS ) + { + dryBiCartCurrentCloseTimeoutMs = DRY_BICART_DRAIN_MAX_ALLOWED_CLOSE_TIME_MS; } -#endif } + if ( FALSE == getU32OverrideValue( &dryBiCartDrainRequested ) ) + { + dryBiCartDrainTimePeriod = 0; + } + + // Max drain time fall back, it is different for small and large bicart, + // 4 minutes for small bicart with full of water and 8 minutes for large bicart + // TODO: user settings should be derived for large and small dry bicart for drain time out + // right now dialin override is provided. + if ( TRUE == didTimeout( dryBiCartDrainStartTime, dryBiCartDrainTimePeriod ) ) + { + + state = DRY_BICART_FLUID_DRAIN_END_STATE; + } + return state; } @@ -1469,11 +1541,16 @@ // 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; + terminateDrainSequence( ); + // Go idle dryBiCartDrainRequested.data = FALSE; + // for this request override also cleared dryBiCartDrainRequested.ovData = FALSE; + state = DRY_BICART_DRAIN_START_STATE; + dryBicartStartRequest = DRY_BICART_IDLE; return state;