@@ -151,27 +151,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
151
151
152
152
// MARK: Pump data
153
153
154
- private var latestPumpStatusDate: NSDate?
155
-
156
- var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody? {
157
- didSet {
158
- if let update = latestPumpStatusFromMySentry, let timeZone = pumpState? . timeZone {
159
- let pumpClock = update. pumpDateComponents
160
- pumpClock. timeZone = timeZone
161
- latestPumpStatusDate = pumpClock. date
162
- }
163
- }
164
- }
165
-
166
- private var latestPolledPumpStatus: RileyLinkKit. PumpStatus? {
167
- didSet {
168
- if let update = latestPolledPumpStatus, let timeZone = pumpState? . timeZone {
169
- let pumpClock = update. clock
170
- pumpClock. timeZone = timeZone
171
- latestPumpStatusDate = pumpClock. date
172
- }
173
- }
174
- }
154
+ var latestPumpStatusFromMySentry: MySentryPumpStatusMessageBody?
175
155
176
156
// TODO: Expose this on DoseStore
177
157
var latestReservoirValue: ReservoirValue? {
@@ -212,7 +192,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
212
192
213
193
latestPumpStatusFromMySentry = status
214
194
215
-
216
195
// Gather PumpStatus from MySentry packet
217
196
let pumpStatus : NightscoutUploadKit . PumpStatus ?
218
197
if let pumpDate = status. pumpDateComponents. date, let pumpID = pumpID {
@@ -266,7 +245,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
266
245
}
267
246
}
268
247
269
-
270
248
/**
271
249
Store a new reservoir volume and notify observers of new pump data.
272
250
@@ -307,35 +285,39 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
307
285
}
308
286
}
309
287
310
- private func readAndUpdatePumpData( completion: ( error: ErrorType? ) - > Void) {
288
+ /**
289
+ Read the pump's current state, including reservoir and clock
311
290
291
+ - parameter completion: A closure called after the command is complete. This closure takes a single Result argument:
292
+ - Success(status, date): The pump status, and the resolved date according to the pump's clock
293
+ - Failure(error): An error describing why the command failed
294
+ */
295
+ private func readPumpData( completion: ( Either < ( status: RileyLinkKit . PumpStatus , date: NSDate ) , ErrorType > ) -> Void) {
312
296
guard let device = rileyLinkManager. firstConnectedDevice, let ops = device. ops else {
313
- completion ( error : LoopError . ConfigurationError)
297
+ completion ( . Failure ( LoopError . ConfigurationError) )
314
298
return
315
299
}
316
300
317
- ops. readPumpStatus ( { ( result) in
301
+ ops. readPumpStatus { ( result) in
318
302
switch result {
319
303
case . Success( let status) :
320
- self . latestPolledPumpStatus = status
321
-
322
304
status. clock. timeZone = ops. pumpState. timeZone
323
305
guard let date = status. clock. date else {
324
306
self . logger. addError ( " Could not interpret pump clock: \( status. clock) " , fromSource: " RileyLink " )
325
- completion ( error : LoopError . ConfigurationError)
307
+ completion ( . Failure ( LoopError . ConfigurationError) )
326
308
return
327
309
}
328
310
329
- self . updateReservoirVolume ( status. reservoir, atDate: date, withTimeLeft: nil )
330
-
331
311
let battery = BatteryStatus ( voltage: status. batteryVolts, status: BatteryIndicator ( batteryStatus: status. batteryStatus) )
332
312
let nsPumpStatus = NightscoutUploadKit . PumpStatus ( clock: date, pumpID: ops. pumpState. pumpID, iob: nil , battery: battery, suspended: status. suspended, bolusing: status. bolusing, reservoir: status. reservoir)
333
313
self . remoteDataManager. uploadDeviceStatus ( nsPumpStatus)
334
314
315
+ completion ( . Success( status: status, date: date) )
335
316
case . Failure( let error) :
336
- completion ( error: error)
317
+ self . logger. addError ( " Failed to fetch pump status: \( error) " , fromSource: " RileyLink " )
318
+ completion ( . Failure( error) )
337
319
}
338
- } )
320
+ }
339
321
}
340
322
341
323
/**
@@ -352,17 +334,16 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
352
334
let pumpStatusAgeTolerance = rileyLinkManager. idleListeningEnabled ? NSTimeInterval ( minutes: 11 ) : NSTimeInterval ( minutes: 4 )
353
335
354
336
// If we don't yet have pump status, or it's old, poll for it.
355
- if latestPumpStatusDate == nil || latestPumpStatusDate!. timeIntervalSinceNow <= - pumpStatusAgeTolerance {
356
- readAndUpdatePumpData ( { ( error) in
357
- if let error = error {
358
- self . logger. addError ( error, fromSource: " RileyLink " )
337
+ if latestReservoirValue == nil || latestReservoirValue!. startDate. timeIntervalSinceNow <= - pumpStatusAgeTolerance {
338
+ readPumpData { ( result) in
339
+ switch result {
340
+ case . Success( let ( status, date) ) :
341
+ self . updateReservoirVolume ( status. reservoir, atDate: date, withTimeLeft: nil )
342
+ case . Failure:
359
343
self . troubleshootPumpCommsWithDevice ( device)
360
344
}
361
- } )
362
-
345
+ }
363
346
}
364
-
365
-
366
347
}
367
348
368
349
/**
@@ -449,18 +430,26 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
449
430
}
450
431
451
432
// If we don't have recent pump data, or the pump was recently rewound, read new pump data before bolusing.
452
- if latestPumpStatusDate == nil ||
433
+ if latestReservoirValue == nil ||
453
434
latestReservoirVolumeDrop < 0 ||
454
- latestPumpStatusDate! . timeIntervalSinceNow <= NSTimeInterval ( minutes: - 5 )
435
+ latestReservoirValue! . startDate . timeIntervalSinceNow <= NSTimeInterval ( minutes: - 5 )
455
436
{
456
- readAndUpdatePumpData ( { ( error) in
457
- if let error = error {
458
- self . logger. addError ( error, fromSource: " Bolus " )
459
- completion ( error: LoopError . CommunicationError)
460
- } else {
461
- setBolus ( )
437
+ readPumpData { ( result) in
438
+ switch result {
439
+ case . Success( let ( status, date) ) :
440
+ self . doseStore. addReservoirValue ( status. reservoir, atDate: date) { ( newValue, _, error) in
441
+ if let error = error {
442
+ self . logger. addError ( error, fromSource: " Bolus " )
443
+ completion ( error: error)
444
+ } else {
445
+ self . latestReservoirValue = newValue
446
+ setBolus ( )
447
+ }
448
+ }
449
+ case . Failure( let error) :
450
+ completion ( error: error)
462
451
}
463
- } )
452
+ }
464
453
} else {
465
454
setBolus ( )
466
455
}
@@ -720,8 +709,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
720
709
if let sentrySupported = pumpState? . pumpModel? . larger where !sentrySupported {
721
710
rileyLinkManager. idleListeningEnabled = false
722
711
}
723
- NSUserDefaults . standardUserDefaults ( ) . pumpModelNumber = pumpState? . pumpModel? . rawValue
724
712
713
+ NSUserDefaults . standardUserDefaults ( ) . pumpModelNumber = pumpState? . pumpModel? . rawValue
725
714
case " lastHistoryDump " ? , " awakeUntil " ? :
726
715
break
727
716
default :
0 commit comments