Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r8ba3f66e02a185630b4918ebd403fb11473f7aa6 -rb0afc167eb4b58bb1c916821e8d8ae4e7bc712c2 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8ba3f66e02a185630b4918ebd403fb11473f7aa6) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision b0afc167eb4b58bb1c916821e8d8ae4e7bc712c2) @@ -1286,14 +1286,16 @@ // Check if we are in treatment mode for settings change if ( MODE_TREA == currMode ) { - U32 dialVolume = dialRate * ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); // In mL + F32 dialVolumeSoFar = (F32)( getTreatmentAvgDialysateFlowRate() * ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) ) / (F32)( SEC_PER_MIN ); + F32 dialVolumeNowToEnd = (F32)( dialRate * CALC_TREAT_TIME_REMAINING_IN_SECS() ) / (F32)( SEC_PER_MIN ); + F32 dialVolume = dialVolumeSoFar + dialVolumeNowToEnd; // mL // Validate new rates if ( ( bloodRate >= getU32TreatmentParamLowerRangeLimit( TREATMENT_PARAM_BLOOD_FLOW ) ) && ( bloodRate <= getU32TreatmentParamUpperRangeLimit( TREATMENT_PARAM_BLOOD_FLOW ) ) && ( dialRate >= getU32TreatmentParamLowerRangeLimit( TREATMENT_PARAM_DIALYSATE_FLOW ) ) && ( dialRate <= getU32TreatmentParamUpperRangeLimit( TREATMENT_PARAM_DIALYSATE_FLOW ) ) && - ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) + ( dialVolume <= (F32)MAX_DIALYSATE_VOLUME_ML ) ) { result = TRUE; // handle blood pump flow rate change @@ -1497,25 +1499,28 @@ { if ( ++treatmentParamsRangesBroadcastTimerCtr >= getU32OverrideValue( &treatmentParamRangesPublishInterval ) ) { + // Compute values need to assess max dialysate rate with respect to 150L limit. + F32 dialVolumeSoFar = (F32)( getTreatmentAvgDialysateFlowRate() * ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) ) / (F32)( SEC_PER_MIN ); + F32 maxQd = ( (F32)MAX_DIALYSATE_VOLUME_ML - dialVolumeSoFar ) / ( (F32)CALC_TREAT_TIME_REMAINING_IN_SECS() / (F32)SEC_PER_MIN ); // Compute minimum treatment duration U32 presTime = ( presTreatmentTimeSecs / SEC_PER_MIN ); U32 elapseTime = CALC_ELAPSED_TREAT_TIME_IN_MIN(); U32 minTime = MAX( (elapseTime + 2), getMinTreatmentTimeInMinutes() ); // Treatment duration cannot be < 1 hour. add two minutes to cover rounding and ensure it is valid for next minute // Compute maximum treatment duration (from both UF and dialysate volume perspectives) - U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationReferenceVolume() ) / ( presUFRate > 0.0 ? (U32)presUFRate : 1 ); + U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationReferenceVolume() ) / ( presUFRate > 0.0F ? (U32)presUFRate : 1 ); U32 maxTime1 = minTime + maxTimeRem; U32 maxTime2 = MAX_DIALYSATE_VOLUME_ML / getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); U32 maxTime = MAX( maxTime1, maxTime2 ); // Compute minimum UF volume F32 minUFVol = getUltrafiltrationReferenceVolume() + presUFRate; // Compute maximum UF volume (considering from adjustment of UF rate and time perspectives) F32 maxUFVol1 = minUFVol + ( (F32)( presTime - elapseTime ) * MAX_UF_RATE_ML_MIN ); - F32 maxUFVol2 = ( presUFRate > 0.0 ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRate ) : minUFVol ); + F32 maxUFVol2 = ( presUFRate > 0.0F ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRate ) : minUFVol ); F32 maxUFVol = MAX( maxUFVol1, maxUFVol2 ); // Compute minimum dialysate flow rate U32 minDialRate = MIN_DIAL_IN_FLOW_RATE; // Compute maximum dialysate flow rate from max dialysate volume perspective - U32 maxDialRate = MAX_DIALYSATE_VOLUME_ML / presTime; + U32 maxDialRate = ( maxQd > (F32)MIN_DIAL_IN_FLOW_RATE ? (U32)((S32)maxQd) : minDialRate ); // Now ensure maximums do not exceed the literal maximums maxTime = MIN( maxTime, MAX_TREATMENT_TIME_MINUTES ); @@ -1545,17 +1550,20 @@ F32 const arterialPres = getFilteredArterialPressure(); F32 const venousPres = getFilteredVenousPressure(); + if ( ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) && ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) ) + { + treatmentBloodFlowRateTotal_mL_min += getMeasuredBloodFlowRate(); + treatmentDialysateFlowRateTotal_mL_min += getMeasuredDialInFlowRate(); + treatmentDialysateTempTotal_degree_C += getDialysateTemperature(); + treatmentArterialPressureTotal_mmHg += arterialPres; + treatmentVenousPressureTotal_mmHg += venousPres; + } + lastTreatmentPeriodicDataCollectTimeStamp = treatmentTimeMS; bloodFlowRateSum_mL_min += getMeasuredBloodFlowRate(); dialysateFlowRateSum_mL_min += getMeasuredDialInFlowRate(); arterialPressureSum_mmHg += arterialPres; venousPressureSum_mmHg += venousPres; - - treatmentBloodFlowRateTotal_mL_min += getMeasuredBloodFlowRate(); - treatmentDialysateFlowRateTotal_mL_min += getMeasuredDialInFlowRate(); - treatmentDialysateTempTotal_degree_C += getDialysateTemperature(); - treatmentArterialPressureTotal_mmHg += arterialPres; - treatmentVenousPressureTotal_mmHg += venousPres; } if ( ( timeElapsedSinceLastPublish_ms >= TREATMENT_PERIODIC_DATA_PUB_INTERVAL ) || ( TRUE == sendLastTreatmentPeriodicData ) )