Bläddra i källkod

refactor glucose storage, use CD entity for data table list

polscm32 2 år sedan
förälder
incheckning
63a8722161

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

@@ -64,7 +64,6 @@ final class BaseAPSManager: APSManager, Injectable {
     @Injected() private var storage: FileStorage!
     @Injected() private var pumpHistoryStorage: PumpHistoryStorage!
     @Injected() private var alertHistoryStorage: AlertHistoryStorage!
-    @Injected() private var glucoseStorage: GlucoseStorage!
     @Injected() private var tempTargetsStorage: TempTargetsStorage!
     @Injected() private var carbsStorage: CarbsStorage!
     @Injected() private var announcementsStorage: AnnouncementsStorage!

+ 19 - 4
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -177,13 +177,28 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         }
     }
 
+    // fetch glucose from core data
+    private func fetchGlucose() -> [GlucoseStored]? {
+        do {
+            debugPrint("OpenAPS: \(#function) \(DebuggingIdentifiers.succeeded) fetched glucose")
+            return try coredataContext.fetch(GlucoseStored.fetch(
+                NSPredicate.predicateForOneDayAgo,
+                ascending: false
+            ))
+        } catch {
+            debugPrint("OpenAPS: \(#function) \(DebuggingIdentifiers.failed) failed to fetch glucose with error: \(error)")
+            return []
+        }
+    }
+
     func syncDate() -> Date {
-        guard let events = storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self),
-              let recent = events.first
-        else {
+        //  TODO: - proof logic here!
+        /// previously the Blood Glucose array was retrieved and the date of the first, i.e. oldest value was returned (called recent????)
+        /// so for now no logic changes here
+        guard let glucose = fetchGlucose(), let recentGlucose = glucose.last else {
             return Date().addingTimeInterval(-1.days.timeInterval)
         }
-        return recent.dateString
+        return recentGlucose.date ?? Date()
     }
 
     func recent() -> [BloodGlucose] {

+ 0 - 1
FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift

@@ -220,7 +220,6 @@ protocol DataTableProvider: Provider {
     func pumpHistory() -> [PumpHistoryEvent]
     func tempTargets() -> [TempTarget]
     func carbs() -> [CarbsEntry]
-    func glucose() -> [BloodGlucose]
     func deleteCarbs(_ treatement: DataTable.Treatment)
     func deleteInsulin(_ treatement: DataTable.Treatment)
     func deleteGlucose(id: String)

+ 0 - 4
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -42,10 +42,6 @@ extension DataTable {
             }
         }
 
-        func glucose() -> [BloodGlucose] {
-            glucoseStorage.recent().sorted { $0.date > $1.date }
-        }
-
         func deleteGlucose(id: String) {
             glucoseStorage.removeGlucose(ids: [id])
             healthkitManager.deleteGlucose(syncID: id)

+ 1 - 14
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -31,12 +31,10 @@ extension DataTable {
             maxBolus = provider.pumpSettings().maxBolus
             historyLayout = settingsManager.settings.historyLayout
             setupTreatments()
-            setupGlucose()
             broadcaster.register(SettingsObserver.self, observer: self)
             broadcaster.register(PumpHistoryObserver.self, observer: self)
             broadcaster.register(TempTargetsObserver.self, observer: self)
             broadcaster.register(CarbsObserver.self, observer: self)
-            broadcaster.register(GlucoseObserver.self, observer: self)
             broadcaster.register(SuggestionObserver.self, observer: self)
         }
 
@@ -154,12 +152,6 @@ extension DataTable {
             }
         }
 
-        func setupGlucose() {
-            DispatchQueue.main.async {
-                self.glucose = self.provider.glucose().map(Glucose.init)
-            }
-        }
-
         func invokeCarbDeletionTask(_ treatment: Treatment) {
             carbEntryDeleted = true
             waitForSuggestion = true
@@ -277,8 +269,7 @@ extension DataTable.StateModel:
     SettingsObserver,
     PumpHistoryObserver,
     TempTargetsObserver,
-    CarbsObserver,
-    GlucoseObserver
+    CarbsObserver
 {
     func settingsDidChange(_: FreeAPSSettings) {
         historyLayout = settingsManager.settings.historyLayout
@@ -296,10 +287,6 @@ extension DataTable.StateModel:
     func carbsDidUpdate(_: [CarbsEntry]) {
         setupTreatments()
     }
-
-    func glucoseDidUpdate(_: [BloodGlucose]) {
-        setupGlucose()
-    }
 }
 
 extension DataTable.StateModel: SuggestionObserver {

+ 91 - 58
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -18,6 +18,12 @@ extension DataTable {
 
         @Environment(\.colorScheme) var colorScheme
 
+        /// fetch ALL glucose values, i.e. manual and non-manual
+        @FetchRequest(
+            fetchRequest: GlucoseStored.fetch(NSPredicate.predicateForOneDayAgo, ascending: false, fetchLimit: 288),
+            animation: .bouncy
+        ) var glucoseStored: FetchedResults<GlucoseStored>
+
         private var insulinFormatter: NumberFormatter {
             let formatter = NumberFormatter()
             formatter.numberStyle = .decimal
@@ -203,9 +209,22 @@ extension DataTable {
                     Spacer()
                     Text("Time").foregroundStyle(.secondary)
                 }
-                if !state.glucose.isEmpty {
-                    ForEach(state.glucose) { item in
-                        glucoseView(item, isManual: item.glucose)
+                if !glucoseStored.isEmpty {
+                    ForEach(glucoseStored) { glucose in
+                        HStack {
+                            Text(formatGlucose(glucose.glucose, isManual: glucose.isManual))
+
+                            /// check for manual glucose
+                            if glucose.isManual {
+                                Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red)
+                            } else {
+                                Text("\(glucose.direction ?? "--")")
+                            }
+
+                            Spacer()
+
+                            Text(dateFormatter.string(from: glucose.date ?? Date()))
+                        }
                     }
                 } else {
                     HStack {
@@ -398,62 +417,76 @@ extension DataTable {
             }
         }
 
-        @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View {
-            HStack {
-                Text(item.glucose.glucose.map {
-                    (
-                        isManual.type == GlucoseType.manual.rawValue ?
-                            manualGlucoseFormatter :
-                            glucoseFormatter
-                    )
-                    .string(from: Double(
-                        state.units == .mmolL ? $0.asMmolL : Decimal($0)
-                    ) as NSNumber)!
-                } ?? "--")
-                if isManual.type == GlucoseType.manual.rawValue {
-                    Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red)
-                } else {
-                    Text(item.glucose.direction?.symbol ?? "--")
-                }
-                Spacer()
+//        @ViewBuilder private func glucoseView(_ item: Glucose, isManual: BloodGlucose) -> some View {
+//            HStack {
+//                Text(item.glucose.glucose.map {
+//                    (
+//                        isManual.type == GlucoseType.manual.rawValue ?
+//                            manualGlucoseFormatter :
+//                            glucoseFormatter
+//                    )
+//                    .string(from: Double(
+//                        state.units == .mmolL ? $0.asMmolL : Decimal($0)
+//                    ) as NSNumber)!
+//                } ?? "--")
+//                if isManual.type == GlucoseType.manual.rawValue {
+//                    Image(systemName: "drop.fill").symbolRenderingMode(.monochrome).foregroundStyle(.red)
+//                } else {
+//                    Text(item.glucose.direction?.symbol ?? "--")
+//                }
+//                Spacer()
+//
+//                Text(dateFormatter.string(from: item.glucose.dateString))
+//            }
+//            .swipeActions {
+//                Button(
+//                    "Delete",
+//                    systemImage: "trash.fill",
+//                    role: .none,
+//                    action: {
+//                        alertGlucoseToDelete = item
+//                        let valueText = (
+//                            isManual.type == GlucoseType.manual.rawValue ?
+//                                manualGlucoseFormatter :
+//                                glucoseFormatter
+//                        ).string(from: Double(
+//                            state.units == .mmolL ? Double(item.glucose.value.asMmolL) : item.glucose.value
+//                        ) as NSNumber)! + " " + state.units.rawValue
+//                        alertTitle = "Delete Glucose?"
+//                        alertMessage = dateFormatter.string(from: item.glucose.dateString) + ", " + valueText
+//                        isRemoveHistoryItemAlertPresented = true
+//                    }
+//                ).tint(.red)
+//            }
+//            .alert(
+//                Text(NSLocalizedString(alertTitle, comment: "")),
+//                isPresented: $isRemoveHistoryItemAlertPresented
+//            ) {
+//                Button("Cancel", role: .cancel) {}
+//                Button("Delete", role: .destructive) {
+//                    guard let glucoseToDelete = alertGlucoseToDelete else {
+//                        print("Cannot unwrap alertTreatmentToDelete!")
+//                        return
+//                    }
+//                    state.deleteGlucose(glucoseToDelete)
+//                }
+//            } message: {
+//                Text("\n" + NSLocalizedString(alertMessage, comment: ""))
+//            }
+//        }
+
+        // MARK: - Format glucose
+
+        private func formatGlucose(_ value: Int16, isManual: Bool) -> String {
+            let formatter = isManual ? manualGlucoseFormatter : glucoseFormatter
+            let formattedValue = formatter.string(from: NSNumber(value: value)) ?? "--"
+
+            return state.units == .mmolL ? convertToMMOL(Double(value)) : formattedValue
+        }
 
-                Text(dateFormatter.string(from: item.glucose.dateString))
-            }
-            .swipeActions {
-                Button(
-                    "Delete",
-                    systemImage: "trash.fill",
-                    role: .none,
-                    action: {
-                        alertGlucoseToDelete = item
-                        let valueText = (
-                            isManual.type == GlucoseType.manual.rawValue ?
-                                manualGlucoseFormatter :
-                                glucoseFormatter
-                        ).string(from: Double(
-                            state.units == .mmolL ? Double(item.glucose.value.asMmolL) : item.glucose.value
-                        ) as NSNumber)! + " " + state.units.rawValue
-                        alertTitle = "Delete Glucose?"
-                        alertMessage = dateFormatter.string(from: item.glucose.dateString) + ", " + valueText
-                        isRemoveHistoryItemAlertPresented = true
-                    }
-                ).tint(.red)
-            }
-            .alert(
-                Text(NSLocalizedString(alertTitle, comment: "")),
-                isPresented: $isRemoveHistoryItemAlertPresented
-            ) {
-                Button("Cancel", role: .cancel) {}
-                Button("Delete", role: .destructive) {
-                    guard let glucoseToDelete = alertGlucoseToDelete else {
-                        print("Cannot unwrap alertTreatmentToDelete!")
-                        return
-                    }
-                    state.deleteGlucose(glucoseToDelete)
-                }
-            } message: {
-                Text("\n" + NSLocalizedString(alertMessage, comment: ""))
-            }
+        private func convertToMMOL(_ value: Double) -> String {
+            let mmolValue = value * 0.0555
+            return "\(mmolValue) mmol/L"
         }
     }
 }