Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
ab412ba
plot bg parabola fit - prototype
ga-zelle Aug 18, 2025
27fb10e
plot bg parabola fit - fix merge issue and cleanup
ga-zelle Aug 19, 2025
32c61b8
plot bg parabola fit - visibility in Light theme
ga-zelle Aug 20, 2025
8110a9f
plot bg parabola fit - only if AutoISf is active
ga-zelle Aug 20, 2025
1e7f6ac
Merge remote-tracking branch 'origin/dev' into 3330-dev-b/dev_plotPar…
ga-zelle Aug 20, 2025
5c2fd67
improve visibility
ga-zelle Sep 7, 2025
935218e
(de)activate showing parabola or its predictions
ga-zelle Sep 8, 2025
25ea78d
fix parabola scaling for MMOL
ga-zelle Sep 8, 2025
cd972a0
Merge remote-tracking branch 'origin/dev' into 3330-dev-b/overlayBgPa…
ga-zelle Sep 11, 2025
d4b6be6
show BG parabola: enabled by default, disabled in simple mode
ga-zelle Sep 11, 2025
65d0418
show BG parabola: enabled by default, disabled in simple mode
ga-zelle Sep 11, 2025
1b39d45
Merge remote-tracking branch 'origin/dev' into 3330-dev-b/dev_plotPar…
ga-zelle Sep 15, 2025
d511e19
adapt parabola graph selectability to new visibility concept
ga-zelle Sep 16, 2025
8f6695d
do not calculate graph data if not visible anyway
ga-zelle Sep 16, 2025
5b0d7e0
hide empty graph frame if not deselectable but invisible
ga-zelle Sep 16, 2025
fcdd2f4
Merge remote-tracking branch 'ga-zelle/3330-dev-b/overlayBgParabolaAs…
ga-zelle Sep 16, 2025
3859ce2
fix graph menu sort order
ga-zelle Sep 16, 2025
4f376e6
Merge remote-tracking branch 'ga-zelle/3330-dev-b/overlayBgParabolaAs…
ga-zelle Sep 17, 2025
c0d92a7
hide name if secondary graph item is invisible
ga-zelle Sep 18, 2025
037f41c
Merge remote-tracking branch 'origin/dev' into 3330-dev-b/overlayBgPa…
ga-zelle Sep 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ interface OverviewData {
var activitySeries: SeriesData
var activityPredictionSeries: SeriesData

var maxBgParabolaValue: Double
val bgParabolaScale: Scale
var bgParabolaSeries: SeriesData
var bgParabolaPredictionSeries: SeriesData

var maxEpsValue: Double
val epsScale: Scale
var epsSeries: SeriesData
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.widget.ImageButton
interface OverviewMenus {
enum class CharType {
PRE,
BG_PARAB,
TREAT,
BAS,
ABS,
Expand Down
3 changes: 3 additions & 0 deletions core/ui/src/main/res/values-night/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@
<color name="profileSwitch">#FFFFFF</color>
<color name="sens">#008585</color>

<!-- AutoISF-->
<color name="bgParabolaColor">#FF00FF</color>

<color name="ribbonDefault">#5a595b</color>
<color name="daySelected">#D000FF00</color>
<color name="weekdayOutline">#1ea3e5</color>
Expand Down
2 changes: 2 additions & 0 deletions core/ui/src/main/res/values-night/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@
<item name="activityColor">@color/activity</item>
<item name="baseBasalColor">@color/baseBasal</item>
<item name="dotLineColor">@color/white</item>
<!-- AutoISf specific colors -->
<item name="bgParabolaColor">@color/bgParabolaColor</item>
<!---Popupmenu TextColor -->
<item name="menuTextColor">@color/black</item>
<item name="menuTextColorInverse">@color/black</item>
Expand Down
2 changes: 2 additions & 0 deletions core/ui/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,8 @@
<attr name="therapyEvent_EXERCISE" format="reference|color" />
<attr name="therapyEvent_APS_OFFLINE" format="reference|color" />
<attr name="therapyEvent_Default" format="reference|color" />
<!-- AutoISF specific colors -->
<attr name="bgParabolaColor" format="reference|color"/>
<!-- Graph specific colors -->
<attr name="graphHorizontalLabelText" format="reference|color" />
<attr name="graphVerticalLabelText" format="reference|color" />
Expand Down
3 changes: 3 additions & 0 deletions core/ui/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@
<color name="blue">#0000FF</color>
<color name="sens">#008585</color>

<!-- AutoISF-->
<color name="bgParabolaColor">#FF00FF</color>

<color name="ribbonDefault">#8C8C8C</color>
<color name="daySelected">#D000FF00</color>
<color name="weekdayOutline">#1ea3e5</color>
Expand Down
2 changes: 2 additions & 0 deletions core/ui/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@
<item name="activityColor">@color/activity</item>
<item name="baseBasalColor">@color/baseBasal</item>
<item name="dotLineColor">@color/black</item>
<!-- AutoISf specific colors -->
<item name="bgParabolaColor">@color/bgParabolaColor</item>
<!---Popupmenu TextColor -->
<item name="menuTextColor">@color/black</item>
<item name="menuTextColorInverse">@color/white</item>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ class OverviewDataImpl @Inject constructor(
maxIAValue = 0.0
activitySeries = FixedLineGraphSeries<ScaledDataPoint>()
activityPredictionSeries = FixedLineGraphSeries<ScaledDataPoint>()
maxBgParabolaValue = 280.0
bgParabolaSeries = FixedLineGraphSeries<ScaledDataPoint>()
bgParabolaPredictionSeries = FixedLineGraphSeries<ScaledDataPoint>()
maxIobValueFound = Double.MIN_VALUE
iobSeries = FixedLineGraphSeries<ScaledDataPoint>()
absIobSeries = FixedLineGraphSeries<ScaledDataPoint>()
Expand Down Expand Up @@ -204,6 +207,11 @@ class OverviewDataImpl @Inject constructor(
override var activitySeries: SeriesData = FixedLineGraphSeries<ScaledDataPoint>()
override var activityPredictionSeries: SeriesData = FixedLineGraphSeries<ScaledDataPoint>()

override var maxBgParabolaValue = 0.0
override val bgParabolaScale = Scale()
override var bgParabolaSeries: SeriesData = FixedLineGraphSeries<ScaledDataPoint>()
override var bgParabolaPredictionSeries: SeriesData = FixedLineGraphSeries<ScaledDataPoint>()

override var maxEpsValue = 0.0
override val epsScale = Scale()
override var epsSeries: SeriesData = PointsWithLabelGraphSeries<DataPointWithLabelInterface>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,8 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
private fun updateGraph() {
_binding ?: return
val pump = activePlugin.activePump
val runningAutoIsf = activePlugin.activeAPS.algorithm.name == "AUTO_ISF"
val showVarSens = runningAutoIsf || preferences.get(BooleanKey.ApsUseDynamicSensitivity)
val graphData = GraphData(injector, binding.graphsLayout.bgGraph, overviewData)
val menuChartSettings = overviewMenus.setting
if (menuChartSettings.isEmpty()) return
Expand All @@ -1053,6 +1055,8 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
graphData.addTherapyEvents()
if (menuChartSettings[0][OverviewMenus.CharType.ACT.ordinal])
graphData.addActivity(0.8)
if (menuChartSettings[0][OverviewMenus.CharType.BG_PARAB.ordinal] && runningAutoIsf)
graphData.addBgParabola(menuChartSettings[0][OverviewMenus.CharType.PRE.ordinal],1.0)
if ((pump.pumpDescription.isTempBasalCapable || config.AAPSCLIENT) && menuChartSettings[0][OverviewMenus.CharType.BAS.ordinal])
graphData.addBasals()
graphData.addTargetLine()
Expand Down Expand Up @@ -1102,7 +1106,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
if (menuChartSettings[g + 1][OverviewMenus.CharType.DEV.ordinal]) secondGraphData.addDeviations(useDevForScale, 1.0)
if (menuChartSettings[g + 1][OverviewMenus.CharType.BGI.ordinal]) secondGraphData.addMinusBGI(useBGIForScale, if (alignDevBgiScale) 1.0 else 0.8)
if (menuChartSettings[g + 1][OverviewMenus.CharType.SEN.ordinal]) secondGraphData.addRatio(useRatioForScale, if (useRatioForScale) 1.0 else 0.8)
if (menuChartSettings[g + 1][OverviewMenus.CharType.VAR_SEN.ordinal]) secondGraphData.addVarSens(useVarSensForScale, if (useVarSensForScale) 1.0 else 0.8)
if (menuChartSettings[g + 1][OverviewMenus.CharType.VAR_SEN.ordinal] && showVarSens) secondGraphData.addVarSens(useVarSensForScale, if (useVarSensForScale) 1.0 else 0.8)
if (menuChartSettings[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] && config.isDev()) secondGraphData.addDeviationSlope(
useDSForScale,
if (useDSForScale) 1.0 else 0.8,
Expand All @@ -1125,7 +1129,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
menuChartSettings[g + 1][OverviewMenus.CharType.DEV.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.BGI.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.SEN.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.VAR_SEN.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.VAR_SEN.ordinal] && showVarSens ||
menuChartSettings[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.HR.ordinal] ||
menuChartSettings[g + 1][OverviewMenus.CharType.STEPS.ordinal]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import app.aaps.core.interfaces.aps.Loop
import app.aaps.core.interfaces.configuration.Config
import app.aaps.core.interfaces.logging.AAPSLogger
import app.aaps.core.interfaces.overview.OverviewMenus
import app.aaps.core.interfaces.plugin.ActivePlugin
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.rx.bus.RxBus
import app.aaps.core.interfaces.rx.events.EventRefreshOverview
Expand All @@ -45,7 +46,8 @@ class OverviewMenusImpl @Inject constructor(
private val preferences: Preferences,
private val rxBus: RxBus,
private val config: Config,
private val loop: Loop
private val loop: Loop,
private val activePlugin: ActivePlugin
) : OverviewMenus {

enum class CharTypeData(
Expand All @@ -60,6 +62,7 @@ class OverviewMenusImpl @Inject constructor(
) {

PRE(R.string.overview_show_predictions, app.aaps.core.ui.R.attr.predictionColor, app.aaps.core.ui.R.attr.menuTextColor, primary = true, secondary = false, shortnameId = R.string.prediction_shortname, enabledByDefault = true),
BG_PARAB(R.string.overview_show_bgParabola, app.aaps.core.ui.R.attr.bgParabolaColor, app.aaps.core.ui.R.attr.menuTextColor, primary = true, secondary = false, shortnameId = R.string.bgParabola_shortname, enabledByDefault = true),
TREAT(R.string.overview_show_treatments, app.aaps.core.ui.R.attr.cobColor, app.aaps.core.ui.R.attr.menuTextColor, primary = true, secondary = false, shortnameId = R.string.treatments_shortname, enabledByDefault = true),
BAS(R.string.overview_show_basals, app.aaps.core.ui.R.attr.basal, app.aaps.core.ui.R.attr.menuTextColor, primary = true, secondary = false, shortnameId = R.string.basal_shortname, enabledByDefault = true),
ABS(R.string.overview_show_abs_insulin, app.aaps.core.ui.R.attr.iobColor, app.aaps.core.ui.R.attr.menuTextColor, primary = false, secondary = true, shortnameId = R.string.abs_insulin_shortname),
Expand All @@ -75,16 +78,22 @@ class OverviewMenusImpl @Inject constructor(
STEPS(R.string.overview_show_steps, app.aaps.core.ui.R.attr.stepsColor, app.aaps.core.ui.R.attr.menuTextColor, primary = false, secondary = true, shortnameId = R.string.steps_shortname),
}

private val runningAutoIsf: Boolean
get() = try {
activePlugin.activeAPS.algorithm.name == "AUTO_ISF"
} catch (e: Exception) { false }

init {
CharTypeData.PRE.visibility = {
CharTypeData.PRE.visibility = {
when {
config.APS -> loop.lastRun?.request?.hasPredictions == true
config.AAPSCLIENT -> true
else -> false
}
}
CharTypeData.DEVSLOPE.visibility = { config.isDev() }
CharTypeData.VAR_SENS.visibility = { preferences.get(BooleanKey.ApsUseDynamicSensitivity) }
CharTypeData.BG_PARAB.visibility = { runningAutoIsf }
CharTypeData.VAR_SENS.visibility = { preferences.get(BooleanKey.ApsUseDynamicSensitivity) || runningAutoIsf }
}

companion object {
Expand All @@ -95,7 +104,7 @@ class OverviewMenusImpl @Inject constructor(
override fun enabledTypes(graph: Int): String {
val r = StringBuilder()
for (type in CharTypeData.entries)
if (setting[graph][type.ordinal]) {
if (setting[graph][type.ordinal] && type.visibility()) {
r.append(rh.gs(type.shortnameId))
r.append(" ")
}
Expand All @@ -119,9 +128,9 @@ class OverviewMenusImpl @Inject constructor(
}
else
listOf(
arrayOf(true, true, true, false, false, false, false, false, false, false, false, false, false, false),
arrayOf(false, false, false, false, true, false, false, false, false, false, false, false, false, false),
arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false)
arrayOf(true, false, true, true, false, false, false, false, false, false, false, false, false, false, false),
arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
arrayOf(false, false, false, false, false, false, true, false, false, false, false, false, false, false, false)
)

@Synchronized
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,12 @@ import kotlin.math.max
overviewData.actScale.multiplier = maxY * scale / overviewData.maxIAValue
}

fun addBgParabola(addPredictions: Boolean, scale: Double) {
addSeries(overviewData.bgParabolaSeries as FixedLineGraphSeries<ScaledDataPoint>)
if (addPredictions) addSeries(overviewData.bgParabolaPredictionSeries as FixedLineGraphSeries<ScaledDataPoint>)
overviewData.bgParabolaScale.multiplier = maxY * scale / overviewData.maxBgValue
}

//Function below show -BGI to be able to compare curves with deviations
fun addMinusBGI(useForScale: Boolean, scale: Double) {
if (useForScale) {
Expand Down
2 changes: 2 additions & 0 deletions plugins/main/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@
<string name="overview_show_basals">Basals</string>
<string name="overview_show_abs_insulin">Absolute insulin</string>
<string name="overview_show_variable_sens">Variable sensitivity</string>
<string name="overview_show_bgParabola">BG parabola</string>
<string name="prediction_shortname">PRED</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
Expand All @@ -300,6 +301,7 @@
<string name="heartRate_shortname">HR</string>
<string name="sensitivity_shortname">SENS%</string>
<string name="variable_sensitivity_shortname">VSENS</string>
<string name="bgParabola_shortname">BG_PARAB</string>
<string name="graph_scale">Graph scale</string>
<string name="graph_menu_divider_header">Graph</string>
<string name="temp_basal_overview_short_name">T:</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.graphics.Paint
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import app.aaps.core.data.aps.SMBDefaults
import app.aaps.core.data.configuration.Constants
import app.aaps.core.data.model.GlucoseUnit
import app.aaps.core.graph.data.BarGraphSeries
import app.aaps.core.graph.data.DataPointWithLabelInterface
import app.aaps.core.graph.data.DeviationDataPoint
Expand All @@ -16,9 +18,11 @@ import app.aaps.core.graph.data.ScaledDataPoint
import app.aaps.core.graph.data.Shape
import app.aaps.core.interfaces.aps.AutosensData
import app.aaps.core.interfaces.aps.AutosensResult
import app.aaps.core.interfaces.aps.GlucoseStatusAutoIsf
import app.aaps.core.interfaces.aps.IobTotal
import app.aaps.core.interfaces.db.PersistenceLayer
import app.aaps.core.interfaces.graph.Scale
import app.aaps.core.interfaces.iob.GlucoseStatusProvider
import app.aaps.core.interfaces.iob.IobCobCalculator
import app.aaps.core.interfaces.logging.LTag
import app.aaps.core.interfaces.overview.OverviewData
Expand Down Expand Up @@ -54,6 +58,7 @@ class PrepareIobAutosensGraphDataWorker(
@Inject lateinit var persistenceLayer: PersistenceLayer
@Inject lateinit var rxBus: RxBus
@Inject lateinit var decimalFormatter: DecimalFormatter
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
private var ctx: Context

init {
Expand Down Expand Up @@ -146,6 +151,8 @@ class PrepareIobAutosensGraphDataWorker(

val adsData = data.iobCobCalculator.ads.clone()

val toUnits = if (profileUtil.units == GlucoseUnit.MGDL) 1.0 else Constants.MGDL_TO_MMOLL

while (time <= endTime) {
if (isStopped) return Result.failure(workDataOf("Error" to "stopped"))
val progress = (time - fromTime).toDouble() / (endTime - fromTime) * 100.0
Expand Down Expand Up @@ -285,6 +292,43 @@ class PrepareIobAutosensGraphDataWorker(
})
}

// BG PARABOLA
val bgParabolaArrayHist: MutableList<ScaledDataPoint> = ArrayList()
val bgParabolaArrayPrediction: MutableList<ScaledDataPoint> = ArrayList()
val glucoseStatus = glucoseStatusProvider.glucoseStatusData as GlucoseStatusAutoIsf?
val corr = glucoseStatus?.corrSqu ?: 0.0
if ( corr > 0.0) {
val a0 = glucoseStatus!!.a0
val a1 = glucoseStatus.a1
val a2 = glucoseStatus.a2
// parabola extrapolation
for (i in 0 until 21 step 5) {
val timestamp = now + (i * 60 * 1000).toLong()
val value = a0 + a1*i/5 +a2*i*i/25
bgParabolaArrayPrediction.add(ScaledDataPoint(timestamp, value * toUnits, data.overviewData.bgParabolaScale))
}
// fitted parabola
val dur = (glucoseStatus.parabolaMinutes).toInt()
for (i in -dur until 1 step 5) {
val timestamp = now + (i * 60 * 1000).toLong()
val value = a0 + a1*i/5 +a2*i*i/25
bgParabolaArrayHist.add(ScaledDataPoint(timestamp, value * toUnits, data.overviewData.bgParabolaScale))
}
}
data.overviewData.bgParabolaSeries = FixedLineGraphSeries(Array(bgParabolaArrayHist.size) { i -> bgParabolaArrayHist[i] }).also {
it.isDrawBackground = false
it.color = rh.gac(ctx, app.aaps.core.ui.R.attr.bgParabolaColor)
it.thickness = 8
}
data.overviewData.bgParabolaPredictionSeries = FixedLineGraphSeries(Array(bgParabolaArrayPrediction.size) { i -> bgParabolaArrayPrediction[i] }).also {
it.setCustomPaint(Paint().also { paint ->
paint.style = Paint.Style.STROKE
paint.strokeWidth = 8f
paint.pathEffect = DashPathEffect(floatArrayOf(6f, 6f), 0f)
paint.color = rh.gac(ctx, app.aaps.core.ui.R.attr.bgParabolaColor)
})
}

// BGI
data.overviewData.minusBgiSeries = FixedLineGraphSeries(Array(bgiArrayHist.size) { i -> bgiArrayHist[i] }).also {
it.isDrawBackground = false
Expand Down