Kaynağa Gözat

Rewrite FPU code.
Add delay in minutes for the first future carb equivalent.
Fix Cap time.
Make sure correct interval is used when many small future carb entries.

Jon Mårtensson 3 yıl önce
ebeveyn
işleme
ddff5852ad

+ 4 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -2764,7 +2764,7 @@
 			buildSettings = {
 			buildSettings = {
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_BW;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
@@ -2800,7 +2800,7 @@
 			buildSettings = {
 			buildSettings = {
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_BW;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
@@ -2836,7 +2836,7 @@
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_BW;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
@@ -2866,7 +2866,7 @@
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_BW;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";

+ 2 - 1
FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json

@@ -25,5 +25,6 @@
     "useFPUconversion": false
     "useFPUconversion": false
     "individualAdjustmentFactor": 0.5,
     "individualAdjustmentFactor": 0.5,
     "timeCap": 8,
     "timeCap": 8,
-    "minuteInterval": 60
+    "minuteInterval": 60,
+    "delay": 60
 }
 }

+ 5 - 0
FreeAPS/Sources/Models/FreeAPSSettings.swift

@@ -29,6 +29,7 @@ struct FreeAPSSettings: JSON, Equatable {
     var individualAdjustmentFactor: Decimal = 0.5
     var individualAdjustmentFactor: Decimal = 0.5
     var timeCap: Decimal = 8
     var timeCap: Decimal = 8
     var minuteInterval: Int = 60
     var minuteInterval: Int = 60
+    var delay: Int = 60
 }
 }
 
 
 extension FreeAPSSettings: Decodable {
 extension FreeAPSSettings: Decodable {
@@ -117,6 +118,10 @@ extension FreeAPSSettings: Decodable {
             settings.minuteInterval = minuteInterval
             settings.minuteInterval = minuteInterval
         }
         }
 
 
+        if let delay = try? container.decode(Int.self, forKey: .delay) {
+            settings.delay = delay
+        }
+
         if let glucoseNotificationsAlways = try? container.decode(Bool.self, forKey: .glucoseNotificationsAlways) {
         if let glucoseNotificationsAlways = try? container.decode(Bool.self, forKey: .glucoseNotificationsAlways) {
             settings.glucoseNotificationsAlways = glucoseNotificationsAlways
             settings.glucoseNotificationsAlways = glucoseNotificationsAlways
         }
         }

+ 20 - 13
FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift

@@ -23,28 +23,35 @@ extension AddCarbs {
                 return
                 return
             }
             }
 
 
+            let interval = settings.settings.minuteInterval
+            let timeCap = settings.settings.timeCap * (60 / Decimal(interval))
+            let adjustment = settings.settings.individualAdjustmentFactor
+            let delay = settings.settings.delay
+
             // Convert fat and protein to carb equivalents and store as future carbs
             // Convert fat and protein to carb equivalents and store as future carbs
             let fpucarb = 0.4 * protein + 0.9 * fat
             let fpucarb = 0.4 * protein + 0.9 * fat
             let fpus = (fat * 9.0 + protein * 4.0) / 100.0
             let fpus = (fat * 9.0 + protein * 4.0) / 100.0
-            // Default is 1 hour (60 minutes)
-            let timeInterval = 60 * settings.settings.minuteInterval
-            // Deffault is 8 hours
-            let timeCap = settings.settings.timeCap
-            let adjustment = settings.settings.individualAdjustmentFactor
             var counter: Decimal = (fpus * 2) - 1.0
             var counter: Decimal = (fpus * 2) - 1.0
             counter = min(timeCap, counter)
             counter = min(timeCap, counter)
             var roundedCounter: Decimal = 0
             var roundedCounter: Decimal = 0
             NSDecimalRound(&roundedCounter, &counter, 0, .up)
             NSDecimalRound(&roundedCounter, &counter, 0, .up)
             let carbequiv = (fpucarb / roundedCounter) * adjustment
             let carbequiv = (fpucarb / roundedCounter) * adjustment
+            let firstDate = date.addingTimeInterval(delay.minutes.timeInterval)
+            var previousDate = date
 
 
-            while counter > 0, counter <= timeCap {
-                let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
-                carbsStorage.storeCarbs([
-                    CarbsEntry(
-                        id: UUID().uuidString, createdAt: date + (newdate * Double(timeInterval)), carbs: carbequiv, enteredBy: CarbsEntry.manual
-
-                    )
-                ])
+            while counter > 0 {
+                var useDate = date + 1 * Double(interval * 60)
+                // Fix Interval and Delay
+                useDate = max(previousDate.addingTimeInterval(interval.minutes.timeInterval), useDate, firstDate)
+                if useDate > previousDate {
+                    carbsStorage.storeCarbs([
+                        CarbsEntry(
+                            id: UUID().uuidString, createdAt: useDate, carbs: carbequiv,
+                            enteredBy: CarbsEntry.manual
+                        )
+                    ])
+                }
+                previousDate = useDate
                 counter -= 1
                 counter -= 1
             }
             }
             // Store the real carbs
             // Store the real carbs

+ 8 - 0
FreeAPS/Sources/Modules/FPUConfig/FPUConfigStateModel.swift

@@ -6,6 +6,7 @@ extension FPUConfig {
         @Published var individualAdjustmentFactor: Decimal = 0
         @Published var individualAdjustmentFactor: Decimal = 0
         @Published var timeCap: Decimal = 0
         @Published var timeCap: Decimal = 0
         @Published var minuteInterval: Decimal = 0
         @Published var minuteInterval: Decimal = 0
+        @Published var delay: Decimal = 0
 
 
         override func subscribe() {
         override func subscribe() {
             subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 }
             subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 }
@@ -25,6 +26,13 @@ extension FPUConfig {
                 $0
                 $0
             })
             })
 
 
