Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r99ba9313f98289563f96a0972a0a4c11e61406f5 -rbc2fae568ba1114ad6ffbda671e2080c0f5c007b --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 99ba9313f98289563f96a0972a0a4c11e61406f5) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision bc2fae568ba1114ad6ffbda671e2080c0f5c007b) @@ -196,14 +196,6 @@ currentPrimeState = handlePrimeCircBloodCircuitState(); break; - case HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE: - currentPrimeState = handlePrimeReservoirOneFillCompleteState(); - break; - - case HD_PRIME_DIALYSATE_DIALYZER_STATE: - currentPrimeState = handlePrimeDialysateDialyzerState(); - break; - case HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE: currentPrimeState = handlePrimeReservoirTwoFillCompleteState(); break; @@ -212,6 +204,14 @@ currentPrimeState = handlePrimeDialysateBypassState(); break; + case HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE: + currentPrimeState = handlePrimeReservoirOneFillCompleteState(); + break; + + case HD_PRIME_DIALYSATE_DIALYZER_STATE: + currentPrimeState = handlePrimeDialysateDialyzerState(); + break; + case HD_PRIME_WET_SELF_TESTS_STATE: currentPrimeState = handlePrimeWetSelfTestsState(); break; @@ -461,7 +461,7 @@ if ( TRUE == didTimeout( primeSalineDialyzerStartTime, PRIME_SALINE_DIALYZER_TIME_LIMIT ) ) { // SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_SALINE_DIALYZER_TIME_OUT, PRIME_SALINE_DIALYZER_TIME_LIMIT ); TODO - // if timeout occurs, what state should we go to? + // if 5 minutes timeout occurs, what state should we go to? } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -564,7 +564,7 @@ if ( TRUE == didTimeout( noAirDetectedStartTime, NO_AIR_DETECTED_COUNT ) ) { signalBloodPumpHardStop(); - state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -578,40 +578,35 @@ /*********************************************************************//** * @brief - * The handlePrimeReservoirOneFillCompleteState function waits for DG to finish - * filling reservoir 1 before moving to priming dialyzer. + * The handlePrimeReservoirTwoFillCompleteState function waits for DG to finish + * filling reservoir 2 before moving to pre-treatment re-circulation. * @details Inputs: reservoirFilledStatus[] * @details Outputs: update valves and pumps configuration on state change * @return current state *************************************************************************/ -static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirTwoFillCompleteState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; - if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) + if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); if ( TRUE == hasDGCompletedReservoirSwitch() ) { - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); + signalDialOutPumpHardStop(); + setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - previousLoadCellReading = 0; + primeDialysateBypassStartTime = getMSTimerCount(); loadcellSteadyVolumeStartTime = getMSTimerCount(); - primeDialysateDialyzerStartTime = getMSTimerCount(); - - #ifdef SKIP_PRIMING - state = HD_PRIME_WET_SELF_TESTS_STATE; - #else - state = HD_PRIME_DIALYSATE_DIALYZER_STATE; - #endif + state = HD_PRIME_DIALYSATE_BYPASS_STATE; } } @@ -628,31 +623,23 @@ * @brief * The handlePrimeDialysateDialyzerState function handles priming for * dialysate dialyzer fluid path. - * @details Inputs: reservoir 1 filtered weight - * @details Outputs: primed dialysate dialyzer fluid path + * @details Inputs: reservoir 2 filtered weight + * @details Outputs: primed dialysate bypass fluid path * @return current state *************************************************************************/ -static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateBypassState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_DIALYZER_STATE; - - F32 const loadcellWeight = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); - + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_BYPASS_STATE; + F32 const loadcellWeight = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); F32 const weightChange = fabs( 1.0 - ( previousLoadCellReading / loadcellWeight ) ); if ( weightChange < LOAD_CELL_VOLUME_NOISE_TOLERANCE ) { if ( TRUE == didTimeout( loadcellSteadyVolumeStartTime, MIN_LOAD_CELL_STEADY_VOLUME_TIME ) ) { - if ( TRUE == runBloodCircuitPrimeAgain ) - { - runBloodCircuitPrimeAgain = FALSE; - state = HD_PRIME_SALINE_SETUP_STATE; - } - else - { - state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; - } + //transitionToWetSelfTests(); + //state = HD_PRIME_WET_SELF_TESTS_STATE; + state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; } } else @@ -661,9 +648,9 @@ loadcellSteadyVolumeStartTime = getMSTimerCount(); } - if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, PRIME_DIALYSATE_DIALYZER_TIME_LIMIT ) ) + if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT, PRIME_DIALYSATE_DIALYZER_TIME_LIMIT ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -677,35 +664,40 @@ /*********************************************************************//** * @brief - * The handlePrimeReservoirTwoFillCompleteState function waits for DG to finish - * filling reservoir 2 before moving to pre-treatment re-circulation. + * The handlePrimeReservoirOneFillCompleteState function waits for DG to finish + * filling reservoir 1 before moving to priming dialyzer. * @details Inputs: reservoirFilledStatus[] * @details Outputs: update valves and pumps configuration on state change * @return current state *************************************************************************/ -static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirTwoFillCompleteState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirOneFillCompleteState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; - if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) + if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); if ( TRUE == hasDGCompletedReservoirSwitch() ) { - signalDialOutPumpHardStop(); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setValvePosition( VDO, VALVE_POSITION_B_OPEN ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); + setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + previousLoadCellReading = 0; - primeDialysateBypassStartTime = getMSTimerCount(); loadcellSteadyVolumeStartTime = getMSTimerCount(); - state = HD_PRIME_DIALYSATE_BYPASS_STATE; + primeDialysateDialyzerStartTime = getMSTimerCount(); + + #ifdef SKIP_PRIMING + state = HD_PRIME_WET_SELF_TESTS_STATE; + #else + state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + #endif } } @@ -722,22 +714,33 @@ * @brief * The handlePrimeDialysateDialyzerState function handles priming for * dialysate dialyzer fluid path. - * @details Inputs: reservoir 2 filtered weight - * @details Outputs: primed dialysate bypass fluid path + * @details Inputs: reservoir 1 filtered weight + * @details Outputs: primed dialysate dialyzer fluid path * @return current state *************************************************************************/ -static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateBypassState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_BYPASS_STATE; - F32 const loadcellWeight = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + + F32 const loadcellWeight = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); + F32 const weightChange = fabs( 1.0 - ( previousLoadCellReading / loadcellWeight ) ); if ( weightChange < LOAD_CELL_VOLUME_NOISE_TOLERANCE ) { if ( TRUE == didTimeout( loadcellSteadyVolumeStartTime, MIN_LOAD_CELL_STEADY_VOLUME_TIME ) ) { - transitionToWetSelfTests(); - state = HD_PRIME_WET_SELF_TESTS_STATE; + if ( TRUE == runBloodCircuitPrimeAgain ) + { + runBloodCircuitPrimeAgain = FALSE; + state = HD_PRIME_SALINE_SETUP_STATE; + } + else + { + //state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; + transitionToWetSelfTests(); + state = HD_PRIME_WET_SELF_TESTS_STATE; + } } } else @@ -746,9 +749,9 @@ loadcellSteadyVolumeStartTime = getMSTimerCount(); } - if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ) ) + if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, PRIME_DIALYSATE_DIALYZER_TIME_LIMIT ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT, PRIME_DIALYSATE_DIALYZER_TIME_LIMIT ); } if ( TRUE == doesAlarmStatusIndicateStop() )