@@ -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
0 commit comments