Skip to content

Commit b3ef35a

Browse files
authored
Merge pull request #61 from loudnate/522-share-race
Read glucose + pump data deterministically for x22 + G4 Share users
2 parents 2b6d4f4 + a3133ea commit b3ef35a

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

Loop/Managers/DeviceDataManager.swift

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate {
9090
}
9191

9292
@objc private func receivedRileyLinkTimerTickNotification(note: NSNotification) {
93-
assertCurrentPumpData()
94-
95-
backfillGlucoseFromShareIfNeeded()
93+
backfillGlucoseFromShareIfNeeded() {
94+
self.assertCurrentPumpData()
95+
}
9696
}
9797

9898
func connectToRileyLink(device: RileyLinkDevice) {
@@ -414,8 +414,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate {
414414

415415
func transmitter(transmitter: Transmitter, didError error: ErrorType) {
416416
logger.addMessage([
417-
"error": "\(error)",
418-
"collectedAt": NSDateFormatter.ISO8601StrictDateFormatter().stringFromDate(NSDate())
417+
"error": "\(error)",
418+
"collectedAt": NSDateFormatter.ISO8601StrictDateFormatter().stringFromDate(NSDate())
419419
], toCollection: "g5"
420420
)
421421

@@ -466,34 +466,47 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate {
466466
var latestGlucoseMessage: GlucoseRxMessage?
467467

468468
/**
469-
Attempts to backfill glucose data from the share servers if the G5 connection hasn't been established.
469+
Attempts to backfill glucose data from the share servers if a G5 connection hasn't been established.
470+
471+
- parameter completion: An optional closure called after the command is complete.
470472
*/
471-
private func backfillGlucoseFromShareIfNeeded() {
472-
if latestGlucoseMessage == nil,
473-
let shareClient = remoteDataManager.shareClient, glucoseStore = glucoseStore
474-
{
475-
// Load glucose from Share if our xDripG5 connection hasn't started
476-
shareClient.fetchLast(1) { (error, glucose) in
477-
if let error = error {
478-
self.logger.addError(error, fromSource: "ShareClient")
479-
}
473+
private func backfillGlucoseFromShareIfNeeded(completion completion: (() -> Void)? = nil) {
474+
// We should have no G5 data, and a configured ShareClient and GlucoseStore.
475+
guard latestGlucoseMessage == nil, let shareClient = remoteDataManager.shareClient, glucoseStore = glucoseStore else {
476+
completion?()
477+
return
478+
}
480479

481-
guard let glucose = glucose?.first else {
482-
return
483-
}
480+
// If our last glucose was less than 4 minutes ago, don't fetch.
481+
if let latestGlucose = glucoseStore.latestGlucose where latestGlucose.startDate.timeIntervalSinceNow <= -NSTimeInterval(minutes: 4) {
482+
completion?()
483+
return
484+
}
484485

485-
// Ignore glucose values that are less than a minute newer than our previous value
486-
if let latestGlucose = glucoseStore.latestGlucose where latestGlucose.startDate.timeIntervalSinceDate(glucose.startDate) > -NSTimeInterval(minutes: 1) {
487-
return
488-
}
486+
shareClient.fetchLast(1) { (error, glucose) in
487+
if let error = error {
488+
self.logger.addError(error, fromSource: "ShareClient")
489+
}
489490

490-
glucoseStore.addGlucose(glucose.quantity, date: glucose.startDate, displayOnly: false, device: nil) { (_, value, error) -> Void in
491-
if let error = error {
492-
self.logger.addError(error, fromSource: "GlucoseStore")
493-
}
491+
guard let glucose = glucose?.first else {
492+
completion?()
493+
return
494+
}
494495

495-
NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.GlucoseUpdatedNotification, object: self)
496+
// Ignore glucose values that are less than a minute newer than our previous value
497+
if let latestGlucose = glucoseStore.latestGlucose where latestGlucose.startDate.timeIntervalSinceDate(glucose.startDate) > -NSTimeInterval(minutes: 1) {
498+
completion?()
499+
return
500+
}
501+
502+
glucoseStore.addGlucose(glucose.quantity, date: glucose.startDate, displayOnly: false, device: nil) { (_, value, error) -> Void in
503+
if let error = error {
504+
self.logger.addError(error, fromSource: "GlucoseStore")
496505
}
506+
507+
NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.GlucoseUpdatedNotification, object: self)
508+
509+
completion?()
497510
}
498511
}
499512
}

0 commit comments

Comments
 (0)