Bläddra i källkod

replace js file battery with core data entitiy

polscm32 2 år sedan
förälder
incheckning
9f5fa7e774

+ 12 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -318,6 +318,9 @@
 		5837A5302BD2E3C700A5DC04 /* MealsStored+helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5837A52F2BD2E3C700A5DC04 /* MealsStored+helper.swift */; };
 		5837A5322BD2E81100A5DC04 /* InsulinStored+helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5837A5312BD2E81100A5DC04 /* InsulinStored+helper.swift */; };
 		587DA1F62B77F3DD00B28F8A /* SettingsRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587DA1F52B77F3DD00B28F8A /* SettingsRowView.swift */; };
+		5887527C2BD986E1008B081D /* OpenAPSBattery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5887527B2BD986E1008B081D /* OpenAPSBattery.swift */; };
+		588752842BD9986A008B081D /* OpenAPS_Battery+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588752822BD9986A008B081D /* OpenAPS_Battery+CoreDataClass.swift */; };
+		588752852BD9986A008B081D /* OpenAPS_Battery+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588752832BD9986A008B081D /* OpenAPS_Battery+CoreDataProperties.swift */; };
 		58F107742BD1A4D000B1A680 /* Determination+helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F107732BD1A4D000B1A680 /* Determination+helper.swift */; };
 		5BFA1C2208114643B77F8CEB /* AddTempTargetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE53A13D26F101B332EFFC8 /* AddTempTargetProvider.swift */; };
 		5D16287A969E64D18CE40E44 /* PumpConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F60E97100041040446F44E7 /* PumpConfigStateModel.swift */; };
@@ -930,6 +933,9 @@
 		5837A52F2BD2E3C700A5DC04 /* MealsStored+helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MealsStored+helper.swift"; sourceTree = "<group>"; };
 		5837A5312BD2E81100A5DC04 /* InsulinStored+helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InsulinStored+helper.swift"; sourceTree = "<group>"; };
 		587DA1F52B77F3DD00B28F8A /* SettingsRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsRowView.swift; sourceTree = "<group>"; };
+		5887527B2BD986E1008B081D /* OpenAPSBattery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAPSBattery.swift; sourceTree = "<group>"; };
+		588752822BD9986A008B081D /* OpenAPS_Battery+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenAPS_Battery+CoreDataClass.swift"; sourceTree = SOURCE_ROOT; };
+		588752832BD9986A008B081D /* OpenAPS_Battery+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenAPS_Battery+CoreDataProperties.swift"; sourceTree = SOURCE_ROOT; };
 		58F107732BD1A4D000B1A680 /* Determination+helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Determination+helper.swift"; sourceTree = "<group>"; };
 		5B8A42073A2D03A278914448 /* AddTempTargetDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddTempTargetDataFlow.swift; sourceTree = "<group>"; };
 		5C018D1680307A31C9ED7120 /* CGMStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CGMStateModel.swift; sourceTree = "<group>"; };
@@ -2132,6 +2138,8 @@
 		5825D1052BD4056700F36E9B /* Classes+Properties */ = {
 			isa = PBXGroup;
 			children = (
+				588752822BD9986A008B081D /* OpenAPS_Battery+CoreDataClass.swift */,
+				588752832BD9986A008B081D /* OpenAPS_Battery+CoreDataProperties.swift */,
 				5825D1062BD4058F00F36E9B /* BGaverages+CoreDataClass.swift */,
 				5825D1072BD4058F00F36E9B /* BGaverages+CoreDataProperties.swift */,
 				5825D1082BD4058F00F36E9B /* BGmedian+CoreDataClass.swift */,
@@ -2191,6 +2199,7 @@
 				58F107732BD1A4D000B1A680 /* Determination+helper.swift */,
 				5837A52F2BD2E3C700A5DC04 /* MealsStored+helper.swift */,
 				5837A5312BD2E81100A5DC04 /* InsulinStored+helper.swift */,
+				5887527B2BD986E1008B081D /* OpenAPSBattery.swift */,
 			);
 			path = Helper;
 			sourceTree = "<group>";
@@ -2926,8 +2935,10 @@
 				38E44539274E411700EC9A94 /* Disk+UIImage.swift in Sources */,
 				388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */,
 				5825D1522BD4058F00F36E9B /* LastLoop+CoreDataClass.swift in Sources */,
+				588752852BD9986A008B081D /* OpenAPS_Battery+CoreDataProperties.swift in Sources */,
 				38FEF3FC2737E53800574A46 /* MainStateModel.swift in Sources */,
 				5825D13A2BD4058F00F36E9B /* LoopStatRecord+CoreDataClass.swift in Sources */,
+				5887527C2BD986E1008B081D /* OpenAPSBattery.swift in Sources */,
 				38569348270B5DFB0002C50D /* GlucoseSource.swift in Sources */,
 				5825D15B2BD4058F00F36E9B /* OverridePresets+CoreDataProperties.swift in Sources */,
 				CEB434E328B8F9DB00B70274 /* BluetoothStateManager.swift in Sources */,
@@ -3179,6 +3190,7 @@
 				19E1F7EC29D082FE005C8D20 /* IconConfigStateModel.swift in Sources */,
 				5837A5322BD2E81100A5DC04 /* InsulinStored+helper.swift in Sources */,
 				711C0CB42CAABE788916BC9D /* ManualTempBasalDataFlow.swift in Sources */,
+				588752842BD9986A008B081D /* OpenAPS_Battery+CoreDataClass.swift in Sources */,
 				BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */,
 				583684062BD178DB00070A60 /* GlucoseStored+helper.swift in Sources */,
 				F90692D6274B9A450037068D /* HealthKitStateModel.swift in Sources */,

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

@@ -1367,7 +1367,26 @@ extension BaseAPSManager: PumpManagerStatusObserver {
             string: percent > 10 ? .normal : .low,
             display: status.pumpBatteryChargeRemaining != nil
         )
-        storage.save(battery, as: OpenAPS.Monitor.battery)
+
+        let batteryToStore = OpenAPS_Battery(context: privateContext)
+        batteryToStore.id = UUID()
+        batteryToStore.date = Date()
+        batteryToStore.percent = Int16(percent)
+        batteryToStore.voltage = nil
+        batteryToStore.status = percent > 10 ? "normal" : "low"
+        batteryToStore.display = status.pumpBatteryChargeRemaining != nil
+        privateContext.perform {
+            do {
+                try self.privateContext.save()
+                debugPrint(
+                    "APS Manager: \(#function) \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) saved battery infos to core data"
+                )
+            } catch {
+                debugPrint(
+                    "APS Manager: \(#function) \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) failed to save battery infos to core data"
+                )
+            }
+        }
         storage.save(status.pumpStatus, as: OpenAPS.Monitor.status)
     }
 }

