Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -ra51419e487a62eac8bce5f5e2a6c366b11e9e11e -r4ac6a67ab2876d1f436704fe67a958e17d0b432a --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision a51419e487a62eac8bce5f5e2a6c366b11e9e11e) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) @@ -94,7 +94,7 @@ bloodPrimeRampControlTimerCtr = 0; bloodPrimePublishTimerCtr = 0; cumulativeBloodPrimeVolume_mL = 0.0; - bloodPrimeMotorCount = getBloodPumpMotorCount(); + bloodPrimeMotorCount = 0; bloodPrimeLastMotorCount = getBloodPumpMotorCount(); bloodPrimeVolumeDelivered_Safety = 0.0; resetBloodPrimeFlags(); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rf4199248340b66e66abbe99599d5d30ce980ea5f -r4ac6a67ab2876d1f436704fe67a958e17d0b432a --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) @@ -40,8 +40,6 @@ // ********** private definitions ********** #define MAX_UF_RATE_ML_PER_HOUR 2750.0 ///< Maximum ultrafiltration rate in mL/hour -#define MAX_UF_RATE_ACCURACY_ERROR_ML_HR 100.0 ///< Maximum ultrafiltration rate accuracy error in mL/hr over each hour of treatment. -#define MAX_UF_RATE_ACCURACY_ERROR_PCT 0.05 ///< Minimum ultrafilteration rate accuracy in percentage of set point (5%) over each hour of treatment. #define MAX_UF_ACCURACY_ERROR_ML 250.0 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. /// Saline bolus data broadcast interval (ms/task time) count. #define SALINE_BOLUS_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) @@ -72,7 +70,6 @@ static U32 setDialysateFlowRate; ///< Currently set dialysate flow rate (from prescription). static F32 maxUFVolumeML; ///< Currently set total ultrafiltration volume for treatment (from prescription). static F32 setUFRate; ///< Currently set ultrafiltration rate (from prescription). -static F32 maxUFRateAccuracyError_Ml_hr; ///< Minimum ultrafiltration rate accuracy over 1 hour duration (5% or 100 mL, whichever is greater). static U32 salineBolusBroadcastTimerCtr; ///< Saline bolus data broadcast timer counter used to schedule when to transmit data. static BOOL salineBolusStartRequested; ///< Flag indicates a saline bolus start has been requested by user. @@ -137,7 +134,6 @@ setDialysateFlowRate = 0; maxUFVolumeML = 0.0; setUFRate = 0.0; - maxUFRateAccuracyError_Ml_hr = MAX_UF_RATE_ACCURACY_ERROR_ML_HR; salineBolusBroadcastTimerCtr = 0; totalSalineVolumeDelivered = 0.0; @@ -234,8 +230,6 @@ setDialysateFlowRate = dPFlow; maxUFVolumeML = maxUFVol; setUFRate = uFRate; - maxUFRateAccuracyError_Ml_hr = MAX_UF_RATE_ACCURACY_ERROR_PCT * uFRate * (F32)MIN_PER_HOUR; - maxUFRateAccuracyError_Ml_hr = MAX( maxUFRateAccuracyError_Ml_hr, MAX_UF_RATE_ACCURACY_ERROR_ML_HR ); if ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) { @@ -1058,22 +1052,19 @@ { F32 uFMeasRate = measUFVolume - lastUFVolumeChecked; // Volumes are at start/end of 1 hour period, so implied rate is per hour - // Check UF rate diff from target in last hour - if ( uFMeasRate > maxUFRateAccuracyError_Ml_hr ) + // Check UF rate over last hour + if ( uFMeasRate > MAX_UF_RATE_ML_PER_HOUR ) { #ifndef DISABLE_UF_ALARMS SET_ALARM_WITH_1_F32_DATA( ALARM_ID_UF_RATE_TOO_HIGH_ERROR, uFMeasRate ); #endif } - // If actively performing ultrafiltration right now, increment timer and see if time to start another 1 hour check period - if ( UF_RUNNING_STATE == currentUFState ) + // Increment timer and see if time to start another 1 hour check period + if ( ++uFAccuracyCheckTimerCtr >= UF_ACCURACY_CHECK_INTERVAL ) { - if ( ++uFAccuracyCheckTimerCtr >= UF_ACCURACY_CHECK_INTERVAL ) - { - // Reset for next check interval - lastUFVolumeChecked = measUFVolume; - uFAccuracyCheckTimerCtr = 0; - } + // Reset for next check interval + lastUFVolumeChecked = measUFVolume; + uFAccuracyCheckTimerCtr = 0; } // Check total UF volume error Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc -r4ac6a67ab2876d1f436704fe67a958e17d0b432a --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) @@ -431,8 +431,7 @@ broadcastTreatmentTimeAndState(); broadcastTreatmentSettingsRanges(); - // Call various execs for treatment mode - execTreatmentReservoirMgmt(); + // Manage air trap control execAirTrapMonitorTreatment(); return currentTreatmentState; @@ -493,6 +492,7 @@ // Handle signals from blood prime sub-mode if ( TRUE == bloodPrimeToDialysisRequest ) { + lastTreatmentTimeStamp = getMSTimerCount(); // Kick dialysis sub-mode off setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); transitionToDialysis(); @@ -546,6 +546,7 @@ // Otherwise, execute state machine for treatment dialysis sub-mode else { + execTreatmentReservoirMgmt(); execDialysis(); } } Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc -r4ac6a67ab2876d1f436704fe67a958e17d0b432a --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) @@ -125,7 +125,7 @@ rinsebackTimerCtr = 0; cumulativeRinsebackVolume_mL = 0.0; additionalRinsebackVolume_mL = 0.0; - rinsebackMotorCount = getBloodPumpMotorCount(); + rinsebackMotorCount = 0; rinsebackLastMotorCount = getBloodPumpMotorCount(); rinsebackVolumeDelivered_Safety = 0.0; rinsebackAdditionalTimerCtr = 0; @@ -303,6 +303,7 @@ // Has user requested rinseback start? if ( TRUE == startRinsebackRequested ) { + rinsebackLastMotorCount = getBloodPumpMotorCount(); setupForRinsebackDelivery( rinsebackRate_mL_min ); // From moment we start rinseback, we consider blood side of dialyzer no longer fully primed setBloodIsPrimed( FALSE ); @@ -364,11 +365,13 @@ setRinsebackIsCompleted( TRUE ); setupForRinsebackStopOrPause(); result = RINSEBACK_STOP_STATE; +#ifndef DISABLE_PUMP_FLOW_CHECKS // Check for under-delivery if ( rinsebackVolumeDelivered_Safety < MIN_RINSEBACK_SAFETY_VOLUME_ML ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, rinsebackVolumeDelivered_Safety ); } +#endif } // Check for empty saline bag if ( TRUE == isSalineBagEmpty() ) @@ -383,6 +386,7 @@ setupForRinsebackStopOrPause(); result = RINSEBACK_PAUSED_STATE; } +#ifndef DISABLE_PUMP_FLOW_CHECKS // Has independent safety volume exceeded safety limit? else if ( rinsebackVolumeDelivered_Safety > MAX_RINSEBACK_SAFETY_VOLUME_ML ) { @@ -391,6 +395,7 @@ SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, rinsebackVolumeDelivered_Safety ); result = RINSEBACK_STOP_STATE; } +#endif // Otherwise, continue rinseback else { // Has user requested rate change?