Просмотр исходного кода

Override Profile Target Glucose

Jon Mårtensson 3 лет назад
Родитель
Сommit
e105fb55c8

+ 1 - 0
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -52,6 +52,7 @@
         <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
         <attribute name="indefinite" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
         <attribute name="percentage" optional="YES" attributeType="Double" defaultValueString="100" usesScalarValueType="YES"/>
+        <attribute name="target" optional="YES" attributeType="Decimal" defaultValueString="100"/>
     </entity>
     <entity name="Presets" representedClassName="Presets" syncable="YES" codeGenerationType="class">
         <attribute name="carbs" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
FreeAPS/Resources/javascript/bundle/determine-basal.js


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

@@ -187,9 +187,11 @@ final class OpenAPS {
 
             var duration: Decimal = 0
             var newDuration: Decimal = 0
+            var overrideTarget: Decimal = 0
 
             if useOverride {
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
+                overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
                 let addedMinutes = Int(duration)
                 let date = overrideArray.first?.date ?? Date()
                 if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
@@ -210,6 +212,7 @@ final class OpenAPS {
                     saveToCoreData.duration = 0
                     saveToCoreData.indefinite = true
                     saveToCoreData.percentage = Double(overridePercentage)
+                    saveToCoreData.target = overrideTarget as NSDecimalNumber
                     try? self.coredataContext.save()
                 } else {
                     newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
@@ -219,6 +222,7 @@ final class OpenAPS {
                     saveToCoreData.duration = newDuration as NSDecimalNumber
                     saveToCoreData.indefinite = false
                     saveToCoreData.percentage = Double(overridePercentage)
+                    saveToCoreData.target = overrideTarget as NSDecimalNumber
                     try? self.coredataContext.save()
                 }
             }
@@ -233,6 +237,7 @@ final class OpenAPS {
                 unlimited = true
                 overridePercentage = 100
                 duration = 0
+                overrideTarget = 0
             }
 
             if temptargetActive /* || isPercentageEnabled */ {
@@ -269,7 +274,8 @@ final class OpenAPS {
                     useOverride: useOverride,
                     duration: duration,
                     unlimited: unlimited,
-                    hbt: hbt_
+                    hbt: hbt_,
+                    overrideTarget: overrideTarget
                 )
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 print("Test time for oref2_variables: \(-now.timeIntervalSinceNow) seconds")
@@ -287,7 +293,8 @@ final class OpenAPS {
                     useOverride: useOverride,
                     duration: duration,
                     unlimited: unlimited,
-                    hbt: hbt_
+                    hbt: hbt_,
+                    overrideTarget: overrideTarget
                 )
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 return self.loadFileFromStorage(name: Monitor.oref2_variables)

+ 5 - 1
FreeAPS/Sources/Models/Oref2_variables.swift

@@ -12,6 +12,7 @@ struct Oref2_variables: JSON, Equatable {
     var duration: Decimal
     var unlimited: Bool
     var hbt: Decimal
+    var overrideTarget: Decimal
 
     init(
         average_total_data: Decimal,
@@ -24,7 +25,8 @@ struct Oref2_variables: JSON, Equatable {
         useOverride: Bool,
         duration: Decimal,
         unlimited: Bool,
-        hbt: Decimal
+        hbt: Decimal,
+        overrideTarget: Decimal
     ) {
         self.average_total_data = average_total_data
         self.weightedAverage = weightedAverage
@@ -37,6 +39,7 @@ struct Oref2_variables: JSON, Equatable {
         self.duration = duration
         self.unlimited = unlimited
         self.hbt = hbt
+        self.overrideTarget = overrideTarget
     }
 }
 
@@ -53,5 +56,6 @@ extension Oref2_variables {
         case duration
         case unlimited
         case hbt
+        case overrideTarget
     }
 }

+ 18 - 1
FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift

@@ -7,17 +7,27 @@ extension OverrideProfilesConfig {
         @Published var isEnabled = false
         @Published var _indefinite = true
         @Published var duration: Decimal = 0
+        @Published var target: Decimal = 0
+        @Published var override_target: Bool = false
+
+        var units: GlucoseUnits = .mmolL
+
+        override func subscribe() {
+            let units = settingsManager.settings.units
+            self.units = units
+        }
 
         let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
 
         func saveSettings() {
-            coredataContext.perform {
+            coredataContext.perform { [self] in
                 let saveOverride = Override(context: self.coredataContext)
                 saveOverride.duration = self.duration as NSDecimalNumber
                 saveOverride.indefinite = self._indefinite
                 saveOverride.percentage = self.percentage
                 saveOverride.enabled = self.isEnabled
                 saveOverride.date = Date()
+                saveOverride.target = units == .mmolL ? target.asMgdL as NSDecimalNumber : target as NSDecimalNumber
                 try? self.coredataContext.save()
             }
         }
@@ -34,6 +44,7 @@ extension OverrideProfilesConfig {
                 percentage = overrideArray.first?.percentage ?? 100
                 _indefinite = overrideArray.first?.indefinite ?? true
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
+                let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
 
                 var newDuration = Double(duration)
                 if isEnabled {
@@ -44,6 +55,10 @@ extension OverrideProfilesConfig {
                         isEnabled = false
                     }
                     newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
+                    if (overrideArray.first?.target ?? 0) != 0 {
+                        override_target = true
+                        target = units == .mgdL ? overrideTarget : overrideTarget.asMmolL
+                    }
                 }
 
                 if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
@@ -52,6 +67,8 @@ extension OverrideProfilesConfig {
                     _indefinite = true
                     percentage = 100
                     duration = 0
+                    target = 0
+                    override_target = false
                 }
             }
         }

+ 36 - 4
FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift

@@ -11,6 +11,7 @@ extension OverrideProfilesConfig {
         @State private var showAlert = false
         @State private var showingDetail = false
         @State private var isPresented = true
+        @State private var alertSring = ""
         @Environment(\.dismiss) var dismiss
 
         private var formatter: NumberFormatter {
@@ -20,10 +21,21 @@ extension OverrideProfilesConfig {
             return formatter
         }
 
+        private var glucoseFormatter: NumberFormatter {
+            let formatter = NumberFormatter()
+            formatter.numberStyle = .decimal
+            formatter.maximumFractionDigits = 0
+            if state.units == .mmolL {
+                formatter.maximumFractionDigits = 1
+            }
+            formatter.roundingMode = .halfUp
+            return formatter
+        }
+
         var body: some View {
             Form {
                 Section(
-                    header: Text("Override your Basal, ISF and CR profiles"),
+                    header: Text("Override your Basal, ISF, CR and Target profiles"),
                     footer: Text("" + (!state.isEnabled ? "Currently no Override active" : ""))
                 ) {
                     Toggle(isOn: $state.isEnabled) {
@@ -72,8 +84,30 @@ extension OverrideProfilesConfig {
                                 Text("minutes").foregroundColor(.secondary)
                             }
                         }
+
+                        HStack {
+                            Toggle(isOn: $state.override_target) {
+                                Text("Override Profile Target")
+                            }
+                        }
+                        if state.override_target {
+                            HStack {
+                                Text("Target Glucose")
+                                DecimalTextField("0", value: $state.target, formatter: glucoseFormatter, cleanInput: false)
+                                Text(state.units.rawValue).foregroundColor(.secondary)
+                            }
+                        }
+
                         Button("Save") {
                             showAlert.toggle()
+
+                            alertSring = "Selected Override:\n\n\(state.percentage.formatted(.number)) %, " +
+                                (state.duration > 0 ? "\(state.duration) min" : " infinite duration.") +
+                                (state.target == 0 ? "" : (" Target: \(state.target) " + state.units.rawValue + "."))
+                                +
+                                "\n\n"
+                                +
+                                "Saving this override will change your basal insulin, ISF, CR and eventual Target Glucose during the entire selected duration. Tapping save will start your new overide or edit your current active override."
                         }
                         .disabled(
                             state.isEnabled == false || state
@@ -85,9 +119,7 @@ extension OverrideProfilesConfig {
                         .frame(maxWidth: .infinity, alignment: .center)
                         .controlSize(.mini)
                         .alert(
-                            "Selected Override:\n\n\(state.percentage.formatted(.number)) %, " +
-                                (state.duration > 0 ? "\(state.duration) min" : " infinite duration.") + "\n\n" +
-                                "Saving this override will change your basal insulin, ISF and CR during the entire selected duration. Tapping save will start your new overide or edit your current active override.",
+                            alertSring,
                             isPresented: $showAlert,
                             actions: {
                                 Button("Cancel", role: .cancel) {}