Преглед изворни кода

Override Profile Target Glucose

Jon Mårtensson пре 3 година
родитељ
комит
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="enabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
         <attribute name="indefinite" 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="percentage" optional="YES" attributeType="Double" defaultValueString="100" usesScalarValueType="YES"/>
+        <attribute name="target" optional="YES" attributeType="Decimal" defaultValueString="100"/>
     </entity>
     </entity>
     <entity name="Presets" representedClassName="Presets" syncable="YES" codeGenerationType="class">
     <entity name="Presets" representedClassName="Presets" syncable="YES" codeGenerationType="class">
         <attribute name="carbs" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <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 duration: Decimal = 0
             var newDuration: Decimal = 0
             var newDuration: Decimal = 0
+            var overrideTarget: Decimal = 0
 
 
             if useOverride {
             if useOverride {
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
+                overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
                 let addedMinutes = Int(duration)
                 let addedMinutes = Int(duration)
                 let date = overrideArray.first?.date ?? Date()
                 let date = overrideArray.first?.date ?? Date()
                 if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
                 if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
@@ -210,6 +212,7 @@ final class OpenAPS {
                     saveToCoreData.duration = 0
                     saveToCoreData.duration = 0
                     saveToCoreData.indefinite = true
                     saveToCoreData.indefinite = true
                     saveToCoreData.percentage = Double(overridePercentage)
                     saveToCoreData.percentage = Double(overridePercentage)
+                    saveToCoreData.target = overrideTarget as NSDecimalNumber
                     try? self.coredataContext.save()
                     try? self.coredataContext.save()
                 } else {
                 } else {
                     newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
                     newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
@@ -219,6 +222,7 @@ final class OpenAPS {
                     saveToCoreData.duration = newDuration as NSDecimalNumber
                     saveToCoreData.duration = newDuration as NSDecimalNumber
                     saveToCoreData.indefinite = false
                     saveToCoreData.indefinite = false
                     saveToCoreData.percentage = Double(overridePercentage)
                     saveToCoreData.percentage = Double(overridePercentage)
+                    saveToCoreData.target = overrideTarget as NSDecimalNumber
                     try? self.coredataContext.save()
                     try? self.coredataContext.save()
                 }
                 }
             }
             }
@@ -233,6 +237,7 @@ final class OpenAPS {
                 unlimited = true
                 unlimited = true
                 overridePercentage = 100
                 overridePercentage = 100
                 duration = 0
                 duration = 0
+                overrideTarget = 0
             }
             }
 
 
             if temptargetActive /* || isPercentageEnabled */ {
             if temptargetActive /* || isPercentageEnabled */ {
@@ -269,7 +274,8 @@ final class OpenAPS {
                     useOverride: useOverride,
                     useOverride: useOverride,
                     duration: duration,
                     duration: duration,
                     unlimited: unlimited,
                     unlimited: unlimited,
-                    hbt: hbt_
+                    hbt: hbt_,
+                    overrideTarget: overrideTarget
                 )
                 )
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 print("Test time for oref2_variables: \(-now.timeIntervalSinceNow) seconds")
                 print("Test time for oref2_variables: \(-now.timeIntervalSinceNow) seconds")
@@ -287,7 +293,8 @@ final class OpenAPS {
                     useOverride: useOverride,
                     useOverride: useOverride,
                     duration: duration,
                     duration: duration,
                     unlimited: unlimited,
                     unlimited: unlimited,
-                    hbt: hbt_
+                    hbt: hbt_,
+                    overrideTarget: overrideTarget
                 )
                 )
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
                 return self.loadFileFromStorage(name: 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 duration: Decimal
     var unlimited: Bool
     var unlimited: Bool
     var hbt: Decimal
     var hbt: Decimal
+    var overrideTarget: Decimal
 
 
     init(
     init(
         average_total_data: Decimal,
         average_total_data: Decimal,
@@ -24,7 +25,8 @@ struct Oref2_variables: JSON, Equatable {
         useOverride: Bool,
         useOverride: Bool,
         duration: Decimal,
         duration: Decimal,
         unlimited: Bool,
         unlimited: Bool,
-        hbt: Decimal
+        hbt: Decimal,
+        overrideTarget: Decimal
     ) {
     ) {
         self.average_total_data = average_total_data
         self.average_total_data = average_total_data
         self.weightedAverage = weightedAverage
         self.weightedAverage = weightedAverage
@@ -37,6 +39,7 @@ struct Oref2_variables: JSON, Equatable {
         self.duration = duration
         self.duration = duration
         self.unlimited = unlimited
         self.unlimited = unlimited
         self.hbt = hbt
         self.hbt = hbt
+        self.overrideTarget = overrideTarget
     }
     }
 }
 }
 
 
@@ -53,5 +56,6 @@ extension Oref2_variables {
         case duration
         case duration
         case unlimited
         case unlimited
         case hbt
         case hbt
+        case overrideTarget
     }
     }
 }
 }

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

