Skip to content

Commit 72192a7

Browse files
committed
Merge pull request #5 from loudnate/poll-reservoir
Poll reservoir when sentry listening is unavailable
2 parents dd81f36 + 6ad9575 commit 72192a7

File tree

5 files changed

+61
-23
lines changed

5 files changed

+61
-23
lines changed

Cartfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ github "loudnate/LoopKit" ~> 0.3
22
github "loudnate/xDripG5" ~> 0.4
33
github "loudnate/SwiftCharts" "loudnate/naterade"
44
github "mddub/dexcom-share-client-swift" ~> 0.1
5-
github "ps2/rileylink_ios" "dev"
5+
github "ps2/rileylink_ios" "assert-pump-model"
66
github "mpurland/Amplitude-iOS" "framework"

Cartfile.resolved

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ github "loudnate/Crypto" "e0ef5b498f2c373d676135dabf5d1803b8558509"
33
github "loudnate/LoopKit" "v0.3.2"
44
github "loudnate/SwiftCharts" "448b80f4025bbf592a4d8ca9d079e9684bc0b64b"
55
github "mddub/dexcom-share-client-swift" "v0.1.0"
6-
github "ps2/rileylink_ios" "4305a83f897c19bd343c6b4f6fcdaaba0985ea64"
6+
github "ps2/rileylink_ios" "cb8de2c84b9f2a16870600e3112d056c2a082d2c"
77
github "loudnate/xDripG5" "0.4.1"

Loop/Managers/DeviceDataManager.swift

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,51 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
187187
}
188188
}
189189

190+
/**
191+
Ensures pump data is current by either waking and polling, or ensuring we're listening to sentry packets.
192+
*/
193+
private func assertCurrentPumpData() {
194+
guard let device = rileyLinkManager.firstConnectedDevice else {
195+
return
196+
}
197+
198+
// TODO: Allow RileyLinkManager to enable/disable idle listening
199+
device.assertIdleListening()
200+
201+
// How long should we wait before we poll for new reservoir data?
202+
let reservoirTolerance = sentryEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 1)
203+
204+
// If we don't yet have reservoir data, or it's old, poll for it.
205+
if latestReservoirValue == nil || latestReservoirValue!.startDate.timeIntervalSinceNow <= -reservoirTolerance {
206+
device.ops?.readRemainingInsulin { (result) in
207+
switch result {
208+
case .Success(let units):
209+
self.updateReservoirVolume(units, atDate: NSDate(), withTimeLeft: nil)
210+
case .Failure:
211+
// Try to troubleshoot communications errors with the pump
212+
213+
// How long should we wait before we re-tune the RileyLink?
214+
let tuneTolerance = NSTimeInterval(minutes: 14)
215+
216+
if device.lastTuned?.timeIntervalSinceNow <= -tuneTolerance {
217+
device.tunePumpWithResultHandler { (result) in
218+
switch result {
219+
case .Success(let scanResult):
220+
self.logger?.addError("Device auto-tuned to \(scanResult.bestFrequency) MHz", fromSource: "RileyLink")
221+
case .Failure(let error):
222+
self.logger?.addError("Device auto-tune failed with error: \(error)", fromSource: "RileyLink")
223+
}
224+
}
225+
}
226+
}
227+
}
228+
}
229+
}
230+
190231
// MARK: - G5 Transmitter
232+
/**
233+
The G5 transmitter is a reliable heartbeat by which we can assert the loop state.
234+
*/
191235

192236
// MARK: TransmitterDelegate
193237

@@ -198,7 +242,7 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
198242
], toCollection: "g5"
199243
)
200244

201-
rileyLinkManager.firstConnectedDevice?.assertIdleListening()
245+
assertCurrentPumpData()
202246
}
203247

204248
func transmitter(transmitter: Transmitter, didReadGlucose glucose: GlucoseRxMessage) {
@@ -226,7 +270,7 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
226270
}
227271
}
228272

229-
rileyLinkManager.firstConnectedDevice?.assertIdleListening()
273+
assertCurrentPumpData()
230274
}
231275

232276
// MARK: G5 data
@@ -310,7 +354,7 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
310354
return pumpState?.pumpID
311355
}
312356
set {
313-
guard newValue?.characters.count == 6 else {
357+
guard newValue?.characters.count == 6 && newValue != pumpState?.pumpID else {
314358
return
315359
}
316360

@@ -321,8 +365,6 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
321365
pumpState.timeZone = timeZone
322366
}
323367

324-
pumpState.pumpModel = self.pumpState?.pumpModel
325-
326368
self.pumpState = pumpState
327369
} else {
328370
self.pumpState = nil
@@ -371,6 +413,10 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
371413
}
372414
}
373415
case "pumpModel"?:
416+
if let sentrySupported = pumpState?.pumpModel?.larger where !sentrySupported {
417+
sentryEnabled = false
418+
}
419+
374420
NSUserDefaults.standardUserDefaults().pumpModelNumber = pumpState?.pumpModel?.rawValue
375421
case "lastHistoryDump"?, "awakeUntil"?:
376422
break
@@ -472,6 +518,9 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
472518
}
473519
}
474520

521+
/// Whether the RileyLink should listen for sentry packets.
522+
var sentryEnabled: Bool = true
523+
475524
// MARK: - CarbKit
476525

477526
let carbStore: CarbStore?
@@ -641,7 +690,11 @@ class DeviceDataManager: NSObject, CarbStoreDelegate, TransmitterDelegate, WCSes
641690
}
642691

643692
if let pumpModelNumber = NSUserDefaults.standardUserDefaults().pumpModelNumber {
644-
pumpState.pumpModel = PumpModel(rawValue: pumpModelNumber)
693+
if let model = PumpModel(rawValue: pumpModelNumber) {
694+
pumpState.pumpModel = model
695+
696+
sentryEnabled = model.larger
697+
}
645698
}
646699

647700
self.pumpState = pumpState

Loop/Managers/LoopDataManager.swift

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,6 @@ class LoopDataManager {
5656
dispatch_async(self.dataAccessQueue) {
5757
self.glucoseMomentumEffect = nil
5858
self.notify()
59-
60-
// Try to troubleshoot communications errors with the pump
61-
if let pumpStatusDate = self.deviceDataManager.latestReservoirValue?.startDate where pumpStatusDate.timeIntervalSinceNow < NSTimeInterval(minutes: -15),
62-
let device = self.deviceDataManager.rileyLinkManager.firstConnectedDevice where device.lastTuned?.timeIntervalSinceNow < NSTimeInterval(minutes: -15) {
63-
device.tunePumpWithResultHandler { (result) in
64-
switch result {
65-
case .Success(let scanResult):
66-
self.deviceDataManager.logger?.addError("Device auto-tuned to \(scanResult.bestFrequency) MHz", fromSource: "RileyLink")
67-
case .Failure(let error):
68-
self.deviceDataManager.logger?.addError("Device auto-tune failed with error: \(error)", fromSource: "RileyLink")
69-
}
70-
}
71-
}
7259
}
7360
},
7461
center.addObserverForName(DeviceDataManager.PumpStatusUpdatedNotification, object: deviceDataManager, queue: nil) { (note) -> Void in

Loop/Views/ReservoirVolumeHUDView.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ class ReservoirVolumeHUDView: HUDView {
2424
didSet {
2525
if let volume = reservoirVolume, units = numberFormatter.stringFromNumber(volume) {
2626
caption.text = "\(units) U"
27-
} else {
28-
caption.text = nil
2927
}
3028
}
3129
}

0 commit comments

Comments
 (0)