polscm32 aka Marvout 1 yıl önce
ebeveyn
işleme
fe4652d404

+ 2 - 4
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -500,16 +500,14 @@ final class OpenAPS {
             if isTemptargetActive {
                 if let tempTarget = tempTargetsArray.first {
                     let tempDuration = tempTarget.duration?.doubleValue ?? 0
-                    let targetValue = tempTarget.target?.doubleValue ?? Double(truncating: hbt_ as NSNumber)
+                    let halfBasalTarget = tempTarget.halfBasalTarget ?? NSDecimalNumber(decimal: hbt_)
                     let startDate = tempTarget.date ?? Date()
                     let tempTargetEndTime = startDate.addingTimeInterval(tempDuration * 60)
                     let timeRemaining = tempTargetEndTime.timeIntervalSinceNow / 60 // Time remaining in minutes
 
                     if timeRemaining > 0 {
-                        hbt_ = Decimal(targetValue)
+                        hbt_ = halfBasalTarget.decimalValue
                         isTemptargetActive = true
-                    } else {
-                        isTemptargetActive = false
                     }
                 }
             }

+ 2 - 0
FreeAPS/Sources/APS/Storage/TempTargetsStorage.swift

@@ -78,6 +78,7 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
             newTempTarget.name = tempTarget.name
             newTempTarget.target = NSDecimalNumber(decimal: tempTarget.targetTop ?? 0)
             newTempTarget.isPreset = tempTarget.isPreset ?? false
+            newTempTarget.halfBasalTarget = NSDecimalNumber(decimal: tempTarget.halfBasalTarget ?? 160)
 
             do {
                 guard self.backgroundContext.hasChanges else { return }
@@ -140,6 +141,7 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
         newTempTarget.name = tempTarget.name
         newTempTarget.target = tempTarget.target
         newTempTarget.isPreset = false // no Preset
+        newTempTarget.halfBasalTarget = tempTarget.halfBasalTarget
 
         await viewContext.perform {
             do {

+ 4 - 1
FreeAPS/Sources/Models/TempTarget.swift

@@ -11,6 +11,7 @@ struct TempTarget: JSON, Identifiable, Equatable, Hashable {
     let reason: String?
     let isPreset: Bool?
     let enabled: Bool?
+    let halfBasalTarget: Decimal?
 
     static let manual = "Trio"
     static let custom = "Temp target"
@@ -38,7 +39,8 @@ struct TempTarget: JSON, Identifiable, Equatable, Hashable {
             enteredBy: TempTarget.manual,
             reason: TempTarget.cancel,
             isPreset: nil,
-            enabled: nil
+            enabled: nil,
+            halfBasalTarget: 160
         )
     }
 }
@@ -55,5 +57,6 @@ extension TempTarget {
         case reason
         case isPreset
         case enabled
+        case halfBasalTarget
     }
 }

+ 1 - 1
FreeAPS/Sources/Modules/Home/View/Chart/TempTargets.swift

@@ -18,7 +18,7 @@ extension MainChartView {
                 xEnd: .value("End", target.end),
                 y: .value("Value", targetLimited)
             )
-            .foregroundStyle(Color.purple.opacity(0.75)).lineStyle(.init(lineWidth: 8))
+            .foregroundStyle(Color.green.opacity(0.75)).lineStyle(.init(lineWidth: 8))
         }
     }
 

