فهرست منبع

Fix Edit View WiP.., fix calculation, bring back normal Profile View

polscm32 1 سال پیش
والد
کامیت
a1e64cdd74

+ 1 - 1
FreeAPS/Sources/APS/Storage/OverrideStorage.swift

@@ -14,7 +14,7 @@ protocol OverrideStorage {
     func getOverrideRunsNotYetUploadedToNightscout() async -> [NightscoutExercise]
     func getOverrideRunsNotYetUploadedToNightscout() async -> [NightscoutExercise]
 }
 }
 
 
-final class BaseOverrideStorage: @preconcurrency OverrideStorage, Injectable {
+final class BaseOverrideStorage: OverrideStorage, Injectable {
     @Injected() private var settingsManager: SettingsManager!
     @Injected() private var settingsManager: SettingsManager!
 
 
     private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
     private let viewContext = CoreDataStack.shared.persistentContainer.viewContext

+ 1 - 3
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -761,9 +761,7 @@ extension Home {
                     if let progress = state.bolusProgress {
                     if let progress = state.bolusProgress {
                         bolusView(geo: geo, progress).padding(.bottom, UIDevice.adjustPadding(min: nil, max: 40))
                         bolusView(geo: geo, progress).padding(.bottom, UIDevice.adjustPadding(min: nil, max: 40))
                     } else {
                     } else {
-                        if overrideString != nil || tempTargetString != nil { // kills the Normal Profile View
-                            profileView(geo: geo).padding(.bottom, UIDevice.adjustPadding(min: nil, max: 40))
-                        }
+                        profileView(geo: geo).padding(.bottom, UIDevice.adjustPadding(min: nil, max: 40))
                     }
                     }
                 }
                 }
                 .background(color)
                 .background(color)

+ 7 - 1
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -51,6 +51,7 @@ extension OverrideConfig {
         @Published var tempTargetPresets: [TempTargetStored] = []
         @Published var tempTargetPresets: [TempTargetStored] = []
         @Published var percentage = 100.0
         @Published var percentage = 100.0
         @Published var maxValue: Decimal = 1.2
         @Published var maxValue: Decimal = 1.2
+        @Published var minValue: Decimal = 0.15
         @Published var viewPercantage = false
         @Published var viewPercantage = false
         @Published var halfBasalTarget: Decimal = 160
         @Published var halfBasalTarget: Decimal = 160
         @Published var didSaveSettings: Bool = false
         @Published var didSaveSettings: Bool = false
@@ -74,6 +75,7 @@ extension OverrideConfig {
             updateLatestOverrideConfiguration()
             updateLatestOverrideConfiguration()
             updateLatestTempTargetConfiguration()
             updateLatestTempTargetConfiguration()
             maxValue = settingsManager.preferences.autosensMax
             maxValue = settingsManager.preferences.autosensMax
+            minValue = settingsManager.preferences.autosensMin
             broadcaster.register(SettingsObserver.self, observer: self)
             broadcaster.register(SettingsObserver.self, observer: self)
         }
         }
 
 
@@ -723,6 +725,8 @@ extension OverrideConfig.StateModel {
         tempTargetName = ""
         tempTargetName = ""
         tempTargetTarget = 0
         tempTargetTarget = 0
         tempTargetDuration = 0
         tempTargetDuration = 0
+        percentage = 100
+        halfBasalTarget = 160
     }
     }
 
 
     func computeHalfBasalTarget() -> Double {
     func computeHalfBasalTarget() -> Double {
@@ -739,7 +743,7 @@ extension OverrideConfig.StateModel {
     }
     }
 
 
     func computeSliderLow() -> Double {
     func computeSliderLow() -> Double {
-        var minSens: Double = 15
+        var minSens = Double(minValue * 100)
         var target = tempTargetTarget
         var target = tempTargetTarget
         if units == .mmolL {
         if units == .mmolL {
             target = Decimal(round(Double(tempTargetTarget.asMgdL))) }
             target = Decimal(round(Double(tempTargetTarget.asMgdL))) }
@@ -749,6 +753,7 @@ extension OverrideConfig.StateModel {
                 !settingsManager.preferences.highTemptargetRaisesSensitivity && !settingsManager.preferences
                 !settingsManager.preferences.highTemptargetRaisesSensitivity && !settingsManager.preferences
                     .exerciseMode
                     .exerciseMode
             ) { minSens = 100 }
             ) { minSens = 100 }
+        minSens = max(0, minSens)
         return minSens
         return minSens
     }
     }
 
 
