Sfoglia il codice sorgente

Move AddManualGlucose logic to Glucose Storage (to also update LA on change); Add SettingsObserver to DataTableStateModel

polscm32 1 anno fa
parent
commit
dc090452c6

+ 26 - 0
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -10,6 +10,7 @@ import Swinject
 protocol GlucoseStorage {
     var updatePublisher: AnyPublisher<Void, Never> { get }
     func storeGlucose(_ glucose: [BloodGlucose])
+    func addManualGlucose(glucose: Int)
     func isGlucoseDataFresh(_ glucoseDate: Date?) -> Bool
     func syncDate() -> Date
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose], at: Date) -> [BloodGlucose]
@@ -173,6 +174,31 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         }
     }
 
+    func addManualGlucose(glucose: Int) {
+        coredataContext.perform {
+            let newItem = GlucoseStored(context: self.coredataContext)
+            newItem.id = UUID()
+            newItem.date = Date()
+            newItem.glucose = Int16(glucose)
+            newItem.isManual = true
+            newItem.isUploadedToNS = false
+            newItem.isUploadedToHealth = false
+            newItem.isUploadedToTidepool = false
+
+            do {
+                guard self.coredataContext.hasChanges else { return }
+                try self.coredataContext.save()
+
+                // Glucose subscribers already listen to the update publisher, so call here to update glucose-related data.
+                self.updateSubject.send(())
+            } catch let error as NSError {
+                debugPrint(
+                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to save manual glucose to Core Data with error: \(error)"
+                )
+            }
+        }
+    }
+
     func isGlucoseDataFresh(_ glucoseDate: Date?) -> Bool {
         guard let glucoseDate = glucoseDate else { return false }
         return glucoseDate > Date().addingTimeInterval(-6 * 60)

+ 15 - 25
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -33,6 +33,7 @@ extension DataTable {
             units = settingsManager.settings.units
             maxBolus = provider.pumpSettings().maxBolus
             broadcaster.register(DeterminationObserver.self, observer: self)
+            broadcaster.register(SettingsObserver.self, observer: self)
         }
 
         func isGlucoseDataFresh(_ glucoseDate: Date?) -> Bool {
@@ -90,6 +91,14 @@ extension DataTable {
             }
         }
 
+        func addManualGlucose() {
+            // Always save value in mg/dL
+            let glucose = units == .mmolL ? manualGlucose.asMgdL : manualGlucose
+            let glucoseAsInt = Int(glucose)
+
+            glucoseStorage.addManualGlucose(glucose: glucoseAsInt)
+        }
+
         // Carb and FPU deletion from history
         /// - **Parameter**: NSManagedObjectID to be able to transfer the object safely from one thread to another thread
         func invokeCarbDeletionTask(_ treatmentObjectID: NSManagedObjectID) {
@@ -239,37 +248,18 @@ extension DataTable {
                 }
             }
         }
-
-        func addManualGlucose() {
-            let glucose = units == .mmolL ? manualGlucose.asMgdL : manualGlucose
-            let glucoseAsInt = Int(glucose)
-
-            // save to core data
-            coredataContext.perform {
-                let newItem = GlucoseStored(context: self.coredataContext)
-                newItem.id = UUID()
-                newItem.date = Date()
-                newItem.glucose = Int16(glucoseAsInt)
-                newItem.isManual = true
-                newItem.isUploadedToNS = false
-                newItem.isUploadedToHealth = false
-                newItem.isUploadedToTidepool = false
-
-                do {
-                    guard self.coredataContext.hasChanges else { return }
-                    try self.coredataContext.save()
-                } catch {
-                    print(error.localizedDescription)
-                }
-            }
-        }
     }
 }
 
-extension DataTable.StateModel: DeterminationObserver {
+extension DataTable.StateModel: DeterminationObserver, SettingsObserver {
     func determinationDidUpdate(_: Determination) {
         DispatchQueue.main.async {
             self.waitForSuggestion = false
         }
     }
+
+    func settingsDidChange(_: FreeAPSSettings) {
+        units = settingsManager.settings.units
+        maxBolus = provider.pumpSettings().maxBolus
+    }
 }