Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r24e36c236babfb412d8bbea7485de24f025bb500 -r0047fb79ccb021d606e06bc6da70fd710e05169e --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 24e36c236babfb412d8bbea7485de24f025bb500) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 0047fb79ccb021d606e06bc6da70fd710e05169e) @@ -49,16 +49,14 @@ #define DIALYSATE_DIALYZER_BYPASS_TUBE_VOLUME_ML 75 ///< This volume is used to calculate the DPi pump time out in the dialyzer bypass state #define DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN 300 ///< Dialysate pump flow rate during priming fluid path. -#define LOAD_CELL_VOLUME_NOISE_TOLERANCE 5.00 ///< Allow 5 mL tolerance on load cell readings. +#define DIALYZER_DVI_PATH_VOLUME_ML 17 ///< Path volume from the dialyzer to the VDI valve in mL. #define NO_AIR_DETECTED_COUNT ( 20 * MS_PER_SECOND ) ///< No air detected time period count. #define PURGE_AIR_TIME_OUT_COUNT ( 60 * MS_PER_SECOND ) ///< Time period count for purge air time out. #define LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ( 1 * MS_PER_SECOND ) ///< Time load cell reading steady state detection sampling time in seconds. -//#define PRIME_DIALYSATE_DIALYZER_TIME_LIMIT ( 120 * MS_PER_SECOND ) ///< Time limit for priming dialysate dialyzer circuit. #define PRIME_DIALYSATE_BYPASS_TIME_LIMIT ( 15 * MS_PER_SECOND ) ///< Time limit for priming dialysate bypass circuit. -#define PRIME_SALINE_DIALYZER_BLOOD_VOLUME_ML 120 ///< The volume of the blood channel in mL. -#define PRIME_SALINE_DIALYZER_TIME_SEC ( ( PRIME_SALINE_DIALYZER_BLOOD_VOLUME_ML * SEC_PER_MIN ) / BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN ) ///< Time for priming saline dialyzer path. -#define PRIME_SALINE_DIALYZER_TIME_LIMIT ( PRIME_SALINE_DIALYZER_TIME_SEC * MS_PER_SECOND ) ///< Time limit for priming saline dialyzer path. +#define STEADY_VOLUME_COUNT_SEC 10 ///< Counter must be greater than 10 before steady volume is true. +#define STEADY_VOLUME_TIME_DEADLINE_MS ( 55 * MS_PER_SECOND ) ///< Time in msec for the steady volume deadline time out. /// States of the treatment reservoir management state machine. typedef enum PrimeReservoirMgmt_States @@ -88,7 +86,8 @@ { 87, 233 }, { 102, 280 } }; -static U32 primeDialysateDialyzerTimeLimit; ///< Time limit for priming dialysate dialyzer path. +static U32 primeDialysateDialyzerTimeLimit; ///< Time limit in msec for priming dialysate dialyzer path. +static U32 primeSalineDialyzerTimeLimit; ///< Time limit in msec for priming saline dialyzer path. 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. @@ -560,7 +559,7 @@ if ( TRUE == hasDGCompletedReservoirSwitch() ) { - U32 dialyzerDialysateVolume; + U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); @@ -572,9 +571,8 @@ 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 ); - 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 ) * MS_PER_SECOND; + primeDialysateDialyzerTimeLimit = (U32)( ( ( DIALYSATE_DIALYZER_TUBE_VOLUME_ML + dialyzerDialysateVolume ) * SEC_PER_MIN * MS_PER_SECOND ) / DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN ); minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); steadyVolumeCount = 0; steadyVolumeSamplingStartTime = getMSTimerCount(); @@ -618,7 +616,7 @@ if ( currentReservoirVolume >= minimumReservoirVolume ) { - if ( ++steadyVolumeCount >= 10 ) + if ( ++steadyVolumeCount >= STEADY_VOLUME_COUNT_SEC ) { #ifdef RUN_BLOOD_CIRCUIT_PRIME_AGAIN if ( TRUE == runBloodCircuitPrimeAgain ) @@ -649,7 +647,7 @@ steadyVolumeSamplingStartTime = getMSTimerCount(); } - if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, primeDialysateDialyzerTimeLimit + 55 * MS_PER_SECOND ) ) + if ( TRUE == didTimeout( primeDialysateDialyzerStartTime, primeDialysateDialyzerTimeLimit + STEADY_VOLUME_TIME_DEADLINE_MS ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT, primeDialysateDialyzerTimeLimit ); } @@ -674,6 +672,7 @@ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerSetupState( void ) { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; + U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); @@ -684,6 +683,8 @@ signalDialOutPumpHardStop(); signalDialInPumpHardStop(); setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + + primeSalineDialyzerTimeLimit = (U32)( ( ( dialyzerDialysateVolume * 0.5 + DIALYZER_DVI_PATH_VOLUME_ML ) * SEC_PER_MIN * MS_PER_SECOND ) / BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN ); primeSalineDialyzerStartTime = getMSTimerCount(); if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -707,7 +708,7 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; - if ( TRUE == didTimeout( primeSalineDialyzerStartTime, PRIME_SALINE_DIALYZER_TIME_LIMIT ) ) + if ( TRUE == didTimeout( primeSalineDialyzerStartTime, primeSalineDialyzerTimeLimit ) ) { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; } @@ -786,7 +787,7 @@ if ( currentReservoirVolume >= minimumReservoirVolume ) { - if ( ++steadyVolumeCount >= 10 ) + if ( ++steadyVolumeCount >= STEADY_VOLUME_COUNT_SEC ) { transitionToWetSelfTests(); state = HD_PRIME_WET_SELF_TESTS_STATE; @@ -806,7 +807,7 @@ steadyVolumeSamplingStartTime = getMSTimerCount(); } - if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT + 55 * MS_PER_SECOND ) ) // allocate 55 seconds for the steady state logic to do its job before timing out + if ( TRUE == didTimeout( primeDialysateBypassStartTime, PRIME_DIALYSATE_BYPASS_TIME_LIMIT + STEADY_VOLUME_TIME_DEADLINE_MS ) ) // allocate 55 seconds for the steady state logic to do its job before timing out { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT, PRIME_DIALYSATE_BYPASS_TIME_LIMIT ); }