Selaa lähdekoodia

Set external date to heartbeat

Ivan Valkou 5 vuotta sitten
vanhempi
commit
e8eeb139e0

+ 3 - 3
FreeAPS/Sources/APS/APSManager.swift

@@ -6,7 +6,7 @@ import SwiftDate
 import Swinject
 import Swinject
 
 
 protocol APSManager {
 protocol APSManager {
-    func heartbeat(force: Bool)
+    func heartbeat(date: Date, force: Bool)
     func autotune() -> AnyPublisher<Autotune?, Never>
     func autotune() -> AnyPublisher<Autotune?, Never>
     func enactBolus(amount: Double)
     func enactBolus(amount: Double)
     var pumpManager: PumpManagerUI? { get set }
     var pumpManager: PumpManagerUI? { get set }
@@ -78,8 +78,8 @@ final class BaseAPSManager: APSManager, Injectable {
         pumpManager?.addStatusObserver(self, queue: processQueue)
         pumpManager?.addStatusObserver(self, queue: processQueue)
     }
     }
 
 
-    func heartbeat(force: Bool) {
-        deviceDataManager.heartbeat(force: force)
+    func heartbeat(date: Date, force: Bool) {
+        deviceDataManager.heartbeat(date: date, force: force)
     }
     }
 
 
     private func fetchAndLoop() {
     private func fetchAndLoop() {

+ 10 - 8
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -15,7 +15,7 @@ protocol DeviceDataManager {
     var recommendsLoop: PassthroughSubject<Void, Never> { get }
     var recommendsLoop: PassthroughSubject<Void, Never> { get }
     var pumpName: CurrentValueSubject<String, Never> { get }
     var pumpName: CurrentValueSubject<String, Never> { get }
     var pumpExpiresAtDate: CurrentValueSubject<Date?, Never> { get }
     var pumpExpiresAtDate: CurrentValueSubject<Date?, Never> { get }
-    func heartbeat(force: Bool)
+    func heartbeat(date: Date, force: Bool)
 }
 }
 
 
 private let staticPumpManagers: [PumpManagerUI.Type] = [
 private let staticPumpManagers: [PumpManagerUI.Type] = [
@@ -35,6 +35,7 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     @Injected() private var pumpHistoryStorage: PumpHistoryStorage!
     @Injected() private var pumpHistoryStorage: PumpHistoryStorage!
     @Injected() private var storage: FileStorage!
     @Injected() private var storage: FileStorage!
     @Injected() private var broadcaster: Broadcaster!
     @Injected() private var broadcaster: Broadcaster!
+    @Injected() private var glucoseStorage: GlucoseStorage!
 
 
     @Persisted(key: "BaseDeviceDataManager.lastEventDate") var lastEventDate: Date? = nil
     @Persisted(key: "BaseDeviceDataManager.lastEventDate") var lastEventDate: Date? = nil
     @SyncAccess(lock: accessLock) @Persisted(key: "BaseDeviceDataManager.lastHeartBeatTime") var lastHeartBeatTime: Date =
     @SyncAccess(lock: accessLock) @Persisted(key: "BaseDeviceDataManager.lastHeartBeatTime") var lastHeartBeatTime: Date =
@@ -83,17 +84,16 @@ 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(date: Date, force: Bool) {
         if force {
         if force {
-            lastHeartBeatTime = Date()
+            lastHeartBeatTime = date
             updatePumpData()
             updatePumpData()
             return
             return
         }
         }
 
 
-        let now = Date()
         var updateInterval: TimeInterval = 5.minutes.timeInterval
         var updateInterval: TimeInterval = 5.minutes.timeInterval
 
 
-        switch lastHeartBeatTime.timeIntervalSince(now) {
+        switch lastHeartBeatTime.timeIntervalSince(date) {
         case let interval where interval < -10.minutes.timeInterval:
         case let interval where interval < -10.minutes.timeInterval:
             break
             break
         case let interval where interval < -5.minutes.timeInterval:
         case let interval where interval < -5.minutes.timeInterval:
@@ -102,13 +102,13 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
             break
             break
         }
         }
 
 
-        let interval = now.timeIntervalSince(lastHeartBeatTime)
+        let interval = date.timeIntervalSince(lastHeartBeatTime)
         guard 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
         }
         }
 
 
-        lastHeartBeatTime = Date()
+        lastHeartBeatTime = date
         updatePumpData()
         updatePumpData()
     }
     }
 
 
@@ -164,7 +164,9 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
 
 
     func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
     func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
         debug(.deviceManager, "Pump Heartbeat")
         debug(.deviceManager, "Pump Heartbeat")
-//        heartbeat(force: false)
+        if glucoseStorage.isGlucoseFresh() {
+            heartbeat(date: Date(), force: false)
+        }
     }
     }
 
 
     func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
     func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {

+ 11 - 7
FreeAPS/Sources/APS/GlucoseManager.swift

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

+ 10 - 5
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -6,8 +6,9 @@ protocol GlucoseStorage {
     func storeGlucose(_ glucose: [BloodGlucose])
     func storeGlucose(_ glucose: [BloodGlucose])
     func recent() -> [BloodGlucose]
     func recent() -> [BloodGlucose]
     func syncDate() -> Date
     func syncDate() -> Date
-    func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose]
+    func filterTooFrequentGlucose(_ glucose: [BloodGlucose], at: Date) -> [BloodGlucose]
     func lastGlucoseDate() -> Date
     func lastGlucoseDate() -> Date
+    func isGlucoseFresh() -> Bool
 }
 }
 
 
 final class BaseGlucoseStorage: GlucoseStorage, Injectable {
 final class BaseGlucoseStorage: GlucoseStorage, Injectable {
@@ -25,7 +26,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
 
 
     func storeGlucose(_ glucose: [BloodGlucose]) {
     func storeGlucose(_ glucose: [BloodGlucose]) {
         processQueue.sync {
         processQueue.sync {
-            let filtered = self.filterTooFrequentGlucose(glucose)
+            let filtered = self.filterTooFrequentGlucose(glucose, at: self.lastGlucoseDate())
             let file = OpenAPS.Monitor.glucose
             let file = OpenAPS.Monitor.glucose
             self.storage.transaction { storage in
             self.storage.transaction { storage in
                 storage.append(filtered, to: file, uniqBy: \.dateString)
                 storage.append(filtered, to: file, uniqBy: \.dateString)
@@ -50,7 +51,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         else {
         else {
             return Date().addingTimeInterval(-1.days.timeInterval)
             return Date().addingTimeInterval(-1.days.timeInterval)
         }
         }
-        return recent.dateString.addingTimeInterval(Config.filterTime)
+        return recent.dateString
     }
     }
 
 
     func recent() -> [BloodGlucose] {
     func recent() -> [BloodGlucose] {
@@ -61,8 +62,12 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         recent().last?.dateString ?? .distantPast
         recent().last?.dateString ?? .distantPast
     }
     }
 
 
-    func filterTooFrequentGlucose(_ glucose: [BloodGlucose]) -> [BloodGlucose] {
-        var lastDate = lastGlucoseDate()
+    func isGlucoseFresh() -> Bool {
+        Date().timeIntervalSince(lastGlucoseDate()) <= Config.filterTime
+    }
+
+    func filterTooFrequentGlucose(_ glucose: [BloodGlucose], at date: Date) -> [BloodGlucose] {
+        var lastDate = date
         var filtered: [BloodGlucose] = []
         var filtered: [BloodGlucose] = []
 
 
         for entry in glucose.reversed() {
         for entry in glucose.reversed() {

+ 1 - 1
FreeAPS/Sources/Modules/Home/HomeProvider.swift

@@ -19,7 +19,7 @@ extension Home {
         }
         }
 
 
         func heartbeatNow() {
         func heartbeatNow() {
-            apsManager.heartbeat(force: true)
+            apsManager.heartbeat(date: Date(), force: true)
         }
         }
 
 
         func filteredGlucose(hours: Int) -> [BloodGlucose] {
         func filteredGlucose(hours: Int) -> [BloodGlucose] {

+ 1 - 0
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -348,6 +348,7 @@ extension MainChartView {
         calculateCarbsDots(fullSize: fullSize)
         calculateCarbsDots(fullSize: fullSize)
         calculateTempTargetsRects(fullSize: fullSize)
         calculateTempTargetsRects(fullSize: fullSize)
         calculateTempTargetsRects(fullSize: fullSize)
         calculateTempTargetsRects(fullSize: fullSize)
+        calculateBasalPoints(fullSize: fullSize)
     }
     }
 
 
     private func calculateGlucoseDots(fullSize: CGSize) {
     private func calculateGlucoseDots(fullSize: CGSize) {