Jelajahi Sumber

This commit fixes small inconsistencies with determineBasal:

- Add temp target override for targetGlucose in determineBasal
- Update min/max glucose based on profileTarget
- Make sure to apply override before calculating sensitivity
- Call `calculateSensitivityRatio` for DynamicISF as well
Sam King 10 bulan lalu
induk
melakukan
ed1982bf0c

+ 29 - 1
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasal+Helpers.swift

@@ -267,7 +267,12 @@ extension DeterminationGenerator {
         currentBasalRate * sensitivityRatio
     }
 
-    static func computeAdjustedSensitivity(sensitivity: Decimal, sensitivityRatio: Decimal) -> Decimal {
+    static func computeAdjustedSensitivity(
+        sensitivity: Decimal,
+        sensitivityRatio: Decimal,
+        trioCustomOrefVariables: TrioCustomOrefVariables
+    ) -> Decimal {
+        let sensitivity = trioCustomOrefVariables.override(sensitivity: sensitivity)
         guard sensitivityRatio != 1.0 else { return sensitivity }
         return (sensitivity / sensitivityRatio).rounded(toPlaces: 1)
     }
@@ -303,6 +308,7 @@ extension DeterminationGenerator {
     static func adjustGlucoseTargets(
         profile: Profile,
         autosens: Autosens?,
+        trioCustomOrefVariables: TrioCustomOrefVariables,
         temptargetSet: Bool,
         targetGlucose: Decimal,
         minGlucose: Decimal,
@@ -313,6 +319,13 @@ extension DeterminationGenerator {
         var maxGlucose = maxGlucose
         var targetGlucose = targetGlucose
 
+        // Apply profile override first
+        if let overrideTarget = profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) {
+            targetGlucose = overrideTarget
+            minGlucose = overrideTarget
+            maxGlucose = overrideTarget
+        }
+
         // Only adjust glucose targets for autosens if no temp target set
         if !temptargetSet, let autosens = autosens {
             if (profile.sensitivityRaisesTarget && autosens.ratio < 1) ||
@@ -372,3 +385,18 @@ extension Profile {
         return minBg
     }
 }
+
+extension TrioCustomOrefVariables {
+    func override(sensitivity: Decimal) -> Decimal {
+        if useOverride {
+            let overrideFactor = overridePercentage / 100
+            if isfAndCr || isf {
+                return sensitivity / overrideFactor
+            } else {
+                return sensitivity
+            }
+        } else {
+            return sensitivity
+        }
+    }
+}

+ 12 - 12
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasalGenerator.swift

@@ -47,7 +47,6 @@ enum DeterminationGenerator {
             return errorDetermination
         }
 
-        let sensitivityRatio: Decimal
         let dynamicIsfResult = DynamicISF.calculate(
             profile: profile,
             preferences: preferences,
@@ -57,21 +56,19 @@ enum DeterminationGenerator {
 
         // TODO: We need to add the dynamicIsfResult to our forcasting functions
         if let dynamicIsfResult = dynamicIsfResult {
-            sensitivityRatio = dynamicIsfResult.ratio
             autosensData = Autosens(
                 ratio: dynamicIsfResult.ratio,
                 newisf: autosensData.newisf,
                 deviationsUnsorted: autosensData.deviationsUnsorted,
                 timestamp: autosensData.timestamp
             )
-        } else {
-            sensitivityRatio = calculateSensitivityRatio(
-                profile: profile,
-                autosens: autosensData,
-                targetGlucose: profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) ?? 120,
-                temptargetSet: profile.temptargetSet ?? false
-            )
         }
+        let sensitivityRatio = calculateSensitivityRatio(
+            profile: profile,
+            autosens: autosensData,
+            targetGlucose: profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) ?? 120,
+            temptargetSet: profile.temptargetSet ?? false
+        )
 
         let basal: Decimal
         if let dynamicIsfResult = dynamicIsfResult, profile.tddAdjBasal {
@@ -85,9 +82,11 @@ enum DeterminationGenerator {
                 sensitivityRatio: sensitivityRatio
             )
         }
+
         let sensitivity = computeAdjustedSensitivity(
             sensitivity: profile.sens ?? profile.sensitivityFor(time: currentTime),
-            sensitivityRatio: sensitivityRatio
+            sensitivityRatio: sensitivityRatio,
+            trioCustomOrefVariables: trioCustomOrefVariables
         )
 
         // Safety check: current temp vs. last temp in iob
@@ -137,8 +136,9 @@ enum DeterminationGenerator {
         let (adjustedGlucoseTargets, threshold) = adjustGlucoseTargets(
             profile: profile,
             autosens: autosensData,
+            trioCustomOrefVariables: trioCustomOrefVariables,
             temptargetSet: profile.temptargetSet ?? false,
-            targetGlucose: profile.targetBg ?? 100, // TODO: grab from therapy settings
+            targetGlucose: profile.minBg ?? 100,
             minGlucose: profile.minBg ?? 70, // TODO: can we force unwrap?
             maxGlucose: profile.maxBg ?? 180,
             noise: 1
@@ -207,7 +207,7 @@ enum DeterminationGenerator {
 
         // used for pre dosing decision sanity later on
         let expectedDelta = calculateExpectedDelta(
-            targetGlucose: profile.minBg ?? 100,
+            targetGlucose: adjustedGlucoseTargets.targetGlucose,
             eventualGlucose: eventualGlucose,
             glucoseImpact: currentGlucoseImpact
         )

+ 1 - 6
Trio/Sources/APS/OpenAPSSwift/DynamicISF.swift

@@ -42,12 +42,7 @@ enum DynamicISF {
             return nil
         }
 
-        if trioCustomOrefVariables.useOverride {
-            let overrideFactor = trioCustomOrefVariables.overridePercentage / 100
-            if trioCustomOrefVariables.isfAndCr || trioCustomOrefVariables.isf {
-                sensitivity = sensitivity / overrideFactor
-            }
-        }
+        sensitivity = trioCustomOrefVariables.override(sensitivity: sensitivity)
 
         let minLimit = min(profile.autosensMin, profile.autosensMax)
         let maxLimit = max(profile.autosensMin, profile.autosensMax)