|
|
@@ -411,13 +411,6 @@ final class OpenAPS {
|
|
|
debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to fetch TDD Data")
|
|
|
}
|
|
|
|
|
|
- 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 = self.context.fetch(requestIsEnbled)
|
|
|
-
|
|
|
/// Get the last active Override as only this information is apparently used in oref2
|
|
|
var overrideArray = [OverrideStored]()
|
|
|
let requestOverrides = OverrideStored.fetchRequest() as NSFetchRequest<OverrideStored>
|
|
|
@@ -427,8 +420,8 @@ final class OpenAPS {
|
|
|
requestOverrides.fetchLimit = 1
|
|
|
try? overrideArray = self.context.fetch(requestOverrides)
|
|
|
|
|
|
- var tempTargetsArray = [TempTargets]()
|
|
|
- let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
|
|
|
+ var tempTargetsArray = [TempTargetStored]()
|
|
|
+ let requestTempTargets = TempTargetStored.fetchRequest() as NSFetchRequest<TempTargetStored>
|
|
|
let sortTT = NSSortDescriptor(key: "date", ascending: false)
|
|
|
requestTempTargets.sortDescriptors = [sortTT]
|
|
|
requestTempTargets.fetchLimit = 1
|
|
|
@@ -436,14 +429,14 @@ final class OpenAPS {
|
|
|
|
|
|
let total = uniqueEvents.compactMap({ ($0["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0 }).reduce(0, +)
|
|
|
var indeces = uniqueEvents.count
|
|
|
- // Only fetch once. Use same (previous) fetch
|
|
|
+
|
|
|
+ // Fetch data for two hours
|
|
|
let twoHoursArray = uniqueEvents.filter({ ($0["timestamp"] as? Date ?? Date()) >= twoHoursAgo })
|
|
|
var nrOfIndeces = twoHoursArray.count
|
|
|
let totalAmount = twoHoursArray.compactMap({ ($0["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0 })
|
|
|
.reduce(0, +)
|
|
|
|
|
|
- var temptargetActive = tempTargetsArray.first?.active ?? false
|
|
|
- let isPercentageEnabled = sliderArray.first?.enabled ?? false
|
|
|
+ var isTemptargetActive = tempTargetsArray.first?.enabled ?? false
|
|
|
|
|
|
var useOverride = overrideArray.first?.enabled ?? false
|
|
|
var overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
|
|
|
@@ -452,18 +445,13 @@ final class OpenAPS {
|
|
|
|
|
|
let currentTDD = (uniqueEvents.last?["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0
|
|
|
|
|
|
- if indeces == 0 {
|
|
|
- indeces = 1
|
|
|
- }
|
|
|
- if nrOfIndeces == 0 {
|
|
|
- nrOfIndeces = 1
|
|
|
- }
|
|
|
+ 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
|
|
|
+ let weightedAverage = wp * average2hours + (1 - wp) * average14
|
|
|
|
|
|
var duration: Decimal = 0
|
|
|
var overrideTarget: Decimal = 0
|
|
|
@@ -474,9 +462,7 @@ final class OpenAPS {
|
|
|
let advancedSettings = overrideArray.first?.advancedSettings ?? false
|
|
|
let addedMinutes = Int(duration)
|
|
|
let date = overrideArray.first?.date ?? Date()
|
|
|
- if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
|
|
|
- !unlimited
|
|
|
- {
|
|
|
+ if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !unlimited {
|
|
|
useOverride = false
|
|
|
let saveToCoreData = OverrideStored(context: self.context)
|
|
|
saveToCoreData.enabled = false
|
|
|
@@ -501,35 +487,33 @@ final class OpenAPS {
|
|
|
disableSMBs = false
|
|
|
}
|
|
|
|
|
|
- if temptargetActive {
|
|
|
+ if isTemptargetActive {
|
|
|
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)
|
|
|
- temptargetActive = true
|
|
|
- } else {
|
|
|
- temptargetActive = false
|
|
|
- }
|
|
|
+ duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
|
|
|
+ hbt = Double(truncating: tempTargetsArray.first?.target ?? NSDecimalNumber(value: Double(hbt_)))
|
|
|
+ let startDate = tempTargetsArray.first?.date ?? Date()
|
|
|
+ let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
|
|
|
+ dd = durationPlusStart.timeIntervalSinceNow.minutes
|
|
|
+
|
|
|
+ if dd > 0.1 {
|
|
|
+ hbt_ = Decimal(hbt)
|
|
|
+ isTemptargetActive = true
|
|
|
+ } else {
|
|
|
+ isTemptargetActive = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if currentTDD > 0 {
|
|
|
let averages = Oref2_variables(
|
|
|
average_total_data: average14,
|
|
|
- weightedAverage: weighted_average,
|
|
|
+ weightedAverage: weightedAverage,
|
|
|
past2hoursAverage: average2hours,
|
|
|
date: Date(),
|
|
|
- isEnabled: temptargetActive,
|
|
|
- presetActive: isPercentageEnabled,
|
|
|
+ isEnabled: isTemptargetActive,
|
|
|
+ presetActive: isTemptargetActive,
|
|
|
overridePercentage: overridePercentage,
|
|
|
useOverride: useOverride,
|
|
|
duration: duration,
|
|
|
@@ -546,7 +530,6 @@ final class OpenAPS {
|
|
|
)
|
|
|
|
|
|
self.storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
|
|
|
-
|
|
|
return self.loadFileFromStorage(name: Monitor.oref2_variables)
|
|
|
|
|
|
} else {
|
|
|
@@ -555,8 +538,8 @@ final class OpenAPS {
|
|
|
weightedAverage: 1,
|
|
|
past2hoursAverage: 0,
|
|
|
date: Date(),
|
|
|
- isEnabled: temptargetActive,
|
|
|
- presetActive: isPercentageEnabled,
|
|
|
+ isEnabled: isTemptargetActive,
|
|
|
+ presetActive: isTemptargetActive,
|
|
|
overridePercentage: overridePercentage,
|
|
|
useOverride: useOverride,
|
|
|
duration: duration,
|
|
|
@@ -577,6 +560,199 @@ final class OpenAPS {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// func oref2() async -> RawJSON {
|
|
|
+// await context.perform {
|
|
|
+// let preferences = self.storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self)
|
|
|
+// var hbt_ = preferences?.halfBasalExerciseTarget ?? 160
|
|
|
+// let wp = preferences?.weightPercentage ?? 1
|
|
|
+// let smbMinutes = (preferences?.maxSMBBasalMinutes ?? 30) as NSDecimalNumber
|
|
|
+// let uamMinutes = (preferences?.maxUAMSMBBasalMinutes ?? 30) as NSDecimalNumber
|
|
|
+//
|
|
|
+// let tenDaysAgo = Date().addingTimeInterval(-10.days.timeInterval)
|
|
|
+// let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)
|
|
|
+//
|
|
|
+// var uniqueEvents = [[String: Any]]()
|
|
|
+// let requestTDD = OrefDetermination.fetchRequest() as NSFetchRequest<NSFetchRequestResult>
|
|
|
+// requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND totalDailyDose > 0", tenDaysAgo as NSDate)
|
|
|
+// requestTDD.propertiesToFetch = ["timestamp", "totalDailyDose"]
|
|
|
+// let sortTDD = NSSortDescriptor(key: "timestamp", ascending: true)
|
|
|
+// requestTDD.sortDescriptors = [sortTDD]
|
|
|
+// requestTDD.resultType = .dictionaryResultType
|
|
|
+//
|
|
|
+// do {
|
|
|
+// if let fetchedResults = try self.context.fetch(requestTDD) as? [[String: Any]] {
|
|
|
+// uniqueEvents = fetchedResults
|
|
|
+// }
|
|
|
+// } catch {
|
|
|
+// debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to fetch TDD Data")
|
|
|
+// }
|
|
|
+//
|
|
|
+ //// var sliderArray = [TempTargetStored]()
|
|
|
+ //// let requestIsEnbled = TempTargetStored.fetchRequest() as NSFetchRequest<TempTargetStored>
|
|
|
+ //// let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
|
|
|
+ //// requestIsEnbled.sortDescriptors = [sortIsEnabled]
|
|
|
+ //// // requestIsEnbled.fetchLimit = 1
|
|
|
+ //// try? sliderArray = self.context.fetch(requestIsEnbled)
|
|
|
+//
|
|
|
+// /// Get the last active Override as only this information is apparently used in oref2
|
|
|
+// var overrideArray = [OverrideStored]()
|
|
|
+// let requestOverrides = OverrideStored.fetchRequest() as NSFetchRequest<OverrideStored>
|
|
|
+// let sortOverride = NSSortDescriptor(key: "date", ascending: false)
|
|
|
+// requestOverrides.sortDescriptors = [sortOverride]
|
|
|
+// requestOverrides.predicate = NSPredicate.lastActiveOverride
|
|
|
+// requestOverrides.fetchLimit = 1
|
|
|
+// try? overrideArray = self.context.fetch(requestOverrides)
|
|
|
+//
|
|
|
+// var tempTargetsArray = [TempTargetStored]()
|
|
|
+// let requestTempTargets = TempTargetStored.fetchRequest() as NSFetchRequest<TempTargetStored>
|
|
|
+// let sortTT = NSSortDescriptor(key: "date", ascending: false)
|
|
|
+// requestTempTargets.sortDescriptors = [sortTT]
|
|
|
+// requestTempTargets.fetchLimit = 1
|
|
|
+// try? tempTargetsArray = self.context.fetch(requestTempTargets)
|
|
|
+//
|
|
|
+// let total = uniqueEvents.compactMap({ ($0["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0 }).reduce(0, +)
|
|
|
+// var indeces = uniqueEvents.count
|
|
|
+// // Only fetch once. Use same (previous) fetch
|
|
|
+// let twoHoursArray = uniqueEvents.filter({ ($0["timestamp"] as? Date ?? Date()) >= twoHoursAgo })
|
|
|
+// var nrOfIndeces = twoHoursArray.count
|
|
|
+// let totalAmount = twoHoursArray.compactMap({ ($0["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0 })
|
|
|
+// .reduce(0, +)
|
|
|
+//
|
|
|
+// var isTemptargetActive = tempTargetsArray.first?.enabled ?? false
|
|
|
+//
|
|
|
+// var useOverride = overrideArray.first?.enabled ?? false
|
|
|
+// var overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
|
|
|
+// var unlimited = overrideArray.first?.indefinite ?? true
|
|
|
+// var disableSMBs = overrideArray.first?.smbIsOff ?? false
|
|
|
+//
|
|
|
+// let currentTDD = (uniqueEvents.last?["totalDailyDose"] as? NSDecimalNumber)?.decimalValue ?? 0
|
|
|
+//
|
|
|
+// 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 overrideTarget: Decimal = 0
|
|
|
+//
|
|
|
+// if useOverride {
|
|
|
+// duration = (overrideArray.first?.duration ?? 0) as Decimal
|
|
|
+// overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
|
|
|
+// let advancedSettings = overrideArray.first?.advancedSettings ?? false
|
|
|
+// let addedMinutes = Int(duration)
|
|
|
+// let date = overrideArray.first?.date ?? Date()
|
|
|
+// if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
|
|
|
+// !unlimited
|
|
|
+// {
|
|
|
+// useOverride = false
|
|
|
+// let saveToCoreData = OverrideStored(context: self.context)
|
|
|
+// saveToCoreData.enabled = false
|
|
|
+// saveToCoreData.date = Date()
|
|
|
+// saveToCoreData.duration = 0
|
|
|
+// saveToCoreData.indefinite = false
|
|
|
+// saveToCoreData.percentage = 100
|
|
|
+// do {
|
|
|
+// guard self.context.hasChanges else { return "{}" }
|
|
|
+// try self.context.save()
|
|
|
+// } catch {
|
|
|
+// print(error.localizedDescription)
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// if !useOverride {
|
|
|
+// unlimited = true
|
|
|
+// overridePercentage = 100
|
|
|
+// duration = 0
|
|
|
+// overrideTarget = 0
|
|
|
+// disableSMBs = false
|
|
|
+// }
|
|
|
+//
|
|
|
+// if isTemptargetActive {
|
|
|
+// var duration_ = 0
|
|
|
+// var hbt = Double(hbt_)
|
|
|
+// var dd = 0.0
|
|
|
+//
|
|
|
+// duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
|
|
|
+// hbt = tempTargetsArray.first?.target ?? 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)
|
|
|
+// isTemptargetActive = true
|
|
|
+// } else {
|
|
|
+// isTemptargetActive = false
|
|
|
+// }
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// // TODO: - adapt oref2 struct to remove double use of isTemptargetActive
|
|
|
+//
|
|
|
+// if currentTDD > 0 {
|
|
|
+// let averages = Oref2_variables(
|
|
|
+// average_total_data: average14,
|
|
|
+// weightedAverage: weighted_average,
|
|
|
+// past2hoursAverage: average2hours,
|
|
|
+// date: Date(),
|
|
|
+// isEnabled: isTemptargetActive,
|
|
|
+// presetActive: isTemptargetActive,
|
|
|
+// overridePercentage: overridePercentage,
|
|
|
+// useOverride: useOverride,
|
|
|
+// duration: duration,
|
|
|
+// unlimited: unlimited,
|
|
|
+// hbt: hbt_,
|
|
|
+// overrideTarget: overrideTarget,
|
|
|
+// smbIsOff: disableSMBs,
|
|
|
+// advancedSettings: overrideArray.first?.advancedSettings ?? false,
|
|
|
+// isfAndCr: overrideArray.first?.isfAndCr ?? false,
|
|
|
+// isf: overrideArray.first?.isf ?? false,
|
|
|
+// cr: overrideArray.first?.cr ?? false,
|
|
|
+// smbMinutes: (overrideArray.first?.smbMinutes ?? smbMinutes) as Decimal,
|
|
|
+// uamMinutes: (overrideArray.first?.uamMinutes ?? uamMinutes) as Decimal
|
|
|
+// )
|
|
|
+//
|
|
|
+// self.storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
|
|
|
+//
|
|
|
+// return self.loadFileFromStorage(name: Monitor.oref2_variables)
|
|
|
+//
|
|
|
+// } else {
|
|
|
+// let averages = Oref2_variables(
|
|
|
+// average_total_data: 0,
|
|
|
+// weightedAverage: 1,
|
|
|
+// past2hoursAverage: 0,
|
|
|
+// date: Date(),
|
|
|
+// isEnabled: isTemptargetActive,
|
|
|
+// presetActive: isTemptargetActive,
|
|
|
+// overridePercentage: overridePercentage,
|
|
|
+// useOverride: useOverride,
|
|
|
+// duration: duration,
|
|
|
+// unlimited: unlimited,
|
|
|
+// hbt: hbt_,
|
|
|
+// overrideTarget: overrideTarget,
|
|
|
+// smbIsOff: disableSMBs,
|
|
|
+// advancedSettings: overrideArray.first?.advancedSettings ?? false,
|
|
|
+// isfAndCr: overrideArray.first?.isfAndCr ?? false,
|
|
|
+// isf: overrideArray.first?.isf ?? false,
|
|
|
+// cr: overrideArray.first?.cr ?? false,
|
|
|
+// smbMinutes: (overrideArray.first?.smbMinutes ?? smbMinutes) as Decimal,
|
|
|
+// uamMinutes: (overrideArray.first?.uamMinutes ?? uamMinutes) as Decimal
|
|
|
+// )
|
|
|
+// self.storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
|
|
|
+// return self.loadFileFromStorage(name: Monitor.oref2_variables)
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
func autosense() async throws -> Autosens? {
|
|
|
debug(.openAPS, "Start autosens")
|
|
|
|