|
|
@@ -34,7 +34,7 @@ private let staticPumpManagersByIdentifier: [String: PumpManagerUI.Type] = stati
|
|
|
private let accessLock = NSRecursiveLock(label: "BaseDeviceDataManager.accessLock")
|
|
|
|
|
|
final class BaseDeviceDataManager: DeviceDataManager, Injectable {
|
|
|
- private let processQueue = DispatchQueue(label: "BaseDeviceDataManager.processQueue")
|
|
|
+ private let processQueue = DispatchQueue.markedQueue(label: "BaseDeviceDataManager.processQueue")
|
|
|
@Injected() private var pumpHistoryStorage: PumpHistoryStorage!
|
|
|
@Injected() private var storage: FileStorage!
|
|
|
@Injected() private var broadcaster: Broadcaster!
|
|
|
@@ -65,13 +65,16 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
|
|
|
}
|
|
|
pumpExpiresAtDate.send(endTime)
|
|
|
}
|
|
|
- pumpManager.setMustProvideBLEHeartbeat(true)
|
|
|
} else {
|
|
|
pumpDisplayState.value = nil
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ var hasBLEHeartbeat: Bool {
|
|
|
+ (pumpManager as? MockPumpManager) == nil
|
|
|
+ }
|
|
|
+
|
|
|
let pumpDisplayState = CurrentValueSubject<PumpDisplayState?, Never>(nil)
|
|
|
let pumpExpiresAtDate = CurrentValueSubject<Date?, Never>(nil)
|
|
|
let pumpName = CurrentValueSubject<String, Never>("Pump")
|
|
|
@@ -88,37 +91,37 @@ 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()
|
|
|
- return
|
|
|
- }
|
|
|
+ processQueue.safeSync {
|
|
|
+ if force {
|
|
|
+ updatePumpData()
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- var updateInterval: TimeInterval = 5.minutes.timeInterval
|
|
|
+ var updateInterval: TimeInterval = 4.5 * 60
|
|
|
|
|
|
- switch lastHeartBeatTime.timeIntervalSince(date) {
|
|
|
- case let interval where interval < -10.minutes.timeInterval:
|
|
|
- break
|
|
|
- case let interval where interval < -5.minutes.timeInterval:
|
|
|
- updateInterval = 1.minutes.timeInterval
|
|
|
- default:
|
|
|
- break
|
|
|
- }
|
|
|
+ switch date.timeIntervalSince(lastHeartBeatTime) {
|
|
|
+ case let interval where interval > 10.minutes.timeInterval:
|
|
|
+ break
|
|
|
+ case let interval where interval > 5.minutes.timeInterval:
|
|
|
+ updateInterval = 1.minutes.timeInterval
|
|
|
+ default:
|
|
|
+ break
|
|
|
+ }
|
|
|
|
|
|
- let interval = date.timeIntervalSince(lastHeartBeatTime)
|
|
|
- guard interval >= updateInterval else {
|
|
|
- debug(.deviceManager, "Last hearbeat \(interval / 60) min ago, skip updating the pump data")
|
|
|
- return
|
|
|
- }
|
|
|
+ let interval = date.timeIntervalSince(lastHeartBeatTime)
|
|
|
+ guard interval >= updateInterval else {
|
|
|
+ debug(.deviceManager, "Last hearbeat \(interval / 60) min ago, skip updating the pump data")
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- lastHeartBeatTime = date
|
|
|
- updatePumpData()
|
|
|
+ lastHeartBeatTime = date
|
|
|
+ updatePumpData()
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private func updatePumpData() {
|
|
|
@@ -126,16 +129,11 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
|
|
|
debug(.deviceManager, "Pump is not set, skip updating")
|
|
|
return
|
|
|
}
|
|
|
- guard !pumpUpdateInProgress else {
|
|
|
- debug(.deviceManager, "Pump update in progress, skip updating")
|
|
|
- return
|
|
|
- }
|
|
|
+
|
|
|
debug(.deviceManager, "Start updating the pump data")
|
|
|
- pumpUpdateInProgress = true
|
|
|
|
|
|
pumpManager.ensureCurrentPumpData {
|
|
|
debug(.deviceManager, "Pump Data updated")
|
|
|
- self.pumpUpdateInProgress = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -173,8 +171,6 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
|
|
|
|
|
|
func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {
|
|
|
debug(.deviceManager, "Pump Heartbeat")
|
|
|
- pumpUpdateInProgress = false
|
|
|
- heartbeat(date: Date(), force: false)
|
|
|
}
|
|
|
|
|
|
func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
|
|
|
@@ -182,6 +178,7 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
|
|
|
}
|
|
|
|
|
|
func pumpManager(_ pumpManager: PumpManager, didUpdate status: PumpManagerStatus, oldStatus _: PumpManagerStatus) {
|
|
|
+ dispatchPrecondition(condition: .onQueue(processQueue))
|
|
|
debug(.deviceManager, "New pump status Bolus: \(status.bolusState)")
|
|
|
debug(.deviceManager, "New pump status Basal: \(String(describing: status.basalDeliveryState))")
|
|
|
|
|
|
@@ -220,16 +217,16 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
|
|
|
}
|
|
|
|
|
|
func pumpManagerWillDeactivate(_: PumpManager) {
|
|
|
+ dispatchPrecondition(condition: .onQueue(processQueue))
|
|
|
pumpManager = nil
|
|
|
- pumpUpdateInProgress = false
|
|
|
}
|
|
|
|
|
|
func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {}
|
|
|
|
|
|
func pumpManager(_: PumpManager, didError error: PumpManagerError) {
|
|
|
+ dispatchPrecondition(condition: .onQueue(processQueue))
|
|
|
debug(.deviceManager, "error: \(error.localizedDescription), reason: \(String(describing: error.failureReason))")
|
|
|
errorSubject.send(error)
|
|
|
- pumpUpdateInProgress = false
|
|
|
}
|
|
|
|
|
|
func pumpManager(
|
|
|
@@ -270,7 +267,6 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
|
|
|
|
|
|
func pumpManagerRecommendsLoop(_: PumpManager) {
|
|
|
dispatchPrecondition(condition: .onQueue(processQueue))
|
|
|
- pumpUpdateInProgress = false
|
|
|
debug(.deviceManager, "Recomends loop")
|
|
|
recommendsLoop.send()
|
|
|
}
|