Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rc9a699f3e65bb1680c265d6d0ad755aa653b1707 -rb29da200407a214659556e9996a4a8de77c5b147 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision c9a699f3e65bb1680c265d6d0ad755aa653b1707) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision b29da200407a214659556e9996a4a8de77c5b147) @@ -61,7 +61,10 @@ #define STEADY_VOLUME_TIME_DEADLINE_MS ( 55 * MS_PER_SECOND ) ///< Time in msec for the steady volume deadline time out. #define VENOUS_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ( 200.0F ) ///< Maximum venous pressure reading (in mmHg) for bubble clear. -#define BUBBLE_CLEAR_PRESSURE_REPETITIONS ( 5 ) ///< Bubble clear pressure repetitions in dialyzer priming. +//#define BUBBLE_CLEAR_PRESSURE_REPETITIONS ( 5 ) ///< Bubble clear pressure repetitions in dialyzer priming. +#define BUBBLE_CLEAR_WAIT_TIME_INITIAL_MS ( 10 * MS_PER_SECOND ) ///< Time in msec to wait for initial bubble clear pressure. +#define BUBBLE_CLEAR_WAIT_TIME_MS ( 2 * MS_PER_SECOND ) ///< Time in msec to wait for bubble clear pressure. +#define BUBBLE_CLEAR_MAX_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time in msec maximum for bubble clear pressure. /// States of the treatment reservoir management state machine. typedef enum PrimeReservoirMgmt_States @@ -108,6 +111,8 @@ static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. static BOOL primeFirstPurgePass; ///< Flag indicates to transition to a faster purge speed. +static BOOL primeFirstBubbleClearPass; ///< Flag indicates first bubble clear - wait longer before first pressurize. +static BOOL bubbleClearActive; ///< Flag indicates bubble clear pressure active static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. @@ -490,6 +495,9 @@ purgeAirValvesBloodPumpControl(); purgeAirTimeOutStartTime = getMSTimerCount(); + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + primeFirstBubbleClearPass = TRUE; + bubbleClearActive = FALSE; if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -502,6 +510,53 @@ /*********************************************************************//** * @brief + * The handlePrimeBubbleClear function handles bubble clear pressurizing + * of dialyzer. + * @details Inputs: air trap levels, bubbleClearActive, primeFirstBubbleClearPass + * @details Outputs: control valves to pressurize, bubbleClearActive, primeSalineDialyzerBubbleClearStartTime + * @return none + *************************************************************************/ +static void handlePrimeBubbleClear( void ) +{ + U32 timeout; + if ( FALSE == bubbleClearActive ) + { + if ( TRUE == primeFirstBubbleClearPass ) + { + timeout = BUBBLE_CLEAR_WAIT_TIME_INITIAL_MS; + } + else + { + timeout = BUBBLE_CLEAR_WAIT_TIME_MS; + } + + if ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, timeout ) ) + { + // Close valve to create pressure to clear Dialyzer bubbles + primeFirstBubbleClearPass = FALSE; + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + { + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValveAirTrap( STATE_CLOSED ); + bubbleClearActive = TRUE; + } + } + } + else if ( ( getMeasuredVenousPressure() > VENOUS_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ) || + ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_MAX_TIME_MS ) ) ) + { + // Pressure max reached. or timeout, release pressure + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_OPEN ); + bubbleClearActive = FALSE; + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + } + +} + +/*********************************************************************//** + * @brief * The handlePrimePurgeAirState function checks for air trap level and moves * to blood circuit circulation state if fluid is detected at upper sensor. * @details Inputs: air trap levels, primeFirstPurgePass, purgeAirTimeOutStartTime @@ -518,13 +573,16 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_PRIME_SALINE_PURGE_AIR_TIME_OUT, PURGE_AIR_TIME_OUT_COUNT ); } + handlePrimeBubbleClear(); + if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) { setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_CLOSED ); + bubbleClearActive = FALSE; setBloodPumpTargetFlowRate( BLOOD_PUMP_FAST_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); @@ -724,7 +782,7 @@ primeSalineDialyzerTimeLimit = (U32)( ( ( dialyzerDialysateVolume * DIALYZER_VOLUME_SCALE_FACTOR + DIALYZER_DVI_PATH_VOLUME_ML ) * SEC_PER_MIN * MS_PER_SECOND ) / BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN ); primeSalineDialyzerStartTime = getMSTimerCount(); - primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); +// primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -745,11 +803,12 @@ *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerState( void ) { - static BOOL bubbleClearActive = FALSE; +// static BOOL bubbleClearActive = FALSE; HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; - +/* // Close valve 4-5 times to create pressure to clear Dialyzer bubbles + if ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, ( primeSalineDialyzerTimeLimit / BUBBLE_CLEAR_PRESSURE_REPETITIONS ) ) ) { primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); @@ -763,12 +822,13 @@ setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); bubbleClearActive = FALSE; } +*/ if ( TRUE == didTimeout( primeSalineDialyzerStartTime, primeSalineDialyzerTimeLimit ) ) { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; // Release pressure setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); - bubbleClearActive = FALSE; +// bubbleClearActive = FALSE; } // TODO: Rework alarm and timeout logic here. PRIME_SALINE_DIALYZER_TIME_OUT_COUNT may not be reached. if ( TRUE == didTimeout( primeSalineDialyzerStartTime, PRIME_SALINE_DIALYZER_TIME_OUT_COUNT ) )