Skip to content

Commit ba63f6b

Browse files
authored
Saving pump history into LoopKit and delegating upload to Nightscout (#128)
* Adding a current glucose HUD * DoseStore upload delegation * Updating interface; fixing watch * Reverting font weight change * Better display of history values
1 parent 0bc3ce4 commit ba63f6b

File tree

2 files changed

+40
-32
lines changed

2 files changed

+40
-32
lines changed

Loop/Extensions/DoseStore.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ extension DoseStore {
5959
break
6060
}
6161

62-
title = (dose?.type != nil ? String(dose!.type) : event.dictionaryRepresentation["_type"] as? String) ?? String(event.pumpEvent.dynamicType)
62+
title = String(event.pumpEvent)
6363
events.append(NewPumpEvent(date: event.date, dose: dose, isMutable: event.isMutable(), raw: event.pumpEvent.rawData, title: title))
6464
}
6565

Loop/Managers/DeviceDataManager.swift

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import Foundation
1010
import CarbKit
11+
import CoreData
1112
import G4ShareSpy
1213
import GlucoseKit
1314
import HealthKit
@@ -20,7 +21,7 @@ import ShareClient
2021
import xDripG5
2122

2223

23-
final class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverDelegate {
24+
final class DeviceDataManager: CarbStoreDelegate, DoseStoreDelegate, TransmitterDelegate, ReceiverDelegate {
2425
/// Notification posted by the instance when new glucose data was processed
2526
static let GlucoseUpdatedNotification = "com.loudnate.Naterade.notification.GlucoseUpdated"
2627

@@ -42,9 +43,6 @@ final class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverD
4243

4344
private var nightscoutDataManager: NightscoutDataManager!
4445

45-
// Timestamp of last event we've retrieved from pump
46-
var observingPumpEventsSince = NSDate(timeIntervalSinceNow: NSTimeInterval(hours: -24))
47-
4846
// The Dexcom Share receiver object
4947
private var receiver: Receiver? {
5048
didSet {
@@ -350,38 +348,18 @@ final class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverD
350348
return
351349
}
352350

353-
// TODO: Reconcile these
354-
//let startDate = doseStore.pumpEventQueryAfterDate
355-
let startDate = remoteDataManager.nightscoutUploader?.observingPumpEventsSince ?? observingPumpEventsSince
351+
let startDate = doseStore.pumpEventQueryAfterDate
356352

357353
device.ops?.getHistoryEventsSinceDate(startDate) { (result) in
358354
switch result {
359-
case let .Success(events, pumpModel):
360-
// TODO: Surface raw pump event data and add DoseEntry conformance
361-
// self.doseStore.addPumpEvents(events.map({ ($0.date, nil, $0.pumpEvent.rawData, $0.isMutable()) })) { (error) in
362-
// if let error = error {
363-
// self.logger.addError("Failed to store history: \(error)", fromSource: "DoseStore")
364-
// }
365-
// }
366-
367-
NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.PumpStatusUpdatedNotification, object: self)
368-
self.remoteDataManager.nightscoutUploader?.processPumpEvents(events, source: device.deviceURI, pumpModel: pumpModel)
369-
370-
var lastFinalDate: NSDate?
371-
var firstMutableDate: NSDate?
372-
373-
for event in events {
374-
if event.isMutable() {
375-
firstMutableDate = min(event.date, firstMutableDate ?? event.date)
376-
} else {
377-
lastFinalDate = max(event.date, lastFinalDate ?? event.date)
355+
case let .Success(events, _):
356+
self.doseStore.add(events) { (error) in
357+
if let error = error {
358+
self.logger.addError("Failed to store history: \(error)", fromSource: "DoseStore")
378359
}
379360
}
380-
if let mutableDate = firstMutableDate {
381-
self.observingPumpEventsSince = mutableDate
382-
} else if let finalDate = lastFinalDate {
383-
self.observingPumpEventsSince = finalDate
384-
}
361+
362+
NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.PumpStatusUpdatedNotification, object: self)
385363
case .Failure(let error):
386364
self.logger.addError("Failed to fetch history: \(error)", fromSource: "RileyLink")
387365

@@ -860,6 +838,35 @@ final class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverD
860838

861839
let doseStore: DoseStore
862840

841+
// MARK: DoseStoreDelegate
842+
843+
func doseStore(doseStore: DoseStore, hasEventsNeedingUpload pumpEvents: [PersistedPumpEvent], fromPumpID pumpID: String, withCompletion completionHandler: (uploadedObjects: [NSManagedObjectID]) -> Void) {
844+
guard let uploader = remoteDataManager.nightscoutUploader, pumpModel = pumpState?.pumpModel else {
845+
completionHandler(uploadedObjects: pumpEvents.map({ $0.objectID }))
846+
return
847+
}
848+
849+
var objectIDs = [NSManagedObjectID]()
850+
var timestampedPumpEvents = [TimestampedHistoryEvent]()
851+
852+
for event in pumpEvents {
853+
objectIDs.append(event.objectID)
854+
855+
if let raw = event.raw where raw.length > 0, let type = MinimedKit.PumpEventType(rawValue: raw[0])?.eventType, pumpEvent = type.init(availableData: raw, pumpModel: pumpModel) {
856+
timestampedPumpEvents.append(TimestampedHistoryEvent(pumpEvent: pumpEvent, date: event.date))
857+
}
858+
}
859+
860+
uploader.upload(timestampedPumpEvents, forSource: "loop://\(UIDevice.currentDevice().name)", from: pumpModel) { (error) in
861+
if let error = error {
862+
self.logger.addError(error, fromSource: "NightscoutUploadKit")
863+
completionHandler(uploadedObjects: [])
864+
} else {
865+
completionHandler(uploadedObjects: objectIDs)
866+
}
867+
}
868+
}
869+
863870
// MARK: - WatchKit
864871

865872
private(set) var watchManager: WatchDataManager!
@@ -924,6 +931,7 @@ final class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate, ReceiverD
924931
nightscoutDataManager = NightscoutDataManager(deviceDataManager: self)
925932

926933
carbStore?.delegate = self
934+
doseStore.delegate = self
927935

928936
if NSUserDefaults.standardUserDefaults().receiverEnabled {
929937
receiver = Receiver()

0 commit comments

Comments
 (0)