Skip to content

Commit 60c98e5

Browse files
authored
Adjustments to pump status uploading: (#101)
* Removing some unnecessary state * Preventing a pre-bolus status read from triggering the loop and history dump
1 parent 910233e commit 60c98e5

File tree

2 files changed

+41
-53
lines changed

2 files changed

+41
-53
lines changed

Loop/Managers/DeviceDataManager.swift

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -151,27 +151,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
151151

152152
// MARK: Pump data
153153

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?
175155

176156
// TODO: Expose this on DoseStore
177157
var latestReservoirValue: ReservoirValue? {
@@ -212,7 +192,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
212192

213193
latestPumpStatusFromMySentry = status
214194

215-
216195
// Gather PumpStatus from MySentry packet
217196
let pumpStatus: NightscoutUploadKit.PumpStatus?
218197
if let pumpDate = status.pumpDateComponents.date, let pumpID = pumpID {
@@ -266,7 +245,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
266245
}
267246
}
268247

269-
270248
/**
271249
Store a new reservoir volume and notify observers of new pump data.
272250

@@ -307,35 +285,39 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
307285
}
308286
}
309287

310-
private func readAndUpdatePumpData(completion: (error: ErrorType?) -> Void) {
288+
/**
289+
Read the pump's current state, including reservoir and clock
311290

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) {
312296
guard let device = rileyLinkManager.firstConnectedDevice, let ops = device.ops else {
313-
completion(error: LoopError.ConfigurationError)
297+
completion(.Failure(LoopError.ConfigurationError))
314298
return
315299
}
316300

317-
ops.readPumpStatus({ (result) in
301+
ops.readPumpStatus { (result) in
318302
switch result {
319303
case .Success(let status):
320-
self.latestPolledPumpStatus = status
321-
322304
status.clock.timeZone = ops.pumpState.timeZone
323305
guard let date = status.clock.date else {
324306
self.logger.addError("Could not interpret pump clock: \(status.clock)", fromSource: "RileyLink")
325-
completion(error: LoopError.ConfigurationError)
307+
completion(.Failure(LoopError.ConfigurationError))
326308
return
327309
}
328310

329-
self.updateReservoirVolume(status.reservoir, atDate: date, withTimeLeft: nil)
330-
331311
let battery = BatteryStatus(voltage: status.batteryVolts, status: BatteryIndicator(batteryStatus: status.batteryStatus))
332312
let nsPumpStatus = NightscoutUploadKit.PumpStatus(clock: date, pumpID: ops.pumpState.pumpID, iob: nil, battery: battery, suspended: status.suspended, bolusing: status.bolusing, reservoir: status.reservoir)
333313
self.remoteDataManager.uploadDeviceStatus(nsPumpStatus)
334314

315+
completion(.Success(status: status, date: date))
335316
case .Failure(let error):
336-
completion(error: error)
317+
self.logger.addError("Failed to fetch pump status: \(error)", fromSource: "RileyLink")
318+
completion(.Failure(error))
337319
}
338-
})
320+
}
339321
}
340322

341323
/**
@@ -352,17 +334,16 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
352334
let pumpStatusAgeTolerance = rileyLinkManager.idleListeningEnabled ? NSTimeInterval(minutes: 11) : NSTimeInterval(minutes: 4)
353335

354336
// 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:
359343
self.troubleshootPumpCommsWithDevice(device)
360344
}
361-
})
362-
345+
}
363346
}
364-
365-
366347
}
367348

368349
/**
@@ -449,18 +430,26 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
449430
}
450431

451432
// 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 ||
453434
latestReservoirVolumeDrop < 0 ||
454-
latestPumpStatusDate!.timeIntervalSinceNow <= NSTimeInterval(minutes: -5)
435+
latestReservoirValue!.startDate.timeIntervalSinceNow <= NSTimeInterval(minutes: -5)
455436
{
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)
462451
}
463-
})
452+
}
464453
} else {
465454
setBolus()
466455
}
@@ -720,8 +709,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegat
720709
if let sentrySupported = pumpState?.pumpModel?.larger where !sentrySupported {
721710
rileyLinkManager.idleListeningEnabled = false
722711
}
723-
NSUserDefaults.standardUserDefaults().pumpModelNumber = pumpState?.pumpModel?.rawValue
724712

713+
NSUserDefaults.standardUserDefaults().pumpModelNumber = pumpState?.pumpModel?.rawValue
725714
case "lastHistoryDump"?, "awakeUntil"?:
726715
break
727716
default:

Loop/Managers/RemoteDataManager.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class RemoteDataManager {
5757
return
5858
}
5959

60-
6160
// Gather UploaderStatus
6261
let uploaderDevice = UIDevice.currentDevice()
6362

@@ -70,7 +69,7 @@ class RemoteDataManager {
7069
let uploaderStatus = UploaderStatus(name: uploaderDevice.name, timestamp: NSDate(), battery: battery)
7170

7271
// Build DeviceStatus
73-
let deviceStatus = DeviceStatus(device: "loop://" + uploaderDevice.name, timestamp: NSDate(), pumpStatus: pumpStatus, uploaderStatus: uploaderStatus, loopStatus: loopStatus)
72+
let deviceStatus = DeviceStatus(device: "loop://\(uploaderDevice.name)", timestamp: NSDate(), pumpStatus: pumpStatus, uploaderStatus: uploaderStatus, loopStatus: loopStatus)
7473

7574
uploader.uploadDeviceStatus(deviceStatus)
7675
}

0 commit comments

Comments
 (0)