Explorar el Código

apsmanager -> use new glucose entity

polscm32 hace 2 años
padre
commit
2892f3b327

+ 4 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -269,6 +269,7 @@
 		581516A42BCED84A00BF67D7 /* DebuggingIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581516A32BCED84A00BF67D7 /* DebuggingIdentifiers.swift */; };
 		581516A92BCEEDF800BF67D7 /* NSPredicates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581516A82BCEEDF800BF67D7 /* NSPredicates.swift */; };
 		58237D9E2BCF0A6B00A47A79 /* PopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58237D9D2BCF0A6B00A47A79 /* PopupView.swift */; };
+		583684062BD178DB00070A60 /* GlucoseStored+helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583684052BD178DB00070A60 /* GlucoseStored+helper.swift */; };
 		587DA1F62B77F3DD00B28F8A /* SettingsRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587DA1F52B77F3DD00B28F8A /* SettingsRowView.swift */; };
 		5BFA1C2208114643B77F8CEB /* AddTempTargetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE53A13D26F101B332EFFC8 /* AddTempTargetProvider.swift */; };
 		5D16287A969E64D18CE40E44 /* PumpConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F60E97100041040446F44E7 /* PumpConfigStateModel.swift */; };
@@ -833,6 +834,7 @@
 		581516A32BCED84A00BF67D7 /* DebuggingIdentifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebuggingIdentifiers.swift; sourceTree = "<group>"; };
 		581516A82BCEEDF800BF67D7 /* NSPredicates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSPredicates.swift; sourceTree = "<group>"; };
 		58237D9D2BCF0A6B00A47A79 /* PopupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupView.swift; sourceTree = "<group>"; };
+		583684052BD178DB00070A60 /* GlucoseStored+helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GlucoseStored+helper.swift"; sourceTree = "<group>"; };
 		587DA1F52B77F3DD00B28F8A /* SettingsRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsRowView.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>"; };
@@ -2047,6 +2049,7 @@
 			isa = PBXGroup;
 			children = (
 				FEFA5C10299F814A00765C17 /* CoreDataStack.swift */,
+				583684052BD178DB00070A60 /* GlucoseStored+helper.swift */,
 				1956FB202AFF79E200C7B4FF /* CoreDataStorage.swift */,
 				FEFA5C0D299F810B00765C17 /* Core_Data.xcdatamodeld */,
 				581516A82BCEEDF800BF67D7 /* NSPredicates.swift */,
@@ -3000,6 +3003,7 @@
 				19E1F7EC29D082FE005C8D20 /* IconConfigStateModel.swift in Sources */,
 				711C0CB42CAABE788916BC9D /* ManualTempBasalDataFlow.swift in Sources */,
 				BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */,
+				583684062BD178DB00070A60 /* GlucoseStored+helper.swift in Sources */,
 				F90692D6274B9A450037068D /* HealthKitStateModel.swift in Sources */,
 				BD1661312B82ADAB00256551 /* CustomProgressView.swift in Sources */,
 				C967DACD3B1E638F8B43BE06 /* ManualTempBasalStateModel.swift in Sources */,

+ 66 - 43
FreeAPS/Sources/APS/APSManager.swift

@@ -765,7 +765,7 @@ final class BaseAPSManager: APSManager, Injectable {
         return Double(sorted[length / 2])
     }
 
