Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r4db65dc16d162be7336b271b8cecf3dea5892b3d -r33955d532f060754c46112255181276c7b2e3052 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 4db65dc16d162be7336b271b8cecf3dea5892b3d) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 33955d532f060754c46112255181276c7b2e3052) @@ -81,6 +81,17 @@ NUM_OF_PRIME_RESERVOIR_MGMT_STATES ///< Number of prime reservoir mgmt. states. } PRIME_RESERVOIR_MGMT_STATE_T; +/// States of the prime dialyzer bubble clear state machine. +typedef enum PrimeSalineDialyzerBubbleClear_States +{ + PRIME_BUBBLE_CLEAR_READY_STATE = 0, ///< Bubble clear initial / ready state. + PRIME_BUBBLE_CLEAR_PRESSURE_STATE, ///< Bubble clear pressurized / active state. + PRIME_BUBBLE_CLEAR_VENT_STATE, ///< BUbble clear vent to reservoir state. + PRIME_BUBBLE_CLEAR_FLOW_STATE, ///< Bubble clear flow state. + PRIME_BUBBLE_CLEAR_COMPLETE_STATE, ///< Bubble clear complete. + NUM_OF_PRIME_BUBBLE_CLEAR_STATES ///< Number of bubble clear states. +} PRIME_BUBBLE_CLEAR_STATE_T; + typedef struct { U32 bloodVolume; ///< Blood volume of the dialyzer in mL. U32 dialysateVolume; ///< Dialysate volume of the dialyzer in mL. @@ -103,6 +114,7 @@ static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. static HD_PRE_TREATMENT_PRIME_STATE_T previousPrimeState; ///< Previous state of the prime sub-mode, to use when resuming from pause. static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. +static PRIME_BUBBLE_CLEAR_STATE_T primeDialyzerBubbleClearState;///< Priming saline dialyzer bubble clear state. static U32 primeStartTime; ///< Starting time of priming (in ms). static U32 primePauseStartTime; ///< Priming pause start time (in ms). @@ -111,8 +123,6 @@ static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. static BOOL primeFirstPurgePass; ///< Flag indicates to transition to a faster purge speed. -static BOOL primeFirstBubbleClearPass; ///< Flag indicates first bubble clear - wait longer before first pressurize. -static BOOL bubbleClearActive; ///< Flag indicates bubble clear pressure active static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. @@ -174,6 +184,7 @@ { primeStartTime = getMSTimerCount(); primeFirstPurgePass = TRUE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_READY_STATE; setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); @@ -206,6 +217,10 @@ *************************************************************************/ void execPrime( void ) { + //TODO - debug stuff REMOVE + HD_PRE_TREATMENT_PRIME_STATE_T lastPrimeState = currentPrimeState; + PRIME_BUBBLE_CLEAR_STATE_T lastPrimeDialyzerBubbleClearState = primeDialyzerBubbleClearState; + // execute prime sub-mode state machine switch ( currentPrimeState ) { @@ -278,6 +293,15 @@ break; } + // TODO Remove this debug + if ( ( lastPrimeState != currentPrimeState ) || (lastPrimeDialyzerBubbleClearState != primeDialyzerBubbleClearState) ) + { + U08 tempCharBuffer[ 64 ]; + sprintf( tempCharBuffer, "PrimeState,%d,BubblePressureState,%d", currentPrimeState, primeDialyzerBubbleClearState ); + broadcastData( MSG_ID_HD_DEBUG_EVENT, COMM_BUFFER_OUT_CAN_HD_BROADCAST, tempCharBuffer, strlen( tempCharBuffer ) ); + } + // TODO End debug output + // Prime flags should be handled by now resetPrimeFlags(); @@ -486,7 +510,8 @@ * before start priming the saline dialyzer fluid path. * priming. * @details Inputs: primeStartReqReceived - * @details Outputs: control valves to purge air + * @details Outputs: control valves to purge air, primeDialyzerBubbleClearState, + * primeSalineDialyzerBubbleClearStartTime, purgeAirTimeOutStartTime * @return current state *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) @@ -496,8 +521,7 @@ purgeAirValvesBloodPumpControl(); purgeAirTimeOutStartTime = getMSTimerCount(); primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); - primeFirstBubbleClearPass = TRUE; - bubbleClearActive = FALSE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_READY_STATE; if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -512,58 +536,68 @@ * @brief * The handlePrimeBubbleClear function handles bubble clear pressurizing * of dialyzer. - * @details Inputs: air trap levels, bubbleClearActive, primeFirstBubbleClearPass - * @details Outputs: control valves to pressurize, bubbleClearActive, primeSalineDialyzerBubbleClearStartTime + * @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; - if ( FALSE == bubbleClearActive ) + switch ( primeDialyzerBubbleClearState ) { - if ( TRUE == primeFirstBubbleClearPass ) - { - timeout = BUBBLE_CLEAR_WAIT_TIME_INITIAL_MS; - } - else - { - timeout = BUBBLE_CLEAR_WAIT_TIME_MS; - } + 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 - primeFirstBubbleClearPass = FALSE; - primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); - if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + 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_CLOSED ); - bubbleClearActive = TRUE; + setValveAirTrap( STATE_OPEN ); + bubble_clear_ended = FALSE; + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_FLOW_STATE; } - } - } - else - { - 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; - } - else if ( ( TRUE == bubble_clear_ended ) && - ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_VALVE_WAIT_TIME_MS ) ) ) - { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_OPEN ); - bubbleClearActive = FALSE; - bubble_clear_ended = FALSE; - } - } + break; + + case PRIME_BUBBLE_CLEAR_COMPLETE_STATE: + default: + // do nothing + break; + + } // end switch } /*********************************************************************//** @@ -593,14 +627,14 @@ setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_CLOSED ); - bubbleClearActive = FALSE; setBloodPumpTargetFlowRate( BLOOD_PUMP_FAST_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // Once the dialyzer is no longer dry from the first pass of purge air, we can set flow to the fast rate // until we are in a new priming state. primeFirstPurgePass = FALSE; noAirDetectedStartTime = getMSTimerCount(); + primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_COMPLETE_STATE; state = HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; }