Ivan Valkou 4 лет назад
Родитель
Сommit
18f6172da5

+ 1 - 1
FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json

@@ -12,5 +12,5 @@
     "cgm": "nightscout",
     "uploadGlucose": false,
     "glucoseBadge": false,
-    "glucoseNotifications": false
+    "glucoseNotificationsAlways": false
 }

+ 9 - 1
FreeAPS/Sources/APS/CGM/GlucoseSource.swift

@@ -1,5 +1,13 @@
 import Combine
 
-protocol GlucoseSource {
+protocol SourceInfoProvider {
+    func sourceInfo() -> [String: Any]?
+}
+
+protocol GlucoseSource: SourceInfoProvider {
     func fetch() -> AnyPublisher<[BloodGlucose], Never>
 }
+
+extension GlucoseSource {
+    func sourceInfo() -> [String: Any]? { nil }
+}

+ 7 - 0
FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift

@@ -41,6 +41,13 @@ final class BaseLibreTransmitterSource: LibreTransmitterSource, Injectable {
         .replaceError(with: [])
         .eraseToAnyPublisher()
     }
+
+    func sourceInfo() -> [String: Any]? {
+        if let battery = manager?.battery {
+            return ["transmitterBattery": battery]
+        }
+        return nil
+    }
 }
 
 extension BaseLibreTransmitterSource: LibreTransmitterManagerDelegate {

+ 5 - 1
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -3,7 +3,7 @@ import Foundation
 import SwiftDate
 import Swinject
 
-protocol FetchGlucoseManager {}
+protocol FetchGlucoseManager: SourceInfoProvider {}
 
 final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     private let processQueue = DispatchQueue(label: "BaseGlucoseManager.processQueue")
@@ -88,6 +88,10 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
             }
             .store(in: &lifetime)
     }
+
+    func sourceInfo() -> [String: Any]? {
+        glucoseSource.sourceInfo()
+    }
 }
 
 extension UserDefaults {

+ 3 - 3
FreeAPS/Sources/Models/FreeAPSSettings.swift

@@ -15,7 +15,7 @@ struct FreeAPSSettings: JSON, Equatable {
     var uploadGlucose: Bool = false
     var useCalendar: Bool = false
     var glucoseBadge: Bool = false
-    var glucoseNotifications: Bool = false
+    var glucoseNotificationsAlways: Bool = false
 }
 
 extension FreeAPSSettings: Decodable {
@@ -80,8 +80,8 @@ extension FreeAPSSettings: Decodable {
             settings.glucoseBadge = glucoseBadge
         }
 
-        if let glucoseNotifications = try? container.decode(Bool.self, forKey: .glucoseNotifications) {
-            settings.glucoseNotifications = glucoseNotifications
+        if let glucoseNotificationsAlways = try? container.decode(Bool.self, forKey: .glucoseNotificationsAlways) {
+            settings.glucoseNotificationsAlways = glucoseNotificationsAlways
         }
 
         self = settings

+ 4 - 10
FreeAPS/Sources/Modules/NotificationsConfig/NotificationsConfigStateModel.swift

@@ -2,21 +2,15 @@ import SwiftUI
 
 extension NotificationsConfig {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() private var settingsManager: SettingsManager!
-
         @Published var glucoseBadge = false
+        @Published var glucoseNotificationsAlways = false
 
         override func subscribe() {
             glucoseBadge = settingsManager.settings.glucoseBadge
+            glucoseNotificationsAlways = settingsManager.settings.glucoseNotificationsAlways
 
-            $glucoseBadge
-                .removeDuplicates()
-                .assign(to: \.settings.glucoseBadge, on: settingsManager)
-                .store(in: &lifetime)
-        }
-
-        deinit {
-            print("OK")
+            subscribeSetting(\.glucoseBadge, on: $glucoseBadge)
+            subscribeSetting(\.glucoseNotificationsAlways, on: $glucoseNotificationsAlways)
         }
     }
 }

+ 15 - 0
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -27,6 +27,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     @Injected() private var reachabilityManager: ReachabilityManager!
 
     private let processQueue = DispatchQueue(label: "BaseNetworkManager.processQueue")
+    private var ping: TimeInterval?
 
     private var lifetime = Lifetime()
 
@@ -66,6 +67,13 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
         }
     }
 
+    func sourceInfo() -> [String: Any]? {
+        if let ping = ping {
+            return [GlucoseSourceKey.nightscoutPing.rawValue: ping]
+        }
+        return nil
+    }
+
     var cgmURL: URL? {
         if let url = settingsManager.settings.cgm.appURL {
             return url
@@ -82,6 +90,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
 
     func fetchGlucose() -> AnyPublisher<[BloodGlucose], Never> {
         let useLocal = settingsManager.settings.useLocalGlucoseSource
+        ping = nil
 
         if !useLocal {
             guard isNetworkReachable else {
@@ -97,6 +106,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
             return Just([]).eraseToAnyPublisher()
         }
 
+        let startDate = Date()
+
         let since = glucoseStorage.syncDate()
         return nightscout.fetchLastGlucose(sinceDate: since)
             .tryCatch({ (error) -> AnyPublisher<[BloodGlucose], Error> in
@@ -104,6 +115,10 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
                 return Just([]).setFailureType(to: Error.self).eraseToAnyPublisher()
             })
             .replaceError(with: [])
+            .handleEvents(receiveOutput: { value in
+                guard value.isNotEmpty else { return }
+                self.ping = Date().timeIntervalSince(startDate)
+            })
             .eraseToAnyPublisher()
     }
 

+ 29 - 1
FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift

@@ -6,6 +6,11 @@ import UserNotifications
 
 protocol UserNotificationsManager {}
 
+enum GlucoseSourceKey: String {
+    case transmitterBattery
+    case nightscoutPing
+}
+
 final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, Injectable {
     private enum Identifier: String {
         case glucocoseNotification = "FreeAPS.glucoseNotification"
@@ -14,6 +19,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
     @Injected() private var settingsManager: SettingsManager!
     @Injected() private var broadcaster: Broadcaster!
     @Injected() private var glucoseStorage: GlucoseStorage!
+    @Injected(as: FetchGlucoseManager.self) private var sourceInfoProvider: SourceInfoProvider!
 
     private let center = UNUserNotificationCenter.current()
 
@@ -93,10 +99,32 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
                         ) as NSNumber)!
                 } ?? "--"
 
-            let body = glucoseText + " " + directionText + " " + deltaText
+            var body = glucoseText + " " + directionText + " " + deltaText
             titles.append(body)
 
             content.title = titles.joined(separator: " ")
+
+            if let info = self.sourceInfoProvider.sourceInfo() {
+                //NS ping
+                if let ping = info[GlucoseSourceKey.nightscoutPing.rawValue] as? TimeInterval {
+                    body.append(
+                        "\n"
+                            + String(
+                                format: NSLocalizedString("Nightscout ping: %d ms", comment: "Nightscout ping"),
+                                Int(ping * 1000)
+                            )
+                    )
+                }
+
+                //Transmitter battery
+                if let transmitterBattery = info[GlucoseSourceKey.transmitterBattery.rawValue] as? Int {
+                    body.append(
+                        "\n"
+                            + String(format: NSLocalizedString("Transmitter: %@%%", comment: "Transmitter: %@%%"), transmitterBattery)
+                    )
+                }
+            }
+
             content.body = body
 
             self.addAppBadge(glucose: lastGlucose.glucose)