-    private func tir(_ array: [Readings]) -> (TIR: Double, hypos: Double, hypers: Double, normal_: Double) {
+    private func tir(_ array: [GlucoseStored]) -> (TIR: Double, hypos: Double, hypers: Double, normal_: Double) {
         let glucose = array
         let justGlucoseArray = glucose.compactMap({ each in Int(each.glucose as Int16) })
         let totalReadings = justGlucoseArray.count
@@ -791,7 +791,7 @@ final class BaseAPSManager: APSManager, Injectable {
         )
     }
 
-    private func glucoseStats(_ fetchedGlucose: [Readings])
+    private func glucoseStats(_ fetchedGlucose: [GlucoseStored])
         -> (ifcc: Double, ngsp: Double, average: Double, median: Double, sd: Double, cv: Double, readings: Double)
     {
         let glucose = fetchedGlucose
@@ -883,6 +883,53 @@ final class BaseAPSManager: APSManager, Injectable {
         return output
     }
 
+    // fetch glucose for time interval
+    private func fetchGlucoseData(forPeriod period: String, withPredicate predicate: NSPredicate) -> [GlucoseStored] {
+        do {
+            let fetchedData = try coredataContext.fetch(GlucoseStored.fetch(predicate))
+            debugPrint(
+                "APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) fetched glucose for \(period) period"
+            )
+            return fetchedData
+        } catch {
+            debugPrint(
+                "APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) error while fetching glucose for \(period) period"
+            )
+            return []
+        }
+    }
+
+//    private func fetchGlucose() {
+//        ///fetch 24h
+//        do {
+//            let glucose24h = try coredataContext.fetch(GlucoseStored.fetch(NSPredicate.predicateForOneDayAgo))
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) fetched glucose for 24h period")
+//        } catch  {
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) error while fetching glucose for 24h period")
+//        }
+//        ///fetch one week
+//        do {
+//            let glucoseOneWeek = try coredataContext.fetch(GlucoseStored.fetch(NSPredicate.predicateForOneWeek))
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) fetched glucose for 7d period")
+//        } catch {
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) error while fetching glucose for 7d")
+//        }
+//        ///fetch one month
+//        do {
+//            let glucoseOneMonth = try coredataContext.fetch(GlucoseStored.fetch(NSPredicate.predicateForOneMonth))
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) fetched glucose for 30d period")
+//        } catch {
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) error while fetching glucose for 30d period")
+//        }
+//        ///total
+//        do {
+//            let glucoseTotal = try coredataContext.fetch(GlucoseStored.fetch(NSPredicate.predicateForThreeMonths))
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.succeeded) fetched glucose for 90d period")
+//        } catch {
+//            debugPrint("APSManager: \(CoreDataStack.identifier) \(DebuggingIdentifiers.failed) error while fetching glucose for 90d period")
+//        }
+//    }
+
     // Add to statistics.JSON for upload to NS.
     private func statistics() {
         let now = Date()
@@ -891,7 +938,7 @@ final class BaseAPSManager: APSManager, Injectable {
             guard hour > 20 else {
                 return
             }
-            coredataContext.performAndWait { [self] in
+            coredataContext.perform { [self] in
                 var stats = [StatsData]()
                 let requestStats = StatsData.fetchRequest() as NSFetchRequest<StatsData>
                 let sortStats = NSSortDescriptor(key: "lastrun", ascending: false)
@@ -983,49 +1030,25 @@ final class BaseAPSManager: APSManager, Injectable {
                 } else if preferences.curve.rawValue == "ultra-rapid" {
                     iPa = 50
                 }
-                // CGM Readings
-                var glucose_24 = [Readings]() // Day
-                var glucose_7 = [Readings]() // Week
-                var glucose_30 = [Readings]() // Month
-                var glucose = [Readings]() // Total
-                let filter = DateFilter()
-                // 24h
-                let requestGFS_24 = Readings.fetchRequest() as NSFetchRequest<Readings>
-                let sortGlucose_24 = NSSortDescriptor(key: "date", ascending: false)
-                requestGFS_24.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.day)
-                requestGFS_24.sortDescriptors = [sortGlucose_24]
-                try? glucose_24 = coredataContext.fetch(requestGFS_24)
-                // Week
-                let requestGFS_7 = Readings.fetchRequest() as NSFetchRequest<Readings>
-                let sortGlucose_7 = NSSortDescriptor(key: "date", ascending: false)
-                requestGFS_7.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.week)
-                requestGFS_7.sortDescriptors = [sortGlucose_7]
-                try? glucose_7 = coredataContext.fetch(requestGFS_7)
-                // Month
-                let requestGFS_30 = Readings.fetchRequest() as NSFetchRequest<Readings>
-                let sortGlucose_30 = NSSortDescriptor(key: "date", ascending: false)
-                requestGFS_30.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.month)
-                requestGFS_30.sortDescriptors = [sortGlucose_30]
-                try? glucose_30 = coredataContext.fetch(requestGFS_30)
-                // Total
-                let requestGFS = Readings.fetchRequest() as NSFetchRequest<Readings>
-                let sortGlucose = NSSortDescriptor(key: "date", ascending: false)
-                requestGFS.predicate = NSPredicate(format: "glucose > 0 AND date > %@", filter.total)
-                requestGFS.sortDescriptors = [sortGlucose]
-                try? glucose = coredataContext.fetch(requestGFS)
+
+                // Glucose Values
+                let glucose24h = fetchGlucoseData(forPeriod: "24h", withPredicate: NSPredicate.predicateForOneDayAgo)
+                let glucoseOneWeek = fetchGlucoseData(forPeriod: "7d", withPredicate: NSPredicate.predicateForOneWeek)
+                let glucoseOneMonth = fetchGlucoseData(forPeriod: "30d", withPredicate: NSPredicate.predicateForOneMonth)
+                let glucoseThreeMonths = fetchGlucoseData(forPeriod: "90d", withPredicate: NSPredicate.predicateForThreeMonths)
 
                 // First date
-                let previous = glucose.last?.date ?? Date()
+                let previous = glucoseThreeMonths.last?.date ?? Date()
                 // Last date (recent)
-                let current = glucose.first?.date ?? Date()
+                let current = glucoseThreeMonths.first?.date ?? Date()
                 // Total time in days
                 let numberOfDays = (current - previous).timeInterval / 8.64E4
 
                 // Get glucose computations for every case
-                let oneDayGlucose = glucoseStats(glucose_24)
-                let sevenDaysGlucose = glucoseStats(glucose_7)
-                let thirtyDaysGlucose = glucoseStats(glucose_30)
-                let totalDaysGlucose = glucoseStats(glucose)
+                let oneDayGlucose = glucoseStats(glucose24h)
+                let sevenDaysGlucose = glucoseStats(glucoseOneWeek)
+                let thirtyDaysGlucose = glucoseStats(glucoseOneMonth)
+                let totalDaysGlucose = glucoseStats(glucoseThreeMonths)
 
                 let median = Durations(
                     day: roundDecimal(Decimal(oneDayGlucose.median), 1),
@@ -1052,10 +1075,10 @@ final class BaseAPSManager: APSManager, Injectable {
                 var thirtyDays_: (TIR: Double, hypos: Double, hypers: Double, normal_: Double) = (0.0, 0.0, 0.0, 0.0)
                 var totalDays_: (TIR: Double, hypos: Double, hypers: Double, normal_: Double) = (0.0, 0.0, 0.0, 0.0)
                 // Get TIR computations for every case
-                oneDay_ = tir(glucose_24)
-                sevenDays_ = tir(glucose_7)
-                thirtyDays_ = tir(glucose_30)
-                totalDays_ = tir(glucose)
+                oneDay_ = tir(glucose24h)
+                sevenDays_ = tir(glucoseOneWeek)
+                thirtyDays_ = tir(glucoseOneMonth)
+                totalDays_ = tir(glucoseThreeMonths)
 
                 let tir = Durations(
                     day: roundDecimal(Decimal(oneDay_.TIR), 1),

+ 24 - 0
Model/GlucoseStored+helper.swift

@@ -0,0 +1,24 @@
+import CoreData
+import Foundation
+
+extension GlucoseStored {
+    static func fetch(_ predicate: NSPredicate = .all) -> NSFetchRequest<GlucoseStored> {
+        let request = GlucoseStored.fetchRequest()
+        request.sortDescriptors = [NSSortDescriptor(keyPath: \GlucoseStored.date, ascending: true)]
+        request.predicate = predicate
+        return request
+    }
+
+//    static func asyncFetch(_ predicate: NSPredicate = NSPredicate(value: true), completion: @escaping (NSAsynchronousFetchResult<GlucoseStored>)->Void) -> NSAsynchronousFetchRequest<GlucoseStored> {
+//           let request: NSFetchRequest<GlucoseStored> = GlucoseStored.fetchRequest()
+//           request.sortDescriptors = [NSSortDescriptor(keyPath: \GlucoseStored.date, ascending: true)]
+//           request.predicate = predicate
+//
+//           // Erstelle einen NSAsynchronousFetchRequest mit einem Completion Handler
+//           let asyncFetchRequest = NSAsynchronousFetchRequest<GlucoseStored>(fetchRequest: request) { result in
+//               completion(result)
+//           }
+//
+//           return asyncFetchRequest
+//       }
+}

+ 31 - 0
Model/NSPredicates.swift

@@ -9,9 +9,25 @@ extension Date {
     static var halfHourAgo: Date {
         Calendar.current.date(byAdding: .minute, value: -30, to: Date())!
     }
+
+    static var oneWeekAgo: Date {
+        Calendar.current.date(byAdding: .day, value: -7, to: Date())!
+    }
+
+    static var oneMonthAgo: Date {
+        Calendar.current.date(byAdding: .month, value: -1, to: Date())!
+    }
+
+    static var threeMonthsAgo: Date {
+        Calendar.current.date(byAdding: .month, value: -3, to: Date())!
+    }
 }
 
 extension NSPredicate {
+    static let all = NSPredicate(format: "TRUEPREDICATE")
+
+    static let none = NSPredicate(format: "FALSEPREDICATE")
+
     static var predicateForOneDayAgo: NSPredicate {
         let date = Date.oneDayAgo
         return NSPredicate(format: "date >= %@", date as NSDate)
@@ -21,4 +37,19 @@ extension NSPredicate {
         let date = Date.halfHourAgo
         return NSPredicate(format: "date >= %@", date as NSDate)
     }
+
+    static var predicateForOneWeek: NSPredicate {
+        let date = Date.oneWeekAgo
+        return NSPredicate(format: "date >= %@", date as NSDate)
+    }
+
+    static var predicateForOneMonth: NSPredicate {
+        let date = Date.oneMonthAgo
+        return NSPredicate(format: "date >= %@", date as NSDate)
+    }
+
+    static var predicateForThreeMonths: NSPredicate {
+        let date = Date.threeMonthsAgo
+        return NSPredicate(format: "date >= %@", date as NSDate)
+    }
 }