Selaa lähdekoodia

Set transmitter ID in UI

Ivan Valkou 4 vuotta sitten
vanhempi
commit
dff2cad9b0

+ 11 - 3
FreeAPS/Sources/APS/CGM/DexcomSource.swift

@@ -5,9 +5,9 @@ import Foundation
 final class DexcomSource: GlucoseSource {
     private let processQueue = DispatchQueue(label: "DexcomSource.processQueue")
 
-    @Persisted(key: "DexcomSource.transmitterID") var transmitterID: String? = nil
-
-    private let dexcomManager = TransmitterManager(state: TransmitterManagerState(transmitterID: "8MBPEY"))
+    private let dexcomManager = TransmitterManager(
+        state: TransmitterManagerState(transmitterID: UserDefaults.standard.dexcomTransmitterID ?? "8MBPEY")
+    )
 
     private var promise: Future<[BloodGlucose], Error>.Promise?
 
@@ -15,6 +15,10 @@ final class DexcomSource: GlucoseSource {
         dexcomManager.delegate = self
     }
 
+    var transmitterID: String {
+        dexcomManager.transmitter.ID
+    }
+
     func fetch() -> AnyPublisher<[BloodGlucose], Never> {
         dexcomManager.transmitter.resumeScanning()
         return Future<[BloodGlucose], Error> { [weak self] promise in
@@ -24,6 +28,10 @@ final class DexcomSource: GlucoseSource {
         .replaceError(with: [])
         .eraseToAnyPublisher()
     }
+
+    deinit {
+        dexcomManager.transmitter.stopScanning()
+    }
 }
 
 extension DexcomSource: TransmitterManagerDelegate {

+ 19 - 11
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -20,34 +20,32 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
 
     init(resolver: Resolver) {
         injectServices(resolver)
+        updateGlucoseSource()
         subscribe()
     }
 
-    var glucoseSource: GlucoseSource {
+    var glucoseSource: GlucoseSource!
+
+    private func updateGlucoseSource() {
         switch settingsManager.settings.cgm {
         case .xdrip:
-            return appGroupSource
+            glucoseSource = appGroupSource
         case .dexcomG5,
              .dexcomG6:
-            return dexcomSource
+            glucoseSource = dexcomSource
         case .nightscout,
              .none:
-            return nightscoutManager
+            glucoseSource = nightscoutManager
         }
     }
 
     private func subscribe() {
-        UserDefaults.standard
-            .publisher(for: \.dexcomTransmitterID)
-            .sink { _ in
-            }
-            .store(in: &lifetime)
-
         timer.publisher
             .receive(on: processQueue)
             .flatMap { date -> AnyPublisher<(Date, Date, [BloodGlucose]), Never> in
                 debug(.nightscout, "FetchGlucoseManager heartbeat")
                 debug(.nightscout, "Start fetching glucose")
+                self.updateGlucoseSource()
                 return Publishers.CombineLatest3(
                     Just(date),
                     Just(self.glucoseStorage.syncDate()),
@@ -68,13 +66,23 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
             .store(in: &lifetime)
         timer.fire()
         timer.resume()
+
+        UserDefaults.standard
+            .publisher(for: \.dexcomTransmitterID)
+            .removeDuplicates()
+            .sink { id in
+                if id != self.dexcomSource.transmitterID {
+                    self.dexcomSource = DexcomSource()
+                }
+            }
+            .store(in: &lifetime)
     }
 }
 
 extension UserDefaults {
     @objc var dexcomTransmitterID: String? {
         get {
-            string(forKey: "DexcomSource.transmitterID")
+            string(forKey: "DexcomSource.transmitterID")?.nonEmpty
         }
         set {
             set(newValue, forKey: "DexcomSource.transmitterID")

+ 6 - 0
FreeAPS/Sources/Modules/CGM/CGMViewModel.swift

@@ -5,9 +5,11 @@ extension CGM {
         @Injected() var settingsManager: SettingsManager!
 
         @Published var cgm: CGMType = .nightscout
+        @Published var transmitterID: String = ""
 
         override func subscribe() {
             cgm = settingsManager.settings.cgm ?? .nightscout
+            transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
 
             $cgm
                 .removeDuplicates()
@@ -16,5 +18,9 @@ extension CGM {
                 }
                 .store(in: &lifetime)
         }
+
+        func onChangeID() {
+            UserDefaults.standard.dexcomTransmitterID = transmitterID
+        }
     }
 }

+ 11 - 0
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -13,6 +13,17 @@ extension CGM {
                         }
                     }
                 }
+                if [.dexcomG5, .dexcomG6].contains(viewModel.cgm) {
+                    Section(header: Text("Transmitter ID")) {
+                        TextField("XXXXXX", text: $viewModel.transmitterID, onCommit: {
+                            UIApplication.shared.endEditing()
+                            viewModel.onChangeID()
+                        })
+                            .disableAutocorrection(true)
+                            .autocapitalization(.allCharacters)
+                            .keyboardType(.asciiCapable)
+                    }
+                }
             }
             .navigationTitle("CGM")
             .navigationBarTitleDisplayMode(.automatic)