Browse Source

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 years ago
parent
commit
ddff5852ad

+ 4 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -2764,7 +2764,7 @@
 			buildSettings = {
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				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;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
@@ -2800,7 +2800,7 @@
 			buildSettings = {
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				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;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
@@ -2836,7 +2836,7 @@
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				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;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
@@ -2866,7 +2866,7 @@
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				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;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";

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

@@ -25,5 +25,6 @@
     "useFPUconversion": false
     "individualAdjustmentFactor": 0.5,
     "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 timeCap: Decimal = 8
     var minuteInterval: Int = 60
+    var delay: Int = 60
 }
 
 extension FreeAPSSettings: Decodable {
@@ -117,6 +118,10 @@ extension FreeAPSSettings: Decodable {
             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) {
             settings.glucoseNotificationsAlways = glucoseNotificationsAlways
         }

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

@@ -23,28 +23,35 @@ extension AddCarbs {
                 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
             let fpucarb = 0.4 * protein + 0.9 * fat
             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
             counter = min(timeCap, counter)
             var roundedCounter: Decimal = 0
             NSDecimalRound(&roundedCounter, &counter, 0, .up)
             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
             }
             // 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 timeCap: Decimal = 0
         @Published var minuteInterval: Decimal = 0
+        @Published var delay: Decimal = 0
 
         override func subscribe() {
             subscribeSetting(\.useFPUconversion, on: $useFPUconversion) { useFPUconversion = $0 }
@@ -25,6 +26,13 @@ extension FPUConfig {
                 $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: {
                 let value = max(min($0, 1.2), 0.3)
                 individualAdjustmentFactor = value

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

@@ -28,6 +28,11 @@ extension FPUConfig {
 
                 Section(header: Text("Optional conversion settings")) {
                     HStack {
+                        Text("Delay In Minutes")
+                        Spacer()
+                        DecimalTextField("8", value: $state.delay, formatter: intFormater)
+                    }
+                    HStack {
                         Text("Maximum Time Cap In Hours")
                         Spacer()
                         DecimalTextField("8", value: $state.timeCap, formatter: intFormater)
@@ -46,7 +51,7 @@ extension FPUConfig {
 
                 Section(
                     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"
                     )
                 )
                     {}