Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rc0421d4da4c4e87db9f7b39b0025a1221bb5c156 -r20bdfd8ac79017c8ab79ad62d16cb10dc4236081 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision c0421d4da4c4e87db9f7b39b0025a1221bb5c156) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 20bdfd8ac79017c8ab79ad62d16cb10dc4236081) @@ -137,7 +137,7 @@ 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 ********** @@ -176,6 +176,7 @@ primeStartTime = 0; primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; + bubbleClearEnded = FALSE; } /*********************************************************************//** @@ -475,6 +476,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 @@ -546,75 +616,6 @@ /*********************************************************************//** * @brief - * The handlePrimeBubbleClear function handles bubble clear pressurizing - * of dialyzer. - * @details Inputs: air trap levels, primeDialyzerBubbleClearState, - * primeSalineDialyzerBubbleClearStartTime, bubbleClearEnded - * @details Outputs: control valves to pressurize, primeDialyzerBubbleClearState, - * primeSalineDialyzerBubbleClearStartTime, bubbleClearEnded - * @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 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