소스 검색

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 년 전
부모
커밋
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"
                     )
                 )
                     {}