Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d -re408267b7e73d664051a46e65ac248749af8e5be --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision e408267b7e73d664051a46e65ac248749af8e5be) @@ -7,8 +7,8 @@ * * @file Prime.c * -* @author (last) Michael Garthwaite -* @date (last) 21-Oct-2022 +* @author (last) Dara Navaei +* @date (last) 07-Nov-2022 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -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 VENOUS_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. @@ -594,8 +597,6 @@ rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - cmdSetDGActiveReservoir( &rsrvrCmd ); - if ( TRUE == hasDGCompletedReservoirSwitch() ) { U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); @@ -608,7 +609,7 @@ signalBloodPumpHardStop(); setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( 225, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // 225 target flow rate matches PWM duty cycle for DPi pump @ 300. // Calculate the time out value that must passed prior to checking for the steady state volume in the reservoir primeDialysateDialyzerTimeLimit = (U32)( ( ( DIALYSATE_DIALYZER_TUBE_VOLUME_ML + dialyzerDialysateVolume ) * SEC_PER_MIN * MS_PER_SECOND ) / DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN ); @@ -720,6 +721,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 +742,24 @@ *************************************************************************/ 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; + } + // TODO - could also check for valve closed too long here (maybe > 2sec) in case not opening based on pressure + if ( ( TRUE == bubbleClearActive ) && ( getMeasuredVenousPressure() > VENOUS_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;