Procházet zdrojové kódy

calculate %Insulin for a TempTarget Input as starting Point for Slider

Robert před 1 rokem
rodič
revize
a567337ef6

+ 17 - 2
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -76,6 +76,8 @@ extension OverrideConfig {
             updateLatestTempTargetConfiguration()
             maxValue = settingsManager.preferences.autosensMax
             minValue = settingsManager.preferences.autosensMin
+            halfBasalTarget = settingsManager.preferences.halfBasalExerciseTarget
+            percentage = round(Double(computePercentage() * 100))
             broadcaster.register(SettingsObserver.self, observer: self)
         }
 
@@ -725,8 +727,8 @@ extension OverrideConfig.StateModel {
         tempTargetName = ""
         tempTargetTarget = 0
         tempTargetDuration = 0
-        percentage = 100
-        halfBasalTarget = 160
+        percentage = round(Double(computePercentage() * 100))
+        halfBasalTarget = settingsManager.preferences.halfBasalExerciseTarget
     }
 
     func computeHalfBasalTarget() -> Double {
@@ -766,6 +768,19 @@ extension OverrideConfig.StateModel {
         if target > 100 || !settingsManager.preferences.lowTemptargetLowersSensitivity { maxSens = 100 }
         return maxSens
     }
+
+    func computePercentage() -> Decimal {
+        let c = (halfBasalTarget - 100)
+        let target = tempTargetTarget
+        var ratio: Decimal = 1
+        if c * (c + target - 100) <= 0 {
+            ratio = maxValue
+        } else {
+            ratio = c / (c + target - 100)
+        }
+        ratio = min(ratio, maxValue)
+        return ratio
+    }
 }
 
 extension OverrideConfig.StateModel: SettingsObserver {

+ 14 - 7
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -111,6 +111,10 @@ struct AddTempTargetForm: View {
                     Text("Target")
                     Spacer()
                     TextFieldWithToolBar(text: $state.tempTargetTarget, placeholder: "0", numberFormatter: glucoseFormatter)
+                        .onChange(of: state.tempTargetTarget) { _ in
+                            // Recalculate the percentage when tempTargetTarget changes
+                            state.percentage = Double(state.computePercentage() * 100)
+                        }
                     Text(state.units.rawValue).foregroundColor(.secondary)
                 }
 
@@ -185,18 +189,21 @@ struct AddTempTargetForm: View {
             if sliderEnabled {
                 Section {
                     VStack {
-                        Text("\(state.percentage.formatted(.number)) % Insulin")
+                        // Display the percentage in large text
+                        Text("\(Int(state.percentage)) % Insulin")
                             .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
                             .font(.largeTitle)
 
-                        Slider(value: $state.percentage, in: state.computeSliderLow() ... state.computeSliderHigh(), step: 5) {}
-                        minimumValueLabel: {
+                        // Bind the slider to the percentage
+                        Slider(
+                            value: $state.percentage,
+                            in: state.computeSliderLow() ... state.computeSliderHigh(),
+                            step: 5
+                        ) {} minimumValueLabel: {
                             Text("\(state.computeSliderLow(), specifier: "%.0f")%")
-                        }
-                        maximumValueLabel: {
+                        } maximumValueLabel: {
                             Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
-                        }
-                        onEditingChanged: { editing in
+                        } onEditingChanged: { editing in
                             isUsingSlider = editing
                             state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
                         }