+            subscribeSetting(\.delay, on: $delay.map(Int.init), initial: {
+                let value = max(min($0, 120), 60)
+                delay = Decimal(value)
+            }, map: {
+                $0
+            })
+
             subscribeSetting(\.individualAdjustmentFactor, on: $individualAdjustmentFactor, initial: {
             subscribeSetting(\.individualAdjustmentFactor, on: $individualAdjustmentFactor, initial: {
                 let value = max(min($0, 1.2), 0.3)
                 let value = max(min($0, 1.2), 0.3)
                 individualAdjustmentFactor = value
                 individualAdjustmentFactor = value

+ 6 - 1
FreeAPS/Sources/Modules/FPUConfig/View/FPUConfigRootView.swift

@@ -28,6 +28,11 @@ extension FPUConfig {
 
 
                 Section(header: Text("Optional conversion settings")) {
                 Section(header: Text("Optional conversion settings")) {
                     HStack {
                     HStack {
+                        Text("Delay In Minutes")
+                        Spacer()
+                        DecimalTextField("8", value: $state.delay, formatter: intFormater)
+                    }
+                    HStack {
                         Text("Maximum Time Cap In Hours")
                         Text("Maximum Time Cap In Hours")
                         Spacer()
                         Spacer()
                         DecimalTextField("8", value: $state.timeCap, formatter: intFormater)
                         DecimalTextField("8", value: $state.timeCap, formatter: intFormater)
@@ -46,7 +51,7 @@ extension FPUConfig {
 
 
                 Section(
                 Section(
                     footer: Text(
                     footer: Text(
-                        "Allows fat and protein to be converted to future carb equivalents.\n\nDefault settings:\n\nTime Cap: 8 hours\nInterval: 60 min\nFactor: 0.5"
+                        "Allows fat and protein to be converted to future carb equivalents.\n\nDefault settings:\n\nDelay: 60 minutes\nTime Cap: 8 hours\nInterval: 60 min\nFactor: 0.5"
                     )
                     )
                 )
                 )
                     {}
                     {}