IOB: fix calculation for EB

This commit is contained in:
Milos Kozak 2021-11-11 22:40:52 +01:00
parent 52e3432132
commit 8bac468306
4 changed files with 21 additions and 10 deletions

View file

@ -42,7 +42,6 @@ import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.Config; import info.nightscout.androidaps.interfaces.Config;
import info.nightscout.androidaps.interfaces.GlucoseUnit; import info.nightscout.androidaps.interfaces.GlucoseUnit;
import info.nightscout.androidaps.interfaces.IobCobCalculator; import info.nightscout.androidaps.interfaces.IobCobCalculator;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.Profile; import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.interfaces.ProfileFunction; import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;

View file

@ -537,7 +537,11 @@ class IobCobCalculatorPlugin @Inject constructor(
for (pos in extendedBoluses.indices) { for (pos in extendedBoluses.indices) {
val e = extendedBoluses[pos] val e = extendedBoluses[pos]
if (e.timestamp > toTime) continue if (e.timestamp > toTime) continue
if (e.end > now) e.duration = now - e.timestamp if (e.end > now) {
val newDuration = now - e.timestamp
e.amount *= newDuration.toDouble() / e.duration
e.duration = newDuration
}
val profile = profileFunction.getProfile(e.timestamp) ?: return total val profile = profileFunction.getProfile(e.timestamp) ?: return total
val calc = e.iobCalc(toTime, profile, activePlugin.activeInsulin) val calc = e.iobCalc(toTime, profile, activePlugin.activeInsulin)
total.plus(calc) total.plus(calc)
@ -632,7 +636,11 @@ class IobCobCalculatorPlugin @Inject constructor(
val e = extendedBoluses[pos] val e = extendedBoluses[pos]
if (e.timestamp > toTime) continue if (e.timestamp > toTime) continue
val profile = profileFunction.getProfile(e.timestamp) ?: continue val profile = profileFunction.getProfile(e.timestamp) ?: continue
if (e.end > now) e.duration = now - e.timestamp if (e.end > now) {
val newDuration = now - e.timestamp
e.amount *= newDuration.toDouble() / e.duration
e.duration = newDuration
}
val calc = e.iobCalc(toTime, profile, activePlugin.activeInsulin) val calc = e.iobCalc(toTime, profile, activePlugin.activeInsulin)
totalExt.plus(calc) totalExt.plus(calc)
} }
@ -667,7 +675,11 @@ class IobCobCalculatorPlugin @Inject constructor(
val e = extendedBoluses[pos] val e = extendedBoluses[pos]
if (e.timestamp > toTime) continue if (e.timestamp > toTime) continue
val profile = profileFunction.getProfile(e.timestamp) ?: continue val profile = profileFunction.getProfile(e.timestamp) ?: continue
if (e.end > now) e.duration = now - e.timestamp if (e.end > now) {
val newDuration = now - e.timestamp
e.amount *= newDuration.toDouble() / e.duration
e.duration = newDuration
}
val calc = e.iobCalc(toTime, profile, lastAutosensResult, exercise_mode, half_basal_exercise_target, isTempTarget, activePlugin.activeInsulin) val calc = e.iobCalc(toTime, profile, lastAutosensResult, exercise_mode, half_basal_exercise_target, isTempTarget, activePlugin.activeInsulin)
totalExt.plus(calc) totalExt.plus(calc)
} }

View file

@ -110,7 +110,7 @@ fun extendedBolusFromJson(jsonObject: JSONObject): ExtendedBolus? {
val pumpSerial = JsonHelper.safeGetStringAllowNull(jsonObject, "pumpSerial", null) val pumpSerial = JsonHelper.safeGetStringAllowNull(jsonObject, "pumpSerial", null)
if (timestamp == 0L) return null if (timestamp == 0L) return null
if (duration == 0L) return null if (duration == 0L && durationInMilliseconds == 0L) return null
if (amount == 0.0) return null if (amount == 0.0) return null
return ExtendedBolus( return ExtendedBolus(
@ -135,7 +135,7 @@ fun ExtendedBolus.iobCalc(time: Long, profile: Profile, insulinInterface: Insuli
val dia = profile.dia val dia = profile.dia
val diaAgo = time - dia * 60 * 60 * 1000 val diaAgo = time - dia * 60 * 60 * 1000
val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt() val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt()
val spacing = realDuration / aboutFiveMinIntervals val spacing = realDuration / aboutFiveMinIntervals.toDouble()
for (j in 0L until aboutFiveMinIntervals) { for (j in 0L until aboutFiveMinIntervals) {
// find middle of the interval // find middle of the interval
val calcDate = (timestamp + j * spacing * 60 * 1000 + 0.5 * spacing * 60 * 1000).toLong() val calcDate = (timestamp + j * spacing * 60 * 1000 + 0.5 * spacing * 60 * 1000).toLong()

View file

@ -134,14 +134,14 @@ fun TemporaryBasal.toStringShort(): String =
fun TemporaryBasal.iobCalc(time: Long, profile: Profile, insulinInterface: Insulin): IobTotal { fun TemporaryBasal.iobCalc(time: Long, profile: Profile, insulinInterface: Insulin): IobTotal {
val result = IobTotal(time) val result = IobTotal(time)
val realDuration: Int = getPassedDurationToTimeInMinutes(time) val realDuration = getPassedDurationToTimeInMinutes(time)
var netBasalAmount = 0.0 var netBasalAmount = 0.0
if (realDuration > 0) { if (realDuration > 0) {
var netBasalRate: Double var netBasalRate: Double
val dia = profile.dia val dia = profile.dia
val diaAgo = time - dia * 60 * 60 * 1000 val diaAgo = time - dia * 60 * 60 * 1000
val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt() val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt()
val tempBolusSpacing = (realDuration / aboutFiveMinIntervals).toDouble() val tempBolusSpacing = realDuration / aboutFiveMinIntervals.toDouble()
for (j in 0L until aboutFiveMinIntervals) { for (j in 0L until aboutFiveMinIntervals) {
// find middle of the interval // find middle of the interval
val calcDate = (timestamp + j * tempBolusSpacing * 60 * 1000 + 0.5 * tempBolusSpacing * 60 * 1000).toLong() val calcDate = (timestamp + j * tempBolusSpacing * 60 * 1000 + 0.5 * tempBolusSpacing * 60 * 1000).toLong()
@ -175,7 +175,7 @@ fun TemporaryBasal.iobCalc(time: Long, profile: Profile, insulinInterface: Insul
fun TemporaryBasal.iobCalc(time: Long, profile: Profile, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean, insulinInterface: Insulin): IobTotal { fun TemporaryBasal.iobCalc(time: Long, profile: Profile, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean, insulinInterface: Insulin): IobTotal {
val result = IobTotal(time) val result = IobTotal(time)
val realDuration: Double = getPassedDurationToTimeInMinutes(time).toDouble() val realDuration = getPassedDurationToTimeInMinutes(time)
var netBasalAmount = 0.0 var netBasalAmount = 0.0
var sensitivityRatio = lastAutosensResult.ratio var sensitivityRatio = lastAutosensResult.ratio
val normalTarget = 100.0 val normalTarget = 100.0
@ -190,7 +190,7 @@ fun TemporaryBasal.iobCalc(time: Long, profile: Profile, lastAutosensResult: Aut
val dia = profile.dia val dia = profile.dia
val diaAgo = time - dia * 60 * 60 * 1000 val diaAgo = time - dia * 60 * 60 * 1000
val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt() val aboutFiveMinIntervals = ceil(realDuration / 5.0).toInt()
val tempBolusSpacing = realDuration / aboutFiveMinIntervals val tempBolusSpacing = realDuration / aboutFiveMinIntervals.toDouble()
for (j in 0L until aboutFiveMinIntervals) { for (j in 0L until aboutFiveMinIntervals) {
// find middle of the interval // find middle of the interval
val calcDate = (timestamp + j * tempBolusSpacing * 60 * 1000 + 0.5 * tempBolusSpacing * 60 * 1000).toLong() val calcDate = (timestamp + j * tempBolusSpacing * 60 * 1000 + 0.5 * tempBolusSpacing * 60 * 1000).toLong()