Skip to content

Commit 66c8773

Browse files
authored
Fix issue with PumpManager ble update coming in right after cgm update arrives (#1096)
1 parent af58beb commit 66c8773

File tree

1 file changed

+40
-34
lines changed

1 file changed

+40
-34
lines changed

Loop/Managers/DeviceDataManager.swift

+40-34
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ final class DeviceDataManager {
3333
/// Should be accessed only on the main queue
3434
private(set) var lastError: (date: Date, error: Error)?
3535

36-
/// The last time a BLE heartbeat was received by the pump manager
36+
/// The last time a BLE heartbeat was received and acted upon.
3737
private var lastBLEDrivenUpdate = Date.distantPast
3838

3939
// MARK: - CGM
@@ -155,6 +155,40 @@ final class DeviceDataManager {
155155

156156
return Manager.init(rawState: rawState) as? PumpManagerUI
157157
}
158+
159+
private func processCGMResult(_ manager: CGMManager, result: CGMResult) {
160+
switch result {
161+
case .newData(let values):
162+
log.default("CGMManager:\(type(of: manager)) did update with \(values.count) values")
163+
164+
loopManager.addGlucose(values) { result in
165+
if manager.shouldSyncToRemoteService {
166+
switch result {
167+
case .success(let values):
168+
self.nightscoutDataManager.uploadGlucose(values, sensorState: manager.sensorState)
169+
case .failure:
170+
break
171+
}
172+
}
173+
174+
self.log.default("Asserting current pump data")
175+
self.pumpManager?.assertCurrentPumpData()
176+
}
177+
case .noData:
178+
log.default("CGMManager:\(type(of: manager)) did update with no data")
179+
180+
pumpManager?.assertCurrentPumpData()
181+
case .error(let error):
182+
log.default("CGMManager:\(type(of: manager)) did update with error: \(error)")
183+
184+
self.setLastError(error: error)
185+
log.default("Asserting current pump data")
186+
pumpManager?.assertCurrentPumpData()
187+
}
188+
189+
updatePumpManagerBLEHeartbeatPreference()
190+
}
191+
158192

159193
}
160194

@@ -269,36 +303,8 @@ extension DeviceDataManager: CGMManagerDelegate {
269303

270304
func cgmManager(_ manager: CGMManager, didUpdateWith result: CGMResult) {
271305
dispatchPrecondition(condition: .onQueue(queue))
272-
switch result {
273-
case .newData(let values):
274-
log.default("CGMManager:\(type(of: manager)) did update with \(values.count) values")
275-
276-
loopManager.addGlucose(values) { result in
277-
if manager.shouldSyncToRemoteService {
278-
switch result {
279-
case .success(let values):
280-
self.nightscoutDataManager.uploadGlucose(values, sensorState: manager.sensorState)
281-
case .failure:
282-
break
283-
}
284-
}
285-
286-
self.log.default("Asserting current pump data")
287-
self.pumpManager?.assertCurrentPumpData()
288-
}
289-
case .noData:
290-
log.default("CGMManager:\(type(of: manager)) did update with no data")
291-
292-
pumpManager?.assertCurrentPumpData()
293-
case .error(let error):
294-
log.default("CGMManager:\(type(of: manager)) did update with error: \(error)")
295-
296-
self.setLastError(error: error)
297-
log.default("Asserting current pump data")
298-
pumpManager?.assertCurrentPumpData()
299-
}
300-
301-
updatePumpManagerBLEHeartbeatPreference()
306+
lastBLEDrivenUpdate = Date()
307+
processCGMResult(manager, result: result);
302308
}
303309

304310
func startDateToFilterNewData(for manager: CGMManager) -> Date? {
@@ -346,12 +352,12 @@ extension DeviceDataManager: PumpManagerDelegate {
346352
bleHeartbeatUpdateInterval = .minutes(1)
347353
case let interval?:
348354
// If we looped successfully less than 5 minutes ago, ignore the heartbeat.
349-
log.default("PumpManager:\(type(of: pumpManager)) ignoring heartbeat. Last loop completed \(interval.minutes) minutes ago")
355+
log.default("PumpManager:\(type(of: pumpManager)) ignoring pumpManager heartbeat. Last loop completed \(-interval.minutes) minutes ago")
350356
return
351357
}
352358

353359
guard lastBLEDrivenUpdate.timeIntervalSinceNow <= -bleHeartbeatUpdateInterval else {
354-
log.default("PumpManager:\(type(of: pumpManager)) ignoring heartbeat. Last update \(lastBLEDrivenUpdate)")
360+
log.default("PumpManager:\(type(of: pumpManager)) ignoring pumpManager heartbeat. Last ble update \(lastBLEDrivenUpdate)")
355361
return
356362
}
357363
lastBLEDrivenUpdate = Date()
@@ -363,7 +369,7 @@ extension DeviceDataManager: PumpManagerDelegate {
363369

364370
if let manager = self.cgmManager {
365371
self.queue.async {
366-
self.cgmManager(manager, didUpdateWith: result)
372+
self.processCGMResult(manager, result: result)
367373
}
368374
}
369375
}

0 commit comments

Comments
 (0)