ソースを参照

Save LoopStats in CoreData.
Remove two JSONs

Jon Mårtensson 3 年 前
コミット
9f6429d120

+ 6 - 0
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21513" systemVersion="22C65" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+    <entity name="LoopStatRecord" representedClassName="LoopStatRecord" syncable="YES" codeGenerationType="class">
+        <attribute name="duration" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
+        <attribute name="end" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+        <attribute name="loopStatus" optional="YES" attributeType="String"/>
+        <attribute name="start" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+    </entity>
     <entity name="Readings" representedClassName="Readings" syncable="YES" codeGenerationType="class">
         <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <attribute name="glucose" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>

+ 6 - 0
FreeAPS.xcworkspace/contents.xcworkspacedata

@@ -5,6 +5,12 @@
       location = "container:"
       name = "CoreDataClassesAndProperties">
       <FileRef
+         location = "group:LoopStatRecord+CoreDataClass.swift">
+      </FileRef>
+      <FileRef
+         location = "group:LoopStatRecord+CoreDataProperties.swift">
+      </FileRef>
+      <FileRef
          location = "group:Readings+CoreDataClass.swift">
       </FileRef>
       <FileRef

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

@@ -832,9 +832,16 @@ final class BaseAPSManager: APSManager, Injectable {
         } else if preferences.curve.rawValue == "ultra-rapid" {
             iPa = 50
         }
-        // Retrieve the loopStats data
-        let lsData = storage.retrieve(OpenAPS.Monitor.loopStats, as: [LoopStats].self)?
-            .sorted { $0.start > $1.start } ?? []
+
+        // MARK: Fetch LoopStatRecords from CoreData
+
+        let requestLSR = LoopStatRecord.fetchRequest() as NSFetchRequest<LoopStatRecord>
+        requestLSR.predicate = NSPredicate(format: "start > %@", Date().addingTimeInterval(-24.hours.timeInterval) as NSDate)
+        let sortLSR = NSSortDescriptor(key: "start", ascending: false)
+        requestLSR.sortDescriptors = [sortLSR]
+        var lsr: [LoopStatRecord] = []
+        try? lsr = coredataContext.fetch(requestLSR)
+
         var successRate: Double?
         var successNR = 0.0
         var errorNR = 0.0
