Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rc0421d4da4c4e87db9f7b39b0025a1221bb5c156 -r42202c41a1a43970f0f8eb12dd46746776a83924 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision c0421d4da4c4e87db9f7b39b0025a1221bb5c156) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 42202c41a1a43970f0f8eb12dd46746776a83924) @@ -7,8 +7,8 @@ * * @file Prime.c * -* @author (last) Sean Nash -* @date (last) 12-Jun-2023 +* @author (last) Dara Navaei +* @date (last) 14-Jun-2023 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -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