Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r8436bb33a488e4471ad8c9d66bdbfcf50589f25b -r0088dea98304e1b8790cc842b6a92154169b9982 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8436bb33a488e4471ad8c9d66bdbfcf50589f25b) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 0088dea98304e1b8790cc842b6a92154169b9982) @@ -1499,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 );