@@ -769,5 +774,6 @@ extension OverrideConfig.StateModel: SettingsObserver {
         defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes
         defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes
         defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
         defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
         maxValue = settingsManager.preferences.autosensMax
         maxValue = settingsManager.preferences.autosensMax
+        minValue = settingsManager.preferences.autosensMin
     }
     }
 }
 }

+ 50 - 35
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -10,6 +10,9 @@ struct AddTempTargetForm: View {
     @State private var showPresetAlert = false
     @State private var showPresetAlert = false
     @State private var alertString = ""
     @State private var alertString = ""
     @State private var isUsingSlider = false
     @State private var isUsingSlider = false
+    @State private var advancedConfiguration = false
+    @State private var didPressSave =
+        false // only used for fixing the Disclaimer showing up after pressing save (after the state was resetted), maybe refactor this...
 
 
     var color: LinearGradient {
     var color: LinearGradient {
         colorScheme == .dark ? LinearGradient(
         colorScheme == .dark ? LinearGradient(
@@ -62,6 +65,7 @@ struct AddTempTargetForm: View {
                         Button("Cancel", role: .cancel) { state.isTempTargetEnabled = false }
                         Button("Cancel", role: .cancel) { state.isTempTargetEnabled = false }
                         Button("Start Temp Target", role: .destructive) {
                         Button("Start Temp Target", role: .destructive) {
                             Task {
                             Task {
+                                didPressSave.toggle()
                                 await setupAlertString()
                                 await setupAlertString()
                                 state.isTempTargetEnabled.toggle()
                                 state.isTempTargetEnabled.toggle()
                                 await state.saveCustomTempTarget()
                                 await state.saveCustomTempTarget()
@@ -86,41 +90,6 @@ struct AddTempTargetForm: View {
             Text("Name")
             Text("Name")
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
 
 
-        if state.computeSliderLow() != state.computeSliderHigh() {
-            Section {
-                VStack {
-                    Text("\(state.percentage.formatted(.number)) % Insulin")
-                        .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
-                        .font(.largeTitle)
-
-                    Slider(value: $state.percentage, in: state.computeSliderLow() ... state.computeSliderHigh(), step: 5) {}
-                    minimumValueLabel: {
-                        Text("\(state.computeSliderLow(), specifier: "%.0f")%")
-                    }
-                    maximumValueLabel: {
-                        Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
-                    }
-                    onEditingChanged: { editing in
-                        isUsingSlider = editing
-                        state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
-                    }
-                    .disabled(!sliderEnabled)
-
-                    Divider()
-                    Text(
-                        state
-                            .units == .mgdL ?
-                            "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().formatted(.number.precision(.fractionLength(0)))) mg/dl" :
-                            "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
-                    )
-                    .foregroundColor(.secondary)
-                    .font(.caption).italic()
-                }
-            } header: {
-                Text("% Insulin")
-            }.listRowBackground(Color.chart)
-        }
-
         Section {
         Section {
             HStack {
             HStack {
                 Text("Target")
                 Text("Target")
@@ -147,6 +116,7 @@ struct AddTempTargetForm: View {
 
 
                 Button {
                 Button {
                     Task {
                     Task {
+                        didPressSave.toggle()
                         await state.saveTempTargetPreset()
                         await state.saveTempTargetPreset()
                         dismiss()
                         dismiss()
                     }
                     }
@@ -161,6 +131,51 @@ struct AddTempTargetForm: View {
         } header: {
         } header: {
             Text("Add Custom Temp Target")
             Text("Add Custom Temp Target")
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
+
+        Toggle("Advanced Configuration", isOn: $advancedConfiguration)
+
+        if advancedConfiguration && state.tempTargetTarget != 0 {
+            if state.computeSliderLow() != state.computeSliderHigh() {
+                Section {
+                    VStack {
+                        Text("\(state.percentage.formatted(.number)) % Insulin")
+                            .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                            .font(.largeTitle)
+
+                        Slider(value: $state.percentage, in: state.computeSliderLow() ... state.computeSliderHigh(), step: 5) {}
+                        minimumValueLabel: {
+                            Text("\(state.computeSliderLow(), specifier: "%.0f")%")
+                        }
+                        maximumValueLabel: {
+                            Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
+                        }
+                        onEditingChanged: { editing in
+                            isUsingSlider = editing
+                            state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
+                        }
+                        .disabled(!sliderEnabled)
+
+                        Divider()
+                        Text(
+                            state
+                                .units == .mgdL ?
+                                "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().formatted(.number.precision(.fractionLength(0)))) mg/dl" :
+                                "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
+                        )
+                        .foregroundColor(.secondary)
+                        .font(.caption).italic()
+                    }
+                }.listRowBackground(Color.chart)
+            }
+        } else if advancedConfiguration && state.tempTargetTarget == 0 && !didPressSave {
+            Section {
+                VStack(alignment: .leading) {
+                    Text(
+                        "You need to input a Target for your Temp Target at first to use the advanced configuration!"
+                    ).bold()
+                }
+            }.listRowBackground(Color.tabBar)
+        }
     }
     }
 
 
     var sliderEnabled: Bool {
     var sliderEnabled: Bool {

+ 67 - 52
FreeAPS/Sources/Modules/OverrideConfig/View/EditTempTargetForm.swift

@@ -28,10 +28,21 @@ struct EditTempTargetForm: View {
         _halfBasalTarget = State(initialValue: tempTargetToEdit.halfBasalTarget?.decimalValue ?? 160)
         _halfBasalTarget = State(initialValue: tempTargetToEdit.halfBasalTarget?.decimalValue ?? 160)
 
 
         let normalTarget: Decimal = 100
         let normalTarget: Decimal = 100
-        if let halfBasal = tempTargetToEdit.halfBasalTarget?.decimalValue {
-            let target = state.units == .mgdL ? state.tempTargetTarget.asMgdL : state.tempTargetTarget
-            let ratio = (halfBasal - normalTarget + (normalTarget * target) / 2) / normalTarget
-            _percentage = State(initialValue: ratio * 100)
+        if let hbt = tempTargetToEdit.halfBasalTarget?.decimalValue {
+            let H = hbt
+            let N: Decimal = normalTarget
+            var T = tempTargetToEdit.target?.decimalValue ?? 0
+            if state.units == .mmolL {
+                T = T.asMgdL
+            }
+
+            let denominator = H - (2 * N) + T
+            if denominator != 0 {
+                let ratio = (H - N) / denominator
+                _percentage = State(initialValue: ratio * 100)
+            } else {
+                _percentage = State(initialValue: 100)
+            }
         } else {
         } else {
             _percentage = State(initialValue: 100)
             _percentage = State(initialValue: 100)
         }
         }
@@ -112,62 +123,66 @@ struct EditTempTargetForm: View {
             Text("Name")
             Text("Name")
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
 
 
-        Section {
-            VStack {
+        if state.computeSliderLow() != state.computeSliderHigh() {
+            Section {
                 VStack {
                 VStack {
-                    Text("\(state.percentage.formatted(.number)) % Insulin")
-                        .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
-                        .font(.largeTitle)
+                    VStack {
+                        Text("\(percentage.formatted(.number.precision(.fractionLength(0)))) % Insulin")
+                            .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                            .font(.largeTitle)
 
 
-                    Slider(value: Binding(
-                        get: {
-                            Double(truncating: percentage as NSNumber) // Decimal in Double umwandeln
-                        },
-                        set: { newValue in
-                            percentage = Decimal(newValue) // Den neuen Slider-Wert speichern
-                            hasChanges = true
+                        Slider(value: Binding(
+                            get: {
+                                Double(truncating: percentage as NSNumber)
+                            },
+                            set: { newValue in
+                                percentage = Decimal(newValue)
+                                hasChanges = true
 
 
-                            // Berechne das halfBasalTarget basierend auf dem neuen percentage-Wert
-                            let ratio = Decimal(Int(percentage) / 100)
-                            let normalTarget: Decimal = 100
-                            var target: Decimal = state.tempTargetTarget
-                            if state.units == .mmolL {
-                                target = target.asMgdL
-                            }
+                                // Calculate the halfBasalTarget based on the new percentage value
+                                let ratio = Decimal(Int(percentage) / 100)
+                                let normalTarget: Decimal = 100
+                                var target: Decimal = target
+                                if state.units == .mmolL {
+                                    target = target.asMgdL
+                                }
 
 
-                            if ratio != 1 {
-                                let hbtcalc = ((2 * ratio * normalTarget) - normalTarget - (ratio * target)) / (ratio - 1)
-                                halfBasalTarget = hbtcalc
-                            } else {
-                                halfBasalTarget = normalTarget
+                                if ratio != 1 {
+                                    let hbtcalc = ((2 * ratio * normalTarget) - normalTarget - (ratio * target)) / (ratio - 1)
+                                    halfBasalTarget = hbtcalc
+                                } else {
+                                    halfBasalTarget = normalTarget
+                                }
                             }
                             }
+                        ), in: Double(state.computeSliderLow()) ... Double(state.computeSliderHigh()), step: 5) {}
+                        minimumValueLabel: {
+                            Text("\(state.computeSliderLow(), specifier: "%.0f")%")
+                        }
+                        maximumValueLabel: {
+                            Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
+                        }
+                        onEditingChanged: { editing in
+                            isUsingSlider = editing
+                            state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
                         }
                         }
-                    ), in: Double(state.computeSliderLow()) ... Double(state.computeSliderHigh()), step: 5) {}
-                    minimumValueLabel: {
-                        Text("\(state.computeSliderLow(), specifier: "%.0f")%")
-                    }
-                    maximumValueLabel: {
-                        Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
-                    }
-                    onEditingChanged: { editing in
-                        isUsingSlider = editing
-                        state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
-                    }
 
 
-                    Divider()
-                    Text(
-                        state
-                            .units == .mgdL ?
-                            "Half Basal Exercise Target at: \(state.halfBasalTarget.formatted(.number.precision(.fractionLength(0)))) mg/dl" :
-                            "Half Basal Exercise Target at: \(state.halfBasalTarget.asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
-                    )
-                    .foregroundColor(.secondary)
-                    .font(.caption).italic()
+                        Divider()
+                        Text(
+                            state
+                                .units == .mgdL ?
+                                "Half Basal Exercise Target at: \(halfBasalTarget.formatted(.number.precision(.fractionLength(0)))) mg/dl" :
+                                "Half Basal Exercise Target at: \(halfBasalTarget.asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
+                        )
+                        .foregroundColor(.secondary)
+                        .font(.caption).italic()
+                    }
                 }
                 }
-            }
-        } header: {
-            Text("% Insulin")
-        }.listRowBackground(Color.chart)
+            } header: {
+                Text("% Insulin")
+            } footer: {
+                Text("The Slider values are limited to your Autosens Min and Max Settings!")
+            }.listRowBackground(Color.chart)
+        }
 
 
         Section {
         Section {
             HStack {
             HStack {

+ 2 - 2
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -156,16 +156,16 @@ extension OverrideConfig {
                     }
                     }
                     .sheet(isPresented: $showTempTargetCreationSheet, onDismiss: {
                     .sheet(isPresented: $showTempTargetCreationSheet, onDismiss: {
                         Task {
                         Task {
-                            await state.resetStateVariables()
                             showTempTargetCreationSheet = false
                             showTempTargetCreationSheet = false
+                            await state.resetStateVariables()
                         }
                         }
                     }) {
                     }) {
                         AddTempTargetForm(state: state)
                         AddTempTargetForm(state: state)
                     }
                     }
                     .sheet(isPresented: $state.showTempTargetEditSheet, onDismiss: {
                     .sheet(isPresented: $state.showTempTargetEditSheet, onDismiss: {
                         Task {
                         Task {
-                            await state.resetTempTargetState()
                             state.showTempTargetEditSheet = false
                             state.showTempTargetEditSheet = false
+                            await state.resetTempTargetState()
                         }
                         }
 
 
                     }) {
                     }) {