Skip to content

Commit dfe6ad7

Browse files
authored
LOOP-3830 PumpManager sync updates (#456)
* PumpManager protocol changes for syncing * Remove debug prints
1 parent 7358672 commit dfe6ad7

File tree

5 files changed

+22
-22
lines changed

5 files changed

+22
-22
lines changed

Loop/Extensions/DeviceDataManager+BolusEntryViewModelDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ extension DeviceDataManager: BolusEntryViewModelDelegate, ManualDoseViewModelDel
4444
carbStore.carbsOnBoard(at: date, effectVelocities: effectVelocities, completion: completion)
4545
}
4646

47-
func ensureCurrentPumpData(completion: @escaping () -> Void) {
47+
func ensureCurrentPumpData(completion: @escaping (Date?) -> Void) {
4848
pumpManager?.ensureCurrentPumpData(completion: completion)
4949
}
5050

Loop/Managers/DeviceDataManager.swift

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ final class DeviceDataManager {
245245
basalProfile: UserDefaults.appGroup?.basalRateSchedule,
246246
insulinSensitivitySchedule: sensitivitySchedule,
247247
overrideHistory: overrideHistory,
248-
lastPumpEventsReconciliation: pumpManager?.lastReconciliation,
248+
lastPumpEventsReconciliation: pumpManager?.lastSync,
249249
provenanceIdentifier: HKSource.default().bundleIdentifier
250250
)
251251

@@ -289,7 +289,7 @@ final class DeviceDataManager {
289289
lastLoopCompleted: statusExtensionManager.context?.lastLoopCompleted,
290290
basalDeliveryState: pumpManager?.status.basalDeliveryState,
291291
overrideHistory: overrideHistory,
292-
lastPumpEventsReconciliation: pumpManager?.lastReconciliation,
292+
lastPumpEventsReconciliation: pumpManager?.lastSync,
293293
analyticsServicesManager: analyticsServicesManager,
294294
localCacheDuration: localCacheDuration,
295295
doseStore: doseStore,
@@ -431,7 +431,12 @@ final class DeviceDataManager {
431431
log.default("CGMManager:%{public}@ did update with %d values", String(describing: type(of: manager)), values.count)
432432
loopManager.addGlucoseSamples(values) { result in
433433
self.log.default("Asserting current pump data")
434-
self.pumpManager?.ensureCurrentPumpData(completion: nil)
434+
self.pumpManager?.ensureCurrentPumpData(completion: { (lastSync) in
435+
if let lastSync = lastSync, Date().timeIntervalSince(lastSync) < LoopCoreConstants.inputDataRecencyInterval {
436+
self.log.default("Pump data from %@ is fresh. Triggering loop()", String(describing: type(of: self.pumpManager)))
437+
self.loopManager.loop()
438+
}
439+
})
435440
if !values.isEmpty {
436441
DispatchQueue.main.async {
437442
self.cgmStalenessMonitor.cgmGlucoseSamplesAvailable(values)
@@ -1004,11 +1009,11 @@ extension DeviceDataManager: PumpManagerDelegate {
10041009
loopManager.storeDosingDecision(withDate: Date(), withError: error)
10051010
}
10061011

1007-
func pumpManager(_ pumpManager: PumpManager, hasNewPumpEvents events: [NewPumpEvent], lastReconciliation: Date?, completion: @escaping (_ error: Error?) -> Void) {
1012+
func pumpManager(_ pumpManager: PumpManager, hasNewPumpEvents events: [NewPumpEvent], lastSync: Date?, completion: @escaping (_ error: Error?) -> Void) {
10081013
dispatchPrecondition(condition: .onQueue(queue))
10091014
log.default("PumpManager:%{public}@ did read pump events", String(describing: type(of: pumpManager)))
10101015

1011-
loopManager.addPumpEvents(events, lastReconciliation: lastReconciliation) { (error) in
1016+
loopManager.addPumpEvents(events, lastReconciliation: lastSync) { (error) in
10121017
if let error = error {
10131018
self.log.error("Failed to addPumpEvents to DoseStore: %{public}@", String(describing: error))
10141019
}
@@ -1036,12 +1041,6 @@ extension DeviceDataManager: PumpManagerDelegate {
10361041
}
10371042
}
10381043

1039-
func pumpManagerRecommendsLoop(_ pumpManager: PumpManager) {
1040-
dispatchPrecondition(condition: .onQueue(queue))
1041-
log.default("PumpManager:%{public}@ recommends loop", String(describing: type(of: pumpManager)))
1042-
loopManager.loop()
1043-
}
1044-
10451044
func startDateToFilterNewPumpEvents(for manager: PumpManager) -> Date {
10461045
dispatchPrecondition(condition: .onQueue(queue))
10471046
return doseStore.pumpEventQueryAfterDate

Loop/View Models/BolusEntryViewModel.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protocol BolusEntryViewModelDelegate: AnyObject {
3636

3737
func carbsOnBoard(at date: Date, effectVelocities: [GlucoseEffectVelocity]?, completion: @escaping (_ result: CarbStoreResult<CarbValue>) -> Void)
3838

39-
func ensureCurrentPumpData(completion: @escaping () -> Void)
39+
func ensureCurrentPumpData(completion: @escaping (Date?) -> Void)
4040

4141
func insulinActivityDuration(for type: InsulinType?) -> TimeInterval
4242

@@ -217,15 +217,16 @@ final class BolusEntryViewModel: ObservableObject {
217217
observeEnteredManualGlucoseChanges()
218218
observeElapsedTime()
219219
observeRecommendedBolusChanges()
220-
221220
update()
222221
}
223222

224223
private func observeLoopUpdates() {
225224
NotificationCenter.default
226225
.publisher(for: .LoopDataUpdated)
227226
.receive(on: DispatchQueue.main)
228-
.sink { [weak self] _ in self?.update() }
227+
.sink { [weak self] _ in
228+
self?.update()
229+
}
229230
.store(in: &cancellables)
230231
}
231232

@@ -653,7 +654,7 @@ final class BolusEntryViewModel: ObservableObject {
653654
DispatchQueue.main.async {
654655
// v-- This needs to happen on the main queue
655656
self.isRefreshingPump = true
656-
let wrappedCompletion: () -> Void = { [weak self] in
657+
let wrappedCompletion: (Date?) -> Void = { [weak self] (lastSync) in
657658
self?.delegate?.withLoopState { [weak self] _ in
658659
// v-- This needs to happen in LoopDataManager's dataQueue
659660
completion()

LoopTests/Managers/DoseEnactorTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class MockPumpManager: PumpManager {
5353

5454
var pumpReservoirCapacity: Double = 50
5555

56-
var lastReconciliation: Date?
56+
var lastSync: Date?
5757

5858
var status: PumpManagerStatus =
5959
PumpManagerStatus(
@@ -70,8 +70,8 @@ class MockPumpManager: PumpManager {
7070
func removeStatusObserver(_ observer: PumpManagerStatusObserver) {
7171
}
7272

73-
func ensureCurrentPumpData(completion: (() -> Void)?) {
74-
completion?()
73+
func ensureCurrentPumpData(completion: ((Date?) -> Void)?) {
74+
completion?(Date())
7575
}
7676

7777
func setMustProvideBLEHeartbeat(_ mustProvideBLEHeartbeat: Bool) {

LoopTests/ViewModels/BolusEntryViewModelTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ class BolusEntryViewModelTests: XCTestCase {
395395
try triggerLoopStateUpdatedWithDataAndWait()
396396
XCTAssertTrue(bolusEntryViewModel.isRefreshingPump)
397397
let completion = try XCTUnwrap(delegate.ensureCurrentPumpDataCompletion)
398-
completion()
398+
completion(Date())
399399
// Need to once again trigger loop state
400400
try triggerLoopStateResult(with: MockLoopState())
401401
// then wait on main again (sigh)
@@ -946,8 +946,8 @@ fileprivate class MockBolusEntryViewModelDelegate: BolusEntryViewModelDelegate {
946946
}
947947
}
948948

949-
var ensureCurrentPumpDataCompletion: (() -> Void)?
950-
func ensureCurrentPumpData(completion: @escaping () -> Void) {
949+
var ensureCurrentPumpDataCompletion: ((Date?) -> Void)?
950+
func ensureCurrentPumpData(completion: @escaping (Date?) -> Void) {
951951
ensureCurrentPumpDataCompletion = completion
952952
}
953953

0 commit comments

Comments
 (0)