Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r1f91b5a53bda942b0967817bbd5e68a499dbf816 -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 1f91b5a53bda942b0967817bbd5e68a499dbf816) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) @@ -165,12 +165,11 @@ *************************************************************************/ void initPrime( void ) { - currentPrimeState = HD_PRIME_START_STATE; + currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; primeStartTime = 0; primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; - } /*********************************************************************//** @@ -198,6 +197,12 @@ signalDialInPumpHardStop(); signalDialOutPumpHardStop(); stopSyringePump(); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + setAirPumpState( AIR_PUMP_STATE_OFF ); + } // Set valves to default positions setValveAirTrap( STATE_CLOSED ); @@ -223,19 +228,6 @@ // execute prime sub-mode state machine switch ( currentPrimeState ) { - case HD_PRIME_START_STATE: -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) - { - currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; - } - else -#endif - { - currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; - } - break; - case HD_PRIME_WAIT_FOR_USER_START_STATE: currentPrimeState = handlePrimeWaitForUserStartState(); break; @@ -280,13 +272,14 @@ currentPrimeState = handlePrimeWetSelfTestsState(); break; - case HD_PRIME_COMPLETE: - break; - case HD_PRIME_PAUSE: currentPrimeState = handlePrimePause(); break; + case HD_PRIME_COMPLETE: + // ok, do nothing here. pre-treatment will move on to recirculate once we get here. + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, currentReservoirMgmtState ); break; @@ -404,9 +397,12 @@ *************************************************************************/ static void setupForPrimePause( void ) { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); signalDialOutPumpHardStop(); signalDialInPumpHardStop(); signalBloodPumpHardStop(); + stopSyringePump(); primePauseStartTime = getMSTimerCount(); previousPrimeState = currentPrimeState; @@ -490,6 +486,14 @@ } #endif +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + } + else +#endif + if ( TRUE == primeStartRequested ) { primeStartRequested = FALSE; @@ -569,7 +573,7 @@ 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 ) ) ) + ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_MAX_TIME_MS ) ) ) { // Pressure max reached. or timeout, release pressure setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); @@ -578,7 +582,7 @@ primeDialyzerBubbleClearState = PRIME_BUBBLE_CLEAR_VENT_STATE; } else if ( ( TRUE == bubble_clear_ended ) && - ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_VALVE_WAIT_TIME_MS ) ) ) + ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, BUBBLE_CLEAR_VALVE_WAIT_TIME_MS ) ) ) { setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_OPEN ); @@ -691,11 +695,6 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - if ( TRUE == hasDGCompletedReservoirSwitch() ) { U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); @@ -753,9 +752,9 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + // Draw dialysate from reservoir for fixed time (calculated in prior state), then start looking for reservoir volume to steady state (indicating we have primed the line) if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, primeDialysateDialyzerTimeLimit ) ) { - // check for volume steady state every second after the DVi and DVo pumps have been on for primeDialysateDialyzerTimeLimit seconds if ( TRUE == didTimeout( steadyVolumeSamplingStartTime, LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ) { F32 const currentReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); @@ -842,6 +841,7 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; + // Wait fixed time (based on calc done in prior state) and then move on to 2nd transfer check if ( TRUE == didTimeout( primeSalineDialyzerStartTime, primeSalineDialyzerTimeLimit ) ) { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; @@ -988,8 +988,7 @@ { state = HD_PRIME_COMPLETE; } - - if ( TRUE == doesAlarmStatusIndicateStop() ) + else if ( TRUE == doesAlarmStatusIndicateStop() ) { setupForPrimePause(); state = HD_PRIME_PAUSE; @@ -1016,6 +1015,10 @@ switch ( previousPrimeState ) { + case HD_PRIME_WAIT_FOR_USER_START_STATE: + state = HD_PRIME_WAIT_FOR_USER_START_STATE; + break; + case HD_PRIME_SALINE_SETUP_STATE: case HD_PRIME_SALINE_PURGE_AIR_STATE: case HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE: