From e29d8f59f9eef24c9bccfae24693590fc9ad0d7d Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 12:32:00 +0100 Subject: [PATCH 01/16] Garmin sgv.json: add iob, cob and tbr --- .../main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt index 81b03f98c5..a65cdbee14 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt @@ -327,6 +327,9 @@ class GarminPlugin @Inject constructor( GlucoseUnit.MGDL -> jo.addProperty("units_hint", "mgdl") GlucoseUnit.MMOL -> jo.addProperty("units_hint", "mmol") } + jo.addProperty("iob", loopHub.insulinTotalOnboard) + jo.addProperty("tbr", loopHub.temporaryBasalPercent) + jo.addProperty("cob", loopHub.carbsOnboard) } joa.add(jo) } From beac0ecf1c3889e3850d70c8cadf82a87085a21c Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 12:34:43 +0100 Subject: [PATCH 02/16] Update LoopHub.kt: add iob, cob, tbr val --- .../kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt index 4b420d21f5..f2dc1b8a7f 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt @@ -20,6 +20,12 @@ interface LoopHub { /** Returns the remaining bolus insulin on board. */ val insulinOnboard: Double + /** Returns the remaining bolus and basal insulin on board. */ + val insulinTotalOnboard: Double + + /** Returns the remaining carbs on board. */ + val carbsOnboard: Double? + /** Returns true if the pump is connected. */ val isConnected: Boolean @@ -29,6 +35,9 @@ interface LoopHub { /** Returns the factor by which the basal rate is currently raised (> 1) or lowered (< 1). */ val temporaryBasal: Double + /** Returns the temporary basal rate in percent */ + val temporaryBasalPercent: String + /** Tells the loop algorithm that the pump is physically connected. */ fun connectPump() @@ -48,4 +57,4 @@ interface LoopHub { avgHeartRate: Int, device: String? ) -} \ No newline at end of file +} From b7dfa735c536d658d5b344ae17178947c92c25e6 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 12:35:21 +0100 Subject: [PATCH 03/16] Update LoopHubImpl.kt: add iob, cob, tbr --- .../aaps/plugins/sync/garmin/LoopHubImpl.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt index dfcf9dab37..0eabe78e4f 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt @@ -13,6 +13,7 @@ import app.aaps.core.interfaces.profile.ProfileFunction import app.aaps.core.interfaces.pump.DetailedBolusInfo import app.aaps.core.interfaces.queue.CommandQueue import app.aaps.core.interfaces.sharedPreferences.SP +import app.aaps.core.main.graph.OverviewData import app.aaps.database.ValueWrapper import app.aaps.database.entities.EffectiveProfileSwitch import app.aaps.database.entities.GlucoseValue @@ -42,6 +43,7 @@ class LoopHubImpl @Inject constructor( private val repo: AppRepository, private val userEntryLogger: UserEntryLogger, private val sp: SP, + private val overviewData: OverviewData, ) : LoopHub { @VisibleForTesting @@ -64,6 +66,15 @@ class LoopHubImpl @Inject constructor( override val insulinOnboard: Double get() = iobCobCalculator.calculateIobFromBolus().iob + /** Returns the remaining bolus and basal insulin on board. */ + override val insulinTotalOnboard :Double + get() = iobCobCalculator.calculateIobFromBolus().iob + iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().basaliob + + /** Returns the remaining carbs on board. */ + override val carbsOnboard: Double? + // get() = overviewData.cobInfo(iobCobCalculator).displayText(rh, decimalFormatter) ?: rh.gs(app.aaps.core.ui.R.string.value_unavailable_short) + get() = overviewData.cobInfo(iobCobCalculator).displayCob + /** Returns true if the pump is connected. */ override val isConnected: Boolean get() = !loop.isDisconnected @@ -83,6 +94,13 @@ class LoopHubImpl @Inject constructor( return if (apsResult == null) Double.NaN else apsResult.percent / 100.0 } + /** Returns the temporary basal rate in percent */ + override val temporaryBasalPercent: String + get() { + val apsResult = loop.lastRun?.constraintsProcessed + return if (apsResult == null) "--" else apsResult.percent.toString() + } + /** Tells the loop algorithm that the pump is physicallly connected. */ override fun connectPump() { repo.runTransaction( @@ -142,4 +160,4 @@ class LoopHubImpl @Inject constructor( ) repo.runTransaction(InsertOrUpdateHeartRateTransaction(hr)).blockingAwait() } -} \ No newline at end of file +} From a35a5b8be0d9bb046214e5378bfdd4d093438505 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 14:29:31 +0100 Subject: [PATCH 04/16] Code clean up --- .../src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt index 0eabe78e4f..aa8c3f7021 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt @@ -72,7 +72,6 @@ class LoopHubImpl @Inject constructor( /** Returns the remaining carbs on board. */ override val carbsOnboard: Double? - // get() = overviewData.cobInfo(iobCobCalculator).displayText(rh, decimalFormatter) ?: rh.gs(app.aaps.core.ui.R.string.value_unavailable_short) get() = overviewData.cobInfo(iobCobCalculator).displayCob /** Returns true if the pump is connected. */ From 3fcdad527518167c12d3a77fd7dd54946ef252bd Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 22:59:56 +0100 Subject: [PATCH 05/16] Fix Garmin Pugintest (missing iob, tbr, cob) --- .../app/aaps/plugins/sync/garmin/GarminPluginTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt index 6913ad4609..64f6c6de9f 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt @@ -227,7 +227,7 @@ class GarminPluginTest: TestBase() { listOf(createGlucoseValue( clock.instant().minusSeconds(100L), 99.3))) assertEquals( - """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol"}]""", + """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1}]""", gp.onSgv(mock(), createUri(mapOf()), null)) verify(loopHub).getGlucoseValues(clock.instant().minusSeconds(25L * 300L), false) verify(loopHub).glucoseUnit @@ -242,20 +242,20 @@ class GarminPluginTest: TestBase() { .map(Instant::ofEpochMilli) .mapIndexed { idx, ts -> createGlucoseValue(ts, 100.0+(10 * idx)) }.reversed()} assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"}]""", + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1}]""", gp.onSgv(mock(), createUri(mapOf("count" to "1")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(600L), false) assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"},""" + + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1},""" + """{"_id":"-2900000","device":"RANDOM","deviceString":"1969-12-31T23:55:10Z","sysTime":"1969-12-31T23:55:10Z","unfiltered":90.0,"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(900L), false) assertEquals( - """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol"},""" + + """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1},""" + """{"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2", "brief_mode" to "true")), null)) verify(loopHub, times(2)).getGlucoseValues( From 3f59d4eb669294c4ed8ecc954bf7d12cd0e41f6d Mon Sep 17 00:00:00 2001 From: swissalpine Date: Sun, 26 Nov 2023 23:28:35 +0100 Subject: [PATCH 06/16] Fix tests loophubtest.kt --- .../kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt index a88facfa05..85f30ce03a 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt @@ -10,9 +10,11 @@ import app.aaps.core.interfaces.iob.IobTotal import app.aaps.core.interfaces.logging.UserEntryLogger import app.aaps.core.interfaces.profile.Profile import app.aaps.core.interfaces.profile.ProfileFunction +import app.aaps.core.interfaces.profile.ProfileUtil import app.aaps.core.interfaces.pump.DetailedBolusInfo import app.aaps.core.interfaces.queue.CommandQueue import app.aaps.core.interfaces.sharedPreferences.SP +import app.aaps.core.main.graph.OverviewData import app.aaps.database.ValueWrapper import app.aaps.database.entities.EffectiveProfileSwitch import app.aaps.database.entities.GlucoseValue @@ -54,6 +56,8 @@ class LoopHubTest: TestBase() { @Mock lateinit var repo: AppRepository @Mock lateinit var userEntryLogger: UserEntryLogger @Mock lateinit var sp: SP + @Mock lateinit var overviewData: OverviewData + @Mock lateinit var profileUtil: ProfileUtil private lateinit var loopHub: LoopHubImpl private val clock = Clock.fixed(Instant.ofEpochMilli(10_000), ZoneId.of("UTC")) @@ -62,7 +66,7 @@ class LoopHubTest: TestBase() { fun setup() { loopHub = LoopHubImpl( aapsLogger, commandQueue, constraints, iobCobCalculator, loop, - profileFunction, repo, userEntryLogger, sp + profileFunction, repo, userEntryLogger, sp, overviewData, profileUtil ) loopHub.clock = clock } @@ -76,6 +80,8 @@ class LoopHubTest: TestBase() { verifyNoMoreInteractions(profileFunction) verifyNoMoreInteractions(repo) verifyNoMoreInteractions(userEntryLogger) + verifyNoMoreInteractions(overviewData) + verifyNoMoreInteractions(profileUtil) } @Test @@ -247,4 +253,4 @@ class LoopHubTest: TestBase() { samplingStart, samplingEnd, 101, "Test Device") verify(repo).runTransaction(InsertOrUpdateHeartRateTransaction(hr)) } -} \ No newline at end of file +} From bc5facc623a0004a9c8d4bb987e4cc0944930985 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Mon, 27 Nov 2023 02:44:07 +0100 Subject: [PATCH 07/16] Next try to fix test: Remove obsolet line --- .../test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt index 85f30ce03a..556d76e4d6 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt @@ -10,7 +10,6 @@ import app.aaps.core.interfaces.iob.IobTotal import app.aaps.core.interfaces.logging.UserEntryLogger import app.aaps.core.interfaces.profile.Profile import app.aaps.core.interfaces.profile.ProfileFunction -import app.aaps.core.interfaces.profile.ProfileUtil import app.aaps.core.interfaces.pump.DetailedBolusInfo import app.aaps.core.interfaces.queue.CommandQueue import app.aaps.core.interfaces.sharedPreferences.SP @@ -57,7 +56,6 @@ class LoopHubTest: TestBase() { @Mock lateinit var userEntryLogger: UserEntryLogger @Mock lateinit var sp: SP @Mock lateinit var overviewData: OverviewData - @Mock lateinit var profileUtil: ProfileUtil private lateinit var loopHub: LoopHubImpl private val clock = Clock.fixed(Instant.ofEpochMilli(10_000), ZoneId.of("UTC")) @@ -81,7 +79,6 @@ class LoopHubTest: TestBase() { verifyNoMoreInteractions(repo) verifyNoMoreInteractions(userEntryLogger) verifyNoMoreInteractions(overviewData) - verifyNoMoreInteractions(profileUtil) } @Test From 68720cb2da4ea84aa1e032d004367991c9a96ba6 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Mon, 27 Nov 2023 03:12:02 +0100 Subject: [PATCH 08/16] Fix Tests: One argument left to delete --- .../src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt index 556d76e4d6..bd52555191 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt @@ -64,7 +64,7 @@ class LoopHubTest: TestBase() { fun setup() { loopHub = LoopHubImpl( aapsLogger, commandQueue, constraints, iobCobCalculator, loop, - profileFunction, repo, userEntryLogger, sp, overviewData, profileUtil + profileFunction, repo, userEntryLogger, sp, overviewData ) loopHub.clock = clock } From 9b2441f4577727d173c4a1928cb4ecb1300861a2 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:44:42 +0100 Subject: [PATCH 09/16] Rework tbr --- .../kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt index a65cdbee14..1a37a3ae4b 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminPlugin.kt @@ -327,8 +327,13 @@ class GarminPlugin @Inject constructor( GlucoseUnit.MGDL -> jo.addProperty("units_hint", "mgdl") GlucoseUnit.MMOL -> jo.addProperty("units_hint", "mmol") } - jo.addProperty("iob", loopHub.insulinTotalOnboard) - jo.addProperty("tbr", loopHub.temporaryBasalPercent) + jo.addProperty("iob", loopHub.insulinOnboard + loopHub.insulinBasalOnboard) + loopHub.temporaryBasal.also { + if (!it.isNaN()) { + val temporaryBasalRateInPercent = (it * 100.0).toInt() + jo.addProperty("tbr", temporaryBasalRateInPercent) + } + } jo.addProperty("cob", loopHub.carbsOnboard) } joa.add(jo) From 1e13237a5bb2dad5bd9f6a556c3d6e59a7e3dd87 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:46:35 +0100 Subject: [PATCH 10/16] Rework --- .../kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt index f2dc1b8a7f..5d4ac7dbd9 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt @@ -20,8 +20,8 @@ interface LoopHub { /** Returns the remaining bolus insulin on board. */ val insulinOnboard: Double - /** Returns the remaining bolus and basal insulin on board. */ - val insulinTotalOnboard: Double + /** Returns the basal insulin on board. */ + val insulinBasalOnboard: Double /** Returns the remaining carbs on board. */ val carbsOnboard: Double? @@ -35,9 +35,6 @@ interface LoopHub { /** Returns the factor by which the basal rate is currently raised (> 1) or lowered (< 1). */ val temporaryBasal: Double - /** Returns the temporary basal rate in percent */ - val temporaryBasalPercent: String - /** Tells the loop algorithm that the pump is physically connected. */ fun connectPump() @@ -51,6 +48,9 @@ interface LoopHub { /** Notifies the system that carbs were eaten and stores the value. */ fun postCarbs(carbohydrates: Int) + /** Stores or cancels a temptarget. */ + fun postTempTarget(target: Double, duration: Int) + /** Stores hear rate readings that a taken and averaged of the given interval. */ fun storeHeartRate( samplingStart: Instant, samplingEnd: Instant, From e6c9e13d510a723d7aab1aebf018d7350b5b8de8 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:48:38 +0100 Subject: [PATCH 11/16] Rework --- .../app/aaps/plugins/sync/garmin/LoopHubImpl.kt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt index aa8c3f7021..1e9f19ae7f 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHubImpl.kt @@ -67,8 +67,8 @@ class LoopHubImpl @Inject constructor( get() = iobCobCalculator.calculateIobFromBolus().iob /** Returns the remaining bolus and basal insulin on board. */ - override val insulinTotalOnboard :Double - get() = iobCobCalculator.calculateIobFromBolus().iob + iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().basaliob + override val insulinBasalOnboard :Double + get() = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().basaliob /** Returns the remaining carbs on board. */ override val carbsOnboard: Double? @@ -93,13 +93,6 @@ class LoopHubImpl @Inject constructor( return if (apsResult == null) Double.NaN else apsResult.percent / 100.0 } - /** Returns the temporary basal rate in percent */ - override val temporaryBasalPercent: String - get() { - val apsResult = loop.lastRun?.constraintsProcessed - return if (apsResult == null) "--" else apsResult.percent.toString() - } - /** Tells the loop algorithm that the pump is physicallly connected. */ override fun connectPump() { repo.runTransaction( From 46c5e82e6cf205efb14eaf5d1525284a14c9420e Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:49:54 +0100 Subject: [PATCH 12/16] Fix tests --- .../aaps/plugins/sync/garmin/GarminPluginTest.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt index 64f6c6de9f..a99668daae 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt @@ -57,6 +57,10 @@ class GarminPluginTest: TestBase() { @AfterEach fun verifyNoFurtherInteractions() { verify(loopHub, atMost(2)).currentProfileName + verify(loopHub, atMost(3)).insulinOnboard + verify(loopHub, atMost(3)).insulinBasalOnboard + verify(loopHub, atMost(3)).temporaryBasal + verify(loopHub, atMost(3)).carbsOnboard verifyNoMoreInteractions(loopHub) } @@ -227,8 +231,8 @@ class GarminPluginTest: TestBase() { listOf(createGlucoseValue( clock.instant().minusSeconds(100L), 99.3))) assertEquals( - """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1}]""", - gp.onSgv(mock(), createUri(mapOf()), null)) + """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0}]""", + gp.onSgv(mock(), createUri(mapOf()), null)) verify(loopHub).getGlucoseValues(clock.instant().minusSeconds(25L * 300L), false) verify(loopHub).glucoseUnit } @@ -242,20 +246,20 @@ class GarminPluginTest: TestBase() { .map(Instant::ofEpochMilli) .mapIndexed { idx, ts -> createGlucoseValue(ts, 100.0+(10 * idx)) }.reversed()} assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1}]""", + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0}]""", gp.onSgv(mock(), createUri(mapOf("count" to "1")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(600L), false) assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1},""" + - """{"_id":"-2900000","device":"RANDOM","deviceString":"1969-12-31T23:55:10Z","sysTime":"1969-12-31T23:55:10Z","unfiltered":90.0,"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0},""" + + """{"_id":"-2900000","device":"RANDOM","deviceString":"1969-12-31T23:55:10Z","sysTime":"1969-12-31T23:55:10Z","unfiltered":90.0,"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(900L), false) assertEquals( - """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":4.8,"tbr":"120","cob":12.1},""" + + """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0},""" + """{"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2", "brief_mode" to "true")), null)) verify(loopHub, times(2)).getGlucoseValues( From dad61d5a3704806822cde51c04218308d0ec53c5 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:51:36 +0100 Subject: [PATCH 13/16] Fix tests --- .../aaps/plugins/sync/garmin/LoopHubTest.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt index bd52555191..acdf58d391 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt @@ -81,7 +81,7 @@ class LoopHubTest: TestBase() { verifyNoMoreInteractions(overviewData) } - @Test +@Test fun testCurrentProfile() { val profile = mock(Profile::class.java) `when`(profileFunction.getProfile()).thenReturn(profile) @@ -112,6 +112,22 @@ class LoopHubTest: TestBase() { verify(iobCobCalculator, times(1)).calculateIobFromBolus() } + @Test + fun testBasalOnBoard() { + val iobBasal = IobTotal(time = 0).apply { basaliob = 23.9 } + `when`(iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended()).thenReturn(iobBasal) + assertEquals(23.9, loopHub.insulinBasalOnboard, 1e-10) + verify(iobCobCalculator, times(1)).calculateIobFromTempBasalsIncludingConvertedExtended() + } + + @Test + fun testCarbsOnBoard() { + val cobInfo = CobInfo(0, 12.0, 0.0) + `when`(overviewData.cobInfo(iobCobCalculator)).thenReturn(cobInfo) + assertEquals(12.0, loopHub.carbsOnboard) + verify(overviewData, times(1)).cobInfo(iobCobCalculator) + } + @Test fun testIsConnected() { `when`(loop.isDisconnected).thenReturn(false) From aecde2032e06b5b3f20d3cc530c047cb69794183 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 11:54:51 +0100 Subject: [PATCH 14/16] Delete unfinished function --- .../src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt index 5d4ac7dbd9..ebd8ac209b 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/LoopHub.kt @@ -48,9 +48,6 @@ interface LoopHub { /** Notifies the system that carbs were eaten and stores the value. */ fun postCarbs(carbohydrates: Int) - /** Stores or cancels a temptarget. */ - fun postTempTarget(target: Double, duration: Int) - /** Stores hear rate readings that a taken and averaged of the given interval. */ fun storeHeartRate( samplingStart: Instant, samplingEnd: Instant, From 3ce6280e4c7220e081dae843d943f8650e769be5 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 12:14:26 +0100 Subject: [PATCH 15/16] Add missing import --- .../src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt index acdf58d391..c96bcaee4b 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/LoopHubTest.kt @@ -5,6 +5,7 @@ import app.aaps.core.interfaces.aps.Loop import app.aaps.core.interfaces.constraints.Constraint import app.aaps.core.interfaces.constraints.ConstraintsChecker import app.aaps.core.interfaces.db.GlucoseUnit +import app.aaps.core.interfaces.iob.CobInfo import app.aaps.core.interfaces.iob.IobCobCalculator import app.aaps.core.interfaces.iob.IobTotal import app.aaps.core.interfaces.logging.UserEntryLogger From 4d504e60cdfbf722315ba9abd98c9b985a4a5088 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 30 Nov 2023 15:47:39 +0100 Subject: [PATCH 16/16] Add values to onSGV tests --- .../plugins/sync/garmin/GarminPluginTest.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt index a99668daae..447788146e 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminPluginTest.kt @@ -225,13 +225,17 @@ class GarminPluginTest: TestBase() { } @Test - fun onSgv_NoDelta() { +fun onSgv_NoDelta() { whenever(loopHub.glucoseUnit).thenReturn(GlucoseUnit.MMOL) + whenever(loopHub.insulinOnboard).thenReturn(2.7) + whenever(loopHub.insulinBasalOnboard).thenReturn(2.5) + whenever(loopHub.temporaryBasal).thenReturn(0.8) + whenever(loopHub.carbsOnboard).thenReturn(10.7) whenever(loopHub.getGlucoseValues(any(), eq(false))).thenReturn( listOf(createGlucoseValue( clock.instant().minusSeconds(100L), 99.3))) assertEquals( - """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0}]""", + """[{"_id":"-900000","device":"RANDOM","deviceString":"1969-12-31T23:58:30Z","sysTime":"1969-12-31T23:58:30Z","unfiltered":90.0,"date":-90000,"sgv":99,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":5.2,"tbr":80,"cob":10.7}]""", gp.onSgv(mock(), createUri(mapOf()), null)) verify(loopHub).getGlucoseValues(clock.instant().minusSeconds(25L * 300L), false) verify(loopHub).glucoseUnit @@ -240,26 +244,31 @@ class GarminPluginTest: TestBase() { @Test fun onSgv() { whenever(loopHub.glucoseUnit).thenReturn(GlucoseUnit.MMOL) + whenever(loopHub.insulinOnboard).thenReturn(2.7) + whenever(loopHub.insulinBasalOnboard).thenReturn(2.5) + whenever(loopHub.temporaryBasal).thenReturn(0.8) + whenever(loopHub.carbsOnboard).thenReturn(10.7) whenever(loopHub.getGlucoseValues(any(), eq(false))).thenAnswer { i -> val from = i.getArgument(0) fromClosedRange(from.toEpochMilli(), clock.instant().toEpochMilli(), 300_000L) .map(Instant::ofEpochMilli) .mapIndexed { idx, ts -> createGlucoseValue(ts, 100.0+(10 * idx)) }.reversed()} assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0}]""", + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":5.2,"tbr":80,"cob":10.7}]""", gp.onSgv(mock(), createUri(mapOf("count" to "1")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(600L), false) + assertEquals( - """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0},""" + + """[{"_id":"100000","device":"RANDOM","deviceString":"1970-01-01T00:00:10Z","sysTime":"1970-01-01T00:00:10Z","unfiltered":90.0,"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":5.2,"tbr":80,"cob":10.7},""" + """{"_id":"-2900000","device":"RANDOM","deviceString":"1969-12-31T23:55:10Z","sysTime":"1969-12-31T23:55:10Z","unfiltered":90.0,"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2")), null)) verify(loopHub).getGlucoseValues( clock.instant().minusSeconds(900L), false) assertEquals( - """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":0.0,"tbr":0,"cob":0.0},""" + + """[{"date":10000,"sgv":130,"delta":10,"direction":"Flat","noise":4.5,"units_hint":"mmol","iob":5.2,"tbr":80,"cob":10.7},""" + """{"date":-290000,"sgv":120,"delta":10,"direction":"Flat","noise":4.5}]""", gp.onSgv(mock(), createUri(mapOf("count" to "2", "brief_mode" to "true")), null)) verify(loopHub, times(2)).getGlucoseValues(