From 5cf8d02c686886ead21d76ea23e5b8200c0049e6 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 4 May 2018 22:15:19 +0200 Subject: [PATCH 1/4] Import automatic pump time synchronization. --- Loop/Managers/DeviceDataManager.swift | 47 ++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index 146ecc5d08..09c8b2d8d9 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -241,12 +241,39 @@ final class DeviceDataManager { // MARK: Pump data /// TODO: Isolate to queue - fileprivate var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? { - didSet { - if let manager = cgmManager as? EnliteCGMManager { - manager.sensorState = latestPumpStatusFromMySentry + fileprivate var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? + + /** Check if pump date is current and otherwise update it. + * TODO this should get a device name probably. + **/ + private func assertPumpDate(_ date: Date) -> Bool { + let dateDiff = abs(date.timeIntervalSinceNow) + if dateDiff > TimeInterval(minutes: 1) { + guard let pumpOps = pumpOps else { + return false + } + rileyLinkManager.getDevices { (devices) in + guard let device = devices.firstConnected else { + return + } + // TODO use a session + pumpOps.runSession(withName: "Sync Pump Time", using: device) { (session) in + do { + try session.setTime { () -> DateComponents in + let calendar = Calendar(identifier: .gregorian) + return calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date()) + } + self.loopManager.addInternalNote("syncPumpTime success (difference \(dateDiff)).") + + } catch let error { + + self.loopManager.addInternalNote("syncPumpTime error \(String(describing: error)).") + } + } } + return false } + return true } /** @@ -272,7 +299,11 @@ final class DeviceDataManager { guard status != latestPumpStatusFromMySentry, let pumpDate = pumpDateComponents.date else { return } - + + if !assertPumpDate(pumpDate) { + return + } + observeBatteryDuring { latestPumpStatusFromMySentry = status } @@ -549,6 +580,12 @@ final class DeviceDataManager { if shouldReadReservoir { do { let reservoir = try session.getRemainingInsulin() + if !self.assertPumpDate(reservoir.clock.date!) { + self.logger.addError("Pump clock is deviating too much, need to fix first.", fromSource: "enactBolus") + let error = PumpOpsError.rfCommsFailure("Pump clock is deviating too much.") + notify(SetBolusError.certain(error)) + return + } self.loopManager.addReservoirValue(reservoir.units, at: reservoir.clock.date!) { (result) in switch result { From c05d942d107d6dab20227a7c316ea42708bde9a0 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 4 May 2018 22:19:40 +0200 Subject: [PATCH 2/4] Fix merge errors --- Loop/Managers/DeviceDataManager.swift | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index 09c8b2d8d9..851ef960ff 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -243,9 +243,7 @@ final class DeviceDataManager { /// TODO: Isolate to queue fileprivate var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? - /** Check if pump date is current and otherwise update it. - * TODO this should get a device name probably. - **/ + /** Check if pump date is current and otherwise update it. **/ private func assertPumpDate(_ date: Date) -> Bool { let dateDiff = abs(date.timeIntervalSinceNow) if dateDiff > TimeInterval(minutes: 1) { @@ -256,18 +254,15 @@ final class DeviceDataManager { guard let device = devices.firstConnected else { return } - // TODO use a session pumpOps.runSession(withName: "Sync Pump Time", using: device) { (session) in do { try session.setTime { () -> DateComponents in let calendar = Calendar(identifier: .gregorian) return calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date()) } - self.loopManager.addInternalNote("syncPumpTime success (difference \(dateDiff)).") - + NSLog("syncPumpTime success (difference \(dateDiff)).") } catch let error { - - self.loopManager.addInternalNote("syncPumpTime error \(String(describing: error)).") + NSLog("syncPumpTime error \(String(describing: error)).") } } } From 2ac474a6a7afac033128604ed7e244f42a97e8da Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 4 May 2018 22:26:27 +0200 Subject: [PATCH 3/4] fix merge error --- Loop/Managers/DeviceDataManager.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index 851ef960ff..f4e525d87c 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -241,9 +241,19 @@ final class DeviceDataManager { // MARK: Pump data /// TODO: Isolate to queue - fileprivate var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? + fileprivate var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? { + didSet { + if let manager = cgmManager as? EnliteCGMManager { + manager.sensorState = latestPumpStatusFromMySentry + } + } + } - /** Check if pump date is current and otherwise update it. **/ + /** + Check if pump date is current and otherwise update it. + + - parameter date: The last pump date + */ private func assertPumpDate(_ date: Date) -> Bool { let dateDiff = abs(date.timeIntervalSinceNow) if dateDiff > TimeInterval(minutes: 1) { From 01ac82c523bdc2397a23f72ec5e2a26f43cbfa85 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 4 May 2018 22:26:52 +0200 Subject: [PATCH 4/4] fix whitespace --- Loop/Managers/DeviceDataManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index f4e525d87c..cd86581107 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -304,11 +304,11 @@ final class DeviceDataManager { guard status != latestPumpStatusFromMySentry, let pumpDate = pumpDateComponents.date else { return } - + if !assertPumpDate(pumpDate) { return } - + observeBatteryDuring { latestPumpStatusFromMySentry = status }