Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rade19b8aa4c3b60cdda4028871ef009b01368948 -rfb4b4a4f9d16742bfb76f62970a43c97e1ac14f0 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision ade19b8aa4c3b60cdda4028871ef009b01368948) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision fb4b4a4f9d16742bfb76f62970a43c97e1ac14f0) @@ -682,20 +682,29 @@ { if ( ++treatmentParamsRangesBroadcastTimerCtr >= TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ) { + // compute minimum treatment duration U32 minTime = CALC_ELAPSED_TREAT_TIME_IN_MIN() + 2; // add two minutes to cover rounding and ensure it's valid for next minute - U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationVolumeCollected() ) / MAX_UF_RATE_ML_MIN; + // compute maximum treatment duration (from both UF and dialysate volume perspectives) + U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationVolumeCollected() ) / ( presUFRate > 0.0 ? (U32)presUFRate : 1 ); U32 maxTime1 = minTime + maxTimeRem; U32 maxTime2 = MAX_DIALYSATE_VOLUME_ML / presDialysateFlowRate; U32 maxTime = MIN( maxTime1, maxTime2 ); - U32 minUFVol = (U32)(getUltrafiltrationVolumeCollected() + 1); - U32 maxUFVol = presUFRate * ( presTreatmentTimeSecs / SEC_PER_MIN ); + // compute minimum UF volume + U32 minUFVol = (U32)(getUltrafiltrationVolumeCollected()); + // compute maximum UF volume (considering from adjustment of treatment duration or UF rate perspectives) + U32 maxUFVol1 = minUFVol + ( ( CALC_TREAT_TIME_REMAINING_IN_SECS() / SEC_PER_MIN ) * MAX_UF_RATE_ML_MIN ); + U32 maxUFVol2 = ( presUFRate > 0 ? minUFVol + (U32)( ( MAX_TREATMENT_TIME_MINUTES - CALC_ELAPSED_TREAT_TIME_IN_MIN() - 1 ) * presUFRate ) : MAX_UF_VOLUME_ML ); + U32 maxUFVol = MIN( 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 / ( presTreatmentTimeSecs / SEC_PER_MIN ); + // now ensure maximums do not exceed the literal maximums maxTime = MIN( maxTime, MAX_TREATMENT_TIME_MINUTES ); maxUFVol = MIN( maxUFVol, MAX_UF_VOLUME_ML ); maxDialRate = MIN( maxDialRate, MAX_DIAL_IN_FLOW_RATE ); - // send ranges to UI + // send updated treatment parameter ranges to UI sendTreatmentParamsRangesToUI( minTime, maxTime, minUFVol, maxUFVol, minDialRate, maxDialRate ); treatmentParamsRangesBroadcastTimerCtr = 0; }