Просмотр исходного кода

Convert TDD.json -> CoreData

Tested on my iPhone ( live ) ... added some logging just to see it in
operation:

--
% grep CoreData log.txt
2023-02-17T02:51:03-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 692 - DEV: Writing TDD to CoreData
2023-02-17T02:51:03-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 56.8
2023-02-17T02:55:58-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 692 - DEV: Writing TDD to CoreData
2023-02-17T02:55:58-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 56.8
2023-02-17T02:55:58-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 57.3
2023-02-17T03:05:18-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 692 - DEV: Writing TDD to CoreData
2023-02-17T03:05:18-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 56.8
2023-02-17T03:05:18-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 57.3
2023-02-17T03:05:18-0800 [ApsManager] APSManager.swift - tdd(enacted_:) - 712 - DEV: Read TDD from CoreData: 58.1
--

I need to add some code for deletion of old data, else it will grow indefinitely
Jon B.M 3 лет назад
Родитель
Сommit
5eab380aae

+ 7 - 1
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,2 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21513" systemVersion="22D5027d" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""/>
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21513" systemVersion="22D5027d" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+    <entity name="TDD" representedClassName="TDD" syncable="YES" codeGenerationType="class">
+        <attribute name="id" optional="YES" attributeType="String"/>
+        <attribute name="tdd" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
+        <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+    </entity>
+</model>

+ 0 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -21,7 +21,6 @@
 		19854F492961C3E500941627 /* DurationButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19854F482961C3E500941627 /* DurationButton.swift */; };
 		199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; };
 		19B0EF2128F6D66200069496 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B0EF2028F6D66200069496 /* Statistics.swift */; };
-		19F79FA9283AE7E000646323 /* TDD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F79FA8283AE7E000646323 /* TDD.swift */; };
 		1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505E09DC17A0C3D0AF4B66FE /* ISFEditorStateModel.swift */; };
 		1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60744C3E9BB3652895C908CC /* DataTableProvider.swift */; };
 		23888883D4EA091C88480FF2 /* BolusProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19984D62EFC0035A9E9644D /* BolusProvider.swift */; };
@@ -471,7 +470,6 @@
 		19B0EF2028F6D66200069496 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = "<group>"; };
 		19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
-		19F79FA8283AE7E000646323 /* TDD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TDD.swift; sourceTree = "<group>"; };
 		1CAE81192B118804DCD23034 /* SnoozeProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SnoozeProvider.swift; sourceTree = "<group>"; };
 		212E8BFE6D66EE65AA26A114 /* CalibrationsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CalibrationsProvider.swift; sourceTree = "<group>"; };
 		223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusStateModel.swift; sourceTree = "<group>"; };
@@ -1348,7 +1346,6 @@
 				3871F39B25ED892B0013ECB5 /* TempTarget.swift */,
 				3811DE8E25C9D80400A708ED /* User.swift */,
 				E0D4F80427513ECF00BDF1FE /* HealthKitSample.swift */,
-				19F79FA8283AE7E000646323 /* TDD.swift */,
 				1935363F28496F7D001E0B16 /* TDD_averages.swift */,
 				CE82E02628E869DF00473A9C /* AlertEntry.swift */,
 				19B0EF2028F6D66200069496 /* Statistics.swift */,
@@ -2381,7 +2378,6 @@
 				9702FF92A09C53942F20D7EA /* TargetsEditorRootView.swift in Sources */,
 				38E8754F275556FA00975559 /* WatchManager.swift in Sources */,
 				A228DF96647338139F152B15 /* PreferencesEditorDataFlow.swift in Sources */,
-				19F79FA9283AE7E000646323 /* TDD.swift in Sources */,
 				389ECE052601144100D86C4F /* ConcurrentMap.swift in Sources */,
 				E4984C5262A90469788754BB /* PreferencesEditorProvider.swift in Sources */,
 				DD399FB31EACB9343C944C4C /* PreferencesEditorStateModel.swift in Sources */,

+ 6 - 0
FreeAPS.xcworkspace/contents.xcworkspacedata

@@ -2,6 +2,12 @@
 <Workspace
    version = "1.0">
    <FileRef