+ 20 - 3
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -73,6 +73,7 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     @SyncAccess private var pumpUpdateCancellable: AnyCancellable?
     private var pumpUpdatePromise: Future<Bool, Never>.Promise?
     @SyncAccess var loopInProgress: Bool = false
+    private let privateContext = CoreDataStack.shared.backgroundContext
 
     var pumpManager: PumpManagerUI? {
         didSet {
@@ -345,9 +346,25 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
             string: batteryPercent >= 10 ? .normal : .low,
             display: pumpManager.status.pumpBatteryChargeRemaining != nil
         )
-        storage.save(battery, as: OpenAPS.Monitor.battery)
-        broadcaster.notify(PumpBatteryObserver.self, on: processQueue) {
-            $0.pumpBatteryDidChange(battery)
+
+        let batteryToStore = OpenAPS_Battery(context: privateContext)
+        batteryToStore.id = UUID()
+        batteryToStore.date = Date()
+        batteryToStore.percent = Int16(batteryPercent)
+        batteryToStore.voltage = nil
+        batteryToStore.status = batteryPercent > 10 ? "normal" : "low"
+        batteryToStore.display = status.pumpBatteryChargeRemaining != nil
+        privateContext.perform {
+            do {
+                try self.privateContext.save()
+                debugPrint(
+                    "Device Data manager: \(#function) \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) saved battery infos to core data"
+                )
+            } catch {
+                debugPrint(
+                    "Device Data manager: \(#function) \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) failed to save battery infos to core data"
+                )
+            }
         }
         broadcaster.notify(PumpTimeZoneObserver.self, on: processQueue) {
             $0.pumpTimeZoneDidChange(status.timeZone)

+ 0 - 1
FreeAPS/Sources/APS/OpenAPS/Constants.swift

@@ -44,7 +44,6 @@ extension OpenAPS {
     enum Monitor {
         static let pumpHistory = "monitor/pumphistory-24h-zoned.json"
         static let reservoir = "monitor/reservoir.json"
-        static let battery = "monitor/battery.json"
         static let carbHistory = "monitor/carbhistory.json"
         static let clock = "monitor/clock-zoned.json"
         static let status = "monitor/status.json"

+ 0 - 1
FreeAPS/Sources/Modules/Home/HomeDataFlow.swift

@@ -16,7 +16,6 @@ protocol HomeProvider: Provider {
     func basalProfile() -> [BasalProfileEntry]
     func tempTargets(hours: Int) -> [TempTarget]
     func carbs(hours: Int) -> [CarbsEntry]
-    func pumpBattery() -> Battery?
     func pumpReservoir() -> Decimal?
     func tempTarget() -> TempTarget?
     func announcement(_ hours: Int) -> [Announcement]

+ 0 - 4
FreeAPS/Sources/Modules/Home/HomeProvider.swift

@@ -67,10 +67,6 @@ extension Home {
                 ?? PumpSettings(insulinActionCurve: 6, maxBolus: 10, maxBasal: 2)
         }
 
-        func pumpBattery() -> Battery? {
-            storage.retrieve(OpenAPS.Monitor.battery, as: Battery.self)
-        }
-
         func pumpReservoir() -> Decimal? {
             storage.retrieve(OpenAPS.Monitor.reservoir, as: Decimal.self)
         }

+ 0 - 15
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -86,7 +86,6 @@ extension Home {
             setupBasalProfile()
             setupTempTargets()
             setupCarbs()
-            setupBattery()
             setupReservoir()
             setupAnnouncements()
             setupCurrentPumpTimezone()
@@ -119,7 +118,6 @@ extension Home {
             broadcaster.register(BasalProfileObserver.self, observer: self)
             broadcaster.register(TempTargetsObserver.self, observer: self)
             broadcaster.register(CarbsObserver.self, observer: self)
-            broadcaster.register(PumpBatteryObserver.self, observer: self)
             broadcaster.register(PumpReservoirObserver.self, observer: self)
 
             animatedBackground = settingsManager.settings.animatedBackground
@@ -181,7 +179,6 @@ extension Home {
                         self.pumpExpiresAtDate = nil
                         self.setupPump = false
                     } else {
-                        self.setupBattery()
                         self.setupReservoir()
                     }
                 }
@@ -380,13 +377,6 @@ extension Home {
             }
         }
 
-        private func setupBattery() {
-            DispatchQueue.main.async { [weak self] in
-                guard let self = self else { return }
-                self.battery = self.provider.pumpBattery()
-            }
-        }
-
         private func setupCurrentTempTarget() {
             tempTarget = provider.tempTarget()
         }
@@ -433,7 +423,6 @@ extension Home.StateModel:
     BasalProfileObserver,
     TempTargetsObserver,
     CarbsObserver,
-    PumpBatteryObserver,
     PumpReservoirObserver,
     PumpTimeZoneObserver
 {
@@ -489,10 +478,6 @@ extension Home.StateModel:
         filterCarbs()
     }
 
-    func pumpBatteryDidChange(_: Battery) {
-        setupBattery()
-    }
-
     func pumpReservoirDidChange(_: Decimal) {
         setupReservoir()
     }

+ 11 - 5
FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift

@@ -1,8 +1,9 @@
+import CoreData
 import SwiftUI
 
 struct PumpView: View {
     @Binding var reservoir: Decimal?
-    @Binding var battery: Battery?
+//    @Binding var battery: Battery?
     @Binding var name: String
     @Binding var expiresAtDate: Date?
     @Binding var timerDate: Date
@@ -10,6 +11,11 @@ struct PumpView: View {
 
     @State var state: Home.StateModel
 
+    @FetchRequest(
+        fetchRequest: OpenAPS_Battery.fetch(NSPredicate.predicateFor30MinAgo),
+        animation: Animation.bouncy
+    ) var battery: FetchedResults<OpenAPS_Battery>
+
     @Environment(\.colorScheme) var colorScheme
 
     private var reservoirFormatter: NumberFormatter {
@@ -64,12 +70,12 @@ struct PumpView: View {
                 }
             }
 
-            if let battery = battery, battery.display ?? false, expiresAtDate == nil {
+            if (battery.first?.display) != nil, expiresAtDate == nil {
                 HStack {
                     Image(systemName: "battery.100")
                         .font(.system(size: 16))
                         .foregroundColor(batteryColor)
-                    Text("\(Int(battery.percent ?? 100)) %").font(.system(size: 16, design: .rounded))
+                    Text("\(Int(battery.first?.percent ?? 100)) %").font(.system(size: 16, design: .rounded))
                 }
             }
 
@@ -110,11 +116,11 @@ struct PumpView: View {
     }
 
     private var batteryColor: Color {
-        guard let battery = battery, let percent = battery.percent else {
+        guard let battery = battery.first else {
             return .gray
         }
 
-        switch percent {
+        switch battery.percent {
         case ...10:
             return .red
         case ...20:

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

@@ -187,7 +187,6 @@ extension Home {
         var pumpView: some View {
             PumpView(
                 reservoir: $state.reservoir,
-                battery: $state.battery,
                 name: $state.pumpName,
                 expiresAtDate: $state.pumpExpiresAtDate,
                 timerDate: $state.timerDate,

+ 34 - 1
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -61,6 +61,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
         return NightscoutAPI(url: url, secret: secret)
     }
 
+    private let context = CoreDataStack.shared.backgroundContext
+
     init(resolver: Resolver) {
         injectServices(resolver)
         subscribe()
@@ -377,6 +379,36 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
         }
     }
 
+    private func fetchBattery() -> Battery {
+        do {
+            let results = try context.fetch(OpenAPS_Battery.fetch(NSPredicate.predicateFor30MinAgo))
+            if let last = results.first {
+                let percent: Int? = Int(last.percent)
+                let voltage: Decimal? = last.voltage as Decimal?
+                let status: String? = last.status
+                let display: Bool? = last.display
+
+                if let percent = percent, let voltage = voltage, let status = status, let display = display {
+                    debugPrint(
+                        "Home State Model: \(#function) \(DebuggingIdentifiers.succeeded) setup battery from core data successfully"
+                    )
+                    return Battery(
+                        percent: percent,
+                        voltage: voltage,
+                        string: BatteryState(rawValue: status) ?? BatteryState.normal,
+                        display: display
+                    )
+                }
+            }
+            return Battery(percent: 100, voltage: 100, string: BatteryState.normal, display: false)
+        } catch {
+            debugPrint(
+                "Home State Model: \(#function) \(DebuggingIdentifiers.failed) failed to setup battery from core data"
+            )
+            return Battery(percent: 100, voltage: 100, string: BatteryState.normal, display: false)
+        }
+    }
+
     func uploadStatus() {
         let iob = storage.retrieve(OpenAPS.Monitor.iob, as: [IOBEntry].self)
         var suggested = storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self)
@@ -409,7 +441,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
             )
         }
 
-        let battery = storage.retrieve(OpenAPS.Monitor.battery, as: Battery.self)
+        let battery = fetchBattery()
+//        let battery = storage.retrieve(OpenAPS.Monitor.battery, as: Battery.self)
 
         var reservoir = Decimal(from: storage.retrieveRaw(OpenAPS.Monitor.reservoir) ?? "0")
         if reservoir == 0xDEAD_BEEF {

+ 8 - 0
Model/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -77,6 +77,14 @@
         <attribute name="note" optional="YES" attributeType="String"/>
         <attribute name="protein" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
     </entity>
+    <entity name="OpenAPS_Battery" representedClassName="OpenAPS_Battery" syncable="YES">
+        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+        <attribute name="display" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
+        <attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
+        <attribute name="percent" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
+        <attribute name="status" optional="YES" attributeType="String"/>
+        <attribute name="voltage" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
+    </entity>
     <entity name="Oref0Suggestion" representedClassName="Oref0Suggestion" syncable="YES">
         <relationship name="computedInsulinDistribution" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="InsulinDistribution" inverseName="insulin" inverseEntity="InsulinDistribution"/>
         <relationship name="computedTDD" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="TDD" inverseName="computed" inverseEntity="TDD"/>

+ 12 - 0
Model/Helper/OpenAPSBattery.swift

@@ -0,0 +1,12 @@
+import CoreData
+import Foundation
+
+extension OpenAPS_Battery {
+    static func fetch(_ predicate: NSPredicate = .predicateFor30MinAgo) -> NSFetchRequest<OpenAPS_Battery> {
+        let request = OpenAPS_Battery.fetchRequest()
+        request.sortDescriptors = [NSSortDescriptor(keyPath: \OpenAPS_Battery.date, ascending: false)]
+        request.fetchLimit = 1
+        request.predicate = predicate
+        return request
+    }
+}

+ 4 - 0
OpenAPS_Battery+CoreDataClass.swift

@@ -0,0 +1,4 @@
+import CoreData
+import Foundation
+
+@objc(OpenAPS_Battery) public class OpenAPS_Battery: NSManagedObject {}

+ 17 - 0
OpenAPS_Battery+CoreDataProperties.swift

@@ -0,0 +1,17 @@
+import CoreData
+import Foundation
+
+public extension OpenAPS_Battery {
+    @nonobjc class func fetchRequest() -> NSFetchRequest<OpenAPS_Battery> {
+        NSFetchRequest<OpenAPS_Battery>(entityName: "OpenAPS_Battery")
+    }
+
+    @NSManaged var date: Date?
+    @NSManaged var display: Bool
+    @NSManaged var id: UUID?
+    @NSManaged var percent: Int16
+    @NSManaged var status: String?
+    @NSManaged var voltage: NSDecimalNumber?
+}
+
+extension OpenAPS_Battery: Identifiable {}