polscm32 2 лет назад
Родитель
Сommit
9fd0bd6b76

+ 160 - 15
FreeAPS/Sources/APS/APSManager.swift

@@ -658,41 +658,54 @@ final class BaseAPSManager: APSManager, Injectable {
     }
 
     private func enactDetermination() -> AnyPublisher<Void, Error> {
-            guard let determination = fetchDetermination() else {
+        // Fetch determination within the correct context
+        Future<OrefDetermination?, Error> { promise in
+            self.privateContext.perform {
+                let determination = self.fetchDetermination()
+                promise(.success(determination))
+            }
+        }
+        .flatMap { determination -> AnyPublisher<Void, Error> in
+            guard let determination = determination else {
                 return Fail(error: APSError.apsError(message: "Determination not found")).eraseToAnyPublisher()
             }
 
-            guard let pump = pumpManager else {
+            guard let pump = self.pumpManager else {
                 return Fail(error: APSError.apsError(message: "Pump not set")).eraseToAnyPublisher()
             }
 
-            // unable to do temp basal during manual temp basal 😁
-            if isManualTempBasal {
+            // Unable to do temp basal during manual temp basal 😁
+            if self.isManualTempBasal {
                 return Fail(error: APSError.manualBasalTemp(message: "Loop not possible during the manual basal temp"))
                     .eraseToAnyPublisher()
             }
 
+            let rateValue = determination.rate
+            let durationValue = determination.duration
+
             let basalPublisher: AnyPublisher<Void, Error> = Deferred { () -> AnyPublisher<Void, Error> in
                 if let error = self.verifyStatus() {
                     return Fail(error: error).eraseToAnyPublisher()
                 }
 
-                guard let rate = determination.rate else {
+                guard let rate = rateValue else {
                     debug(.apsManager, "No temp required")
                     return Just(()).setFailureType(to: Error.self)
                         .eraseToAnyPublisher()
                 }
                 return pump.enactTempBasal(
-                    unitsPerHour: Double(truncating: rate),
-                    for: TimeInterval(determination.duration * 60)
+                    unitsPerHour: Double(truncating: rate as NSNumber),
+                    for: TimeInterval(durationValue * 60)
                 ).map { _ in
-                    let temp = TempBasal(
-                        duration: Int(determination.duration),
-                        rate: ((determination.rate ?? 0) as NSDecimalNumber) as Decimal,
-                        temp: .absolute,
-                        timestamp: Date()
-                    )
-                    self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+                    self.privateContext.perform {
+                        let temp = TempBasal(
+                            duration: Int(durationValue),
+                            rate: ((rateValue ?? 0) as NSDecimalNumber) as Decimal,
+                            temp: .absolute,
+                            timestamp: Date()
+                        )
+                        self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+                    }
                     return ()
                 }
                 .eraseToAnyPublisher()
@@ -715,9 +728,141 @@ final class BaseAPSManager: APSManager, Injectable {
             }.eraseToAnyPublisher()
 
             return basalPublisher.flatMap { bolusPublisher }.eraseToAnyPublisher()
-        
+        }
+        .eraseToAnyPublisher()
     }
 
+//    private func enactDetermination() -> AnyPublisher<Void, Error> {
+//        // Fetch determination within the correct context
+//        Future<OrefDetermination?, Error> { promise in
+//            self.privateContext.perform {
+//                let determination = self.fetchDetermination()
+//                promise(.success(determination))
+//            }
+//        }
+//        .flatMap { determination -> AnyPublisher<Void, Error> in
+//            guard let determination = determination else {
+//                return Fail(error: APSError.apsError(message: "Determination not found")).eraseToAnyPublisher()
+//            }
+//
+//            guard let pump = self.pumpManager else {
+//                return Fail(error: APSError.apsError(message: "Pump not set")).eraseToAnyPublisher()
+//            }
+//
+//            // Unable to do temp basal during manual temp basal 😁
+//            if self.isManualTempBasal {
+//                return Fail(error: APSError.manualBasalTemp(message: "Loop not possible during the manual basal temp"))
+//                    .eraseToAnyPublisher()
+//            }
+//
+//            let basalPublisher: AnyPublisher<Void, Error> = Deferred { () -> AnyPublisher<Void, Error> in
+//                if let error = self.verifyStatus() {
+//                    return Fail(error: error).eraseToAnyPublisher()
+//                }
+//
+//                guard let rate = determination.rate else {
+//                    debug(.apsManager, "No temp required")
+//                    return Just(()).setFailureType(to: Error.self)
+//                        .eraseToAnyPublisher()
+//                }
+//                return pump.enactTempBasal(
+//                    unitsPerHour: Double(truncating: rate as NSNumber),
+//                    for: TimeInterval((determination.duration ?? 0) * 60)
+//                ).map { _ in
+//                    let temp = TempBasal(
+//                        duration: Int(determination.duration ?? 0),
+//                        rate: ((determination.rate ?? 0) as NSDecimalNumber) as Decimal,
+//                        temp: .absolute,
+//                        timestamp: Date()
+//                    )
+//                    self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+//                    return ()
+//                }
+//                .eraseToAnyPublisher()
+//            }.eraseToAnyPublisher()
+//
+//            let bolusPublisher: AnyPublisher<Void, Error> = Deferred { () -> AnyPublisher<Void, Error> in
+//                if let error = self.verifyStatus() {
+//                    return Fail(error: error).eraseToAnyPublisher()
+//                }
+//                guard let smbToDeliver = determination.smbToDeliver else {
+//                    debug(.apsManager, "No bolus required")
+//                    return Just(()).setFailureType(to: Error.self)
+//                        .eraseToAnyPublisher()
+//                }
+//                return pump.enactBolus(units: Double(truncating: smbToDeliver), automatic: true).map { _ in
+//                    self.bolusProgress.send(0)
+//                    return ()
+//                }
+//                .eraseToAnyPublisher()
+//            }.eraseToAnyPublisher()
+//
+//            return basalPublisher.flatMap { bolusPublisher }.eraseToAnyPublisher()
+//        }
+//        .eraseToAnyPublisher()
+//    }
+
+//    private func enactDetermination() -> AnyPublisher<Void, Error> {
+//            guard let determination = fetchDetermination() else {
+//                return Fail(error: APSError.apsError(message: "Determination not found")).eraseToAnyPublisher()
+//            }
+//
+//            guard let pump = pumpManager else {
+//                return Fail(error: APSError.apsError(message: "Pump not set")).eraseToAnyPublisher()
+//            }
+//
+//            // unable to do temp basal during manual temp basal 😁
+//            if isManualTempBasal {
+//                return Fail(error: APSError.manualBasalTemp(message: "Loop not possible during the manual basal temp"))
+//                    .eraseToAnyPublisher()
+//            }
+//
+//            let basalPublisher: AnyPublisher<Void, Error> = Deferred { () -> AnyPublisher<Void, Error> in
+//                if let error = self.verifyStatus() {
+//                    return Fail(error: error).eraseToAnyPublisher()
+//                }
+//
+//                guard let rate = determination.rate else {
+//                    debug(.apsManager, "No temp required")
+//                    return Just(()).setFailureType(to: Error.self)
+//                        .eraseToAnyPublisher()
+//                }
+//                return pump.enactTempBasal(
+//                    unitsPerHour: Double(truncating: rate),
+//                    for: TimeInterval(determination.duration * 60)
+//                ).map { _ in
+//                    let temp = TempBasal(
+//                        duration: Int(determination.duration),
+//                        rate: ((determination.rate ?? 0) as NSDecimalNumber) as Decimal,
+//                        temp: .absolute,
+//                        timestamp: Date()
+//                    )
+//                    self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+//                    return ()
+//                }
+//                .eraseToAnyPublisher()
+//            }.eraseToAnyPublisher()
+//
+//            let bolusPublisher: AnyPublisher<Void, Error> = Deferred { () -> AnyPublisher<Void, Error> in
+//                if let error = self.verifyStatus() {
+//                    return Fail(error: error).eraseToAnyPublisher()
+//                }
+//                guard let smbToDeliver = determination.smbToDeliver else {
+//                    debug(.apsManager, "No bolus required")
+//                    return Just(()).setFailureType(to: Error.self)
+//                        .eraseToAnyPublisher()
+//                }
+//                return pump.enactBolus(units: Double(truncating: smbToDeliver), automatic: true).map { _ in
+//                    self.bolusProgress.send(0)
+//                    return ()
+//                }
+//                .eraseToAnyPublisher()
+//            }.eraseToAnyPublisher()
+//
+//            return basalPublisher.flatMap { bolusPublisher }.eraseToAnyPublisher()
+//
+//    }
+
     private func reportEnacted(received: Bool) {
         privateContext.performAndWait {
             guard let determination = fetchDetermination(), determination.deliverAt != nil else {

+ 2 - 1
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -196,12 +196,13 @@ extension Home {
             let rateString = numberFormatter.string(from: tempRate as NSNumber) ?? "0"
             var manualBasalString = ""
 
-            if state.apsManager.isManualTempBasal {
+            if let apsManager = state.apsManager, apsManager.isManualTempBasal {
                 manualBasalString = NSLocalizedString(
                     " - Manual Basal ⚠️",
                     comment: "Manual Temp basal"
                 )
             }
+
             return rateString + " " + NSLocalizedString(" U/hr", comment: "Unit per hour with space") + manualBasalString
         }