@@ -7,17 +7,27 @@ extension OverrideProfilesConfig {
         @Published var isEnabled = false
         @Published var isEnabled = false
         @Published var _indefinite = true
         @Published var _indefinite = true
         @Published var duration: Decimal = 0
         @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
         let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
 
 
         func saveSettings() {
         func saveSettings() {
-            coredataContext.perform {
+            coredataContext.perform { [self] in
                 let saveOverride = Override(context: self.coredataContext)
                 let saveOverride = Override(context: self.coredataContext)
                 saveOverride.duration = self.duration as NSDecimalNumber
                 saveOverride.duration = self.duration as NSDecimalNumber
                 saveOverride.indefinite = self._indefinite
                 saveOverride.indefinite = self._indefinite
                 saveOverride.percentage = self.percentage
                 saveOverride.percentage = self.percentage
                 saveOverride.enabled = self.isEnabled
                 saveOverride.enabled = self.isEnabled
                 saveOverride.date = Date()
                 saveOverride.date = Date()
+                saveOverride.target = units == .mmolL ? target.asMgdL as NSDecimalNumber : target as NSDecimalNumber
                 try? self.coredataContext.save()
                 try? self.coredataContext.save()
             }
             }
         }
         }
@@ -34,6 +44,7 @@ extension OverrideProfilesConfig {
                 percentage = overrideArray.first?.percentage ?? 100
                 percentage = overrideArray.first?.percentage ?? 100
                 _indefinite = overrideArray.first?.indefinite ?? true
                 _indefinite = overrideArray.first?.indefinite ?? true
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
                 duration = (overrideArray.first?.duration ?? 0) as Decimal
+                let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
 
 
                 var newDuration = Double(duration)
                 var newDuration = Double(duration)
                 if isEnabled {
                 if isEnabled {
@@ -44,6 +55,10 @@ extension OverrideProfilesConfig {
                         isEnabled = false
                         isEnabled = false
                     }
                     }
                     newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
                     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) }
                 if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
@@ -52,6 +67,8 @@ extension OverrideProfilesConfig {
                     _indefinite = true
                     _indefinite = true
                     percentage = 100
                     percentage = 100
                     duration = 0
                     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 showAlert = false
         @State private var showingDetail = false
         @State private var showingDetail = false
         @State private var isPresented = true
         @State private var isPresented = true
+        @State private var alertSring = ""
         @Environment(\.dismiss) var dismiss
         @Environment(\.dismiss) var dismiss
 
 
         private var formatter: NumberFormatter {
         private var formatter: NumberFormatter {
@@ -20,10 +21,21 @@ extension OverrideProfilesConfig {
             return formatter
             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 {
         var body: some View {
             Form {
             Form {
                 Section(
                 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" : ""))
                     footer: Text("" + (!state.isEnabled ? "Currently no Override active" : ""))
                 ) {
                 ) {
                     Toggle(isOn: $state.isEnabled) {
                     Toggle(isOn: $state.isEnabled) {
@@ -72,8 +84,30 @@ extension OverrideProfilesConfig {
                                 Text("minutes").foregroundColor(.secondary)
                                 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") {
                         Button("Save") {
                             showAlert.toggle()
                             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(
                         .disabled(
                             state.isEnabled == false || state
                             state.isEnabled == false || state
@@ -85,9 +119,7 @@ extension OverrideProfilesConfig {
                         .frame(maxWidth: .infinity, alignment: .center)
                         .frame(maxWidth: .infinity, alignment: .center)
                         .controlSize(.mini)
                         .controlSize(.mini)
                         .alert(
                         .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,
                             isPresented: $showAlert,
                             actions: {
                             actions: {
                                 Button("Cancel", role: .cancel) {}
                                 Button("Cancel", role: .cancel) {}