@@ -852,20 +859,22 @@ final class BaseAPSManager: APSManager, Injectable {
         var medianInterval = 0.0
         var averageIntervalLoops = 0.0
 
-        if !lsData.isEmpty {
+        if lsr.isNotEmpty {
             var i = 0.0
-            if let loopEnd = lsData[0].end {
+            if let loopEnd = lsr[0].end {
                 previousTimeLoop = loopEnd
             }
-            for each in lsData {
-                if let loopEnd = each.end, let loopDuration = each.duration {
-                    if each.loopStatus.contains("Success") {
+            for each in lsr {
+                if let loopEnd = each.end {
+                    let loopDuration = each.duration
+
+                    if (each.loopStatus?.contains("Success")) != nil {
                         successNR += 1
                     } else {
                         errorNR += 1
                     }
                     i += 1
-                    timeIntervalLoops = (previousTimeLoop - each.start).timeInterval / 60
+                    timeIntervalLoops = (previousTimeLoop - (each.start ?? previousTimeLoop)).timeInterval / 60
 
                     if timeIntervalLoops > 0.0, i != 1 {
                         timeIntervalLoopArray.append(timeIntervalLoops)
@@ -890,12 +899,12 @@ final class BaseAPSManager: APSManager, Injectable {
                 }
             }
             successRate = (successNR / Double(i)) * 100
-            averageIntervalLoops = ((lsData[0].end ?? lsData[lsData.count - 1].start) - lsData[lsData.count - 1].start)
-                .timeInterval / 60 / Double(i)
             averageLoopTime /= Double(i)
             // Median values
             medianLoopTime = medianCalculation(array: timeForOneLoopArray)
             medianInterval = medianCalculation(array: timeIntervalLoopArray)
+            // Average time interval between loops
+            averageIntervalLoops = timeIntervalLoopArray.reduce(0, +) / Double(timeIntervalLoopArray.count)
         }
         if minimumInt == 999.0 {
             minimumInt = 0.0
@@ -1270,15 +1279,26 @@ final class BaseAPSManager: APSManager, Injectable {
 
     private func loopStats(loopStatRecord: LoopStats) {
         let LoopStatsStartedAt = Date()
-        let file = OpenAPS.Monitor.loopStats
-        var uniqEvents: [LoopStats] = []
-        storage.transaction { storage in
-            storage.append(loopStatRecord, to: file, uniqBy: \.start)
-            uniqEvents = storage.retrieve(file, as: [LoopStats].self)?
-                .filter { $0.start.addingTimeInterval(24.hours.timeInterval) > Date() }
-                .sorted { $0.start > $1.start } ?? []
-            storage.save(Array(uniqEvents), as: file)
-        }
+
+        /*
+         let file = OpenAPS.Monitor.loopStats
+         var uniqEvents: [LoopStats] = []
+         storage.transaction { storage in
+             storage.append(loopStatRecord, to: file, uniqBy: \.start)
+             uniqEvents = storage.retrieve(file, as: [LoopStats].self)?
+                 .filter { $0.start.addingTimeInterval(24.hours.timeInterval) > Date() }
+                 .sorted { $0.start > $1.start } ?? []
+             storage.save(Array(uniqEvents), as: file)
+         }
+          */
+
+        let nLS = LoopStatRecord(context: coredataContext)
+        nLS.start = loopStatRecord.start
+        nLS.end = loopStatRecord.end ?? Date()
+        nLS.loopStatus = loopStatRecord.loopStatus
+        nLS.duration = loopStatRecord.duration ?? 0.0
+        try? coredataContext.save()
+
         print("Test time of LoopStats computation: \(-1 * LoopStatsStartedAt.timeIntervalSinceNow) s")
     }
 

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

@@ -58,8 +58,6 @@ extension OpenAPS {
         static let tdd_averages = "monitor/tdd_averages.json"
         static let alertHistory = "monitor/alerthistory.json"
         static let statistics = "monitor/statistics.json"
-        static let loopStats = "monitor/loopStats.json"
-        static let glucose_data = "monitor/glucose_data.json"
     }
 
     enum Enact {

+ 0 - 4
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -98,10 +98,6 @@ extension Settings {
                                 .navigationLink(to: .configEditor(file: OpenAPS.Middleware.determineBasal), from: self)
                             Text("Statistics")
                                 .navigationLink(to: .configEditor(file: OpenAPS.Monitor.statistics), from: self)
-                            Text("Loop Cycles")
-                                .navigationLink(to: .configEditor(file: OpenAPS.Monitor.loopStats), from: self)
-                            Text("Glucose Data used for statistics")
-                                .navigationLink(to: .configEditor(file: OpenAPS.Monitor.glucose_data), from: self)
                             Text("Edit settings json")
                                 .navigationLink(to: .configEditor(file: OpenAPS.FreeAPS.settings), from: self)
                         }

+ 4 - 0
LoopStatRecord+CoreDataClass.swift

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

+ 13 - 0
LoopStatRecord+CoreDataProperties.swift

@@ -0,0 +1,13 @@
+import CoreData
+import Foundation
+
+public extension LoopStatRecord {
+    @nonobjc class func fetchRequest() -> NSFetchRequest<LoopStatRecord> {
+        NSFetchRequest<LoopStatRecord>(entityName: "LoopStatRecord")
+    }
+
+    @NSManaged var duration: Double
+    @NSManaged var end: Date?
+    @NSManaged var start: Date?
+    @NSManaged var loopStatus: String?
+}