88
99import Foundation
1010import CarbKit
11+ import CoreData
1112import G4ShareSpy
1213import GlucoseKit
1314import HealthKit
@@ -20,7 +21,7 @@ import ShareClient
2021import 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 do seStore: DoseStore
862840
841+ // MARK: DoseStoreDelegate
842+
843+ func do seStore( doseStore: DoseStore, hasEventsNeedingUpload pumpEvents: [ PersistedPumpEvent] , fromPumpID pumpID: String, withCompletion complet ionHandler: ( 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