Ivan Valkou 5 лет назад
Родитель
Сommit
21001e22be

+ 27 - 7
FreeAPS/Sources/APS/APSManager.swift

@@ -15,6 +15,7 @@ protocol APSManager {
     var isLooping: CurrentValueSubject<Bool, Never> { get }
     var lastLoopDate: Date { get }
     var lastLoopDateSubject: PassthroughSubject<Date, Never> { get }
+    var bolusProgress: CurrentValueSubject<Decimal?, Never> { get }
     var pumpExpiresAtDate: CurrentValueSubject<Date?, Never> { get }
     func enactTempBasal(rate: Double, duration: TimeInterval)
     func makeProfiles() -> AnyPublisher<Bool, Never>
@@ -75,6 +76,8 @@ final class BaseAPSManager: APSManager, Injectable {
     let lastLoopDateSubject = PassthroughSubject<Date, Never>()
     let lastError = CurrentValueSubject<Error?, Never>(nil)
 
+    let bolusProgress = CurrentValueSubject<Decimal?, Never>(nil)
+
     var pumpDisplayState: CurrentValueSubject<PumpDisplayState?, Never> {
         deviceDataManager.pumpDisplayState
     }
@@ -266,22 +269,28 @@ final class BaseAPSManager: APSManager, Injectable {
         return Decimal(pump.roundToSupportedBolusVolume(units: Double(amount)))
     }
 
+    private var bolusReporter: DoseProgressReporter?
+
     func enactBolus(amount: Double, isSMB: Bool) {
         guard let pump = pumpManager, verifyStatus() else { return }
 
         let roundedAmout = pump.roundToSupportedBolusVolume(units: amount)
-        pump.enactBolus(units: roundedAmout, automatic: false) { result in
-            switch result {
-            case .success:
+
+        pump.enactBolus(units: roundedAmout, automatic: isSMB).sink { completion in
+            if case let .failure(error) = completion {
+                debug(.apsManager, "Bolus failed with error: \(error.localizedDescription)")
+                self.processError(APSError.pumpError(error))
+            } else {
                 debug(.apsManager, "Bolus succeeded")
                 if !isSMB {
                     self.determineBasal().sink { _ in }.store(in: &self.lifetime)
                 }
-            case let .failure(error):
-                debug(.apsManager, "Bolus failed with error: \(error.localizedDescription)")
-                self.processError(APSError.pumpError(error))
             }
-        }
+
+            self.bolusReporter = pump.createBolusProgressReporter(reportingOn: self.processQueue)
+            self.bolusReporter?.addObserver(self)
+        } receiveValue: { _ in }
+            .store(in: &lifetime)
     }
 
     func enactTempBasal(rate: Double, duration: TimeInterval) {
@@ -556,6 +565,17 @@ extension BaseAPSManager: PumpManagerStatusObserver {
     }
 }
 
+extension BaseAPSManager: DoseProgressObserver {
+    func doseProgressReporterDidUpdate(_ doseProgressReporter: DoseProgressReporter) {
+        bolusProgress.send(Decimal(doseProgressReporter.progress.percentComplete))
+        if doseProgressReporter.progress.isComplete {
+            bolusReporter?.removeObserver(self)
+            bolusReporter = nil
+            bolusProgress.send(nil)
+        }
+    }
+}
+
 extension PumpManagerStatus {
     var pumpStatus: PumpStatus {
         let bolusing = bolusState != .noBolus

+ 5 - 0
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -17,6 +17,7 @@ protocol DeviceDataManager {
     var pumpName: CurrentValueSubject<String, Never> { get }
     var pumpExpiresAtDate: CurrentValueSubject<Date?, Never> { get }
     func heartbeat(date: Date, force: Bool)
+    func createBolusProgressReporter() -> DoseProgressReporter?
 }
 
 private let staticPumpManagers: [PumpManagerUI.Type] = [
@@ -86,6 +87,10 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
 
     @SyncAccess(lock: accessLock) private var pumpUpdateInProgress = false
 
+    func createBolusProgressReporter() -> DoseProgressReporter? {
+        pumpManager?.createBolusProgressReporter(reportingOn: processQueue)
+    }
+
     func heartbeat(date: Date, force: Bool) {
         if force {
             updatePumpData()

+ 6 - 0
FreeAPS/Sources/Modules/Home/HomeViewModel.swift

@@ -36,6 +36,7 @@ extension Home {
         @Published var setupPump = false
         @Published var errorMessage: String? = nil
         @Published var errorDate: Date? = nil
+        @Published var bolusProgress: Decimal?
 
         @Published var allowManualTemp = false
         private(set) var units: GlucoseUnits = .mmolL
@@ -109,6 +110,11 @@ extension Home {
                 }
                 .assign(to: \.errorMessage, on: self)
                 .store(in: &lifetime)
+
+            apsManager.bolusProgress
+                .receive(on: DispatchQueue.main)
+                .assign(to: \.bolusProgress, on: self)
+                .store(in: &lifetime)
         }
 
         func addCarbs() {

+ 5 - 0
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -136,6 +136,11 @@ extension Home {
                     }
                 }
                 Spacer()
+                if let progress = viewModel.bolusProgress {
+                    Text("Bolus " + (numberFormatter.string(from: progress * 100 as NSNumber)!) + "%")
+                        .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin)
+                        .padding(.trailing, 8)
+                }
             }
             .frame(maxWidth: .infinity, maxHeight: 30)
         }