Explorar el Código

Add conditional parset offset handler; refactor ISF and target setting view

Deniz Cengiz hace 1 año
padre
commit
04b2c4970e

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

@@ -849,7 +849,9 @@ extension Home {
             ZStack(alignment: .bottom) {
                 TabView(selection: $selectedTab) {
                     let carbsRequiredBadge: String? = {
-                        guard let carbsRequired = state.enactedAndNonEnactedDeterminations.first?.carbsRequired, state.showCarbsRequiredBadge else {
+                        guard let carbsRequired = state.enactedAndNonEnactedDeterminations.first?.carbsRequired,
+                              state.showCarbsRequiredBadge
+                        else {
                             return nil
                         }
                         let carbsRequiredDecimal = Decimal(carbsRequired)

+ 14 - 33
FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift

@@ -48,10 +48,10 @@ extension ISFEditor {
                         HStack {
                             Text("Calculated Sensitivity")
                             Spacer()
-                            if state.units == .mmolL {
-                                Text(rateFormatter.string(from: autotune.sensitivity.asMmolL as NSNumber) ?? "0")
+                            if state.units == .mgdL {
+                                Text(autotune.sensitivity.description)
                             } else {
-                                Text(rateFormatter.string(from: autotune.sensitivity as NSNumber) ?? "0")
+                                Text(autotune.sensitivity.formattedAsMmolL)
                             }
                             Text(state.units.rawValue + "/U").foregroundColor(.secondary)
                         }
@@ -82,25 +82,14 @@ extension ISFEditor {
                             Spacer()
                             if state.units == .mgdL {
                                 Text(
-                                    rateFormatter
-                                        .string(from: (
-                                            (
-                                                !state.settingsManager.preferences
-                                                    .useNewFormula ? newISF as NSDecimalNumber : dynamicISF
-                                            ) ?? 0
-                                        ) as NSNumber) ?? "0"
+                                    !state.settingsManager.preferences
+                                        .useNewFormula ? newISF.description : (dynamicISF ?? 0).description
                                 )
                             } else {
-                                Text(
-                                    rateFormatter
-                                        .string(from: (
-                                            (
-                                                !state.settingsManager.preferences
-                                                    .useNewFormula ? newISF.asMmolL as NSDecimalNumber as Decimal : dynamicISF?
-                                                    .decimalValue.asMmolL
-                                            ) ?? 0
-                                        ) as NSNumber) ?? "0"
-                                )
+                                Text((
+                                    !state.settingsManager.preferences
+                                        .useNewFormula ? newISF.formattedAsMmolL : dynamicISF?.decimalValue.formattedAsMmolL
+                                ) ?? "0")
                             }
                             Text(state.units.rawValue + "/U").foregroundColor(.secondary)
                         }
@@ -159,13 +148,8 @@ extension ISFEditor {
                     Picker(selection: $state.items[index].rateIndex, label: Text("Rate")) {
                         ForEach(0 ..< state.rateValues.count, id: \.self) { i in
                             Text(
-                                (
-                                    self.rateFormatter
-                                        .string(
-                                            from: state.units == .mgdL ? state.rateValues[i] as NSNumber : state.rateValues[i]
-                                                .asMmolL as NSNumber
-                                        ) ?? ""
-                                ) + " \(state.units.rawValue)/U"
+                                state.units == .mgdL ? state.rateValues[i].description : state.rateValues[i]
+                                    .formattedAsMmolL + " \(state.units.rawValue)/U"
                             ).tag(i)
                         }
                     }
@@ -194,18 +178,15 @@ extension ISFEditor {
         private var list: some View {
             List {
                 ForEach(state.items.indexed(), id: \.1.id) { index, item in
-                    let displayValue = rateFormatter
-                        .string(
-                            from: state.units == .mgdL ? state.rateValues[item.rateIndex] as NSNumber : state
-                                .rateValues[item.rateIndex].asMmolL as NSNumber
-                        )
+                    let displayValue = state.units == .mgdL ? state.rateValues[item.rateIndex].description : state
+                        .rateValues[item.rateIndex].formattedAsMmolL
 
                     NavigationLink(destination: pickers(for: index)) {
                         HStack {
                             Text("Rate").foregroundColor(.secondary)
 
                             Text(
-                                "\(displayValue ?? "0") \(state.units.rawValue)/U"
+                                displayValue + " \(state.units.rawValue)/U"
                             )
                             Spacer()
                             Text("starts at").foregroundColor(.secondary)

+ 15 - 4
FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift

@@ -112,6 +112,10 @@ extension NightscoutConfig {
             return lowTargetValue
         }
 
+        func correctUnitParsingOffsets(_ parsedValue: Decimal) -> Decimal {
+            Int(parsedValue) % 2 == 0 ? parsedValue : parsedValue + 1
+        }
+
         func importSettings() async {
             do {
                 guard let fetchedProfile = await nightscoutManager.importSettings() else {
@@ -122,7 +126,9 @@ extension NightscoutConfig {
                     )
                 }
 
-                let shouldConvertToMgdL = fetchedProfile.units.contains("mmol")
+                // determine whether fetches values are mmol/L or mg/dL values
+                let shouldConvertToMgdL = fetchedProfile.units.contains("mmol") || fetchedProfile.target_low
+                    .contains(where: { $0.value <= 39 }) || fetchedProfile.target_high.contains(where: { $0.value <= 39 })
 
                 // Carb Ratios
                 let carbratios = fetchedProfile.carbratio.map { carbratio in
@@ -174,7 +180,8 @@ extension NightscoutConfig {
                 // Sensitivities
                 let sensitivities = fetchedProfile.sens.map { sensitivity in
                     InsulinSensitivityEntry(
-                        sensitivity: shouldConvertToMgdL ? sensitivity.value.asMgdL : sensitivity.value,
+                        sensitivity: shouldConvertToMgdL ? correctUnitParsingOffsets(sensitivity.value.asMgdL) : sensitivity
+                            .value,
                         offset: offset(sensitivity.time) / 60,
                         start: sensitivity.time
                     )
@@ -194,11 +201,13 @@ extension NightscoutConfig {
                     sensitivities: sensitivities
                 )
 
+                debug(.nightscout, "FETCHED SENSITIVITIES: \(sensitivitiesProfile)")
+
                 // Targets
                 let targets = fetchedProfile.target_low.map { target in
                     BGTargetEntry(
-                        low: shouldConvertToMgdL ? target.value.asMgdL : target.value,
-                        high: shouldConvertToMgdL ? target.value.asMgdL : target.value,
+                        low: shouldConvertToMgdL ? correctUnitParsingOffsets(target.value.asMgdL) : target.value,
+                        high: shouldConvertToMgdL ? correctUnitParsingOffsets(target.value.asMgdL) : target.value,
                         start: target.time,
                         offset: offset(target.time) / 60
                     )
@@ -206,6 +215,8 @@ extension NightscoutConfig {
 
                 let targetsProfile = BGTargets(units: .mgdL, userPreferredUnits: .mgdL, targets: targets)
 
+                debug(.nightscout, "FETCHED TARGETS: \(targetsProfile)")
+
                 // Save to storage and pump
                 if let pump = apsManager.pumpManager {
                     let syncValues = basals.map {

+ 0 - 9
FreeAPS/Sources/Modules/NightscoutConfig/View/NightscoutConfigRootView.swift

@@ -190,15 +190,6 @@ extension NightscoutConfig {
                     sheetTitle: "Help"
                 )
             }
-            .sheet(isPresented: $shouldDisplayHint) {
-                SettingInputHintView(
-                    hintDetent: $hintDetent,
-                    shouldDisplayHint: $shouldDisplayHint,
-                    hintLabel: hintLabel ?? "",
-                    hintText: selectedVerboseHint ?? "",
-                    sheetTitle: "Help"
-                )
-            }
             .navigationBarTitle("Nightscout")
             .navigationBarTitleDisplayMode(.automatic)
             .alert(isPresented: $isImportAlertPresented) {

+ 4 - 18
FreeAPS/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift

@@ -32,12 +32,6 @@ extension TargetsEditor {
             return formatter
         }
 
-        private var rateFormatter: NumberFormatter {
-            let formatter = NumberFormatter()
-            formatter.numberStyle = .decimal
-            return formatter
-        }
-
         var body: some View {
             Form {
                 let shouldDisableButton = state.shouldDisplaySaving || state.items.isEmpty || !state.hasChanges
@@ -96,17 +90,8 @@ extension TargetsEditor {
                         label: Text("Target ")
                     ) {
                         ForEach(0 ..< state.rateValues.count, id: \.self) { i in
-                            Text(
-                                (
-                                    self.rateFormatter
-                                        .string(
-                                            from: state.units == .mgdL ? state.rateValues[i] as NSNumber : state.rateValues[i]
-                                                .asMmolL as NSNumber
-                                        ) ?? ""
-                                )
-                                    + " \(state.units.rawValue)"
-
-                            ).tag(i)
+                            Text(state.units == .mgdL ? state.rateValues[i].description : state.rateValues[i].formattedAsMmolL)
+                                .tag(i)
                         }
                     }
                 }.listRowBackground(Color.chart)
@@ -137,7 +122,8 @@ extension TargetsEditor {
                     NavigationLink(destination: pickers(for: index)) {
                         HStack {
                             Text(
-                                "\(rateFormatter.string(from: state.units == .mgdL ? state.rateValues[item.lowIndex] as NSNumber : state.rateValues[item.lowIndex].asMmolL as NSNumber) ?? "0")"
+                                state.units == .mgdL ? state.rateValues[item.lowIndex].description : state
+                                    .rateValues[item.lowIndex].formattedAsMmolL
                             )
                             Text("\(state.units.rawValue)").foregroundColor(.secondary)
                             Spacer()

+ 2 - 1
FreeAPS/Sources/Services/UserNotifications/UserNotificationsManager.swift

@@ -129,7 +129,8 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
     }
 
     private func notifyCarbsRequired(_ carbs: Int) {
-        guard Decimal(carbs) >= settingsManager.settings.carbsRequiredThreshold, settingsManager.settings.showCarbsRequiredBadge else { return }
+        guard Decimal(carbs) >= settingsManager.settings.carbsRequiredThreshold,
+              settingsManager.settings.showCarbsRequiredBadge else { return }
 
         ensureCanSendNotification {
             var titles: [String] = []