Skip to content

Commit

Permalink
Merge pull request #4 from antoinekh/dev
Browse files Browse the repository at this point in the history
New TT presets support and Meal Presets summation (Artificial-Pancreas#17)
  • Loading branch information
antoinekh authored Mar 29, 2023
2 parents 4e3e0a4 + 5fec45f commit d0aacf3
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 67 deletions.
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/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

0 comments on commit d0aacf3

Please sign in to comment.