فهرست منبع

PURGE suggestion, make enactTempBasal function in apsManager also async (like the enactBolus func)

polscm32 1 سال پیش
والد
کامیت
3afe2000e9

+ 0 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -143,7 +143,6 @@
 		3862CC2E2743F9F700BF832C /* CalendarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3862CC2D2743F9F700BF832C /* CalendarManager.swift */; };
 		386A124F271707F000DDC61C /* DexcomSourceG6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 386A124E271707F000DDC61C /* DexcomSourceG6.swift */; };
 		3870FF4725EC187A0088248F /* BloodGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3870FF4225EC13F40088248F /* BloodGlucose.swift */; };
-		3871F38725ED661C0013ECB5 /* Suggestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3871F38625ED661C0013ECB5 /* Suggestion.swift */; };
 		3871F39C25ED892B0013ECB5 /* TempTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3871F39B25ED892B0013ECB5 /* TempTarget.swift */; };
 		3871F39F25ED895A0013ECB5 /* Decimal+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3871F39E25ED895A0013ECB5 /* Decimal+Extensions.swift */; };
 		3883581C25EE79BB00E024B2 /* DecimalTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883581B25EE79BB00E024B2 /* DecimalTextField.swift */; };
@@ -743,7 +742,6 @@
 		3862CC2D2743F9F700BF832C /* CalendarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarManager.swift; sourceTree = "<group>"; };
 		386A124E271707F000DDC61C /* DexcomSourceG6.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DexcomSourceG6.swift; sourceTree = "<group>"; };
 		3870FF4225EC13F40088248F /* BloodGlucose.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BloodGlucose.swift; sourceTree = "<group>"; };
-		3871F38625ED661C0013ECB5 /* Suggestion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Suggestion.swift; sourceTree = "<group>"; };
 		3871F39B25ED892B0013ECB5 /* TempTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TempTarget.swift; sourceTree = "<group>"; };
 		3871F39E25ED895A0013ECB5 /* Decimal+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Decimal+Extensions.swift"; sourceTree = "<group>"; };
 		3883581B25EE79BB00E024B2 /* DecimalTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecimalTextField.swift; sourceTree = "<group>"; };
@@ -1792,7 +1790,6 @@
 				3883583325EEB38000E024B2 /* PumpSettings.swift */,
 				38E989DC25F5021400C0CED0 /* PumpStatus.swift */,
 				38BF021C25E7E3AF00579895 /* Reservoir.swift */,
-				3871F38625ED661C0013ECB5 /* Suggestion.swift */,
 				38A0364125ED069400FCBB52 /* TempBasal.swift */,
 				3871F39B25ED892B0013ECB5 /* TempTarget.swift */,
 				3811DE8E25C9D80400A708ED /* User.swift */,
@@ -3023,7 +3020,6 @@
 				3811DE4325C9D4A100A708ED /* SettingsProvider.swift in Sources */,
 				45252C95D220E796FDB3B022 /* ConfigEditorDataFlow.swift in Sources */,
 				587DA1F62B77F3DD00B28F8A /* SettingsRowView.swift in Sources */,
-				3871F38725ED661C0013ECB5 /* Suggestion.swift in Sources */,
 				CE7CA34E2A064973004BE681 /* AppShortcuts.swift in Sources */,
 				38C4D33A25E9A1ED00D30B77 /* NSObject+AssociatedValues.swift in Sources */,
 				38DF179027733EAD00B3528F /* SnowScene.swift in Sources */,

+ 45 - 13
FreeAPS/Sources/APS/APSManager.swift

