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

Bug fixes for TTs and more.
Remove delay for added variables.
Refactoring.

(cherry picked from commit 551fbffaadd3e0f7d2086bef9d1d622b5a8fc2da)

Jon Mårtensson 3 лет назад
Родитель
Сommit
fbcba3a17c

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
FreeAPS/Resources/javascript/bundle/determine-basal.js


+ 0 - 222
FreeAPS/Sources/APS/APSManager.swift

@@ -702,232 +702,10 @@ final class BaseAPSManager: APSManager, Injectable {
                 }
             }
             nightscout.uploadStatus()
-            // Update the TDD value
-            tdd(enacted_: enacted)
-            // Update statistics
             statistics()
         }
     }
 
-    private func tdd(enacted_: Suggestion) {
-        let tddStartedAt = Date()
-        let preferences = settingsManager.preferences
-        let currentTDD = enacted_.tdd ?? 0
-
-        var booleanArray = [TempTargetsSlider]()
-        var overrideArray = [Override]()
-        var tempTargetsArray = [TempTargets]()
-        var isPercentageEnabled = false
-        var useOverride = false
-        var overridePercentage: Decimal = 100
-        var duration: Decimal = 0
-        var unlimited: Bool = false
-        var newDuration: Decimal = 0
-        var hbtSetting: Decimal = 160
-
-        if currentTDD > 0 {
-            let tenDaysAgo = Date().addingTimeInterval(-10.days.timeInterval)
-            let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)
-
-            var uniqEvents = [TDD]()
-            var total: Decimal = 0
-            var totalAmount: Decimal = 0
-            var indeces: Int = 0
-            var nrOfIndeces: Int = 0
-
-            coredataContext.performAndWait {
-                let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
-                requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", tenDaysAgo as NSDate)
-                let sortTDD = NSSortDescriptor(key: "timestamp", ascending: true)
-                requestTDD.sortDescriptors = [sortTDD]
-                try? uniqEvents = coredataContext.fetch(requestTDD)
-
-                let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
-                let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
-                requestIsEnbled.sortDescriptors = [sortIsEnabled]
-                // requestIsEnbled.fetchLimit = 1
-                try? booleanArray = coredataContext.fetch(requestIsEnbled)
-
-                let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
-                let sortOverride = NSSortDescriptor(key: "date", ascending: false)
-                requestOverrides.sortDescriptors = [sortOverride]
-                requestOverrides.fetchLimit = 1
-                try? overrideArray = coredataContext.fetch(requestOverrides)
-
-                let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
-                let sortTT = NSSortDescriptor(key: "date", ascending: false)
-                requestTempTargets.sortDescriptors = [sortTT]
-                requestTempTargets.fetchLimit = 1
-                try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
-
-                total = uniqEvents.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
-                indeces = uniqEvents.count
-                // Only fetch once. Use same (previous) fetch
-                let twoHoursArray = uniqEvents.filter({ ($0.timestamp ?? Date()) >= twoHoursAgo })
-                nrOfIndeces = twoHoursArray.count
-                totalAmount = twoHoursArray.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
-            }
-
-            if indeces == 0 {
-                indeces = 1
-            }
-            if nrOfIndeces == 0 {
-                nrOfIndeces = 1
-            }
-
-            let average2hours = totalAmount / Decimal(nrOfIndeces)
-            let average14 = total / Decimal(indeces)
-            let weight = preferences.weightPercentage
-            let weighted_average = weight * average2hours + (1 - weight) * average14
-
-            isPercentageEnabled = booleanArray.first?.enabled ?? false
-            useOverride = overrideArray.first?.enabled ?? false
-            overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
-            unlimited = overrideArray.first?.indefinite ?? true
-            hbtSetting = Decimal(booleanArray.first?.hbt ?? 160)
-
-            if useOverride {
-                duration = (overrideArray.first?.duration ?? 0) as Decimal
-                let addedMinutes = Int(duration)
-                let date = overrideArray.first?.date ?? Date()
-                if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
-                   !unlimited
-                { useOverride = false }
-
-                newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
-            }
-
-            if newDuration < 0 {
-                newDuration = 0
-            } else { duration = newDuration }
-
-            if !useOverride {
-                unlimited = true
-                overridePercentage = 100
-                duration = 0
-            }
-
-            if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
-                var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
-                var hbt = tempTargetsArray.first?.hbt ?? 160
-                if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
-                    duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
-                    hbt = booleanArray.first?.hbt ?? 160
-                }
-                let startDate = tempTargetsArray.first?.startDate ?? Date()
-                let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
-                let dd = durationPlusStart.timeIntervalSinceNow.minutes
-                if dd > 0 {
-                    hbtSetting = Decimal(hbt)
-                    isPercentageEnabled = true
-                } else { isPercentageEnabled = false }
-            }
-
-            let averages = Oref2_variables(
-                average_total_data: roundDecimal(average14, 1),
-                weightedAverage: roundDecimal(weighted_average, 1),
-                past2hoursAverage: roundDecimal(average2hours, 1),
-                date: Date(),
-                isEnabled: isPercentageEnabled,
-                overridePercentage: overridePercentage,
-                useOverride: useOverride,
-                duration: duration,
-                unlimited: unlimited,
-                hbt: hbtSetting
-            )
-            storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
-
-            print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
-        } else {
-            coredataContext.performAndWait {
-                let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
-                let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
-                requestIsEnbled.sortDescriptors = [sortIsEnabled]
-                try? booleanArray = coredataContext.fetch(requestIsEnbled)
-
-                let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
-                let sortOverride = NSSortDescriptor(key: "date", ascending: false)
-                requestOverrides.sortDescriptors = [sortOverride]
-                requestOverrides.fetchLimit = 1
-                try? overrideArray = coredataContext.fetch(requestOverrides)
-
-                let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
-                let sortTT = NSSortDescriptor(key: "date", ascending: false)
-                requestTempTargets.sortDescriptors = [sortTT]
-                requestTempTargets.fetchLimit = 1
-                try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
-            }
-
-            isPercentageEnabled = booleanArray.first?.enabled ?? false
-            useOverride = overrideArray.first?.enabled ?? false
-            overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
-            unlimited = overrideArray.first?.indefinite ?? true
-            hbtSetting = Decimal(booleanArray.first?.hbt ?? 160)
-
-            if useOverride {
-                duration = (overrideArray.first?.duration ?? 0) as Decimal
-                let addedMinutes = Int(duration)
-                let date = overrideArray.first?.date ?? Date()
-                if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
-                   !unlimited
-                { useOverride = false }
-
-                newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
-            }
-
-            if newDuration < 0 {
-                newDuration = 0
-            } else { duration = newDuration }
-
-            if !useOverride {
-                unlimited = true
-                overridePercentage = 100
-                duration = 0
-            }
-
-            if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
-                var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
-                var hbt = tempTargetsArray.first?.hbt ?? 160
-                if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
-                    duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
-                    hbt = booleanArray.first?.hbt ?? 160
-                }
-                let startDate = tempTargetsArray.first?.startDate ?? Date()
-                let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
-                let dd = durationPlusStart.timeIntervalSinceNow.minutes
-
-                if dd > 0 {
-                    hbtSetting = Decimal(hbt)
-                    isPercentageEnabled = true
-                } else { isPercentageEnabled = false }
-            }
-
-            let averages = Oref2_variables(
-                average_total_data: 0,
-                weightedAverage: 1,
-                past2hoursAverage: 0,
-                date: Date(),
-                isEnabled: isPercentageEnabled,
-                overridePercentage: overridePercentage,
-                useOverride: useOverride,
-                duration: duration,
-                unlimited: unlimited,
-                hbt: hbtSetting
-            )
-            storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
-        }
-
-        coredataContext.performAndWait {
-            let saveNewUseOverride = Override(context: self.coredataContext)
-            saveNewUseOverride.date = Date()
-            saveNewUseOverride.enabled = useOverride
-            saveNewUseOverride.percentage = Double(overridePercentage)
-            saveNewUseOverride.duration = newDuration as NSDecimalNumber
-            saveNewUseOverride.indefinite = unlimited
-            try? self.coredataContext.save()
-        }
-    }
-
     private func roundDecimal(_ decimal: Decimal, _ digits: Double) -> Decimal {
         let rounded = round(Double(decimal) * pow(10, digits)) / pow(10, digits)
         return Decimal(rounded)

+ 166 - 1
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -44,7 +44,7 @@ final class OpenAPS {
 
                 self.storage.save(meal, as: Monitor.meal)
 
-                let oref2_variables = self.loadFileFromStorage(name: OpenAPS.Monitor.oref2_variables)
+                let oref2_variables = self.oref2()
 
                 // iob
                 let autosens = self.loadFileFromStorage(name: Settings.autosense)
@@ -117,6 +117,171 @@ final class OpenAPS {
         }
     }
 
+    func oref2() -> Oref2_variables {
+        coredataContext.perform {
+            let now = Date()
+            let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self)
+            var hbt_ = preferences?.halfBasalExerciseTarget ?? 160
+            let wp = preferences?.weightPercentage ?? 1
+
+            let tenDaysAgo = Date().addingTimeInterval(-10.days.timeInterval)
+            let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)
+
+            var uniqueEvents = [TDD]()
+            let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
+            requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", tenDaysAgo as NSDate)
+            let sortTDD = NSSortDescriptor(key: "timestamp", ascending: true)
+            requestTDD.sortDescriptors = [sortTDD]
+            try? uniqueEvents = coredataContext.fetch(requestTDD)
+
+            var sliderArray = [TempTargetsSlider]()
+            let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
+            let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
+            requestIsEnbled.sortDescriptors = [sortIsEnabled]
+            // requestIsEnbled.fetchLimit = 1
+            try? sliderArray = coredataContext.fetch(requestIsEnbled)
+
+            var overrideArray = [Override]()
+            let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
+            let sortOverride = NSSortDescriptor(key: "date", ascending: false)
+            requestOverrides.sortDescriptors = [sortOverride]
+            requestOverrides.fetchLimit = 1
+            try? overrideArray = coredataContext.fetch(requestOverrides)
+
+            var tempTargetsArray = [TempTargets]()
+            let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
+            let sortTT = NSSortDescriptor(key: "date", ascending: false)
+            requestTempTargets.sortDescriptors = [sortTT]
+            requestTempTargets.fetchLimit = 1
+            try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
+
+            let total = uniqueEvents.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
+            var indeces = uniqueEvents.count
+            // Only fetch once. Use same (previous) fetch
+            let twoHoursArray = uniqueEvents.filter({ ($0.timestamp ?? Date()) >= twoHoursAgo })
+            var nrOfIndeces = twoHoursArray.count
+            let totalAmount = twoHoursArray.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
+
+            var temptargetActive = tempTargetsArray.first?.active ?? false
+            var isPercentageEnabled = sliderArray.first?.enabled ?? false
+
+            var useOverride = overrideArray.first?.enabled ?? false
+            var overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
+            var unlimited = overrideArray.first?.indefinite ?? true
+
+            let currentTDD = (uniqueEvents.last?.tdd ?? 0) as Decimal
+
+            if indeces == 0 {
+                indeces = 1
+            }
+            if nrOfIndeces == 0 {
+                nrOfIndeces = 1
+            }
+
+            let average2hours = totalAmount / Decimal(nrOfIndeces)
+            let average14 = total / Decimal(indeces)
+
+            let weight = wp
+            let weighted_average = weight * average2hours + (1 - weight) * average14
+
+            var duration: Decimal = 0
+            var newDuration: Decimal = 0
+
+            if useOverride {
+                duration = (overrideArray.first?.duration ?? 0) as Decimal
+                let addedMinutes = Int(duration)
+                let date = overrideArray.first?.date ?? Date()
+                if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
+                   !unlimited
+                { useOverride = false }
+
+                newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
+            }
+
+            if newDuration < 0 {
+                newDuration = 0
+            } else { duration = newDuration }
+
+            if !useOverride {
+                unlimited = true
+                overridePercentage = 100
+                duration = 0
+            }
+
+            if temptargetActive || isPercentageEnabled {
+                var duration_ = 0
+                var hbt = Double(hbt_)
+                var dd = 0.0
+
+                if temptargetActive {
+                    duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
+                    hbt = tempTargetsArray.first?.hbt ?? Double(hbt_)
+                    let startDate = tempTargetsArray.first?.startDate ?? Date()
+                    let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
+                    dd = durationPlusStart.timeIntervalSinceNow.minutes
+
+                    if dd > 0.1 {
+                        hbt_ = Decimal(hbt)
+                        isPercentageEnabled = true
+                        temptargetActive = false
+                    } else {
+                        isPercentageEnabled = false
+                    }
+                } else if isPercentageEnabled {
+                    duration_ = Int(truncating: sliderArray.first?.duration ?? 0)
+                    hbt = sliderArray.first?.hbt ?? Double(hbt_)
+                    let startDate = sliderArray.first?.date ?? Date()
+                    let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
+                    dd = durationPlusStart.timeIntervalSinceNow.minutes
+
+                    if dd > 0.1 {
+                        hbt_ = Decimal(hbt)
+                        isPercentageEnabled = false
+                        temptargetActive = true
+                    } else {
+                        temptargetActive = false
+                    }
+                }
+            }
+
+            if currentTDD > 0 {
+                let averages = Oref2_variables(
+                    average_total_data: average14,
+                    weightedAverage: weighted_average,
+                    past2hoursAverage: average2hours,
+                    date: Date(),
+                    isEnabled: temptargetActive,
+                    presetActive: isPercentageEnabled,
+                    overridePercentage: overridePercentage,
+                    useOverride: useOverride,
+                    duration: duration,
+                    unlimited: unlimited,
+                    hbt: hbt_
+                )
+                storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
+                print("Test time for oref2_variables: \(-now.timeIntervalSinceNow) seconds")
+                return averages
+
+            } else {
+                let averages = Oref2_variables(
+                    average_total_data: 0,
+                    weightedAverage: 1,
+                    past2hoursAverage: 0,
+                    date: Date(),
+                    isEnabled: temptargetActive,
+                    presetActive: isPercentageEnabled,
+                    overridePercentage: overridePercentage,
+                    useOverride: useOverride,
+                    duration: duration,
+                    unlimited: unlimited,
+                    hbt: hbt_
+                )
+                storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
+                return averages
+            }
+        }
+    }
+
     func autosense() -> Future<Autosens?, Never> {
         Future { promise in
             self.processQueue.async {

+ 4 - 0
FreeAPS/Sources/Models/Oref2_variables.swift

@@ -6,6 +6,7 @@ struct Oref2_variables: JSON, Equatable {
     var past2hoursAverage: Decimal
     var date: Date
     var isEnabled: Bool
+    var presetActive: Bool
     var overridePercentage: Decimal
     var useOverride: Bool
     var duration: Decimal
@@ -18,6 +19,7 @@ struct Oref2_variables: JSON, Equatable {
         past2hoursAverage: Decimal,
         date: Date,
         isEnabled: Bool,
+        presetActive: Bool,
         overridePercentage: Decimal,
         useOverride: Bool,
         duration: Decimal,
@@ -29,6 +31,7 @@ struct Oref2_variables: JSON, Equatable {
         self.past2hoursAverage = past2hoursAverage
         self.date = date
         self.isEnabled = isEnabled
+        self.presetActive = presetActive
         self.overridePercentage = overridePercentage
         self.useOverride = useOverride
         self.duration = duration
@@ -44,6 +47,7 @@ extension Oref2_variables {
         case past2hoursAverage
         case date
         case isEnabled
+        case presetActive
         case overridePercentage
         case useOverride
         case duration

+ 11 - 2
FreeAPS/Sources/Modules/AddTempTarget/AddTempTargetStateModel.swift

@@ -38,6 +38,16 @@ extension AddTempTarget {
 
             if viewPercantage {
                 lowTarget = computeTarget()
+                coredataContext.performAndWait {
+                    let saveToCoreData = TempTargets(context: self.coredataContext)
+                    saveToCoreData.id = UUID().uuidString
+                    saveToCoreData.active = true
+                    saveToCoreData.hbt = hbt
+                    saveToCoreData.date = Date()
+                    saveToCoreData.duration = duration as NSDecimalNumber
+                    saveToCoreData.startDate = Date()
+                    try? self.coredataContext.save()
+                }
                 saveSettings = true
             }
             var highTarget = lowTarget
@@ -72,6 +82,7 @@ extension AddTempTarget {
 
                 let setHBT = TempTargetsSlider(context: self.coredataContext)
                 setHBT.enabled = false
+                setHBT.date = Date()
                 try? self.coredataContext.save()
             }
         }
@@ -86,7 +97,6 @@ extension AddTempTarget {
                 lowTarget = computeTarget()
                 saveSettings = true
             }
-
             var highTarget = lowTarget
 
             if units == .mmolL, !viewPercantage {
@@ -115,7 +125,6 @@ extension AddTempTarget {
                     saveToCoreData.isPreset = true
                     saveToCoreData.enabled = true
                     saveToCoreData.hbt = hbt
-                    saveToCoreData.enabled = true
                     saveToCoreData.date = Date()
                     saveToCoreData.duration = duration as NSDecimalNumber
                     try? self.coredataContext.save()

+ 0 - 17
FreeAPS/Sources/Modules/AddTempTarget/View/AddTempTargetRootView.swift

@@ -147,23 +147,6 @@ extension AddTempTarget {
             .navigationTitle("Enact Temp Target")
             .navigationBarTitleDisplayMode(.automatic)
             .navigationBarItems(leading: Button("Close", action: state.hideModal))
-            .onDisappear {
-                if state.viewPercantage, state.saveSettings {
-                    let isEnabledMoc = TempTargetsSlider(context: moc)
-                    isEnabledMoc.enabled = true
-                    isEnabledMoc.date = Date()
-                    isEnabledMoc.hbt = state.hbt
-                    isEnabledMoc.duration = state.duration as NSDecimalNumber
-                    isEnabledMoc.isPreset = false
-                    try? moc.save()
-                } else {
-                    let isEnabledMoc = TempTargetsSlider(context: moc)
-                    isEnabledMoc.enabled = false
-                    isEnabledMoc.date = Date()
-                    // isEnabledMoc.hbt = isEnabledArray.first?.hbt ?? 160
-                    try? moc.save()
-                }
-            }
         }
 
         private func presetView(for preset: TempTarget) -> some View {