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

Advanced TempTarget slider #241

Draft
wants to merge 2 commits into
base: dev
Choose a base branch
from
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,13 @@ extension AddTempTarget {
return
}
var lowTarget = low
if units == .mmolL {
lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
}
let highTarget = lowTarget

if viewPercantage {
lowTarget = Decimal(round(Double(computeTarget())))
hbt = computeHBT()
coredataContext.performAndWait {
let saveToCoreData = TempTargets(context: self.coredataContext)
saveToCoreData.id = UUID().uuidString
Expand All @@ -55,12 +59,6 @@ extension AddTempTarget {
try? coredataContext.save()
}
}
var highTarget = lowTarget

if units == .mmolL, !viewPercantage {
lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
highTarget = lowTarget
}

let entry = TempTarget(
name: TempTarget.custom,
Expand Down Expand Up @@ -105,17 +103,15 @@ extension AddTempTarget {
return
}
var lowTarget = low
if units == .mmolL {
lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
}
let highTarget = lowTarget

if viewPercantage {
lowTarget = Decimal(round(Double(computeTarget())))
hbt = computeHBT()
saveSettings = true
}
var highTarget = lowTarget

if units == .mmolL, !viewPercantage {
lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
highTarget = lowTarget
}

let entry = TempTarget(
name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
Expand Down Expand Up @@ -196,30 +192,17 @@ extension AddTempTarget {
return Decimal(Double(target))
}

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

if ratio > maxValue {
ratio = maxValue
}

let adjustedPercentage = ratio * 100
let roundedPercentage = (adjustedPercentage as NSDecimalNumber).rounding(accordingToBehavior: nil)
return roundedPercentage as Decimal
}

func updatePreset(_ preset: TempTarget) {
var lowTarget = low

if viewPercantage {
lowTarget = Decimal(round(Double(computeTarget())))
}

if units == .mmolL, !viewPercantage {
lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
}

if viewPercantage {
hbt = computeHBT()
}

let updatedPreset = TempTarget(
id: preset.id,
name: newPresetName.isEmpty ? preset.name : newPresetName,
Expand All @@ -236,5 +219,31 @@ extension AddTempTarget {
storage.storePresets(presets)
}
}

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

if ratio > maxValue {
ratio = maxValue
}

let adjustedPercentage = ratio * 100
let roundedPercentage = (adjustedPercentage as NSDecimalNumber).rounding(accordingToBehavior: nil)
return roundedPercentage as Decimal
}

func computeHBT() -> Double {
let ratio = Decimal(percentage / 100)
let normalTarget: Decimal = 100
var target: Decimal = low
if units == .mmolL {
target = target.asMgdL }
var hbtcalc = Decimal(hbt)
if ratio != 1 {
hbtcalc = ((2 * ratio * normalTarget) - normalTarget - (ratio * target)) / (ratio - 1)
}
return round(Double(hbtcalc))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,58 +127,73 @@ extension AddTempTarget {

@ViewBuilder func settingsSection(header: String) -> some View {
HStack {
Text("Experimental")
Text("Advanced TT")
Toggle(isOn: $state.viewPercantage) {}
.controlSize(.mini)
.onChange(of: state.viewPercantage) { newValue in
if newValue {
guard let selectedPreset = selectedPreset,
let targetBottom = selectedPreset.targetBottom else { return }
let computedPercentage = state.computePercentage(target: targetBottom)
state.percentage = Double(truncating: computedPercentage as NSNumber)
state.hbt = isEnabledArray.first?
.hbt ??
160 // how to get hbt from previously saved preset? this takes the last enacted temptarget hbt?
state
.percentage =
Double(truncating: computedPercentage as NSNumber) // now I guess state.percentage needs to become whatever I do on slider
}
}
Image(systemName: "figure.highintensity.intervaltraining")
Image(systemName: "fork.knife")
}

if state.viewPercantage {
Section {
Section(
header: Text("TT Effect on Insulin")
) {
VStack {
Text("\(state.percentage.formatted(.number)) % Insulin")
.foregroundColor(isEditing ? .orange : .blue)
.font(.largeTitle)
.padding(.vertical)
Slider(
value: $state.percentage,
in: 15 ...
min(Double(state.maxValue * 100), 200),
step: 1,
onEditingChanged: { editing in
isEditing = editing
}
)
HStack {}
// Only display target slider when not 100 %
if state.percentage != 100 {
HStack {
Text(NSLocalizedString("Target", comment: ""))
Spacer()
DecimalTextField(
"0",
value: $state.low,
formatter: formatter,
cleanInput: true
)
Text(state.units.rawValue).foregroundColor(.secondary)
}

if computeSliderLow() != computeSliderHigh() {
Text("\(state.percentage.formatted(.number)) % Insulin")
.foregroundColor(isEditing ? .orange : .blue)
.font(.largeTitle)
Slider(
value: $state.percentage,
in: computeSliderLow() ... computeSliderHigh(),
step: 5
) {}
minimumValueLabel: { Text("\(computeSliderLow(), specifier: "%.0f")%") }
maximumValueLabel: { Text("\(computeSliderHigh(), specifier: "%.0f")%") }
onEditingChanged: { editing in
isEditing = editing }
Divider()
Text(
(
state
.units == .mmolL ?
"\(state.computeTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L" :
"\(state.computeTarget().formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) mg/dl"
)
+ NSLocalizedString(" Target Glucose", comment: "")
state
.units == .mgdL ?
"Half Basal Exercise Target at: \(state.computeHBT().formatted(.number)) mg/dl" :
"Half Basal Exercise Target at: \(state.computeHBT().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
)
.foregroundColor(.green)
.padding(.vertical)
Slider(
value: $state.hbt,
in: 101 ... 295,
step: 1
).accentColor(.green)
.foregroundColor(.secondary)
.font(.caption).italic()
} else {
Text(
"You have not enabled the proper Preferences to change sensitivity with chosen TempTarget. Verify Autosens Max > 1 & lowTT lowers Sens is on for lowTT's. For high TTs check highTT raises Sens is on (or Exercise Mode)!"
)
// .foregroundColor(.loopRed)
.font(.caption).italic()
.fixedSize(horizontal: false, vertical: true)
.multilineTextAlignment(.leading)
}
}
}
Expand Down Expand Up @@ -238,7 +253,9 @@ extension AddTempTarget {
.onAppear {
guard let selectedPreset = selectedPreset, let targetBottom = selectedPreset.targetBottom else { return }
let computedPercentage = state.computePercentage(target: targetBottom)
state.percentage = Double(truncating: computedPercentage as NSNumber)
state
.percentage =
Double(truncating: computedPercentage as NSNumber) // I guess this needs to come directly from the slider
}
.onDisappear {
if isEditSheetPresented == false {
Expand Down Expand Up @@ -296,5 +313,30 @@ extension AddTempTarget {
state.enactPreset(id: preset.id)
}
}
} }
}

func computeSliderLow() -> Double {
var minSens: Double = 15
var target = state.low
if state.units == .mmolL {
target = Decimal(round(Double(state.low.asMgdL))) }
if target == 0 { return minSens }
if target < 100 ||
(
!state.settingsManager.preferences.highTemptargetRaisesSensitivity && !state.settingsManager.preferences
.exerciseMode
) { minSens = 100 }
return minSens
}

func computeSliderHigh() -> Double {
var maxSens = Double(state.maxValue * 100)
var target = state.low
if target == 0 { return maxSens }
if state.units == .mmolL {
target = Decimal(round(Double(state.low.asMgdL))) }
if target > 100 || !state.settingsManager.preferences.lowTemptargetLowersSensitivity { maxSens = 100 }
return maxSens
}
}
}