+ 18 - 14
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -51,10 +51,10 @@ extension OverrideConfig {
         @Published var date = Date()
         @Published var newPresetName = ""
         @Published var tempTargetPresets: [TempTargetStored] = []
-        @Published var percentageTT = 100.0
+        @Published var percentage = 100.0
         @Published var maxValue: Decimal = 1.2
         @Published var viewPercantage = false
-        @Published var hbt: Double = 160
+        @Published var halfBasalTarget: Decimal = 160
         @Published var didSaveSettings: Bool = false
 
         let coredataContext = CoreDataStack.shared.newTaskContext()
@@ -535,7 +535,8 @@ extension OverrideConfig.StateModel {
             enteredBy: TempTarget.manual,
             reason: TempTarget.custom,
             isPreset: false,
-            enabled: true
+            enabled: true,
+            halfBasalTarget: halfBasalTarget
         )
 
         // Save Temp Target to Core Data and to the storage
@@ -562,7 +563,8 @@ extension OverrideConfig.StateModel {
             enteredBy: TempTarget.manual,
             reason: TempTarget.custom,
             isPreset: true,
-            enabled: false
+            enabled: false,
+            halfBasalTarget: halfBasalTarget
         )
 
         await tempTargetStorage.storeTempTarget(tempTarget: tempTarget)
@@ -612,7 +614,8 @@ extension OverrideConfig.StateModel {
                 enteredBy: TempTarget.manual,
                 reason: TempTarget.custom,
                 isPreset: true,
-                enabled: true
+                enabled: true,
+                halfBasalTarget: halfBasalTarget
             )
 
             // Make sure the Temp Target gets used by Oref
@@ -723,16 +726,17 @@ extension OverrideConfig.StateModel {
         tempTargetDuration = 0
     }
 
-    func computeTarget() -> Decimal {
-        var ratio = Decimal(percentageTT / 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
+    func computeHalfBasalTarget() -> Double {
+        let ratio = Decimal(percentage / 100)
+        let normalTarget: Decimal = 100
+        var target: Decimal = low
+        if units == .mmolL {
+            target = target.asMgdL }
+        var hbtcalc = halfBasalTarget
+        if ratio != 1 {
+            hbtcalc = ((2 * ratio * normalTarget) - normalTarget - (ratio * target)) / (ratio - 1)
         }
-        return Decimal(Double(target))
+        return round(Double(hbtcalc))
     }
 }
 

+ 57 - 0
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -9,6 +9,7 @@ struct AddTempTargetForm: View {
     @State private var showAlert = false
     @State private var showPresetAlert = false
     @State private var alertString = ""
+    @State private var isUsingSlider = false
 
     var color: LinearGradient {
         colorScheme == .dark ? LinearGradient(
@@ -86,6 +87,38 @@ struct AddTempTargetForm: View {
         }.listRowBackground(Color.chart)
 
         Section {
+            VStack {
+                Text("\(state.percentage.formatted(.number)) % Insulin")
+                    .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                    .font(.largeTitle)
+
+                Slider(value: $state.percentage, in: computeSliderLow() ... computeSliderHigh(), step: 5) {}
+                minimumValueLabel: {
+                    Text("\(computeSliderLow(), specifier: "%.0f")%")
+                }
+                maximumValueLabel: {
+                    Text("\(computeSliderHigh(), specifier: "%.0f")%")
+                }
+                onEditingChanged: { editing in
+                    isUsingSlider = editing
+                    state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
+                }
+
+                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 {
             HStack {
                 Text("Target")
                 Spacer()
@@ -151,4 +184,28 @@ struct AddTempTargetForm: View {
                 comment: ""
             )
     }
+
+    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
+    }
 }

+ 2 - 1
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -448,7 +448,8 @@ extension BaseWatchManager: WCSessionDelegate {
                         enteredBy: TempTarget.manual,
                         reason: TempTarget.cancel,
                         isPreset: false,
-                        enabled: false
+                        enabled: false,
+                        halfBasalTarget: 160
                     )
                     await tempTargetsStorage.storeTempTarget(tempTarget: entry)
                     replyHandler(["confirmation": true])

+ 2 - 1
Model/TrioCoreDataPersistentContainer.xcdatamodeld/TrioCoreDataPersistentContainer.xcdatamodel/contents

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22222" systemVersion="22G120" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23222.3" systemVersion="23G93" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
     <entity name="BolusStored" representedClassName="BolusStored" syncable="YES">
         <attribute name="amount" optional="YES" attributeType="Decimal" defaultValueString="0"/>
         <attribute name="isExternal" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
@@ -201,6 +201,7 @@
         <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
+        <attribute name="halfBasalTarget" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
         <attribute name="isPreset" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
         <attribute name="isUploadedToNS" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>

+ 1 - 0
TempTargetStored+CoreDataProperties.swift

@@ -14,6 +14,7 @@ public extension TempTargetStored {
     @NSManaged var name: String?
     @NSManaged var isUploadedToNS: Bool
     @NSManaged var isPreset: Bool
+    @NSManaged var halfBasalTarget: NSDecimalNumber?
     @NSManaged var tempTargetRun: TempTargetRunStored?
 }