Sfoglia il codice sorgente

Rewrite sync logic again

Ivan Valkou 5 anni fa
parent
commit
96957e72be

+ 1 - 0
FreeAPS/Sources/APS/APSManager.swift

@@ -103,6 +103,7 @@ final class BaseAPSManager: APSManager, Injectable {
     }
     }
 
 
     private func loop() {
     private func loop() {
+        debug(.apsManager, "Starting loop")
         isLooping.send(true)
         isLooping.send(true)
         Publishers.CombineLatest(
         Publishers.CombineLatest(
             nightscout.fetchCarbs(),
             nightscout.fetchCarbs(),

+ 6 - 2
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -84,6 +84,11 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     @SyncAccess(lock: accessLock) private var pumpUpdateInProgress = false
     @SyncAccess(lock: accessLock) private var pumpUpdateInProgress = false
 
 
     func heartbeat(force: Bool) {
     func heartbeat(force: Bool) {
+        if force {
+            updatePumpData()
+            return
+        }
+
         let now = Date()
         let now = Date()
         var updateInterval: TimeInterval = 5.minutes.timeInterval
         var updateInterval: TimeInterval = 5.minutes.timeInterval
 
 
@@ -97,7 +102,7 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
         }
         }
 
 
         let interval = now.timeIntervalSince(lastHeartBeatTime)
         let interval = now.timeIntervalSince(lastHeartBeatTime)
-        guard force || interval >= updateInterval else {
+        guard interval >= updateInterval else {
             debug(.deviceManager, "Last hearbeat \(interval / 60) min ago, skip updating the pump data")
             debug(.deviceManager, "Last hearbeat \(interval / 60) min ago, skip updating the pump data")
             return
             return
         }
         }
@@ -158,7 +163,6 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
 
 
     func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
     func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
         debug(.deviceManager, "Pump Heartbeat")
         debug(.deviceManager, "Pump Heartbeat")
-        // TODO: call it for Medtronic CGM
 //        heartbeat(force: false)
 //        heartbeat(force: false)
     }
     }
 
 

+ 8 - 6
FreeAPS/Sources/APS/GlucoseManager.swift

@@ -22,18 +22,20 @@ final class BaseGlucoseManager: GlucoseManager, Injectable {
     private func subscribe() {
     private func subscribe() {
         timer.publisher
         timer.publisher
             .receive(on: processQueue)
             .receive(on: processQueue)
-            .flatMap { _ -> AnyPublisher<[BloodGlucose], Never> in
+            .flatMap { _ -> AnyPublisher<(Date, [BloodGlucose]), Never> in
                 debug(.nightscout, "Glucose manager heartbeat")
                 debug(.nightscout, "Glucose manager heartbeat")
                 debug(.nightscout, "Start fetching glucose")
                 debug(.nightscout, "Start fetching glucose")
-                return self.nightscoutManager.fetchGlucose()
+                return Publishers.CombineLatest(Just(self.glucoseStogare.syncDate()), self.nightscoutManager.fetchGlucose())
+                    .eraseToAnyPublisher()
             }
             }
-            .sink { glucose in
-                let filtered = self.glucoseStogare.filterTooFrequentGlucose(glucose)
+            .sink { syncDate, glucose in
+                // Because of Spike dosn't respect a date query
+                let filteredByDate = glucose.filter { $0.dateString > syncDate }
+                let filtered = self.glucoseStogare.filterTooFrequentGlucose(filteredByDate)
+                print("ASDF \(glucose.count) filtered: \(filtered.count)")
                 if !filtered.isEmpty {
                 if !filtered.isEmpty {
                     debug(.nightscout, "New glucose found")
                     debug(.nightscout, "New glucose found")
                     self.apsManager.heartbeat(force: true)
                     self.apsManager.heartbeat(force: true)
-                } else {
-                    self.apsManager.heartbeat(force: false)
                 }
                 }
             }
             }
             .store(in: &lifetime)
             .store(in: &lifetime)

+ 6 - 1
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -7,6 +7,7 @@ protocol GlucoseStorage {
     func recent() -> [BloodGlucose]
     func recent() -> [BloodGlucose]
     func syncDate() -> Date
     func syncDate() -> Date
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose]
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose]
+    func lastGlucoseDate() -> Date
 }
 }
 
 
 final class BaseGlucoseStorage: GlucoseStorage, Injectable {
 final class BaseGlucoseStorage: GlucoseStorage, Injectable {
@@ -56,8 +57,12 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self)?.reversed() ?? []
         storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self)?.reversed() ?? []
     }
     }
 
 
+    func lastGlucoseDate() -> Date {
+        recent().first?.dateString ?? .distantPast
+    }
+
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose] {
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose] {
-        var lastDate = recent().first?.dateString ?? .distantPast
+        var lastDate = lastGlucoseDate()
         var filtered: [BloodGlucose] = []
         var filtered: [BloodGlucose] = []
 
 
         for entry in glucose.reversed() {
         for entry in glucose.reversed() {

+ 2 - 2
FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift

@@ -39,8 +39,8 @@ struct CurrentGlucoseView: View {
                             glucoseFormatter
                             glucoseFormatter
                                 .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! }
                                 .string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! }
                         ?? "--"
                         ?? "--"
-                ).minimumScaleFactor(0.2)
-                    .font(.system(size: 24, weight: .bold))
+                )
+                .font(.system(size: 24, weight: .bold))
                 image.padding(.bottom, 2)
                 image.padding(.bottom, 2)
 
 
             }.padding(.leading, 4)
             }.padding(.leading, 4)

+ 1 - 1
FreeAPS/Sources/Services/Network/NightscoutAPI.swift

@@ -57,7 +57,7 @@ extension NightscoutAPI {
         components.host = url.host
         components.host = url.host
         components.port = url.port
         components.port = url.port
         components.path = Config.entriesPath
         components.path = Config.entriesPath
-        components.queryItems = [URLQueryItem(name: "count", value: "\(2000)")]
+        components.queryItems = [URLQueryItem(name: "count", value: "\(1600)")]
         if let date = sinceDate {
         if let date = sinceDate {
             let dateItem = URLQueryItem(
             let dateItem = URLQueryItem(
                 name: "find[dateString][$gte]",
                 name: "find[dateString][$gte]",