Sfoglia il codice sorgente

Merge remote-tracking branch 'ivalkou/dev' into Crowdin

Jon B.M 4 anni fa
parent
commit
9ca366d903
1 ha cambiato i file con 38 aggiunte e 5 eliminazioni
  1. 38 5
      FreeAPS/Sources/APS/DeviceDataManager.swift

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

@@ -49,6 +49,8 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     let bolusTrigger = PassthroughSubject<Bool, Never>()
     let errorSubject = PassthroughSubject<Error, Never>()
     let pumpNewStatus = PassthroughSubject<Void, Never>()
+    @SyncAccess private var pumpUpdateCancellable: AnyCancellable?
+    private var pumpUpdatePromise: Future<Bool, Never>.Promise?
 
     var pumpManager: PumpManagerUI? {
         didSet {
@@ -97,6 +99,13 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     }
 
     func heartbeat(date: Date) {
+        guard pumpUpdateCancellable == nil else {
+            warning(.deviceManager, "Pump updating already in progress")
+            return
+        }
+
+        func update(_: Future<Bool, Never>.Promise?) {}
+
         processQueue.safeSync {
             lastHeartBeatTime = date
             updatePumpData()
@@ -106,14 +115,34 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
     private func updatePumpData() {
         guard let pumpManager = pumpManager else {
             debug(.deviceManager, "Pump is not set, skip updating")
+            updateUpdateFinished(false)
             return
         }
 
         debug(.deviceManager, "Start updating the pump data")
+        pumpUpdateCancellable = Future<Bool, Never> { [unowned self] promise in
+            pumpUpdatePromise = promise
+            debug(.deviceManager, "Waiting for pump update and loop recommendation")
+            processQueue.async {
+                pumpManager.ensureCurrentPumpData {
+                    debug(.deviceManager, "Pump data updated.")
+                }
+            }
+        }
+        .timeout(60, scheduler: processQueue)
+        .replaceError(with: false)
+        .replaceEmpty(with: false)
+        .sink(receiveValue: updateUpdateFinished)
+    }
 
-        pumpManager.ensureCurrentPumpData {
-            debug(.deviceManager, "Pump Data updated")
+    private func updateUpdateFinished(_ recommendsLoop: Bool) {
+        pumpUpdateCancellable = nil
+        pumpUpdatePromise = nil
+        if !recommendsLoop {
+            warning(.deviceManager, "Loop recommendation time out or got error. Starting loop right now.")
         }
+
+        self.recommendsLoop.send()
     }
 
     private func pumpManagerFromRawValue(_ rawValue: [String: Any]) -> PumpManagerUI? {
@@ -215,7 +244,7 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
     }
 
     func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
-        debug(.deviceManager, "Pump Heartbeat")
+        debug(.deviceManager, "Pump Heartbeat: do nothing. Pump connection is OK")
     }
 
     func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
@@ -312,8 +341,12 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
 
     func pumpManagerRecommendsLoop(_: PumpManager) {
         dispatchPrecondition(condition: .onQueue(processQueue))
-        debug(.deviceManager, "Recomends loop")
-        recommendsLoop.send()
+        debug(.deviceManager, "Pump recommends loop")
+        guard let promise = pumpUpdatePromise else {
+            warning(.deviceManager, "We do not waiting for loop recommendation at this time.")
+            return
+        }
+        promise(.success(true))
     }
 
     func startDateToFilterNewPumpEvents(for _: PumpManager) -> Date {