Jon Mårtensson пре 3 година
родитељ
комит
52429583ad
1 измењених фајлова са 60 додато и 55 уклоњено
  1. 60 55
      FreeAPS/Sources/APS/APSManager.swift

+ 60 - 55
FreeAPS/Sources/APS/APSManager.swift

@@ -684,62 +684,67 @@ final class BaseAPSManager: APSManager, Injectable {
 
         // MARK: Add new data to Core Data:TDD Entity. TEST:
 
-        debug(.apsManager, "Writing TDD to CoreData")
-
-        let nTDD = TDD(context: coredataContext)
-        nTDD.timestamp = Date()
-        nTDD.tdd = NSDecimalNumber(decimal: currentTDD)
-
-        try? coredataContext.save()
-
-        let twoWeeksAgo = Date().addingTimeInterval(-14.days.timeInterval)
-        let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)
-        let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
-        requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", twoWeeksAgo as NSDate)
-        var uniqEvents: [TDD] = []
-
-        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
-        }
+        if currentTDD > 0 {
+            debug(.apsManager, "Writing TDD to CoreData")
+            let nTDD = TDD(context: coredataContext)
+            nTDD.timestamp = Date()
+            nTDD.tdd = currentTDD as NSDecimalNumber
+            try? coredataContext.save()
+
+            let twoWeeksAgo = Date().addingTimeInterval(-10.days.timeInterval)
+            let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)
+
+            var requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
+            requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", twoWeeksAgo as NSDate)
+            let sortTDD = NSSortDescriptor(key: "timestamp", ascending: false)
+            requestTDD.sortDescriptors = [sortTDD]
+            var uniqEvents = [TDD]()
+
+            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 ?? 0)")
+                total += uniqEvent.tdd?.decimalValue ?? 0
+                indeces += 1
+            }
 
-        requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", twoHoursAgo as NSDate)
-        var entriesPast2hours: [TDD] = []
+            requestTDD.predicate = NSPredicate(format: "timestamp > %@", twoHoursAgo as NSDate)
+            let sortTDDs = NSSortDescriptor(key: "timestamp", ascending: false)
+            requestTDD.sortDescriptors = [sortTDDs]
+            var entriesPast2hours = [TDD]()
 
-        try? entriesPast2hours = coredataContext.fetch(requestTDD)
+            try? entriesPast2hours = coredataContext.fetch(requestTDD)
 
-        var totalAmount: Decimal = 0
-        var nrOfIndeces: Decimal = 0
-        for entry in entriesPast2hours {
-            if (entry.tdd?.decimalValue ?? 0) > 0 {
-                totalAmount += entry.tdd?.decimalValue ?? 0
-                nrOfIndeces += 1
+            var totalAmount: Decimal = 0
+            var nrOfIndeces: Decimal = 0
+            for entry in entriesPast2hours {
+                if (entry.tdd?.decimalValue ?? 0) > 0 {
+                    totalAmount += entry.tdd?.decimalValue ?? 0
+                    nrOfIndeces += 1
+                }
             }
-        }
 
-        if indeces == 0 {
-            indeces = 1
-        }
-        if nrOfIndeces == 0 {
-            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)
+            print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
         }
-        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)
-        print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
     }
 
     private func roundDecimal(_ decimal: Decimal, _ digits: Double) -> Decimal {
@@ -800,17 +805,17 @@ final class BaseAPSManager: APSManager, Injectable {
         // MARK: Fetch TDD from CoreData
 
         let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
-        daysAgo = Date().addingTimeInterval(-10.days.timeInterval)
-        requestTDD.predicate = NSPredicate(format: "tdd > 0 AND date > %@", daysAgo as NSDate)
-        requestTDD.fetchLimit = 1
+        daysAgo = Date().addingTimeInterval(-12.hours.timeInterval)
+        requestTDD.predicate = NSPredicate(format: "timestamp > %@", daysAgo as NSDate)
         let sort = NSSortDescriptor(key: "timestamp", ascending: false)
         requestTDD.sortDescriptors = [sort]
+        requestTDD.fetchLimit = 1
 
-        var tdds: [TDD] = []
+        var tdds = [TDD]()
         try? tdds = coredataContext.fetch(requestTDD)
 
         var currentTDD: Decimal = 0
-        if tdds.count == 1 {
+        if !tdds.isEmpty {
             currentTDD = tdds[0].tdd?.decimalValue ?? 0
         }