Index: firmware/App/HDCommon.h =================================================================== diff -u -r9fc107ffe0ed515acf970426ff467abd8e7247a8 -r645a316a9cda57a4d7561080add53dd12bbe4770 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 9fc107ffe0ed515acf970426ff467abd8e7247a8) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 645a316a9cda57a4d7561080add53dd12bbe4770) @@ -84,7 +84,7 @@ #define SKIP_SAMPLE_WATER 1 // Skip pre-treatment sample water #define SKIP_CONSUMABLE_TESTS 1 // Skip pre-treatment consumable Self-tests #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests - #define RUN_BLOOD_CIRCUIT_PRIME_AGAIN 1 // If this is 1st time priming, run blood circuit prime again + // #define RUN_BLOOD_CIRCUIT_PRIME_AGAIN 1 // If this is 1st time priming, run blood circuit prime again // #define SKIP_PRIMING 1 // Skip Pre-treatment Prime // #define SKIP_WET_SELF_TESTS 1 // Skip Pre-treatment prime wet self-tests Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r8c93220d5ff830eeb95d683f67c5bc9a988bf315 -r645a316a9cda57a4d7561080add53dd12bbe4770 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 8c93220d5ff830eeb95d683f67c5bc9a988bf315) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 645a316a9cda57a4d7561080add53dd12bbe4770) @@ -106,9 +106,8 @@ static U32 primeSalineDialyzerStartTime; ///< Starting time of priming saline dialyzer circuit. static U32 primeDialysateDialyzerStartTime; ///< Starting time of priming dialysate dialyzer circuit. static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. -static U32 loadcellSteadyVolumeStartTime; ///< Load cell steady volume starting time. +static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. static BOOL runBloodCircuitPrimeAgain; ///< Flag indicates HD should run blood circuit prime once more time. -static F32 previousReservoirVolume; ///< Use to calculate the delta volume in steady state detection. static F32 minimumReservoirVolume; ///< Minimum reservoir volume in mL. static U32 steadyVolumeCount; ///< Use to keep track the number of dVolume/dt < Threshold @@ -117,7 +116,6 @@ static void resetPrimeFlags(); static void setupForPrimePause( void ); static void broadcastPrimingStatus( void ); -static void purgeAirDialyzerBloodPumpControl( void ); static void purgeAirValvesBloodPumpControl( void ); static F32 getDialyzerBloodVolume( void ); static F32 getDialyzerDialysateVolume( void ); @@ -415,27 +413,6 @@ /*********************************************************************//** * @brief - * The purgeAirDialyzerBloodPumpControl function controls valves and blood pump - * to purge air by priming the saline dialyzer fluid path. - * @details Inputs: none - * @details Outputs: run blood pump, close VDI, VDO, VBA and VBV valves, open VBT valve - * @return current state (sub-mode) - *************************************************************************/ -static void purgeAirDialyzerBloodPumpControl( void ) -{ - setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_CLOSED ); - - signalDialOutPumpHardStop(); - signalDialInPumpHardStop(); - setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -} - -/*********************************************************************//** - * @brief * The handlePrimeSalineSetupState function checks user's request to start * priming. * @details Inputs: primeStartReqReceived @@ -583,6 +560,8 @@ if ( TRUE == hasDGCompletedReservoirSwitch() ) { + U32 dialyzerDialysateVolume; + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); @@ -593,12 +572,12 @@ 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 ); - U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); + dialyzerDialysateVolume = getDialyzerDialysateVolume(); // Calculate the time out value that must passed prior to checking for the steady state volume in the reservoir primeDialysateDialyzerTimeLimit = (U32)( ( ( DIALYSATE_DIALYZER_TUBE_VOLUME_ML + dialyzerDialysateVolume ) * 60 ) / DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN ); - previousReservoirVolume = 0.0; + minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); steadyVolumeCount = 0; - loadcellSteadyVolumeStartTime = getMSTimerCount(); + steadyVolumeSamplingStartTime = getMSTimerCount(); primeDialysateDialyzerStartTime = getMSTimerCount(); #ifdef SKIP_PRIMING @@ -633,13 +612,11 @@ 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( loadcellSteadyVolumeStartTime, LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ) + if ( TRUE == didTimeout( steadyVolumeSamplingStartTime, LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ) { F32 const currentReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); - F32 const deltaVolume = fabs( currentReservoirVolume - previousReservoirVolume ); - previousReservoirVolume = currentReservoirVolume; - if ( deltaVolume < LOAD_CELL_VOLUME_NOISE_TOLERANCE ) + if ( currentReservoirVolume >= minimumReservoirVolume ) { if ( ++steadyVolumeCount >= 10 ) { @@ -660,15 +637,16 @@ } else { + minimumReservoirVolume = currentReservoirVolume; steadyVolumeCount = 0; // required 10 seconds continuous steady volume to transition to next state } - loadcellSteadyVolumeStartTime = getMSTimerCount(); // re-armed the timer for the next dVolume/dt check + steadyVolumeSamplingStartTime = getMSTimerCount(); // re-armed the timer for the next dVolume/dt check } } else { - loadcellSteadyVolumeStartTime = getMSTimerCount(); + steadyVolumeSamplingStartTime = getMSTimerCount(); } if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, primeDialysateDialyzerTimeLimit + 55 ) ) @@ -697,8 +675,16 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_CLOSED ); + + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); primeSalineDialyzerStartTime = getMSTimerCount(); - purgeAirDialyzerBloodPumpControl(); if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -762,11 +748,10 @@ setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); - //previousReservoirVolume = 0.0; minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); steadyVolumeCount = 0; primeDialysateBypassStartTime = getMSTimerCount(); - loadcellSteadyVolumeStartTime = getMSTimerCount(); + steadyVolumeSamplingStartTime = getMSTimerCount(); state = HD_PRIME_DIALYSATE_BYPASS_STATE; } } @@ -795,13 +780,11 @@ if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ) ) { // check for steady volume every second after the DVi pump has been on for PRIME_DIALYSATE_BYPASS_TIME_LIMIT seconds - if ( TRUE == didTimeout( loadcellSteadyVolumeStartTime, LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ) + if ( TRUE == didTimeout( steadyVolumeSamplingStartTime, LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ) { F32 const currentReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); - // F32 const deltaVolume = fabs( currentReservoirVolume - previousRevervoirVolume ); - // previousRevervoirVolume = currentReservoirVolume; - if ( currentReservoirVolume > minimumReservoirVolume ) // this may not work!!! + if ( currentReservoirVolume >= minimumReservoirVolume ) { if ( ++steadyVolumeCount >= 10 ) { @@ -815,25 +798,12 @@ steadyVolumeCount = 0; } - loadcellSteadyVolumeStartTime = getMSTimerCount(); // re-armed the timer for the next 1 second iteration - - /* if ( deltaVolume < LOAD_CELL_VOLUME_NOISE_TOLERANCE ) - { - if ( ++steadyVolumeCount >= 10 ) - { - transitionToWetSelfTests(); - state = HD_PRIME_WET_SELF_TESTS_STATE; - } - } - else - { - steadyVolumeCount = 0; // required 10 seconds continuous steady volume to transition to next state - } */ + steadyVolumeSamplingStartTime = getMSTimerCount(); // re-armed the timer for the next 1 second iteration } } else { - loadcellSteadyVolumeStartTime = getMSTimerCount(); + steadyVolumeSamplingStartTime = getMSTimerCount(); } if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT + 55 ) ) // allocate 55 seconds for the steady state logic to do its job before timing out