From cc26abc4fa5ee6c3632d983eefa9432b0358fcfe Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Mon, 31 Jan 2022 18:31:45 -0600 Subject: [PATCH 1/3] Trigger heartbeat if asked, using new session callback --- OmniBLE/PumpManager/OmniBLEPumpManager.swift | 20 ++++++++++++++------ OmniBLE/PumpManager/PumpManagerAlert.swift | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/OmniBLE/PumpManager/OmniBLEPumpManager.swift index 3387449a..106161cf 100644 --- a/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -206,6 +206,13 @@ public class OmniBLEPumpManager: DeviceManager { delegate?.deviceManager(self, logEventForDeviceIdentifier: podAddress, type: type, message: message, completion: nil) } } + + // Not persisted + var provideHeartbeat: Bool = false + + public func setMustProvideBLEHeartbeat(_ mustProvideBLEHeartbeat: Bool) { + provideHeartbeat = mustProvideBLEHeartbeat + } private let pumpDelegate = WeakSynchronizedDelegate() @@ -1504,12 +1511,7 @@ extension OmniBLEPumpManager: PumpManager { public func removeStatusObserver(_ observer: PumpManagerStatusObserver) { statusObservers.removeElement(observer) } - - public func setMustProvideBLEHeartbeat(_ mustProvideBLEHeartbeat: Bool) { - // We can't implement this service for Dash (unless we can find some Dash hook for this). - // XXX PumpManager protocol probably should be updated to not to assume that this service is always available. - } - + public func ensureCurrentPumpData(completion: ((Date?) -> Void)?) { let shouldFetchStatus = setStateWithResult { (state) -> Bool? in guard state.hasActivePod else { @@ -2093,6 +2095,12 @@ extension OmniBLEPumpManager: PodCommsDelegate { break } } + + if self.provideHeartbeat { + pumpDelegate.notify { (delegate) in + delegate?.pumpManagerBLEHeartbeatDidFire(self) + } + } } func podComms(_ podComms: PodComms, didChange podState: PodState) { diff --git a/OmniBLE/PumpManager/PumpManagerAlert.swift b/OmniBLE/PumpManager/PumpManagerAlert.swift index 0ddf7cea..440eb5b7 100644 --- a/OmniBLE/PumpManager/PumpManagerAlert.swift +++ b/OmniBLE/PumpManager/PumpManagerAlert.swift @@ -233,7 +233,7 @@ extension PumpManagerAlert: RawRepresentable { extension PodAlert { var isIgnored: Bool { switch self { - case .podSuspendedReminder: + case .podSuspendedReminder, .finishSetupReminder: return true default: return false From 772a750f919e6b643f610e2b73f6cb6fa0de4fba Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Thu, 3 Feb 2022 12:03:14 -0600 Subject: [PATCH 2/3] Store any dosing record updates after post-connect status check --- OmniBLE/PumpManager/OmniBLEPumpManager.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/OmniBLE/PumpManager/OmniBLEPumpManager.swift index 106161cf..8eb340ce 100644 --- a/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -2090,6 +2090,9 @@ extension OmniBLEPumpManager: PodCommsDelegate { case .success(let session): let _ = try? session.getStatus(confirmationBeepType: .none) self.silenceAcknowledgedAlerts() + session.dosesForStorage() { (doses) -> Bool in + return self.store(doses: doses, in: session) + } case .failure: // Errors can be ignored here. break From a53a594f0499be6e0f5e915ea11532a2a67460f1 Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Fri, 4 Feb 2022 11:44:31 -0600 Subject: [PATCH 3/3] Fail more quickly on disconnected pod, and wait until session synced before updating doses --- OmniBLE/PumpManager/OmniBLEPumpManager.swift | 10 +++++----- OmniBLE/PumpManager/PodComms.swift | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OmniBLE/PumpManager/OmniBLEPumpManager.swift b/OmniBLE/PumpManager/OmniBLEPumpManager.swift index 8eb340ce..1b37a0ce 100644 --- a/OmniBLE/PumpManager/OmniBLEPumpManager.swift +++ b/OmniBLE/PumpManager/OmniBLEPumpManager.swift @@ -2093,17 +2093,17 @@ extension OmniBLEPumpManager: PodCommsDelegate { session.dosesForStorage() { (doses) -> Bool in return self.store(doses: doses, in: session) } + if self.provideHeartbeat { + self.pumpDelegate.notify { (delegate) in + delegate?.pumpManagerBLEHeartbeatDidFire(self) + } + } case .failure: // Errors can be ignored here. break } } - if self.provideHeartbeat { - pumpDelegate.notify { (delegate) in - delegate?.pumpManagerBLEHeartbeatDidFire(self) - } - } } func podComms(_ podComms: PodComms, didChange podState: PodState) { diff --git a/OmniBLE/PumpManager/PodComms.swift b/OmniBLE/PumpManager/PodComms.swift index 1083d5be..840a8e96 100644 --- a/OmniBLE/PumpManager/PodComms.swift +++ b/OmniBLE/PumpManager/PodComms.swift @@ -379,11 +379,11 @@ public class PodComms: CustomDebugStringConvertible { // Use to serialize a set of Pod Commands for a given session func runSession(withName name: String, _ block: @escaping (_ result: SessionRunResult) -> Void) { - guard let manager = manager else { + guard let manager = manager, manager.peripheral.state == .connected else { block(.failure(PodCommsError.podNotConnected)) return } - + manager.runSession(withName: name) { () in guard self.podState != nil else { block(.failure(PodCommsError.noPodPaired))