Skip to content

Backport the Omnipod BLE Heartbeat API from next-dev - #118

Open
marionbarker wants to merge 26 commits into
devfrom
ble-heartbeat
Open

Backport the Omnipod BLE Heartbeat API from next-dev#118
marionbarker wants to merge 26 commits into
devfrom
ble-heartbeat

Conversation

@marionbarker

Copy link
Copy Markdown
Contributor

Purpose

Backport to the dev branch the new BLE management scheme developed under the loopkitdev GitHub user name for next-dev branch.

This requires updates to LoopKit, which are merged to LoopKit/LoopKit dev and works best with updates to Loop, which are merged to LoopKit/Loop dev.

This was extensively tested by a few users and several test configurations.

Tests

There will be additional tests while this is a PR.

Prior History

There were extensive tests found in the following PR.

initial next-dev code changes and testing are found in these PR

code changes and testing of the backport to dev from next-dev are found in these PR

Commit history

There were several hot fixes that were applied to multiple open testing branches. The commit history is rather tortuous, but the code changes are clean.

marionbarker and others added 25 commits June 6, 2026 13:24
…ests

UnfinalizedDose's bolus initializer gained a required decisionId: UUID?
parameter; the source call sites were updated but
testBolusFinishedEarlyOnPodIsMarkedNonMutable was missed, so the
OmniTests target failed to compile ("missing argument for parameter
'decisionId'"). Passes decisionId: nil, matching the other test/source
call sites.
CryptoSwift 1.9.0 removed its `Data.bytes -> [UInt8]` extension (renamed
to `byteArray`). On the Xcode 26 SDK, `data.bytes` then resolves to
Foundation's new native `Data.bytes`, which returns a `RawSpan` -
breaking every crypto call site with errors like:

  Cannot convert value of type 'RawSpan' to expected argument type 'Array<UInt8>'
  Value of type 'RawSpan' has no member 'toHexString'

Builds pinned to CryptoSwift <= 1.8.5 are unaffected, so this only bites
users whose package resolution floats up to 1.9.0/1.10.0 (e.g. after
'Update to Latest Package Versions').

Replace `<data>.bytes` with `Array(<data>)`, which yields the same
[UInt8] and compiles against every CryptoSwift version (and doesn't
depend on CryptoSwift at all). Verified building OmnipodKit against
CryptoSwift 1.10.0 on Xcode 26.5.
CryptoSwift 1.9.0 removed its `Data.bytes -> [UInt8]` extension (renamed
to `byteArray`). On the Xcode 26 SDK, `data.bytes` then resolves to
Foundation's new native `Data.bytes`, which returns a `RawSpan` -
breaking every crypto call site with errors like:

  Cannot convert value of type 'RawSpan' to expected argument type 'Array<UInt8>'
  Value of type 'RawSpan' has no member 'toHexString'

Builds pinned to CryptoSwift <= 1.8.5 are unaffected, so this only bites
users whose package resolution floats up to 1.9.0/1.10.0 (e.g. after
'Update to Latest Package Versions').

Replace `<data>.bytes` with `Array(<data>)`, which yields the same
[UInt8] and compiles against every CryptoSwift version (and doesn't
depend on CryptoSwift at all). Verified building OmnipodKit against
CryptoSwift 1.10.0 on Xcode 26.5.
Use Array(data) instead of Data.bytes for CryptoSwift 1.9+ compatibility
Fix OmniTests: pass decisionId to UnfinalizedDose
hotfix loop-next-dev: Disable TBR enforcement as a workaround with mismatched basal limits
Update loop-next-dev to support Omnipod 5 Pods with token
fix for loop-next-dev: Properly handle and display times for DASH reset type pod faults
Commit f6d56f9 made DetailedStatus return nil (not 0.0) when the fault time is 0x0000, since that
is a DASH reset-fault sentinel rather than a valid time. Update the two tests that still asserted
0.0 (testPodInfoNoFaultAlerts, testPodInfoDuringPriming) to XCTAssertNil, matching the intended
behavior. Fixes the OmniTests failures blocking LoopWorkspace next-dev CI.
f6d56f9 made DetailedStatus return nil (not 0.0) when the fault time is 0x0000, a DASH reset-fault
sentinel rather than a valid time. Update the two tests still asserting 0.0 (testPodInfoNoFaultAlerts,
testPodInfoDuringPriming) to XCTAssertNil, matching the intended behavior.
OmniTests: faultEventTimeSinceActivation is nil for 0x0000 fault time
…-RileyLink

Fix for loop-next-dev branch: Remove unneeded reference to release RLs when switching pump types
When no host refreshes the reading schedule — an app that only calls the legacy
setMustProvideBLEHeartbeat sets the heartbeat target once and never updates it —
the fixed target goes chronically overdue, so every StartDelay probe pins to
heartbeatMinDelaySeconds (the 60s floor). That ~60s background wake cadence is ~5x
the intended ~interval cadence, burns the iOS background execution budget, and
gets the app suspended for long stretches (Trio field report on LoopKit/LoopKit#599:
99% of heartbeat intervals were 61s, with six 16–128 min suspension gaps).

Track the reading interval and when the target was last set. When the target
hasn't been refreshed within ~1.5 reading intervals, advance it by whole intervals
in issueDelayedConnectProbe so we hold the expected ~interval cadence. A host that
refreshes the schedule every reading (Loop) keeps the set-at timestamp fresh, so
its floor-based late-reading retry is unaffected.

Scheduler simulation: set-once host 60s -> 300s; per-reading-refresh host 300s
unchanged; a single late reading still retries at the floor.
Heartbeat: advance a stale target instead of collapsing to the 60s floor

@itsmojo itsmojo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@marionbarker

Copy link
Copy Markdown
Contributor Author

Test

✅ successful continuation of Loop dev with BLE backport on SE 2nd gen phone

Use LoopWorkspace branch update_dev_to_3.14.4, commit 2bf6a99.

  • this branch was updated today to include the backported code changes in Loop, LoopKit and OmnipodKit

Build to the SE 2nd gen phone which is connected to an Omnipod 5 pod and is using Nightscout as a CGM.

✅ It continues to loop while locked.

  • let this run for the rest of the day
  • each time I unlocked this phone it was connected to the Omnipod 5 pod
  • last report for this comment was at 20:40.

But- had issues on the SE 3rd gen phone - write those up as another comment.

@marionbarker

Copy link
Copy Markdown
Contributor Author

Test with Trio and Loop next-dev on SE 3rd gen phone

❌ there were frequent times when Trio stopped looping while locked - we need to look into those. Is there another modification needed for Trio?
❌ there were a few instances when the next-dev Loop app on the same test phone stopped looping while locked.
✅ The fault alert worked for Omnipod 5 reaching 80 hours

Trio timeline

I don't have the timeline down 100%. But I was running a backport version of Trio, test case 3 from this comment: #117 (comment)

Around 12:30, I happened to notice a Trio not looping alert and unlocked the phone.
There was a critical comms loss during an insulin delivery event.
I used every trick to try and restore comms with the Omnipod 5 Pod.

  • cycle Bluetooth
  • quit/restarted app
  • rebooted phone
  • built a fresh version of the app making 100% sure I had the correct SHA for the submodules
  • at the same time, I had been trying the rPi that doesn't quite work properly as an Omnipod 5 simulator and that may or may not have caused an issue - I quit the rPi, but I was messing around with a test on a different phone at the same time.
  • I was about ready to discard the pod when it came back
  • In the csv file attached below, you can see many attempts to reach the pod:
    • starting at UTC: 2026-07-28 19:32:19 (right after a cancel temp basal)
    • ending at UTC: 2026-07-28 19:40:07 when an 0x1d finally came back from the pod
    • the reboot must have happened around 2026-07-28 19:34:35, when there was a 3-minute gap in attempts to reach the pod

Several other times during the afternoon I noticed Trio not looping message on the lock screen.

  • when I unlocked the phone, I could see the pod reconnect, but it was clearly not looping while locked

I captured a few notes with time stamps after this - transcribing here:

Note at 17:40
It has my oldest Omnipod 5 on it - manuf April 2023. It could be the pod. I'm not sure how to tell.

I just confirmed I have all the right branches and built again to the phone:

SE 3rd gen running iOS 26, Omnipod 5 Pod, Nightscout as a CGM
The looping stats say 166 loops and 210 CGM readings - so definitely down from yesterday.

At 17:35, disabled auto-lock and leave phone unlocked with Trio in foreground for at least half and hour

Note at 18:15
18:12 - Trio phone kept looping while in foreground and phone open.
18:13 - lock the phone and come back later to check.

Note at 20:10
Both Loop and Trio showed no signal with I unlocked at 20:08.
They both connected right away/

I'm looking to see if there are app limits anywhere on the phone - not finding them.

Locked phone again to wait for the 80 hour fault to hit.
The new fault detection should wake up the phone for an fault.

Note at 20:44
Alarm at 20:32.

  • ✅ I can see Pod Expired. Insulin Delivery Stopped alert showing on the lock screen before unlocking.
    Unlocked and opened app and deactivated the pod.

Trio log

20260728_2106_Trio_ble-heartbeat_o5_log.txt.zip

Trio csv file

podState_Marion_backport-ble_20260728_1.csv

Loop next-dev testing

A few times when I unlocked the phone to check on the Trio app, I noticed the Loop next-dev app was also showing not looping.

I noticed this a few times and it can be seen in the csv file. There were 3 instances of > 1000 sec today and there was one yesterday too. The recovery times are:

  • 2026-07-28 21:32:45
  • 2026-07-29 02:08:34
  • 2026-07-29 02:41:44
  • 2026-07-29 03:07:49

Loop Report

csv file

@marionbarker

marionbarker commented Jul 29, 2026

Copy link
Copy Markdown
Contributor Author

Test Status for Loop BLE Backport

✅ This test instance behaves nominally with no loss of signal wrt the Pod while phone was locked.

Check the results for the Loop BLE Backport test (test case 1 from this comment: #117 (comment))

  • started with ble-backport on SE 2nd gen phone running iOS 18, Omnipod 5, Nightscout as CGM
  • after updating LoopWorkspace branch update_dev_to_3.14.4 on 2026-07-28, rebuilt that version onto this phone

There are no instances of gaps in deltaSec > 1000 sec between commands.
When examining gaps > in deltaSec > 180 sec, the statistics are nominal with gaps of 300 or 600 sec.
The glucose uploaded to Nightscout had periods of oscillation with long periods of flat glucose.

Spot check:

  • periods of flat glucose correspond with the 600 sec (10 min) gaps
  • periods of rapid glucose change correspond with 300 sec (5 min) gaps

Statistics Table:

test # test description podActiveTime
hrs
min max average median
1 Loop dev backport 65.4 194 651 500 598

Data files

I'll wait until this pod completes before uploading final data files to this PR. Data is saved locally.

  • Shared Loop Report dev-backport-o5 2026-07-29 05:36:31-07:00.md
  • Parsed the Phone/Pod messages (csv file) to get the statistics reported above

@marionbarker

marionbarker commented Jul 29, 2026

Copy link
Copy Markdown
Contributor Author

Test Status for Loop next-dev with new BLE heartbeat method

✅ This test instance had no new anomalies since yesterday

Check the results for the Loop next-dev with new BLE heartbeattest (test case 2 from this comment: #117 (comment))

  • SE 3rd gen running iOS 26.5.2, Omnipod DASH (Atlas), Nightscout as a CGM
  • last build date: Tue Jul 28 08:43:08 PDT 2026, UTC 2026-07-28 15:43:08
  • LoopWorkspace SHA: 0621dbc
    • Loop, b2027e1
    • LoopKit, c9b0c93
    • OmnipodKit, d3a55a4

There were no new instances of gaps in deltaSec > 1000 sec between commands after UTC 2026-07-29 03:07:49.
When examining gaps > in deltaSec > 180 sec and < 1000, the statistics are nominal with gaps of 300 or 600 sec and a few at 900 sec.
The glucose uploaded to Nightscout had periods of oscillation with long periods of flat glucose.

Statistics Table:

test # test description podActiveTime
hrs
min max average median
2 Loop next-dev 65.4 182 903 388 300

Data files

I'll wait until this pod completes before uploading final data files to this PR. Data is saved locally.

  • Shared Loop Report next-dev-dash 2026-07-29 08:14:18-07:00.md
  • Parsed the Phone/Pod messages (csv file) to get the statistics reported above

@marionbarker

Copy link
Copy Markdown
Contributor Author

Statistics check for iAPS test case 4

✅ This test instance behaves nominally with no loss of signal wrt the Pod while phone was locked.

Details

Check the results for the iAPS dev 2nd gen iOS 18 phone with new BLE heartbeat, Omnipod 5 pod, Nightscout as a CGM (test case 4 from this comment: #117 (comment))

Data harvested this morning with file name: 20260729-0535_iAPS_dev-backport-o5.txt (concatenated all log files so contains all Omnipod 5 results). There are no times when the app stopped looping while locked.
The time between pod exchanges are longer than for Loop or Trio. See graphic below.

Statistics Table:

test # test description podActiveTime
hrs
min max average median
3 iAPS dev backport 35.9 274 678 432 331

Histogram of intervals between phone-pod message exchanges

Screenshot 2026-07-29 at 2 46 41 PM

Data files

I'll wait until this pod completes before uploading final data files to this PR. Data is saved locally.

@marionbarker

Copy link
Copy Markdown
Contributor Author

Final Reports Loop: test cases 1 and 2

When each pod reached 80 hours, Issue the Loop Report and parse the messages.
The average gap between communication was different for test case 1 and test case 2 even though both phones were using the same input Nightscout profile. But the therapy settings were different between the two phones.

Test Case 1: Loop dev backport:

The Loop backport: Omnipod 5, SE 2nd gen, iOS 18, test 1 Pod hit 80 hours first.
✅ The Fault alert worked again.
✅ With one exception, the groupings for pod connection were around 300 or 600 sec for the 80 hours

  • There may have been one time when pod did not wake or maybe phone was not with the pod

Test Case 2: Loop next-dev, with last 8 hours running dev backport

The Loop next-dev phone, final configuration was dev backport
Atlas DASH, SE 3rd gen, iOS 26
The response for showing the fault was not as fast as for Omnipod 5. The phone was unlocked and as soon as I brought Loop to foreground, the fault modal showed up.
✅ The Fault alert worked again.
❓ There were several exceptions when the phone stopped looping while locked - for the most part, the groupings for pod connection were around 300 or 600 sec for the 80 hours

Configuration for test case 1

Omnipod 5, SE 2nd gen, iOS 18, Nightscout as a CGM

Final config (rebuild after PR 117 was merged):

  • buildDateString: Tue Jul 28 14:28:51 PDT 2026
  • Workspace branch: update_dev_to_3.14.4
  • Workspace SHA: 5727b6c
  • Submodule name: branch, SHA
  • Loop: dev, 3894e1a
  • LoopKit: dev, a5beee9
  • OmnipodKit: ble-heartbeat, fa5afdb

Configuration for test case 2

Atlas DASH, SE 3rd gen, iOS 26, Nightscout as a CGM

For the first 72 hours, the configuration was LoopWorkspace next-dev (before and after merging OmnipodKit PR 117)
Last 8 hours, same configuration as test case 1 phone (dev backport)
At the same time, I decreased the basal rate from 1.2 U/hr to 0.6 U/hr to make sure the pod would last to 80 hours.

Statistics for case 1 and 2 (both Loop)

Statistics Table:

test # test description phone podActiveTime
hrs
min max average median filter
1 Loop dev backport 2nd gen iOS 18 80 194 1105 505 598 deltaSec > 180 sec
2 Loop next-dev
dev backport
3rd gen iOS 26 80 182 903 378 300 deltaSec > 180 sec &&
< 1200

test case 1: Details for deltaSec > 1000

Look at the one outlier for case 1, was at UTC 2026-07-29 16:05:39
This was during a time when I was moving pods and phones around but pretty sure I was keeping the pods with the correct phone at all times.

Examine lines just before in the log:

* 2026-07-29 15:47:19 +0000 Omni 002A05FD connection Pod disconnected 89BDE627-0078-8C6C-41BF-CBEED7B92107 nil
* 2026-07-29 15:47:19 +0000 Omni 002A05FD connection [scan] armed filter=[CE1F923D-C539-48EA-7300-0A002A05FC02] lowPowerMonitor=true allowDuplicates=false
* 2026-07-29 15:47:19 +0000 Omni 002A05FD connection [delayedConnect] pid=2551 everFg=true issuing connect StartDelay=224s
* 2026-07-29 16:05:32 +0000 Omni 002A05FD connection [delayedConnect] pid=2551 everFg=true CONNECTED after 1092.7s (StartDelay=224s) — heartbeat wake
* 2026-07-29 16:05:32 +0000 Omni 002A05FD connection Pod disconnected 89BDE627-0078-8C6C-41BF-CBEED7B92107 nil

test case 2: Details for deltaSec > 1000

There was one additional time, in addition to the 4 previously noted in earlier comments. Consolidate the list here.

2026-07-28 21:32:45
2026-07-29 02:08:34
2026-07-29 02:41:44
2026-07-29 03:07:49
2026-07-29 16:45:43

Log files:

csv files:

@marionbarker

Copy link
Copy Markdown
Contributor Author

Status for personal phone testing

✅ Using next-dev, Pod Keep Alive works as designed

  • Note - the next-dev code is replicated in this PR to backport the method to the dev branch
  • I built the latest version of next-dev on this phone multiple times as updates for other items were made available

This was an inadvertent test. I forgot that I set PKA to Silent Tune and left it on for a previous Atlas DASH pod and an entire SAW DASH pod

  • 2026-07-20 at 10:14 PDT disable Pod Keep Alive about 28 hours into the next SAW DASH pod
  • future reports from this phone can be used for the BLE connect on demand testing with a G7 CGM

Keep Alive statistics

The Loop Report was processed and statistics obtained. Using the same table format as before, the results are shown. The expected cadence between Phone-Pod communications with PKA set to Silent Tunes is 160 sec (2m 40s).

test # test description phone podActiveTime
hrs
min max average median filter
personal Loop next-dev 15 pro, iOS 26 80 101 726 157 160 deltaSec > 100 sec

@marionbarker

Copy link
Copy Markdown
Contributor Author

Update

A modification was needed for Trio to take advantage of the new BLE heartbeat.

  • ✅ Once the update was made, 2026-07-30 at 13:00 PDT, the Trio instance is looping while locked
  • of course, we need to collect more data

Modification Details

The Trio code under test is a combination of a PR that needs to be tested plus the changes needed for using the BLE heartbeat.

Configuration

SE 3rd gen phone running iOS 26.5.2

  • Omnipod 5 Pod, started at 2026-07-29 at 21:39 PDT
  • Nightscout as a CGM
  • Upload to Nightscout URL
  • Share data to Apple Health
  • 2026-07-30 13:00 update with Trio modifications
  • 2026-07-30 13:25 - delete Tidepool from Loop; 13:27 add Tidepool Service to Trio

Download the code for PR 1300 (branch is finalized-pump-events)

git fetch dnzxy
git switch finalized-pump-events
git pull
git switch -c test-pr1300_plus_ble_backport

Merge most recent dev at the time to test-pr1300_plus_ble_backport

git switch dev
git pull
git switch test-pr1300_plus_ble_backport
git merge dev

Point to the latest LoopKit and OmnipodKit code with the heartbeat modifications

cd LoopKit; git fetch; git switch dev; git pull

LoopKit SHA is a5beee96

cd OmnipodKit; git fetch; git switch ble-heartbeat; git pull

OmnipodKit SHA is 0d1bb36

commit changes to new branch and push to docs-test

At this point, paired Omnipod 5, but this does not loop while locked.
This version does not work because it does not have the required Trio changes.

Bring in changes to Trio and push to docs-test

These updates were made around 2026-07-30 13:00 PDT

git remote add trioneer-dev https://github.com/trioneer-dev/Trio
git fetch trioneer-dev
git switch feat/omnipod-ble-heartbeat
git pull
git switch test-pr1300_plus_ble_backport
git cherry-pick 562e5fc7f
git cherry-pick 29dd825ab

Link for the version under test:

https://github.com/docs-test/Trio/tree/test-pr1300_plus_ble_backport

@marionbarker

Copy link
Copy Markdown
Contributor Author

Last Configuration

✅ Last configuration (with modification of Trio) works as expected

Used the configuration in #118 (comment) with Trio requesting OmnipodKit provide a heartbeat

  • Start Time
  • Issue log
    • save locally as 20260730_1618_Trio_ble-heartbeat117-withTrio-mod_log.txt
    • examine csv file statistics from UTC 20:30 through 23:18
    • ✅ nominal statistics
test # test description min max average median filter
prior config Trio backport 277 620 400 302 deltaSec > 180 sec

@marionbarker

Copy link
Copy Markdown
Contributor Author

Test Summary

✅ Successful Initial test:

Test of PR 121

Configuration

There is a new PR that does not require the changes to Trio to work with the phone locked. Putting the test case here to keep the configuration changes in one place.

Revert the changes to Trio and add the changes from PR #121 to the Trio test phone.

Details

Start with test-pr1300_plus_ble_backport, commit 386200087
Revert the two Trio heartbeat changes.

git checkout 5d55cda2d
git switch -c test_omnipodkit_pr121
cd OmnipodKit
git fetch loopkitdev
git switch heartbeat-delegate-pull
cd ..

Build on to the same test phone: Trio, SE 3rd gen, iOS 26, Omnipod 5 Pod, Nightscout as a CGM

  • 2026-07-30 16:33 is start of new configuration
  • 2026-07-30 16:38, lock phone

@marionbarker

marionbarker commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

Final Harvest of the iAPS test case 4

✅ This one appears to have looped while locked for the 80 hours except for two short instances

Initial configuration 2026-07-27

iAPS dev commit 350617185 (fix: in DeviceDataManager - receive events from appCoordinator.heartbeat on the processQueue. (pr 1978))

  • Modifications: used the not-yet merged version of LoopKit dev before PR 599 was merged and the not-yet finalized OmnipodKit PR 117
    • LoopKit: loopdevkit/LoopKit: backport/pump-ble-heartbeat-api-dev, commit e32e2f65
    • OmnipodKit: loopandlearn/OmnipodKit: ble-heartbeat before PR 117 was merged, at commit 1fa0648 and applied a patch that was at an earlier commit than the final commit
    • upload the patch that I applied (matches PR 117):

Paired pod at 2026-07-27 17:32:46 (PDT)
Pod hit 80 hours at 2026-07-31 01:34:09 (PDT)
Pod deactivated at 2026-07-31 04:52:57 (PDT)

Updated configuration 2026-07-30

IAPS dev commit c19413189 (commits were update POD activation/expiry, pr 1980; translations)

  • Modifications: used the merged version for LoopKit (after PR 599) and the in-process version of PR 121

    • LoopKit: point to LoopKit/LoopKit dev branch: a5beee96
    • OmnipodKit: point to loopkitdev/OmnipodKit branch heartbeat-delegate-pull, 43fcf8f0
    • This build hung - looks like the app kept going
  • Modifications: restore the original configuration

    • I may have forgotten to lock the phone after the rebuild
    • I think the phone was unlocked when I checked it this morning (2026-07-31 after pod expired)

Log of entire history of pod

iaps-logs-20260731_full_o5_ble-backport.txt.zip

csv of entire history of pod

Note - I need to tweak the parser a bit - it did not put the very first exchange into the csv file.
Note - when the parser is used on iAPS files, the output csv files are in local time.

podState_Marion_test-iAPS_20260727_1.csv

Statistics

There were 2 instances when these was delay in the communication groupings between phone and pod; note the time stamps for any deltaSec > 1000; need to examine these in detail (that was at a time when I was moving pods and phones around and testing an rPi Omnipod 5 simulator that is not working)

  • 2026-07-29 09:07:56, gap was 1428 sec
  • 2026-07-29 09:45:20, gap was 1690 sec
  • 2026-07-31 04:52:57, gap of 11,928 sec from time pod hit 80 hours and when I deactivated the pod

Statistics results

test # test description phone podActiveTime
hrs
min max average median filter
4 iAPS SE 2nd gen, iOS 18 80 221 965 434 331 deltaSec > 180 &&
deltaSec < 1000

@marionbarker

Copy link
Copy Markdown
Contributor Author

Summary of different Trio Configurations

Sorry to keep switching between 121 and 118, but setting up for a longer term 118 test using updated version of Trio code.

Summary - the Trio updates (commit 386200087) were sufficient to get looping while locked to work. Doing a longer term test of this. The Trio changes and PR 121 changes came in about the same time.

Build at 2026-08-01 14:33

  • Trio commit 386200087 << has the 2 commits by @dnzxy
  • OmnipodKit commit 0d1bb36 << PR 118 (without any PR 121)
  • LoopKit commit a5beee9 (LoopKit PR 599 merged to dev)
  • SE 3rd gen, iOS 26.6
  • Nightscout as a CGM

✅ Looping while locked - leave it like this for a long term test

Trio Truth Table

The Truth Table Below is what I think our tests showed, go back and confirm each state
Last 4 columns are expected: loops while open/unlocked, loops while locked and then tested for each.

  • I required at least 20 minutes of looping while locked for a ✅ for this test

Note that the loops while locked might be a most-of-the-time ✅ . There were intervals in earlier testing when things would stop looping (>1000 sec).

Each alternate configuration was built at the indicated time.

  • Minimum of 10 minutes while phone is open to get a ✅
  • Minimum of 20 minutes while phone is locked to get a ✅ or ❌ - even though the ❌ is pretty immediate.

Truth Table

Build Time (PDT) Trio commit Omnipod 5 commit LoopKit commit open/unlocked
expected
locked
expected
open/unlocked
measured
locked
measured
2026-07-31 12:05 386200087 43cf8f0
PR 118 + 121 first commit
a5beee96
2026-08-01 13:28 386200087 0d1bb36
PR 118
a5beee9
2026-08-01 14:02 5d55cda2d 0d1bb36
PR 118
a5beee9

Switch to Middle row at 2026-08-01 14:33

  • Trio commit 386200087
  • OmnipodKit commit 0d1bb36
  • LoopKit commit a5beee9

Looping while locked - leave it like this for a long term test

Trio and OmnipodKit Commit Details

Use https://github.com/docs-test/Trio/tree/test-pr1300_plus_ble_backport as the build for Trio.

Trio commits

latest Trio commit for this branch is 3862000

  • Configuration coming into this test:
    • 386200087 (HEAD -> test-pr1300_plus_ble_backport, test/test-pr1300_plus_ble_backport) Gate pump heartbeat on CGM heartbeat capability
    • 9e2788acd Wire pump BLE heartbeat to CGM reading schedule
    • 5d55cda2d (test_omnipodkit_pr121) update OmnipodKit, LoopKit: support new BLE connect on demand method

OmnipodKit commits

List of OmnipodKit commits for PR 121

  • 02ff824 (HEAD -> heartbeat-delegate-pull, loopkitdev/heartbeat-delegate-pull) Heartbeat: don't query the delegate on the caller's queue (fixes hang)
  • 43cf8f0 Heartbeat: pull must-provide from the delegate, not just the app's push
  • 0d1bb36 (origin/ble-heartbeat, ble-heartbeat) remove Claude generated md files

List of OmnipodKit commits for PR 118

  • 0d1bb36 (origin/ble-heartbeat, ble-heartbeat) remove Claude generated md files

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants