From 7a7d81d735caaa243b09a273c6183aefc712751d Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Sun, 5 Jun 2016 20:55:59 -0700 Subject: [PATCH 1/3] Register for timer tick notifications Fixes #10 --- Cartfile | 2 +- Cartfile.resolved | 2 +- Loop/Managers/DeviceDataManager.swift | 53 ++++++++------------------- 3 files changed, 17 insertions(+), 40 deletions(-) diff --git a/Cartfile b/Cartfile index d3bf5ed6c4..967f2d09ca 100644 --- a/Cartfile +++ b/Cartfile @@ -2,5 +2,5 @@ github "loudnate/LoopKit" ~> 0.3 github "loudnate/xDripG5" ~> 0.4 github "loudnate/SwiftCharts" "loudnate/naterade" github "mddub/dexcom-share-client-swift" ~> 0.1 -github "ps2/rileylink_ios" ~> 0.3.2 +github "ps2/rileylink_ios" "timer-tick-notification" # ~> 0.3.2 github "mpurland/Amplitude-iOS" "framework" diff --git a/Cartfile.resolved b/Cartfile.resolved index 19ef5decef..9da2f9fe54 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -3,5 +3,5 @@ github "loudnate/Crypto" "e0ef5b498f2c373d676135dabf5d1803b8558509" github "loudnate/LoopKit" "v0.3.2" github "loudnate/SwiftCharts" "dc8f5fbb29e391a65995d138158139559e365a1e" github "mddub/dexcom-share-client-swift" "v0.1.2" -github "ps2/rileylink_ios" "v0.3.2" +github "ps2/rileylink_ios" "abf4d19055cd11624f0dc1706d222878af7beff8" github "loudnate/xDripG5" "0.4.1" diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index fafae42ce5..d5eeabea78 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -56,27 +56,11 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { // MARK: - RileyLink - private var rileyLinkManagerObserver: AnyObject? { - willSet { - if let observer = rileyLinkManagerObserver { - NSNotificationCenter.defaultCenter().removeObserver(observer) - } - } - } - - private var rileyLinkDevicePacketObserver: AnyObject? { - willSet { - if let observer = rileyLinkDevicePacketObserver { - NSNotificationCenter.defaultCenter().removeObserver(observer) - } - } - } - - private func receivedRileyLinkManagerNotification(note: NSNotification) { + @objc private func receivedRileyLinkManagerNotification(note: NSNotification) { NSNotificationCenter.defaultCenter().postNotificationName(note.name, object: self, userInfo: note.userInfo) } - private func receivedRileyLinkPacketNotification(note: NSNotification) { + @objc private func receivedRileyLinkPacketNotification(note: NSNotification) { if let device = note.object as? RileyLinkDevice, data = note.userInfo?[RileyLinkDevice.IdleMessageDataKey] as? NSData, @@ -98,6 +82,10 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } + @objc private func receivedRileyLinkTimerTickNotification(note: NSNotification) { + assertCurrentPumpData() + } + func connectToRileyLink(device: RileyLinkDevice) { connectedPeripheralIDs.insert(device.peripheral.identifier.UUIDString) @@ -194,11 +182,10 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { return } - // TODO: Allow RileyLinkManager to enable/disable idle listening device.assertIdleListening() // How long should we wait before we poll for new reservoir data? - let reservoirTolerance = sentryEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 1) + let reservoirTolerance = rileyLinkManager.idleListeningEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 4) // If we don't yet have reservoir data, or it's old, poll for it. if latestReservoirValue == nil || latestReservoirValue!.startDate.timeIntervalSinceNow <= -reservoirTolerance { @@ -411,7 +398,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } case "pumpModel"?: if let sentrySupported = pumpState?.pumpModel?.larger where !sentrySupported { - sentryEnabled = false + rileyLinkManager.idleListeningEnabled = false } NSUserDefaults.standardUserDefaults().pumpModelNumber = pumpState?.pumpModel?.rawValue @@ -515,9 +502,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } - /// Whether the RileyLink should listen for sentry packets. - var sentryEnabled: Bool = true - // MARK: - CarbKit let carbStore: CarbStore? @@ -564,6 +548,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { insulinSensitivitySchedule: insulinSensitivitySchedule ) + var idleListeningEnabled = true + if let pumpID = pumpID { let pumpState = PumpState(pumpID: pumpID) @@ -575,7 +561,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { if let model = PumpModel(rawValue: pumpModelNumber) { pumpState.pumpModel = model - sentryEnabled = model.larger + idleListeningEnabled = model.larger } } @@ -586,6 +572,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { pumpState: self.pumpState, autoConnectIDs: connectedPeripheralIDs ) + rileyLinkManager.idleListeningEnabled = idleListeningEnabled if let settings = NSBundle.mainBundle().remoteSettings, username = settings["ShareAccountName"], @@ -597,14 +584,9 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { shareClient = nil } - rileyLinkManagerObserver = NSNotificationCenter.defaultCenter().addObserverForName(nil, object: rileyLinkManager, queue: nil) { [weak self] (note) -> Void in - self?.receivedRileyLinkManagerNotification(note) - } - - // TODO: Use delegation instead. - rileyLinkDevicePacketObserver = NSNotificationCenter.defaultCenter().addObserverForName(RileyLinkDevice.DidReceiveIdleMessageNotification, object: nil, queue: nil) { [weak self] (note) -> Void in - self?.receivedRileyLinkPacketNotification(note) - } + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkManagerNotification(_:)), name: nil, object: rileyLinkManager) + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkPacketNotification(_:)), name: RileyLinkDevice.DidReceiveIdleMessageNotification, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkTimerTickNotification(_:)), name: RileyLinkDevice.DidUpdateTimerTickNotification, object: nil) if let pumpState = pumpState { NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pumpStateValuesDidChange(_:)), name: PumpState.ValuesDidChangeNotification, object: pumpState) @@ -621,10 +603,5 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { transmitterID = NSUserDefaults.standardUserDefaults().transmitterID } } - - deinit { - rileyLinkManagerObserver = nil - rileyLinkDevicePacketObserver = nil - } } From 8347d148c80abdc55a654528e678c527ae50e7ea Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Sun, 5 Jun 2016 20:55:59 -0700 Subject: [PATCH 2/3] Register for timer tick notifications Fixes #10 --- Cartfile | 2 +- Cartfile.resolved | 2 +- Loop/Managers/DeviceDataManager.swift | 53 ++++++++------------------- 3 files changed, 17 insertions(+), 40 deletions(-) diff --git a/Cartfile b/Cartfile index d3bf5ed6c4..967f2d09ca 100644 --- a/Cartfile +++ b/Cartfile @@ -2,5 +2,5 @@ github "loudnate/LoopKit" ~> 0.3 github "loudnate/xDripG5" ~> 0.4 github "loudnate/SwiftCharts" "loudnate/naterade" github "mddub/dexcom-share-client-swift" ~> 0.1 -github "ps2/rileylink_ios" ~> 0.3.2 +github "ps2/rileylink_ios" "timer-tick-notification" # ~> 0.3.2 github "mpurland/Amplitude-iOS" "framework" diff --git a/Cartfile.resolved b/Cartfile.resolved index 19ef5decef..9da2f9fe54 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -3,5 +3,5 @@ github "loudnate/Crypto" "e0ef5b498f2c373d676135dabf5d1803b8558509" github "loudnate/LoopKit" "v0.3.2" github "loudnate/SwiftCharts" "dc8f5fbb29e391a65995d138158139559e365a1e" github "mddub/dexcom-share-client-swift" "v0.1.2" -github "ps2/rileylink_ios" "v0.3.2" +github "ps2/rileylink_ios" "abf4d19055cd11624f0dc1706d222878af7beff8" github "loudnate/xDripG5" "0.4.1" diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index fafae42ce5..d5eeabea78 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -56,27 +56,11 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { // MARK: - RileyLink - private var rileyLinkManagerObserver: AnyObject? { - willSet { - if let observer = rileyLinkManagerObserver { - NSNotificationCenter.defaultCenter().removeObserver(observer) - } - } - } - - private var rileyLinkDevicePacketObserver: AnyObject? { - willSet { - if let observer = rileyLinkDevicePacketObserver { - NSNotificationCenter.defaultCenter().removeObserver(observer) - } - } - } - - private func receivedRileyLinkManagerNotification(note: NSNotification) { + @objc private func receivedRileyLinkManagerNotification(note: NSNotification) { NSNotificationCenter.defaultCenter().postNotificationName(note.name, object: self, userInfo: note.userInfo) } - private func receivedRileyLinkPacketNotification(note: NSNotification) { + @objc private func receivedRileyLinkPacketNotification(note: NSNotification) { if let device = note.object as? RileyLinkDevice, data = note.userInfo?[RileyLinkDevice.IdleMessageDataKey] as? NSData, @@ -98,6 +82,10 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } + @objc private func receivedRileyLinkTimerTickNotification(note: NSNotification) { + assertCurrentPumpData() + } + func connectToRileyLink(device: RileyLinkDevice) { connectedPeripheralIDs.insert(device.peripheral.identifier.UUIDString) @@ -194,11 +182,10 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { return } - // TODO: Allow RileyLinkManager to enable/disable idle listening device.assertIdleListening() // How long should we wait before we poll for new reservoir data? - let reservoirTolerance = sentryEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 1) + let reservoirTolerance = rileyLinkManager.idleListeningEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 4) // If we don't yet have reservoir data, or it's old, poll for it. if latestReservoirValue == nil || latestReservoirValue!.startDate.timeIntervalSinceNow <= -reservoirTolerance { @@ -411,7 +398,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } case "pumpModel"?: if let sentrySupported = pumpState?.pumpModel?.larger where !sentrySupported { - sentryEnabled = false + rileyLinkManager.idleListeningEnabled = false } NSUserDefaults.standardUserDefaults().pumpModelNumber = pumpState?.pumpModel?.rawValue @@ -515,9 +502,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } - /// Whether the RileyLink should listen for sentry packets. - var sentryEnabled: Bool = true - // MARK: - CarbKit let carbStore: CarbStore? @@ -564,6 +548,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { insulinSensitivitySchedule: insulinSensitivitySchedule ) + var idleListeningEnabled = true + if let pumpID = pumpID { let pumpState = PumpState(pumpID: pumpID) @@ -575,7 +561,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { if let model = PumpModel(rawValue: pumpModelNumber) { pumpState.pumpModel = model - sentryEnabled = model.larger + idleListeningEnabled = model.larger } } @@ -586,6 +572,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { pumpState: self.pumpState, autoConnectIDs: connectedPeripheralIDs ) + rileyLinkManager.idleListeningEnabled = idleListeningEnabled if let settings = NSBundle.mainBundle().remoteSettings, username = settings["ShareAccountName"], @@ -597,14 +584,9 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { shareClient = nil } - rileyLinkManagerObserver = NSNotificationCenter.defaultCenter().addObserverForName(nil, object: rileyLinkManager, queue: nil) { [weak self] (note) -> Void in - self?.receivedRileyLinkManagerNotification(note) - } - - // TODO: Use delegation instead. - rileyLinkDevicePacketObserver = NSNotificationCenter.defaultCenter().addObserverForName(RileyLinkDevice.DidReceiveIdleMessageNotification, object: nil, queue: nil) { [weak self] (note) -> Void in - self?.receivedRileyLinkPacketNotification(note) - } + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkManagerNotification(_:)), name: nil, object: rileyLinkManager) + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkPacketNotification(_:)), name: RileyLinkDevice.DidReceiveIdleMessageNotification, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkTimerTickNotification(_:)), name: RileyLinkDevice.DidUpdateTimerTickNotification, object: nil) if let pumpState = pumpState { NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pumpStateValuesDidChange(_:)), name: PumpState.ValuesDidChangeNotification, object: pumpState) @@ -621,10 +603,5 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { transmitterID = NSUserDefaults.standardUserDefaults().transmitterID } } - - deinit { - rileyLinkManagerObserver = nil - rileyLinkDevicePacketObserver = nil - } } From d5d765ca112ff69aebe0babafbb824b249102a9b Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Mon, 6 Jun 2016 17:23:47 -0700 Subject: [PATCH 3/3] Fetch Share data in the timer tick --- Loop/Managers/DeviceDataManager.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index d5eeabea78..18ad9d644b 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -84,6 +84,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { @objc private func receivedRileyLinkTimerTickNotification(note: NSNotification) { assertCurrentPumpData() + + backfillGlucoseFromShareIfNeeded() } func connectToRileyLink(device: RileyLinkDevice) {