@@ -23,7 +23,7 @@ protocol APSManager {
     var bolusProgress: CurrentValueSubject<Decimal?, Never> { get }
     var pumpExpiresAtDate: CurrentValueSubject<Date?, Never> { get }
     var isManualTempBasal: Bool { get }
-    func enactTempBasal(rate: Double, duration: TimeInterval)
+    func enactTempBasal(rate: Double, duration: TimeInterval) async
     func makeProfiles() -> AnyPublisher<Bool, Never>
     func determineBasal() -> AnyPublisher<Bool, Never>
     func determineBasalSync()
@@ -533,7 +533,7 @@ final class BaseAPSManager: APSManager, Injectable {
         bolusProgress.send(nil)
     }
 
-    func enactTempBasal(rate: Double, duration: TimeInterval) {
+    func enactTempBasal(rate: Double, duration: TimeInterval) async {
         if let error = verifyStatus() {
             processError(error)
             return
@@ -550,21 +550,53 @@ final class BaseAPSManager: APSManager, Injectable {
         debug(.apsManager, "Enact temp basal \(rate) - \(duration)")
 
         let roundedAmout = pump.roundToSupportedBasalRate(unitsPerHour: rate)
-        pump.enactTempBasal(unitsPerHour: roundedAmout, for: duration) { error in
-            if let error = error {
-                debug(.apsManager, "Temp Basal failed with error: \(error.localizedDescription)")
-                self.processError(APSError.pumpError(error))
-            } else {
-                debug(.apsManager, "Temp Basal succeeded")
-                let temp = TempBasal(duration: Int(duration / 60), rate: Decimal(rate), temp: .absolute, timestamp: Date())
-                self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
-                if rate == 0, duration == 0 {
-                    self.pumpHistoryStorage.saveCancelTempEvents()
-                }
+
+        do {
+            try await pump.enactTempBasal(unitsPerHour: roundedAmout, for: duration)
+            debug(.apsManager, "Temp Basal succeeded")
+            let temp = TempBasal(duration: Int(duration / 60), rate: Decimal(rate), temp: .absolute, timestamp: Date())
+            storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+            if rate == 0, duration == 0 {
+                pumpHistoryStorage.saveCancelTempEvents()
             }
+        } catch {
+            debug(.apsManager, "Temp Basal failed with error: \(error.localizedDescription)")
+            processError(APSError.pumpError(error))
         }
     }
 
+//    func enactTempBasal(rate: Double, duration: TimeInterval) {
+//        if let error = verifyStatus() {
+//            processError(error)
+//            return
+//        }
+//
+//        guard let pump = pumpManager else { return }
+//
+//        // unable to do temp basal during manual temp basal 😁
+//        if isManualTempBasal {
+//            processError(APSError.manualBasalTemp(message: "Loop not possible during the manual basal temp"))
+//            return
+//        }
+//
+//        debug(.apsManager, "Enact temp basal \(rate) - \(duration)")
+//
+//        let roundedAmout = pump.roundToSupportedBasalRate(unitsPerHour: rate)
+//        pump.enactTempBasal(unitsPerHour: roundedAmout, for: duration) { error in
+//            if let error = error {
+//                debug(.apsManager, "Temp Basal failed with error: \(error.localizedDescription)")
+//                self.processError(APSError.pumpError(error))
+//            } else {
+//                debug(.apsManager, "Temp Basal succeeded")
+//                let temp = TempBasal(duration: Int(duration / 60), rate: Decimal(rate), temp: .absolute, timestamp: Date())
+//                self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+//                if rate == 0, duration == 0 {
+//                    self.pumpHistoryStorage.saveCancelTempEvents()
+//                }
+//            }
+//        }
+//    }
+
     func dailyAutotune() -> AnyPublisher<Bool, Never> {
         guard settings.useAutotune else {
             return Just(false).eraseToAnyPublisher()

+ 0 - 1
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -260,7 +260,6 @@ final class OpenAPS {
 
                 if var determination = Determination(from: orefDetermination) {
                     determination.timestamp = determination.deliverAt ?? clock
-                    self.storage.save(determination, as: Enact.suggested)
 
                     // save to core data asynchronously
                     self.processDetermination(determination)

+ 14 - 0
FreeAPS/Sources/Models/Determination.swift

@@ -32,6 +32,20 @@ struct Determination: JSON, Equatable {
     let carbRatio: Decimal?
 }
 
+struct Predictions: JSON, Equatable {
+    let iob: [Int]?
+    let zt: [Int]?
+    let cob: [Int]?
+    let uam: [Int]?
+}
+
+struct Insulin: JSON, Equatable {
+    let TDD: Decimal?
+    let bolus: Decimal?
+    let temp_basal: Decimal?
+    let scheduled_basal: Decimal?
+}
+
 extension Determination {
     private enum CodingKeys: String, CodingKey {
         case reason

+ 0 - 117
FreeAPS/Sources/Models/Suggestion.swift

@@ -1,117 +0,0 @@
-import Foundation
-
-struct Suggestion: JSON, Equatable {
-    let reason: String
-    let units: Decimal?
-    let insulinReq: Decimal?
-    let eventualBG: Int?
-    let sensitivityRatio: Decimal?
-    let rate: Decimal?
-    let duration: Int?
-    let iob: Decimal?
-    let cob: Decimal?
-    var predictions: Predictions?
-    let deliverAt: Date?
-    let carbsReq: Decimal?
-    let temp: TempType?
-    let bg: Decimal?
-    let reservoir: Decimal?
-    let isf: Decimal?
-    var timestamp: Date?
-    var recieved: Bool?
-    let tdd: Decimal?
-    let insulin: Insulin?
-    let current_target: Decimal?
-    let insulinForManualBolus: Decimal?
-    let manualBolusErrorString: Decimal?
-    let minDelta: Decimal?
-    let expectedDelta: Decimal?
-    let minGuardBG: Decimal?
-    let minPredBG: Decimal?
-    let threshold: Decimal?
-    let carbRatio: Decimal?
-}
-
-struct Predictions: JSON, Equatable {
-    let iob: [Int]?
-    let zt: [Int]?
-    let cob: [Int]?
-    let uam: [Int]?
-}
-
-struct Insulin: JSON, Equatable {
-    let TDD: Decimal?
-    let bolus: Decimal?
-    let temp_basal: Decimal?
-    let scheduled_basal: Decimal?
-}
-
-extension Suggestion {
-    private enum CodingKeys: String, CodingKey {
-        case reason
-        case units
-        case insulinReq
-        case eventualBG
-        case sensitivityRatio
-        case rate
-        case duration
-        case iob = "IOB"
-        case cob = "COB"
-        case predictions = "predBGs"
-        case deliverAt
-        case carbsReq
-        case temp
-        case bg
-        case reservoir
-        case timestamp
-        case recieved
-        case isf = "ISF"
-        case tdd = "TDD"
-        case insulin
-        case current_target
-        case insulinForManualBolus
-        case manualBolusErrorString
-        case minDelta
-        case expectedDelta
-        case minGuardBG
-        case minPredBG
-        case threshold
-        case carbRatio = "CR"
-    }
-}
-
-extension Predictions {
-    private enum CodingKeys: String, CodingKey {
-        case iob = "IOB"
-        case zt = "ZT"
-        case cob = "COB"
-        case uam = "UAM"
-    }
-}
-
-extension Insulin {
-    private enum CodingKeys: String, CodingKey {
-        case TDD
-        case bolus
-        case temp_basal
-        case scheduled_basal
-    }
-}
-
-protocol SuggestionObserver {
-    func suggestionDidUpdate(_ suggestion: Suggestion)
-}
-
-protocol EnactedSuggestionObserver {
-    func enactedSuggestionDidUpdate(_ suggestion: Suggestion)
-}
-
-extension Suggestion {
-    var reasonParts: [String] {
-        reason.components(separatedBy: "; ").first?.components(separatedBy: ", ") ?? []
-    }
-
-    var reasonConclusion: String {
-        reason.components(separatedBy: "; ").last ?? ""
-    }
-}

+ 0 - 1
FreeAPS/Sources/Modules/Bolus/BolusDataFlow.swift

@@ -3,6 +3,5 @@ enum Bolus {
 }
 
 protocol BolusProvider: Provider {
-    var suggestion: Suggestion? { get }
     func pumpSettings() -> PumpSettings
 }

+ 0 - 4
FreeAPS/Sources/Modules/Bolus/BolusProvider.swift

@@ -1,9 +1,5 @@
 extension Bolus {
     final class Provider: BaseProvider, BolusProvider {
-        var suggestion: Suggestion? {
-            storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self)
-        }
-
         func pumpSettings() -> PumpSettings {
             storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self)
                 ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings))

+ 0 - 9
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -16,7 +16,6 @@ extension Bolus {
         @Injected() var carbsStorage: CarbsStorage!
         @Injected() var glucoseStorage: GlucoseStorage!
 
-        @Published var suggestion: Suggestion?
         @Published var predictions: Predictions?
         @Published var amount: Decimal = 0
         @Published var insulinRecommended: Decimal = 0
@@ -110,7 +109,6 @@ extension Bolus {
             broadcaster.register(BolusFailureObserver.self, observer: self)
             units = settingsManager.settings.units
             percentage = settingsManager.settings.insulinReqPercentage
-            threshold = provider.suggestion?.threshold ?? 0
             maxBolus = provider.pumpSettings().maxBolus
             // added
             fraction = settings.settings.overrideFactor
@@ -121,7 +119,6 @@ extension Bolus {
             sweetMealFactor = settings.settings.sweetMealFactor
             displayPresets = settings.settings.displayPresets
 
-            carbsRequired = provider.suggestion?.carbsReq
             maxCarbs = settings.settings.maxCarbs
             skipBolus = settingsManager.settings.skipBolusScreenAfterCarbs
             useFPUconversion = settingsManager.settings.useFPUconversion
@@ -138,12 +135,6 @@ extension Bolus {
                         }
                     }.store(in: &lifetime)
             }
-            if let notNilSugguestion = provider.suggestion {
-                suggestion = notNilSugguestion
-                if let notNilPredictions = suggestion?.predictions {
-                    predictions = notNilPredictions
-                }
-            }
         }
 
         // MARK: - Basal

+ 0 - 1
FreeAPS/Sources/Modules/ISFEditor/ISFEditorDataFlow.swift

@@ -28,5 +28,4 @@ protocol ISFEditorProvider: Provider {
     func saveProfile(_ profile: InsulinSensitivities)
     var autosense: Autosens { get }
     var autotune: Autotune? { get }
-    var suggestion: Suggestion? { get }
 }

+ 0 - 4
FreeAPS/Sources/Modules/ISFEditor/ISFEditorProvider.swift

@@ -20,10 +20,6 @@ extension ISFEditor {
                 ?? Autosens(ratio: 1, newisf: nil, timestamp: nil)
         }
 
-        var suggestion: Suggestion? {
-            storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self)
-        }
-
         var autotune: Autotune? {
             storage.retrieve(OpenAPS.Settings.autotune, as: Autotune.self)
         }

+ 37 - 0
FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -1,3 +1,4 @@
+import CoreData
 import SwiftUI
 
 extension ISFEditor {
@@ -6,6 +7,9 @@ extension ISFEditor {
         private(set) var autosensISF: Decimal?
         private(set) var autosensRatio: Decimal = 0
         @Published var autotune: Autotune?
+        @Published var determinationsFromPersistence: [OrefDetermination] = []
+
+        let context = CoreDataStack.shared.newTaskContext()
 
         let timeValues = stride(from: 0.0, to: 1.days.timeInterval, by: 30.minutes.timeInterval).map { $0 }
 
@@ -45,6 +49,7 @@ extension ISFEditor {
             }
 
             autosensRatio = provider.autosense.ratio
+            setupDeterminationsArray()
         }
 
         func add() {
@@ -90,5 +95,37 @@ extension ISFEditor {
                 }
             }
         }
+
+        private func setupDeterminationsArray() {
+            Task {
+                let ids = await self.fetchDeterminations()
+                await updateDeterminationsArray(with: ids)
+            }
+        }
+
+        private func fetchDeterminations() async -> [NSManagedObjectID] {
+            CoreDataStack.shared.fetchEntities(
+                ofType: OrefDetermination.self,
+                onContext: context,
+                predicate: NSPredicate.enactedDetermination,
+                key: "deliverAt",
+                ascending: false,
+                fetchLimit: 1
+            ).map(\.objectID)
+        }
+
+        @MainActor private func updateDeterminationsArray(with IDs: [NSManagedObjectID]) {
+            do {
+                let objects = try IDs.compactMap { id in
+                    try context.existingObject(with: id) as? OrefDetermination
+                }
+                determinationsFromPersistence = objects
+
+            } catch {
+                debugPrint(
+                    "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error.localizedDescription)"
+                )
+            }
+        }
     }
 }

+ 10 - 6
FreeAPS/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift

@@ -60,16 +60,18 @@ extension ISFEditor {
                         header: !state.settingsManager.preferences
                             .useNewFormula ? Text("Autosens") : Text("Dynamic Sensitivity")
                     ) {
-                        let dynamicRatio = state.provider.suggestion?.sensitivityRatio ?? 0
-                        let dynamicISF = state.provider.suggestion?.isf ?? 0
+                        let dynamicRatio = state.determinationsFromPersistence.first?.sensitivityRatio
+                        let dynamicISF = state.determinationsFromPersistence.first?.insulinSensitivity
                         HStack {
                             Text("Sensitivity Ratio")
                             Spacer()
                             Text(
                                 rateFormatter
                                     .string(from: (
-                                        !state.settingsManager.preferences.useNewFormula ? state
-                                            .autosensRatio : dynamicRatio
+                                        (
+                                            !state.settingsManager.preferences.useNewFormula ? state
+                                                .autosensRatio as NSDecimalNumber : dynamicRatio
+                                        ) ?? 1
                                     ) as NSNumber) ?? "1"
                             )
                         }
@@ -79,8 +81,10 @@ extension ISFEditor {
                             Text(
                                 rateFormatter
                                     .string(from: (
-                                        !state.settingsManager.preferences
-                                            .useNewFormula ? newISF : dynamicISF
+                                        (
+                                            !state.settingsManager.preferences
+                                                .useNewFormula ? newISF as NSDecimalNumber : dynamicISF
+                                        ) ?? 0
                                     ) as NSNumber) ?? "0"
                             )
                             Text(state.units.rawValue + "/U").foregroundColor(.secondary)

+ 9 - 5
FreeAPS/Sources/Modules/ManualTempBasal/ManualTempBasalStateModel.swift

@@ -11,14 +11,18 @@ extension ManualTempBasal {
         override func subscribe() {}
 
         func cancel() {
-            apsManager.enactTempBasal(rate: 0, duration: 0)
-            showModal(for: nil)
+            Task {
+                await apsManager.enactTempBasal(rate: 0, duration: 0)
+                showModal(for: nil)
+            }
         }
 
         func enact() {
-            let duration = durationValues[durationIndex]
-            apsManager.enactTempBasal(rate: Double(rate), duration: duration * 60)
-            showModal(for: nil)
+            Task {
+                let duration = durationValues[durationIndex]
+                await apsManager.enactTempBasal(rate: Double(rate), duration: duration * 60)
+                showModal(for: nil)
+            }
         }
     }
 }

+ 4 - 4
FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift

@@ -59,7 +59,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
         center.delegate = self
         injectServices(resolver)
         broadcaster.register(GlucoseObserver.self, observer: self)
-        broadcaster.register(SuggestionObserver.self, observer: self)
+        broadcaster.register(DeterminationObserver.self, observer: self)
         broadcaster.register(BolusFailureObserver.self, observer: self)
         broadcaster.register(pumpNotificationObserver.self, observer: self)
 
@@ -445,9 +445,9 @@ extension BaseUserNotificationsManager: pumpNotificationObserver {
     }
 }
 
-extension BaseUserNotificationsManager: SuggestionObserver {
-    func suggestionDidUpdate(_ suggestion: Suggestion) {
-        guard let carndRequired = suggestion.carbsReq else { return }
+extension BaseUserNotificationsManager: DeterminationObserver {
+    func determinationDidUpdate(_ determination: Determination) {
+        guard let carndRequired = determination.carbsReq else { return }
         notifyCarbsRequired(Int(carndRequired))
     }
 }

+ 33 - 31
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -53,7 +53,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
         configureState()
     }
 
-    private func fetchLastDeterminationDate() -> Date? {
+    private func fetchlastDetermination() -> [OrefDetermination]? {
         let predicate = NSPredicate.enactedDetermination
 
         return CoreDataStack.shared.fetchEntities(
@@ -64,7 +64,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             ascending: false,
             fetchLimit: 1,
             propertiesToFetch: ["timestamp"]
-        ).first?.timestamp
+        )
     }
 
     private func fetchLatestOverride() -> Override? {
@@ -87,11 +87,11 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             Date()
         )
 
-        context.performAndWait {
+        context.perform {
             let predicate = NSPredicate.predicateFor120MinAgo
             let fetchedGlucose = CoreDataStack.shared.fetchEntities(
                 ofType: GlucoseStored.self,
-                onContext: context,
+                onContext: self.context,
                 predicate: predicate,
                 key: "date",
                 ascending: false,
@@ -108,7 +108,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             let date = firstGlucose.date ?? .distantPast
             let delta = fetchedGlucose.count >= 2 ? glucoseValue - fetchedGlucose[1].glucose : 0
 
-            let units = settingsManager.settings.units
+            let units = self.settingsManager.settings.units
             let glucoseFormatter = NumberFormatter()
             glucoseFormatter.numberStyle = .decimal
             glucoseFormatter.maximumFractionDigits = (units == .mmolL) ? 1 : 0
@@ -133,13 +133,14 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
         processQueue.async {
             self.context.performAndWait {
                 let glucoseValues = self.fetchAndProcessGlucose()
+                let lastDetermination = self.fetchlastDetermination()?.first
 
                 self.state.glucose = glucoseValues.glucose
                 self.state.trend = glucoseValues.trend
                 self.state.delta = glucoseValues.delta
                 self.state.trendRaw = glucoseValues.trend
                 self.state.glucoseDate = glucoseValues.date
-                self.state.lastLoopDate = self.fetchLastDeterminationDate()
+                self.state.lastLoopDate = lastDetermination?.timestamp
                 self.state.lastLoopDateInterval = self.state.lastLoopDate.map {
                     guard $0.timeIntervalSince1970 > 0 else { return 0 }
                     return UInt64($0.timeIntervalSince1970)
@@ -147,13 +148,13 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
                 self.state.bolusIncrement = self.settingsManager.preferences.bolusIncrement
                 self.state.maxCOB = self.settingsManager.preferences.maxCOB
                 self.state.maxBolus = self.settingsManager.pumpSettings.maxBolus
-                self.state.carbsRequired = self.suggestion?.carbsReq
+                self.state.carbsRequired = lastDetermination?.carbsRequired as? Decimal
 
-                var insulinRequired = self.suggestion?.insulinReq ?? 0
+                var insulinRequired = lastDetermination?.insulinReq as? Decimal ?? 0
 
                 var double: Decimal = 2
-                if self.suggestion?.manualBolusErrorString == 0 {
-                    insulinRequired = self.suggestion?.insulinForManualBolus ?? 0
+                if lastDetermination?.manualBolusErrorString == 0 {
+                    insulinRequired = lastDetermination?.insulinForManualBolus as? Decimal ?? 0
                     double = 1
                 }
 
@@ -166,13 +167,16 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
                             0
                         ))
                 } else {
-                    let recommended = self.newBolusCalc(ids: glucoseValues.ids, suggestion: self.suggestion)
+                    let recommended = self.newBolusCalc(
+                        ids: glucoseValues.ids,
+                        determination: lastDetermination
+                    )
                     self.state.bolusRecommended = self.apsManager
                         .roundBolus(amount: max(recommended, 0))
                 }
 
-                self.state.iob = self.suggestion?.iob
-                self.state.cob = self.suggestion?.cob
+                self.state.iob = lastDetermination?.iob as? Decimal
+                self.state.cob = lastDetermination?.cob as? Decimal
                 self.state.tempTargets = self.tempTargetsStorage.presets()
                     .map { target -> TempTargetWatchPreset in
                         let untilDate = self.tempTargetsStorage.current().flatMap { currentTarget -> Date? in
@@ -196,7 +200,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
                 self.state.eventualBG = eBG.map { "⇢ " + $0 }
                 self.state.eventualBGRaw = eBG
 
-                self.state.isf = self.suggestion?.isf
+                self.state.isf = lastDetermination?.insulinSensitivity as? Decimal
 
                 let latestOverride = self.fetchLatestOverride()
 
@@ -246,16 +250,18 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
     }
 
     private func evetualBGStraing() -> String? {
-        guard let eventualBG = suggestion?.eventualBG else {
-            return nil
+        context.perform {
+            guard let eventualBG = self.fetchlastDetermination()?.first?.eventualBG as? Int else {
+                return nil
+            }
+            let units = self.settingsManager.settings.units
+            return eventualFormatter.string(
+                from: (units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber
+            )!
         }
-        let units = settingsManager.settings.units
-        return eventualFormatter.string(
-            from: (units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber
-        )!
     }
 
-    private func newBolusCalc(ids: [NSManagedObjectID], suggestion: Suggestion?) -> Decimal {
+    private func newBolusCalc(ids: [NSManagedObjectID], determination: OrefDetermination?) -> Decimal {
         var insulinCalculated: Decimal = 0
 
         context.performAndWait {
@@ -272,12 +278,12 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             }
 
             let conversion: Decimal = settingsManager.settings.units == .mmolL ? 0.0555 : 1
-            let isf = state.isf ?? 0
-            let target = suggestion?.current_target ?? 0
-            let carbratio = suggestion?.carbRatio ?? 0
-            let cob = state.cob ?? 0
-            let iob = state.iob ?? 0
-            let fattyMealFactor = settingsManager.settings.fattyMealFactor
+            let isf = self.state.isf ?? 0
+            let target = determination?.currentTarget as? Decimal ?? 100
+            let carbratio = determination?.carbRatio as? Decimal ?? 10
+            let cob = self.state.cob ?? 0
+            let iob = self.state.iob ?? 0
+            let fattyMealFactor = self.settingsManager.settings.fattyMealFactor
 
             // Complete bolus calculation logic
             let targetDifference = Decimal(bg) - target
@@ -333,10 +339,6 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
         formatter.maximumFractionDigits = 1
         return formatter
     }
-
-    private var suggestion: Suggestion? {
-        storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self)
-    }
 }
 
 extension BaseWatchManager: WCSessionDelegate {