Index: firmware/App/Modes/Prime.c =================================================================== diff -u -raa7b1f5f68aae23c1c52b32658fcb625c29accfb -r29a10234d477b500dd2a07ab269d49bd18b221eb --- firmware/App/Modes/Prime.c (.../Prime.c) (revision aa7b1f5f68aae23c1c52b32658fcb625c29accfb) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 29a10234d477b500dd2a07ab269d49bd18b221eb) @@ -60,6 +60,8 @@ #define STEADY_VOLUME_COUNT_SEC ( 10000 / LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ///< Counter must be greater than 10 seconds before steady volume is true. #define STEADY_VOLUME_TIME_DEADLINE_MS ( 55 * MS_PER_SECOND ) ///< Time in msec for the steady volume deadline time out. +#define ARTERIAL_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ( 200.0F ) ///< Maximum arterial pressure reading (in mmHg) for bubble clear. + /// States of the treatment reservoir management state machine. typedef enum PrimeReservoirMgmt_States { @@ -109,6 +111,7 @@ static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. static U32 primeSalineDialyzerStartTime; ///< Starting time of priming saline dialyzer circuit. +static U32 primeSalineDialyzerBubbleClearStartTime; ///< Starting time of priming saline dialyzer bubble clear. static U32 primeDialysateDialyzerStartTime; ///< Starting time of priming dialysate dialyzer circuit. static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. @@ -720,6 +723,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(); if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -740,8 +744,23 @@ *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerState( void ) { + 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 / 5 ) ) ) + { + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + bubbleClearActive = TRUE; + } + if ( ( TRUE == bubbleClearActive ) && ( getFilteredArterialPressure() > ARTERIAL_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ) ) + { + // Pressure max reached, release pressure + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + bubbleClearActive = FALSE; + } if ( TRUE == didTimeout( primeSalineDialyzerStartTime, primeSalineDialyzerTimeLimit ) ) { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE;