Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r38355442b06187fe5d57deca647b3adf2fa26b89 -ra6308f42594f03f4ef666cc858fd5432ad7ea63d --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 38355442b06187fe5d57deca647b3adf2fa26b89) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision a6308f42594f03f4ef666cc858fd5432ad7ea63d) @@ -136,14 +136,16 @@ static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. static F32 minimumReservoirVolume; ///< Minimum reservoir volume in mL. -static U32 steadyVolumeCount; ///< Use to keep track the number of dVolume/dt < Threshold +static U32 steadyVolumeCount; ///< Use to keep track the number of dVolume/dt < Threshold. +static BOOL bubbleClearEnded; ///< Bubble clear ended boolean signal. // ********** private function prototypes ********** static void resetPrimeFlags(); static void setupForPrimePause( void ); static void broadcastPrimingStatus( void ); static void purgeAirValvesBloodPumpControl( void ); +static void handlePrimeBubbleClear( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWaitForUserStartState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerSetupState( void ); @@ -173,14 +175,17 @@ primeStartTime = 0; primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; + bubbleClearEnded = FALSE; } /*********************************************************************//** * @brief * The transitionToPrime function prepares for transition to prime sub-mode. * This function will reset anything required before the start of priming sequence. * @details Inputs: none - * @details Outputs: currentPrimeState, wetSelfTestsResult, primeStartReqReceived, reservoirFilledStatus[] + * @details Outputs: currentPrimeState, wetSelfTestsResult, + * primeStartReqReceived, reservoirFilledStatus[], bubbleClearEnded, + * primeDialyzerBubbleClearState * @return none *************************************************************************/ void transitionToPrime( void ) @@ -210,6 +215,14 @@ setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); resetPrimeFlags(); + + if ( TRUE == getTestConfigStatus( TEST_CONFIG_USE_WET_CARTRIDGE ) ) + { + // If the use wet cartridge test configuration has been enabled skip the dialyzer + // bubble clear + bubbleClearEnded = TRUE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_COMPLETE_STATE; + } } /*********************************************************************//** @@ -461,6 +474,75 @@ /*********************************************************************//** * @brief + * The handlePrimeBubbleClear function handles bubble clear pressurizing + * of dialyzer. + * @details Inputs: air trap levels, primeDialyzerBubbleClearState, + * primeSalineDialyzerBubbleClearStartTime + * @details Outputs: control valves to pressurize, primeDialyzerBubbleClearState, + * primeSalineDialyzerBubbleClearStartTime + * @return none + *************************************************************************/ +static void handlePrimeBubbleClear( void ) +{ + U32 timeout; + + switch ( primeDialyzerBubbleClearState ) + { + case PRIME_BUBBLE_CLEAR_READY_STATE: + case PRIME_BUBBLE_CLEAR_FLOW_STATE: + if ( PRIME_BUBBLE_CLEAR_READY_STATE == primeDialyzerBubbleClearState ) + { + 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 + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_CLOSED ); + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_PRESSURE_STATE; + } + } + break; + + case PRIME_BUBBLE_CLEAR_PRESSURE_STATE: + case PRIME_BUBBLE_CLEAR_VENT_STATE: + 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_A_INSERT_EJECT ); + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + bubbleClearEnded = TRUE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_VENT_STATE; + } + else if ( ( TRUE == bubbleClearEnded ) && + ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_VALVE_WAIT_TIME_MS ) ) ) + { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_OPEN ); + bubbleClearEnded = FALSE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_FLOW_STATE; + } + break; + + case PRIME_BUBBLE_CLEAR_COMPLETE_STATE: + default: + // do nothing + break; + + } // end switch +} + +/*********************************************************************//** + * @brief * The handlePrimeSalineSetupState function checks user's request to start * priming. * @details Inputs: primeStartReqReceived @@ -527,74 +609,7 @@ return state; } -/*********************************************************************//** - * @brief - * The handlePrimeBubbleClear function handles bubble clear pressurizing - * of dialyzer. - * @details Inputs: air trap levels, primeDialyzerBubbleClearState, primeSalineDialyzerBubbleClearStartTime - * @details Outputs: control valves to pressurize, primeDialyzerBubbleClearState, primeSalineDialyzerBubbleClearStartTime - * @return none - *************************************************************************/ -static void handlePrimeBubbleClear( void ) -{ - static BOOL bubble_clear_ended = FALSE; - U32 timeout; - switch ( primeDialyzerBubbleClearState ) - { - case PRIME_BUBBLE_CLEAR_READY_STATE: - case PRIME_BUBBLE_CLEAR_FLOW_STATE: - if ( PRIME_BUBBLE_CLEAR_READY_STATE == primeDialyzerBubbleClearState ) - { - 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 - primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); - if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) - { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_CLOSED ); - primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_PRESSURE_STATE; - } - } - break; - - case PRIME_BUBBLE_CLEAR_PRESSURE_STATE: - case PRIME_BUBBLE_CLEAR_VENT_STATE: - 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_A_INSERT_EJECT ); - primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); - bubble_clear_ended = TRUE; - primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_VENT_STATE; - } - else if ( ( TRUE == bubble_clear_ended ) && - ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_VALVE_WAIT_TIME_MS ) ) ) - { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_OPEN ); - bubble_clear_ended = FALSE; - primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_FLOW_STATE; - } - break; - - case PRIME_BUBBLE_CLEAR_COMPLETE_STATE: - default: - // do nothing - break; - - } // end switch -} - /*********************************************************************//** * @brief * The handlePrimePurgeAirState function checks for air trap level and moves