+      location = "group:FreeAPS/Sources/Models/TDD+CoreDataClass.swift">
+   </FileRef>
+   <FileRef
+      location = "group:FreeAPS/Sources/Models/TDD+CoreDataProperties.swift">
+   </FileRef>
+   <FileRef
       location = "group:FreeAPS/Sources/Helpers/CoreDataStack.swift">
    </FileRef>
    <FileRef

+ 76 - 31
FreeAPS/Sources/APS/APSManager.swift

@@ -683,37 +683,62 @@ final class BaseAPSManager: APSManager, Injectable {
         // Add to tdd.json:
         let preferences = settingsManager.preferences
         let currentTDD = enacted_.tdd ?? 0
-        let file = OpenAPS.Monitor.tdd
-        let tdd = TDD(
-            TDD: currentTDD,
-            timestamp: Date(),
-            id: UUID().uuidString
-        )
 
-        var allTDD: [Decimal] = [0]
+        debug(.apsManager, "Writing TDD to CoreData")
+
+        // Add new record to CoreData:TDD Entity
+        let nTDD = TDD(context: coredataContext)
+        nTDD.id = UUID().uuidString
+        nTDD.timestamp = Date()
+        nTDD.tdd = NSDecimalNumber(decimal: currentTDD)
+        try! coredataContext.save()
+
+        let twoWeeksAgo = Calendar.current.date(byAdding: .day, value: -14, to: Date())!
+
+        let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
+        requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", twoWeeksAgo as NSDate)
         var uniqEvents: [TDD] = []
-        storage.transaction { storage in
-            storage.append(tdd, to: file, uniqBy: \.id)
-            uniqEvents = storage.retrieve(file, as: [TDD].self) ?? []
-            let tddArray = uniqEvents.map({ tddArray in tddArray }).sorted { $0.timestamp > $1.timestamp }
-            let _10_Array = tddArray.filter { $0.timestamp.addingTimeInterval(10.days.timeInterval) > Date() && $0.TDD != 0 }
-            let _2_hours_Array = tddArray.filter { $0.timestamp.addingTimeInterval(2.hours.timeInterval) > Date() && $0.TDD != 0 }
-
-            allTDD = _10_Array.map({ each in each.TDD })
-            let average14 = allTDD.reduce(0, +) / Decimal(allTDD.count)
-            let _2hoursTDD = _2_hours_Array.map({ each in each.TDD })
-            let average2hours = _2hoursTDD.reduce(0, +) / Decimal(_2hoursTDD.count)
-            let weight = preferences.weightPercentage
-            let weighted_average = weight * average2hours + (1 - weight) * average14
-            let averages = TDD_averages(
-                average_total_data: roundDecimal(average14, 1),
-                weightedAverage: roundDecimal(weighted_average, 1),
-                past2hoursAverage: roundDecimal(average2hours, 1),
-                date: Date()
-            )
-            storage.save(averages, as: OpenAPS.Monitor.tdd_averages)
-            storage.save(Array(_10_Array), as: file)
+
+        try! uniqEvents = coredataContext.fetch(requestTDD)
+
+        var total: Decimal = 0
+        var indeces: Decimal = 0
+        for uniqEvent in uniqEvents {
+            debug(.apsManager, "Read TDD from CoreData: \(uniqEvent.tdd!.decimalValue)")
+            total += uniqEvent.tdd!.decimalValue
+            indeces += 1
+        }
+
+        let twoHoursAgo = Calendar.current.date(byAdding: .hour, value: -2, to: Date())!
+
+        requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", twoHoursAgo as NSDate)
+        var entriesPast2hours: [TDD] = []
+
+        try! entriesPast2hours = coredataContext.fetch(requestTDD)
+
+        var totalAmount: Decimal = 0
+        var nrOfIndeces: Decimal = 0
+        for entry in entriesPast2hours {
+            totalAmount += entry.tdd!.decimalValue
+            nrOfIndeces += 1
+        }
+        if indeces == 0 {
+            indeces = 1
+        }
+        if nrOfIndeces == 0 {
+            nrOfIndeces = 1
         }
+        let average14 = total / indeces
+        let average2hours = totalAmount / nrOfIndeces
+        let weight = preferences.weightPercentage
+        let weighted_average = weight * average2hours + (1 - weight) * average14
+        let averages = TDD_averages(
+            average_total_data: roundDecimal(average14, 1),
+            weightedAverage: roundDecimal(weighted_average, 1),
+            past2hoursAverage: roundDecimal(average2hours, 1),
+            date: Date()
+        )
+        storage.save(averages, as: OpenAPS.Monitor.tdd_averages)
     }
 
     private func roundDecimal(_ decimal: Decimal, _ digits: Double) -> Decimal {
@@ -760,11 +785,31 @@ final class BaseAPSManager: APSManager, Injectable {
         let units = settingsManager.settings.units
         let preferences = settingsManager.preferences
         let carbs = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)
-        let tdds = storage.retrieve(OpenAPS.Monitor.tdd, as: [TDD].self)
+
+        let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
+        requestTDD.predicate = NSPredicate(format: "tdd > 0")
+        requestTDD.fetchLimit = 1
+        let sort = NSSortDescriptor(key: "timestamp", ascending: false)
+        requestTDD.sortDescriptors = [sort]
+
+        var tdds: [TDD] = []
+        try! tdds = coredataContext.fetch(requestTDD)
+
         var currentTDD: Decimal = 0
-        if tdds?.count ?? 0 > 0 {
-            currentTDD = tdds?[0].TDD ?? 0
+        if tdds.count == 1 {
+            currentTDD = tdds[0].tdd!.decimalValue
+        }
+
+        let carbs_length = carbs?.count ?? 0
+        var carbTotal: Decimal = 0
+        if carbs_length != 0 {
+            for each in carbs! {
+                if each.carbs != 0 {
+                    carbTotal += each.carbs
+                }
+            }
         }
+        var algo_ = "Oref0"
 
         var algo_ = "Oref0"
         let carbTotal = carbs?.map({ carbs in carbs.carbs }).reduce(0, +) ?? 0

+ 14 - 0
FreeAPS/Sources/Helpers/CoreDataStack.swift

@@ -16,4 +16,18 @@ class CoreDataStack {
 
         return container
     }()
+
+    func saveContext() {
+        let context = persistentContainer.viewContext
+        if context.hasChanges {
+            do {
+                try context.save()
+            } catch {
+                // Replace this implementation with code to handle the error appropriately.
+                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
+                let nserror = error as NSError
+                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
+            }
+        }
+    }
 }

+ 4 - 0
FreeAPS/Sources/Models/TDD+CoreDataClass.swift

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

+ 12 - 0
FreeAPS/Sources/Models/TDD+CoreDataProperties.swift

@@ -0,0 +1,12 @@
+import CoreData
+import Foundation
+
+public extension TDD {
+    @nonobjc class func fetchRequest() -> NSFetchRequest<TDD> {
+        NSFetchRequest<TDD>(entityName: "TDD")
+    }
+
+    @NSManaged var tdd: NSDecimalNumber?
+    @NSManaged var timestamp: Date?
+    @NSManaged var id: String?
+}

+ 0 - 25
FreeAPS/Sources/Models/TDD.swift

@@ -1,25 +0,0 @@
-import Foundation
-
-struct TDD: JSON, Equatable {
-    var TDD: Decimal
-    var timestamp: Date
-    let id: String
-
-    init(
-        TDD: Decimal,
-        timestamp: Date,
-        id: String
-    ) {
-        self.TDD = TDD
-        self.timestamp = timestamp
-        self.id = id
-    }
-}
-
-extension TDD {
-    private enum CodingKeys: String, CodingKey {
-        case TDD
-        case timestamp
-        case id
-    }
-}

+ 0 - 6
FreeAPSWatch WatchKit Extension/Info.plist

@@ -2,12 +2,6 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
-	<key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
-	<string>Bla bla Record Health</string>
-	<key>NSHealthShareUsageDescription</key>
-	<string>Bla bla Share Health</string>
-	<key>NSHealthUpdateUsageDescription</key>
-	<string>Bla bla Update Health</string>
 	<key>NSExtension</key>
 	<dict>
 		<key>NSExtensionAttributes</key>