Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rd33b56765d3eeb3853eb84697d05c8a91441e00f -re2a7289fade72dfc5426629eeb288395d894b3ec --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision d33b56765d3eeb3853eb84697d05c8a91441e00f) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision e2a7289fade72dfc5426629eeb288395d894b3ec) @@ -94,6 +94,7 @@ static U32 previousDialysateFlowMLP; ///< Previous dialysate flow rate in mL/min. static F32 previousUFFlowMLP; ///< Previous ultrafiltration flow rate in mL/min. static DG_MIXING_RATIOS_T ratios; ///< Mixing ratios and fill prep time in milliseconds structure. +static U32 prevTargetFillVolumeML; ///< Previous target fill volume in milliliters. static const F32 RESERVOIR_DILUTION_RATIO = MAX_RESERVOIR_DILUTION / ( 1.0 - MAX_RESERVOIR_DILUTION ); ///< Reservoir dilution ratio. @@ -125,7 +126,7 @@ * volSpentMl, reservoirsPublicationCounter, dilutionLevelPct, dgOpMode, dgSubMode, * timeReservoirInUse, volSpentUFML, activeReservoir, recirculationLevelPct, * reservoirSwitchStartTimeMS, timeWaitToFillMS, targetFillFlowLPM, ratios - * previousDialysateFlowRate + * previousDialysateFlowRate, prevTargetFillVolumeML * @return none *************************************************************************/ void initReservoirs( void ) @@ -153,6 +154,7 @@ ratios.acidMixingRatio = 0.0F; ratios.bicarbMixingRatio = 0.0F; ratios.timeFillPrepMS = 0; + prevTargetFillVolumeML = 0; } /*********************************************************************//** @@ -196,7 +198,7 @@ volSpentML += ( flowRateMLPerMS * msSinceLastVolumeCalc ); timeReservoirInUse++; // Check the recirculation level - recirculationLevelPct = volSpentML / (F32)getTargetFillVolumeBasedOnDialysateFlowML(); + recirculationLevelPct = volSpentML / (F32)prevTargetFillVolumeML; } // Update the reservoir start time @@ -336,21 +338,21 @@ static void calculateActiveReservoirCycleTime( void ) { U32 dialysateFlowMLP = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - F32 fillTimeMS = ( (F32)getTargetFillVolumeBasedOnDialysateFlowML() / ( getTargetFillFlowRateLPM() * ML_PER_LITER ) ) * SEC_PER_MIN * MS_PER_SECOND; + F32 fillTimeMS = ( (F32)prevTargetFillVolumeML / ( getTargetFillFlowRateLPM() * ML_PER_LITER ) ) * SEC_PER_MIN * MS_PER_SECOND; F32 targetUFFlowMLP = getCurrentUFSetRate(); - F32 timeDepletionMS = ( (F32)getTargetFillVolumeBasedOnDialysateFlowML() / dialysateFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; + F32 timeDepletionMS = ( (F32)prevTargetFillVolumeML / dialysateFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; F32 timeTotalCycleMS = fillTimeMS + RESERVOIR_FRESH_SETTLE_TIME_MS + RESERVOIR_CYCLE_EXTRA_MARGIN_TIME_MS + ratios.timeFillPrepMS; F32 timeReservoirCycleMS = 0.0F; F32 timeUFDepletionMS = NEARLY_INFINITY; - F32 volFreshML = getTargetFillVolumeBasedOnDialysateFlowML() - volSpentML; + F32 volFreshML = prevTargetFillVolumeML - volSpentML; F32 timeFreshRemainingMS = ( volFreshML / (F32)dialysateFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; - F32 volMaxUFML = getTargetFillVolumeBasedOnDialysateFlowML() * MAX_RESERVOIR_DILUTION; + F32 volMaxUFML = prevTargetFillVolumeML * MAX_RESERVOIR_DILUTION; // Check if target UF flow is not zero to consider it in the calculations too if ( targetUFFlowMLP > NEARLY_ZERO ) { // If UF is not 0, the active reservoir cycle time is minimum of UF depletion and fill time - timeUFDepletionMS = ( ( (F32)getTargetFillVolumeBasedOnDialysateFlowML() * RESERVOIR_DILUTION_RATIO ) / targetUFFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; + timeUFDepletionMS = ( ( (F32)prevTargetFillVolumeML * RESERVOIR_DILUTION_RATIO ) / targetUFFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; // Calculate the ultra-filtration remaining volume // Using the ultra-filtration remaining volume and the ultra-filtration target flow rate calculate the time // The depletion time in milliseconds is the minimum time of the fresh remaining time and the depletion remaining time @@ -529,15 +531,17 @@ { if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) { - cmdStartDGFill( getTargetFillVolumeBasedOnDialysateFlowML(), targetFillFlowRateLPM ); + prevTargetFillVolumeML = getTargetFillVolumeBasedOnDialysateFlowML(); + cmdStartDGFill( prevTargetFillVolumeML, targetFillFlowRateLPM ); } } // If we have active dialysate temp alarms, we want to fill immediately. else if ( TRUE == isDialysateTempAlarmActive() ) { if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) { - cmdStartDGFill( getTargetFillVolumeBasedOnDialysateFlowML(), targetFillFlowRateLPM ); + prevTargetFillVolumeML = getTargetFillVolumeBasedOnDialysateFlowML(); + cmdStartDGFill( prevTargetFillVolumeML, targetFillFlowRateLPM ); } } else @@ -550,7 +554,8 @@ // If the wait time has elapsed, trigger a fill command if ( timeWaitToFillMS <= 0 ) { - cmdStartDGFill( getTargetFillVolumeBasedOnDialysateFlowML(), targetFillFlowRateLPM ); + prevTargetFillVolumeML = getTargetFillVolumeBasedOnDialysateFlowML(); + cmdStartDGFill( prevTargetFillVolumeML, targetFillFlowRateLPM ); } }