Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overrides and tt presets #17

Merged
merged 8 commits into from
Mar 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,21 @@
<attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<relationship name="computed" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedTDD" inverseEntity="Oref0Suggestion"/>
</entity>
<entity name="ViewPercentage" representedClassName="ViewPercentage" syncable="YES" codeGenerationType="class">
<entity name="TempTargets" representedClassName="TempTargets" syncable="YES" codeGenerationType="class">
<attribute name="active" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
<attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
<attribute name="id" optional="YES" attributeType="String"/>
<attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
</entity>
<entity name="TempTargetsSlider" representedClassName="TempTargetsSlider" syncable="YES" codeGenerationType="class">
<attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="defaultHBT" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
<attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
<attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="100" usesScalarValueType="YES"/>
<attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
<attribute name="id" optional="YES" attributeType="String" defaultValueString="empy"/>
<attribute name="isPreset" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
</entity>
</model>
2 changes: 1 addition & 1 deletion FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
},
{
"package": "SwiftCharts",
"repositoryURL": "https://github.com/ivanschuetz/SwiftCharts",
"repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git",
"state": {
"branch": "master",
"revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2",
Expand Down
2 changes: 1 addition & 1 deletion FreeAPS/Resources/javascript/bundle/determine-basal.js

Large diffs are not rendered by default.

55 changes: 50 additions & 5 deletions FreeAPS/Sources/APS/APSManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -714,8 +714,9 @@ final class BaseAPSManager: APSManager, Injectable {
let preferences = settingsManager.preferences
let currentTDD = enacted_.tdd ?? 0

var booleanArray = [ViewPercentage]()
var booleanArray = [TempTargetsSlider]()
var overrideArray = [Override]()
var tempTargetsArray = [TempTargets]()
var isPercentageEnabled = false
var useOverride = false
var overridePercentage: Decimal = 100
Expand All @@ -741,10 +742,10 @@ final class BaseAPSManager: APSManager, Injectable {
requestTDD.sortDescriptors = [sortTDD]
try? uniqEvents = coredataContext.fetch(requestTDD)

let requestIsEnbled = ViewPercentage.fetchRequest() as NSFetchRequest<ViewPercentage>
let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
requestIsEnbled.sortDescriptors = [sortIsEnabled]
requestIsEnbled.fetchLimit = 1
// requestIsEnbled.fetchLimit = 1
try? booleanArray = coredataContext.fetch(requestIsEnbled)

let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
Expand All @@ -753,6 +754,12 @@ final class BaseAPSManager: APSManager, Injectable {
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
Expand Down Expand Up @@ -800,6 +807,22 @@ final class BaseAPSManager: APSManager, Injectable {
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),
Expand All @@ -817,17 +840,22 @@ final class BaseAPSManager: APSManager, Injectable {
print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
} else {
coredataContext.performAndWait {
let requestIsEnbled = ViewPercentage.fetchRequest() as NSFetchRequest<ViewPercentage>
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)
}

isPercentageEnabled = booleanArray.first?.enabled ?? false
Expand Down Expand Up @@ -857,6 +885,23 @@ final class BaseAPSManager: APSManager, Injectable {
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,
Expand Down
2 changes: 1 addition & 1 deletion FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ extension AddCarbs {
@Published var selection: Presets?

let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
@Environment(\.managedObjectContext) var moc
// @Environment(\.managedObjectContext) var moc

override func subscribe() {
carbsRequired = provider.suggestion?.carbsReq
Expand Down
6 changes: 3 additions & 3 deletions FreeAPS/Sources/Modules/AddCarbs/View/AddCarbsRootView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ extension AddCarbs {
}
.pickerStyle(.automatic)
._onBindingChange($state.selection) { _ in
state.carbs = ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal
state.fat = ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal
state.protein = ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal
state.carbs += ((state.selection?.carbs ?? 0) as NSDecimalNumber) as Decimal
state.fat += ((state.selection?.fat ?? 0) as NSDecimalNumber) as Decimal
state.protein += ((state.selection?.protein ?? 0) as NSDecimalNumber) as Decimal
}
}
HStack {
Expand Down
101 changes: 75 additions & 26 deletions FreeAPS/Sources/Modules/AddTempTarget/AddTempTargetStateModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ extension AddTempTarget {
@Injected() private var storage: TempTargetsStorage!
@Injected() var apsManager: APSManager!

let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
@Environment(\.managedObjectContext) var moc

@Published var low: Decimal = 0
// @Published var target: Decimal = 0
@Published var high: Decimal = 0
@Published var duration: Decimal = 0
@Published var date = Date()
Expand All @@ -17,7 +21,7 @@ extension AddTempTarget {
@Published var viewPercantage = false
@Published var hbt: Double = 160
@Published var saveSettings: Bool = false

private(set) var units: GlucoseUnits = .mmolL

override func subscribe() {
Expand All @@ -30,17 +34,7 @@ extension AddTempTarget {
var lowTarget = low

if viewPercantage {
var ratio = Decimal(percentage / 100)
let hB = Decimal(hbt)
let c = hB - 100
var target = (c / ratio) - c + 100

if c * (c + target - 100) <= 0 {
ratio = maxValue
target = (c / ratio) - c + 100
}
lowTarget = target
lowTarget = Decimal(round(Double(target)))
lowTarget = computeTarget()
saveSettings = true
}
var highTarget = lowTarget
Expand All @@ -49,7 +43,7 @@ extension AddTempTarget {
lowTarget = lowTarget.asMgdL
highTarget = highTarget.asMgdL
}

let entry = TempTarget(
name: TempTarget.custom,
createdAt: date,
Expand All @@ -66,25 +60,27 @@ extension AddTempTarget {
func cancel() {
storage.storeTempTargets([TempTarget.cancel(at: Date())])
showModal(for: nil)

coredataContext.performAndWait {
let saveToCoreData = TempTargets(context: self.coredataContext)
saveToCoreData.active = false
saveToCoreData.date = Date()
try? self.coredataContext.save()

let setHBT = TempTargetsSlider(context: self.coredataContext)
setHBT.enabled = false
try? self.coredataContext.save()
}
}

func save() {
var lowTarget = low

if viewPercantage {
var ratio = Decimal(percentage / 100)
let hB = Decimal(hbt)
let c = hB - 100
var target = (c / ratio) - c + 100

if c * (c + target - 100) <= 0 {
ratio = maxValue
target = (c / ratio) - c + 100
}
lowTarget = target
lowTarget = Decimal(round(Double(target)))
lowTarget = computeTarget()
saveSettings = true
}

var highTarget = lowTarget

if units == .mmolL, !viewPercantage {
Expand All @@ -103,21 +99,74 @@ extension AddTempTarget {
)
presets.append(entry)
storage.storePresets(presets)

if viewPercantage {
let id = entry.id

coredataContext.performAndWait {
let saveToCoreData = TempTargetsSlider(context: self.coredataContext)
saveToCoreData.id = id
saveToCoreData.isPreset = true
saveToCoreData.enabled = true
saveToCoreData.hbt = hbt
saveToCoreData.enabled = true
saveToCoreData.date = Date()
saveToCoreData.duration = duration as NSDecimalNumber
try? self.coredataContext.save()
}
}
}

func enactPreset(id: String) {
if var preset = presets.first(where: { $0.id == id }) {
preset.createdAt = Date()
storage.storeTempTargets([preset])
showModal(for: nil)

coredataContext.performAndWait {
var tempTargetsArray = [TempTargetsSlider]()
let requestTempTargets = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
let sortTT = NSSortDescriptor(key: "date", ascending: false)
requestTempTargets.sortDescriptors = [sortTT]
try? tempTargetsArray = coredataContext.fetch(requestTempTargets)

let whichID = tempTargetsArray.first(where: { $0.id == id })

if whichID != nil {
let saveToCoreData = TempTargets(context: self.coredataContext)
saveToCoreData.active = true
saveToCoreData.date = Date()
saveToCoreData.hbt = whichID?.hbt ?? 160
// saveToCoreData.id = id
saveToCoreData.startDate = Date()
saveToCoreData.duration = whichID?.duration ?? 0

try? self.coredataContext.save()
} else {
let saveToCoreData = TempTargets(context: self.coredataContext)
saveToCoreData.active = false
saveToCoreData.date = Date()
try? self.coredataContext.save()
}
}
}
}

func savedHBT() {}

func removePreset(id: String) {
presets = presets.filter { $0.id != id }
storage.storePresets(presets)
}

func computeTarget() -> Decimal {
var ratio = Decimal(percentage / 100)
let c = Decimal(hbt - 100)
var target = (c / ratio) - c + 100

if c * (c + target - 100) <= 0 {
ratio = maxValue
target = (c / ratio) - c + 100
}
return target
}
}
}
Loading