diff --git a/core/objects/src/main/kotlin/app/aaps/core/objects/aps/DetermineBasalResult.kt b/core/objects/src/main/kotlin/app/aaps/core/objects/aps/DetermineBasalResult.kt
index 58ac79fd5af..77c541fd550 100644
--- a/core/objects/src/main/kotlin/app/aaps/core/objects/aps/DetermineBasalResult.kt
+++ b/core/objects/src/main/kotlin/app/aaps/core/objects/aps/DetermineBasalResult.kt
@@ -108,7 +108,7 @@ class DetermineBasalResult @Inject constructor(val injector: HasAndroidInjector)
targetBG = result.targetBG ?: 0.0
deliverAt = result.deliverAt ?: 0L
variableSens = result.variable_sens
- scriptDebug = result.consoleError
+ scriptDebug = result.consoleLog
}
override val carbsRequiredText: String
diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/OpenAPSFragment.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/OpenAPSFragment.kt
index f7fe7035844..b42296c46ff 100644
--- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/OpenAPSFragment.kt
+++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/OpenAPSFragment.kt
@@ -1,10 +1,13 @@
package app.aaps.plugins.aps
import android.annotation.SuppressLint
+import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.os.HandlerThread
+import android.text.SpannableStringBuilder
import android.text.Spanned
+import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
@@ -136,7 +139,7 @@ class OpenAPSFragment : DaggerFragment(), MenuProvider {
binding.iobdata.text = rh.gs(R.string.array_of_elements, lastAPSResult.iobData?.size) + "\n" + lastAPSResult.iob?.dataClassToHtml()
binding.profile.text = lastAPSResult.oapsProfile?.dataClassToHtml()
binding.mealdata.text = lastAPSResult.mealData?.dataClassToHtml()
- binding.scriptdebugdata.text = lastAPSResult.scriptDebug?.joinToString("\n")
+ binding.scriptdebugdata.text = lastAPSResult.scriptDebug?.let { buildSpannableFromEntries(it) }
binding.constraints.text = lastAPSResult.inputConstraints?.getReasons()
binding.autosensdata.text = lastAPSResult.autosensResult?.dataClassToHtml()
binding.lastrun.text = dateUtil.dateAndTimeString(openAPSPlugin.lastAPSRun)
@@ -188,4 +191,21 @@ class OpenAPSFragment : DaggerFragment(), MenuProvider {
private fun String.bold(): String = "$this"
private val br = "
"
+
+ private fun buildSpannableFromEntries(entries: List): SpannableStringBuilder {
+ val builder = SpannableStringBuilder()
+ entries.forEach { entry ->
+ val start = builder.length
+ if (entry.startsWith("ERROR: ")) {
+ // Strip the "ERROR: " prefix before displaying
+ val strippedEntry = entry.removePrefix("ERROR: ")
+ builder.append("$strippedEntry\n")
+ val end = builder.length
+ builder.setSpan(ForegroundColorSpan(Color.RED), start, end, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE)
+ } else {
+ builder.append("$entry\n")
+ }
+ }
+ return builder
+ }
}
\ No newline at end of file
diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAMA.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAMA.kt
index 5181c231609..bd0cfe2f50a 100644
--- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAMA.kt
+++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAMA.kt
@@ -26,6 +26,15 @@ class DetermineBasalAMA @Inject constructor(
private val consoleError = mutableListOf()
private val consoleLog = mutableListOf()
+ private fun consoleLog(msg: String) {
+ consoleLog.add(msg)
+ }
+
+ private fun consoleError(msg: String) {
+ consoleError.add(msg)
+ consoleLog("ERROR: $msg")
+ }
+
private fun Double.toFixed2(): String = DecimalFormat("0.00#").format(round(this, 2))
private fun Double.toFixed3(): String = DecimalFormat("0.000#").format(round(this, 3))
@@ -58,7 +67,7 @@ class DetermineBasalAMA @Inject constructor(
fun reason(rT: RT, msg: String) {
if (rT.reason.toString().isNotEmpty()) rT.reason.append(". ")
rT.reason.append(msg)
- consoleError.add(msg)
+ consoleError(msg)
}
private fun getMaxSafeBasal(profile: OapsProfile): Double =
@@ -116,7 +125,7 @@ class DetermineBasalAMA @Inject constructor(
)
val basal = round_basal(profile.current_basal * autosens_data.ratio)
if (basal != profile.current_basal) {
- consoleError.add("Adjusting basal from ${profile.current_basal} to $basal")
+ consoleError("Adjusting basal from ${profile.current_basal} to $basal")
}
val bg = glucose_status.glucose
@@ -142,15 +151,15 @@ class DetermineBasalAMA @Inject constructor(
// adjust min, max, and target BG for sensitivity, such that 50% increase in ISF raises target from 100 to 120
if (profile.autosens_adjust_targets) {
if (profile.temptargetSet) {
- consoleError.add("Temp Target set, not adjusting with autosens")
+ consoleError("Temp Target set, not adjusting with autosens")
} else {
min_bg = round((min_bg - 60) / autosens_data.ratio, 0) + 60
max_bg = round((max_bg - 60) / autosens_data.ratio, 0) + 60
val new_target_bg = round((target_bg - 60) / autosens_data.ratio) + 60.0
if (target_bg == new_target_bg) {
- consoleError.add("target_bg unchanged: $new_target_bg")
+ consoleError("target_bg unchanged: $new_target_bg")
} else {
- consoleError.add("Adjusting target_bg from $target_bg to $new_target_bg")
+ consoleError("Adjusting target_bg from $target_bg to $new_target_bg")
}
target_bg = new_target_bg
}
@@ -171,7 +180,7 @@ class DetermineBasalAMA @Inject constructor(
val sens = round(profile.sens / autosens_data.ratio, 1)
if (sens != profile.sens) {
- consoleError.add("Adjusting sens from ${profile.sens} to $sens")
+ consoleError("Adjusting sens from ${profile.sens} to $sens")
}
//calculate BG impact: the amount BG "should" be rising or falling based on insulin activity alone
@@ -240,8 +249,8 @@ class DetermineBasalAMA @Inject constructor(
//5m data points = g * (1U/10g) * (40mg/dL/1U) / (mg/dL/5m)
cid = meal_data.mealCOB * (sens / profile.carb_ratio) / ci
val acid: Double = meal_data.mealCOB * (sens / profile.carb_ratio) / aci
- consoleError.add("Carb Impact: $ci mg/dL per 5m; CI Duration: ${Math.round(10 * cid / 6) / 10} hours")
- consoleError.add("Accel. Carb Impact: $aci mg/dL per 5m; ACI Duration: ${Math.round(10 * acid / 6) / 10} hours")
+ consoleError("Carb Impact: $ci mg/dL per 5m; CI Duration: ${Math.round(10 * cid / 6) / 10} hours")
+ consoleError("Accel. Carb Impact: $aci mg/dL per 5m; ACI Duration: ${Math.round(10 * acid / 6) / 10} hours")
var minPredBG = 999.0
var maxPredBG = bg
//var eventualPredBG = bg
diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalSMB.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalSMB.kt
index f1757062e6f..b4e9a9ce83d 100644
--- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalSMB.kt
+++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalSMB.kt
@@ -29,6 +29,15 @@ class DetermineBasalSMB @Inject constructor(
private val consoleError = mutableListOf()
private val consoleLog = mutableListOf()
+ private fun consoleLog(msg: String) {
+ consoleLog.add(msg)
+ }
+
+ private fun consoleError(msg: String) {
+ consoleError.add(msg)
+ consoleLog("ERROR: $msg")
+ }
+
private fun Double.toFixed2(): String = DecimalFormat("0.00#").format(round(this, 2))
fun round_basal(value: Double): Double = value
@@ -63,46 +72,46 @@ class DetermineBasalSMB @Inject constructor(
fun enable_smb(profile: OapsProfile, microBolusAllowed: Boolean, meal_data: MealData, target_bg: Double): Boolean {
// disable SMB when a high temptarget is set
if (!microBolusAllowed) {
- consoleError.add("SMB disabled (!microBolusAllowed)")
+ consoleError("SMB disabled (!microBolusAllowed)")
return false
} else if (!profile.allowSMB_with_high_temptarget && profile.temptargetSet && target_bg > 100) {
- consoleError.add("SMB disabled due to high temptarget of $target_bg")
+ consoleError("SMB disabled due to high temptarget of $target_bg")
return false
}
// enable SMB/UAM if always-on (unless previously disabled for high temptarget)
if (profile.enableSMB_always) {
- consoleError.add("SMB enabled due to enableSMB_always")
+ consoleError("SMB enabled due to enableSMB_always")
return true
}
// enable SMB/UAM (if enabled in preferences) while we have COB
if (profile.enableSMB_with_COB && meal_data.mealCOB != 0.0) {
- consoleError.add("SMB enabled for COB of ${meal_data.mealCOB}")
+ consoleError("SMB enabled for COB of ${meal_data.mealCOB}")
return true
}
// enable SMB/UAM (if enabled in preferences) for a full 6 hours after any carb entry
// (6 hours is defined in carbWindow in lib/meal/total.js)
if (profile.enableSMB_after_carbs && meal_data.carbs != 0.0) {
- consoleError.add("SMB enabled for 6h after carb entry")
+ consoleError("SMB enabled for 6h after carb entry")
return true
}
// enable SMB/UAM (if enabled in preferences) if a low temptarget is set
if (profile.enableSMB_with_temptarget && (profile.temptargetSet && target_bg < 100)) {
- consoleError.add("SMB enabled for temptarget of ${convert_bg(target_bg)}")
+ consoleError("SMB enabled for temptarget of ${convert_bg(target_bg)}")
return true
}
- consoleError.add("SMB disabled (no enableSMB preferences active or no condition satisfied)")
+ consoleError("SMB disabled (no enableSMB preferences active or no condition satisfied)")
return false
}
fun reason(rT: RT, msg: String) {
if (rT.reason.toString().isNotEmpty()) rT.reason.append(". ")
rT.reason.append(msg)
- consoleError.add(msg)
+ consoleError(msg)
}
private fun getMaxSafeBasal(profile: OapsProfile): Double =
@@ -222,9 +231,9 @@ class DetermineBasalSMB @Inject constructor(
val halfBasalTarget = profile.half_basal_exercise_target
if (dynIsfMode) {
- consoleError.add("---------------------------------------------------------")
- consoleError.add(" Dynamic ISF version 2.0 ")
- consoleError.add("---------------------------------------------------------")
+ consoleLog("---------------------------------------------------------")
+ consoleLog(" Dynamic ISF version 2.0 ")
+ consoleLog("---------------------------------------------------------")
}
if (high_temptarget_raises_sensitivity && profile.temptargetSet && target_bg > normalTarget
@@ -238,17 +247,17 @@ class DetermineBasalSMB @Inject constructor(
// limit sensitivityRatio to profile.autosens_max (1.2x by default)
sensitivityRatio = min(sensitivityRatio, profile.autosens_max)
sensitivityRatio = round(sensitivityRatio, 2)
- consoleLog.add("Sensitivity ratio set to $sensitivityRatio based on temp target of $target_bg; ")
+ consoleLog("Sensitivity ratio set to $sensitivityRatio based on temp target of $target_bg; ")
} else {
sensitivityRatio = autosens_data.ratio
- consoleLog.add("Autosens ratio: $sensitivityRatio; ")
+ consoleLog("Autosens ratio: $sensitivityRatio; ")
}
basal = profile.current_basal * sensitivityRatio
basal = round_basal(basal)
if (basal != profile_current_basal)
- consoleLog.add("Adjusting basal from $profile_current_basal to $basal; ")
+ consoleLog("Adjusting basal from $profile_current_basal to $basal; ")
else
- consoleLog.add("Basal unchanged: $basal; ")
+ consoleLog("Basal unchanged: $basal; ")
// adjust min, max, and target BG for sensitivity, such that 50% increase in ISF raises target from 100 to 120
if (profile.temptargetSet) {
@@ -262,9 +271,9 @@ class DetermineBasalSMB @Inject constructor(
// don't allow target_bg below 80
new_target_bg = max(80.0, new_target_bg)
if (target_bg == new_target_bg)
- consoleLog.add("target_bg unchanged: $new_target_bg; ")
+ consoleLog("target_bg unchanged: $new_target_bg; ")
else
- consoleLog.add("target_bg from $target_bg to $new_target_bg; ")
+ consoleLog("target_bg from $target_bg to $new_target_bg; ")
target_bg = new_target_bg
}
@@ -290,14 +299,14 @@ class DetermineBasalSMB @Inject constructor(
val profile_sens = round(profile.sens, 1)
val adjusted_sens = round(profile.sens / sensitivityRatio, 1)
if (adjusted_sens != profile_sens) {
- consoleLog.add("ISF from $profile_sens to $adjusted_sens")
+ consoleLog("ISF from $profile_sens to $adjusted_sens")
} else {
- consoleLog.add("ISF unchanged: $adjusted_sens")
+ consoleLog("ISF unchanged: $adjusted_sens")
}
adjusted_sens
//console.log(" (autosens ratio "+sensitivityRatio+")");
}
- consoleError.add("CR:${profile.carb_ratio}")
+ consoleLog("CR:${profile.carb_ratio}")
//calculate BG impact: the amount BG "should" be rising or falling based on insulin activity alone
val bgi = round((-iob_data.activity * sens * 5), 2)
@@ -333,24 +342,24 @@ class DetermineBasalSMB @Inject constructor(
// if eventualBG, naive_eventualBG, and target_bg aren't all above adjustedMinBG, don’t use it
//console.error("naive_eventualBG:",naive_eventualBG+", eventualBG:",eventualBG);
if (eventualBG > adjustedMinBG && naive_eventualBG > adjustedMinBG && min_bg > adjustedMinBG) {
- consoleLog.add("Adjusting targets for high BG: min_bg from $min_bg to $adjustedMinBG; ")
+ consoleLog("Adjusting targets for high BG: min_bg from $min_bg to $adjustedMinBG; ")
min_bg = adjustedMinBG
} else {
- consoleLog.add("min_bg unchanged: $min_bg; ")
+ consoleLog("min_bg unchanged: $min_bg; ")
}
// if eventualBG, naive_eventualBG, and target_bg aren't all above adjustedTargetBG, don’t use it
if (eventualBG > adjustedTargetBG && naive_eventualBG > adjustedTargetBG && target_bg > adjustedTargetBG) {
- consoleLog.add("target_bg from $target_bg to $adjustedTargetBG; ")
+ consoleLog("target_bg from $target_bg to $adjustedTargetBG; ")
target_bg = adjustedTargetBG
} else {
- consoleLog.add("target_bg unchanged: $target_bg; ")
+ consoleLog("target_bg unchanged: $target_bg; ")
}
// if eventualBG, naive_eventualBG, and max_bg aren't all above adjustedMaxBG, don’t use it
if (eventualBG > adjustedMaxBG && naive_eventualBG > adjustedMaxBG && max_bg > adjustedMaxBG) {
- consoleError.add("max_bg from $max_bg to $adjustedMaxBG")
+ consoleLog("max_bg from $max_bg to $adjustedMaxBG")
max_bg = adjustedMaxBG
} else {
- consoleError.add("max_bg unchanged: $max_bg")
+ consoleLog("max_bg unchanged: $max_bg")
}
}
@@ -361,7 +370,7 @@ class DetermineBasalSMB @Inject constructor(
if (profile.lgsThreshold != null) {
val lgsThreshold = profile.lgsThreshold ?: error("lgsThreshold missing")
if (lgsThreshold > threshold) {
- consoleError.add("Threshold set from ${convert_bg(threshold)} to ${convert_bg(lgsThreshold.toDouble())}; ")
+ consoleError("Threshold set from ${convert_bg(threshold)} to ${convert_bg(lgsThreshold.toDouble())}; ")
threshold = lgsThreshold.toDouble()
}
}
@@ -425,13 +434,13 @@ class DetermineBasalSMB @Inject constructor(
// autotuned CR is still in effect even when basals and ISF are being adjusted by TT or autosens
// this avoids overdosing insulin for large meals when low temp targets are active
val csf = sens / profile.carb_ratio
- consoleError.add("profile.sens: ${profile.sens}, sens: $sens, CSF: $csf")
+ consoleError("profile.sens: ${profile.sens}, sens: $sens, CSF: $csf")
val maxCarbAbsorptionRate = 30 // g/h; maximum rate to assume carbs will absorb if no CI observed
// limit Carb Impact to maxCarbAbsorptionRate * csf in mg/dL per 5m
val maxCI = round(maxCarbAbsorptionRate * csf * 5 / 60, 1)
if (ci > maxCI) {
- consoleError.add("Limiting carb impact from $ci to $maxCI mg/dL/5m ( $maxCarbAbsorptionRate g/h )")
+ consoleError("Limiting carb impact from $ci to $maxCI mg/dL/5m ( $maxCarbAbsorptionRate g/h )")
ci = maxCI
}
var remainingCATimeMin = 3.0 // h; duration of expected not-yet-observed carb absorption
@@ -452,7 +461,7 @@ class DetermineBasalSMB @Inject constructor(
remainingCATime = remainingCATimeMin + 1.5 * lastCarbAge / 60
remainingCATime = round(remainingCATime, 1)
//console.error(fractionCOBAbsorbed, remainingCATimeAdjustment, remainingCATime)
- consoleError.add("Last carbs " + lastCarbAge + "minutes ago; remainingCATime:" + remainingCATime + "hours;" + round(fractionCOBAbsorbed * 100) + "% carbs absorbed")
+ consoleError("Last carbs " + lastCarbAge + "minutes ago; remainingCATime:" + remainingCATime + "hours;" + round(fractionCOBAbsorbed * 100) + "% carbs absorbed")
}
// calculate the number of carbs absorbed over remainingCATime hours at current CI
@@ -491,7 +500,7 @@ class DetermineBasalSMB @Inject constructor(
}
val acid = max(0.0, meal_data.mealCOB * csf / aci)
// duration (hours) = duration (5m) * 5 / 60 * 2 (to account for linear decay)
- consoleError.add("Carb Impact: ${ci} mg/dL per 5m; CI Duration: ${round(cid * 5 / 60 * 2, 1)} hours; remaining CI (~2h peak): ${round(remainingCIpeak, 1)} mg/dL per 5m")
+ consoleError("Carb Impact: ${ci} mg/dL per 5m; CI Duration: ${round(cid * 5 / 60 * 2, 1)} hours; remaining CI (~2h peak): ${round(remainingCIpeak, 1)} mg/dL per 5m")
//console.error("Accel. Carb Impact:",aci,"mg/dL per 5m; ACI Duration:",round(acid*5/60*2,1),"hours");
var minIOBPredBG = 999.0
var minCOBPredBG = 999.0
@@ -600,8 +609,8 @@ class DetermineBasalSMB @Inject constructor(
// set eventualBG to include effect of carbs
//console.error("PredBGs:",JSON.stringify(predBGs));
if (meal_data.mealCOB > 0) {
- consoleError.add("predCIs (mg/dL/5m):" + predCIs.joinToString(separator = " "))
- consoleError.add("remainingCIs: " + remainingCIs.joinToString(separator = " "))
+ consoleError("predCIs (mg/dL/5m):" + predCIs.joinToString(separator = " "))
+ consoleError("remainingCIs: " + remainingCIs.joinToString(separator = " "))
}
rT.predBGs = Predictions()
IOBpredBGs = IOBpredBGs.map { round(min(401.0, max(39.0, it)), 0) }.toMutableList()
@@ -651,8 +660,8 @@ class DetermineBasalSMB @Inject constructor(
rT.eventualBG = eventualBG
}
- consoleError.add("UAM Impact: $uci mg/dL per 5m; UAM Duration: $UAMduration hours")
- consoleLog.add("EventualBG is $eventualBG ;")
+ consoleError("UAM Impact: $uci mg/dL per 5m; UAM Duration: $UAMduration hours")
+ consoleLog("EventualBG is $eventualBG ;")
minIOBPredBG = max(39.0, minIOBPredBG)
minCOBPredBG = max(39.0, minCOBPredBG)
@@ -667,17 +676,17 @@ class DetermineBasalSMB @Inject constructor(
) {
future_sens = (1800 / (ln((((fSensBG * 0.5) + (bg * 0.5)) / profile.insulinDivisor) + 1) * profile.TDD))
future_sens = round(future_sens, 1)
- consoleLog.add("Future state sensitivity is $future_sens based on eventual and current bg due to flat glucose level above target")
+ consoleLog("Future state sensitivity is $future_sens based on eventual and current bg due to flat glucose level above target")
rT.reason.append("Dosing sensitivity: $future_sens using eventual BG;")
} else if (glucose_status.delta > 0 && eventualBG > target_bg || eventualBG > bg) {
future_sens = (1800 / (ln((bg / profile.insulinDivisor) + 1) * profile.TDD))
future_sens = round(future_sens, 1)
- consoleLog.add("Future state sensitivity is $future_sens using current bg due to small delta or variation")
+ consoleLog("Future state sensitivity is $future_sens using current bg due to small delta or variation")
rT.reason.append("Dosing sensitivity: $future_sens using current BG;")
} else {
future_sens = (1800 / (ln((fSensBG / profile.insulinDivisor) + 1) * profile.TDD))
future_sens = round(future_sens, 1)
- consoleLog.add("Future state sensitivity is $future_sens based on eventual bg due to -ve delta")
+ consoleLog("Future state sensitivity is $future_sens based on eventual bg due to -ve delta")
rT.reason.append("Dosing sensitivity: $future_sens using eventual BG;")
}
@@ -759,14 +768,14 @@ class DetermineBasalSMB @Inject constructor(
// make sure minPredBG isn't higher than avgPredBG
minPredBG = min(minPredBG, avgPredBG)
- consoleLog.add("minPredBG: $minPredBG minIOBPredBG: $minIOBPredBG minZTGuardBG: $minZTGuardBG")
+ consoleLog("minPredBG: $minPredBG minIOBPredBG: $minIOBPredBG minZTGuardBG: $minZTGuardBG")
if (minCOBPredBG < 999) {
- consoleLog.add(" minCOBPredBG: $minCOBPredBG")
+ consoleLog(" minCOBPredBG: $minCOBPredBG")
}
if (minUAMPredBG < 999) {
- consoleLog.add(" minUAMPredBG: $minUAMPredBG")
+ consoleLog(" minUAMPredBG: $minUAMPredBG")
}
- consoleError.add(" avgPredBG: $avgPredBG COB: ${meal_data.mealCOB} / ${meal_data.carbs}")
+ consoleError(" avgPredBG: $avgPredBG COB: ${meal_data.mealCOB} / ${meal_data.carbs}")
// But if the COB line falls off a cliff, don't trust UAM too much:
// use maxCOBPredBG if it's been set and lower than minPredBG
if (maxCOBPredBG > bg) {
@@ -830,19 +839,19 @@ class DetermineBasalSMB @Inject constructor(
}
if (enableSMB && minGuardBG < threshold) {
- consoleError.add("minGuardBG ${convert_bg(minGuardBG)} projected below ${convert_bg(threshold)} - disabling SMB")
+ consoleError("minGuardBG ${convert_bg(minGuardBG)} projected below ${convert_bg(threshold)} - disabling SMB")
//rT.reason += "minGuardBG "+minGuardBG+"<"+threshold+": SMB disabled; ";
enableSMB = false
}
if (maxDelta > 0.20 * bg) {
- consoleError.add("maxDelta ${convert_bg(maxDelta)} > 20% of BG ${convert_bg(bg)} - disabling SMB")
+ consoleError("maxDelta ${convert_bg(maxDelta)} > 20% of BG ${convert_bg(bg)} - disabling SMB")
rT.reason.append("maxDelta " + convert_bg(maxDelta) + " > 20% of BG " + convert_bg(bg) + ": SMB disabled; ")
enableSMB = false
}
- consoleError.add("BG projected to remain above ${convert_bg(min_bg)} for $minutesAboveMinBG minutes")
+ consoleError("BG projected to remain above ${convert_bg(min_bg)} for $minutesAboveMinBG minutes")
if (minutesAboveThreshold < 240 || minutesAboveMinBG < 60) {
- consoleError.add("BG projected to remain above ${convert_bg(threshold)} for $minutesAboveThreshold minutes")
+ consoleError("BG projected to remain above ${convert_bg(threshold)} for $minutesAboveThreshold minutes")
}
// include at least minutesAboveThreshold worth of zero temps in calculating carbsReq
// always include at least 30m worth of zero temp (carbs to 80, low temp up to target)
@@ -853,7 +862,7 @@ class DetermineBasalSMB @Inject constructor(
val COBforCarbsReq = max(0.0, meal_data.mealCOB - 0.25 * meal_data.carbs)
val carbsReq = round(((bgUndershoot - zeroTempEffectDouble) / csf - COBforCarbsReq))
val zeroTempEffect = round(zeroTempEffectDouble)
- consoleError.add("naive_eventualBG: $naive_eventualBG bgUndershoot: $bgUndershoot zeroTempDuration $zeroTempDuration zeroTempEffect: $zeroTempEffect carbsReq: $carbsReq")
+ consoleError("naive_eventualBG: $naive_eventualBG bgUndershoot: $bgUndershoot zeroTempDuration $zeroTempDuration zeroTempEffect: $zeroTempEffect carbsReq: $carbsReq")
if (carbsReq >= profile.carbsReqThreshold && minutesAboveThreshold <= 45) {
rT.carbsReq = carbsReq
rT.carbsReqWithin = minutesAboveThreshold
@@ -1042,11 +1051,11 @@ class DetermineBasalSMB @Inject constructor(
// never bolus more than maxSMBBasalMinutes worth of basal
val mealInsulinReq = round(meal_data.mealCOB / profile.carb_ratio, 3)
if (iob_data.iob > mealInsulinReq && iob_data.iob > 0) {
- consoleError.add("IOB ${iob_data.iob} > COB ${meal_data.mealCOB}; mealInsulinReq = $mealInsulinReq")
- consoleError.add("profile.maxUAMSMBBasalMinutes: ${profile.maxUAMSMBBasalMinutes} profile.current_basal: ${profile.current_basal}")
+ consoleError("IOB ${iob_data.iob} > COB ${meal_data.mealCOB}; mealInsulinReq = $mealInsulinReq")
+ consoleError("profile.maxUAMSMBBasalMinutes: ${profile.maxUAMSMBBasalMinutes} profile.current_basal: ${profile.current_basal}")
maxBolus = round(profile.current_basal * profile.maxUAMSMBBasalMinutes / 60, 1)
} else {
- consoleError.add("profile.maxSMBBasalMinutes: ${profile.maxSMBBasalMinutes} profile.current_basal: ${profile.current_basal}")
+ consoleError("profile.maxSMBBasalMinutes: ${profile.maxSMBBasalMinutes} profile.current_basal: ${profile.current_basal}")
maxBolus = round(profile.current_basal * profile.maxSMBBasalMinutes / 60, 1)
}
// bolus 1/2 the insulinReq, up to maxBolus, rounding down to nearest bolus increment
@@ -1088,7 +1097,7 @@ class DetermineBasalSMB @Inject constructor(
val nextBolusMins = round(SMBInterval - lastBolusAge, 0)
val nextBolusSeconds = round((SMBInterval - lastBolusAge) * 60, 0) % 60
//console.error(naive_eventualBG, insulinReq, worstCaseInsulinReq, durationReq);
- consoleError.add("naive_eventualBG $naive_eventualBG,${durationReq}m ${smbLowTempReq}U/h temp needed; last bolus ${lastBolusAge}m ago; maxBolus: $maxBolus")
+ consoleError("naive_eventualBG $naive_eventualBG,${durationReq}m ${smbLowTempReq}U/h temp needed; last bolus ${lastBolusAge}m ago; maxBolus: $maxBolus")
if (lastBolusAge > SMBInterval) {
if (microBolus > 0) {
rT.units = microBolus