Skip to content

Commit bdf9ca3

Browse files
authored
Only trigger when new CGM data received > 4.2 minutes ago. (#2039)
* Only trigger when new CGM data received > 4.2 minutes ago. * Change errors to prints, still for testing * Allow pump driven loop at < 5 minutes intervals
1 parent c1e5330 commit bdf9ca3

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

Loop/Managers/DeviceDataManager.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ final class DeviceDataManager {
4545

4646
@Published var pumpIsAllowingAutomation: Bool
4747

48+
private var lastCGMLoopTrigger: Date = .distantPast
49+
4850
private let automaticDosingStatus: AutomaticDosingStatus
4951

5052
var closedLoopDisallowedLocalizedDescription: String? {
@@ -557,7 +559,6 @@ final class DeviceDataManager {
557559
private func processCGMReadingResult(_ manager: CGMManager, readingResult: CGMReadingResult, completion: @escaping () -> Void) {
558560
switch readingResult {
559561
case .newData(let values):
560-
log.default("CGMManager:%{public}@ did update with %d values", String(describing: type(of: manager)), values.count)
561562
loopManager.addGlucoseSamples(values) { result in
562563
if !values.isEmpty {
563564
DispatchQueue.main.async {
@@ -570,10 +571,8 @@ final class DeviceDataManager {
570571
loopManager.receivedUnreliableCGMReading()
571572
completion()
572573
case .noData:
573-
log.default("CGMManager:%{public}@ did update with no data", String(describing: type(of: manager)))
574574
completion()
575575
case .error(let error):
576-
log.default("CGMManager:%{public}@ did update with error: %{public}@", String(describing: type(of: manager)), String(describing: error))
577576
self.setLastError(error: error)
578577
completion()
579578
}
@@ -924,8 +923,14 @@ extension DeviceDataManager: CGMManagerDelegate {
924923

925924
func cgmManager(_ manager: CGMManager, hasNew readingResult: CGMReadingResult) {
926925
dispatchPrecondition(condition: .onQueue(queue))
926+
log.default("CGMManager:%{public}@ did update with %{public}@", String(describing: type(of: manager)), String(describing: readingResult))
927927
processCGMReadingResult(manager, readingResult: readingResult) {
928-
self.checkPumpDataAndLoop()
928+
let now = Date()
929+
if case .newData = readingResult, now.timeIntervalSince(self.lastCGMLoopTrigger) > .minutes(4.2) {
930+
self.log.default("Triggering loop from new CGM data at %{public}@", String(describing: now))
931+
self.lastCGMLoopTrigger = now
932+
self.checkPumpDataAndLoop()
933+
}
929934
}
930935
}
931936

@@ -1012,7 +1017,8 @@ extension DeviceDataManager: PumpManagerDelegate {
10121017

10131018
self.queue.async {
10141019
self.processCGMReadingResult(cgmManager, readingResult: result) {
1015-
if self.loopManager.lastLoopCompleted == nil || self.loopManager.lastLoopCompleted!.timeIntervalSinceNow < -.minutes(6) {
1020+
if self.loopManager.lastLoopCompleted == nil || self.loopManager.lastLoopCompleted!.timeIntervalSinceNow < -.minutes(4.2) {
1021+
self.log.default("Triggering Loop from refreshCGM()")
10161022
self.checkPumpDataAndLoop()
10171023
}
10181024
completion?()

Loop/Managers/LoopDataManager.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ final class LoopDataManager {
2727
case loopFinished
2828
}
2929

30+
let loopLock = UnfairLock()
31+
3032
static let LoopUpdateContextKey = "com.loudnate.Loop.LoopDataManager.LoopUpdateContext"
3133

3234
private let carbStore: CarbStoreProtocol
@@ -840,7 +842,23 @@ extension LoopDataManager {
840842
///
841843
/// Executes an analysis of the current data, and recommends an adjustment to the current
842844
/// temporary basal rate.
845+
///
843846
func loop() {
847+
848+
if let lastLoopCompleted, Date().timeIntervalSince(lastLoopCompleted) < .minutes(2) {
849+
print("Looping too fast!")
850+
}
851+
852+
let available = loopLock.withLockIfAvailable {
853+
loopInternal()
854+
return true
855+
}
856+
if available == nil {
857+
print("Loop attempted while already looping!")
858+
}
859+
}
860+
861+
func loopInternal() {
844862

845863
dataAccessQueue.async {
846864

0 commit comments

Comments
 (0)