From 252274eaf9c30c335e9ae3fb466be69ceab887e7 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 22 Jan 2022 14:42:02 +0100 Subject: [PATCH] feat: remove bluetooth device when disconnected (#805) --- Modules/Bluetooth/popup.swift | 8 +++++--- Modules/Bluetooth/readers.swift | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Modules/Bluetooth/popup.swift b/Modules/Bluetooth/popup.swift index 97e64f7a..db184b99 100644 --- a/Modules/Bluetooth/popup.swift +++ b/Modules/Bluetooth/popup.swift @@ -15,8 +15,6 @@ import Kit internal class Popup: NSStackView, Popup_p { public var sizeCallback: ((NSSize) -> Void)? = nil - private var list: [UUID: BLEView] = [:] - public init() { super.init(frame: NSRect(x: 0, y: 0, width: Constants.Popup.width, height: 0)) @@ -29,7 +27,11 @@ internal class Popup: NSStackView, Popup_p { } internal func batteryCallback(_ list: [BLEDevice]) { - let views = self.subviews.filter{ $0 is BLEView }.map{ $0 as! BLEView } + var views = self.subviews.filter{ $0 is BLEView }.map{ $0 as! BLEView } + if list.count < views.count && !views.isEmpty { + views.forEach{ $0.removeFromSuperview() } + views = [] + } list.reversed().forEach { (ble: BLEDevice) in if let view = views.first(where: { $0.address == ble.address }) { diff --git a/Modules/Bluetooth/readers.swift b/Modules/Bluetooth/readers.swift index 3dc04700..f77f1646 100644 --- a/Modules/Bluetooth/readers.swift +++ b/Modules/Bluetooth/readers.swift @@ -31,6 +31,7 @@ private struct ioDevice { internal class DevicesReader: Reader<[BLEDevice]>, CBCentralManagerDelegate, CBPeripheralDelegate { private var devices: [BLEDevice] = [] + private var devicesToRemove: [UUID] = [] private var manager: CBCentralManager! private var characteristicsDict: [UUID: CBCharacteristic] = [:] @@ -107,6 +108,8 @@ internal class DevicesReader: Reader<[BLEDevice]>, CBCentralManagerDelegate, CBP if self.manager.isScanning { self.manager.connect(p, options: nil) } + } else if p.state == .disconnecting { + self.devicesToRemove.append(p.identifier) } else if p.state == .connected && !self.devices[idx].isPeripheralInitialized { p.delegate = self p.discoverServices([DevicesReader.batteryServiceUUID]) @@ -120,6 +123,16 @@ internal class DevicesReader: Reader<[BLEDevice]>, CBCentralManagerDelegate, CBP } } + if !self.devicesToRemove.isEmpty { + self.devices = self.devices.filter { (d: BLEDevice) -> Bool in + if let uuid = d.uuid, self.devicesToRemove.contains(uuid) { + return false + } + return true + } + self.devicesToRemove = [] + } + self.callback(self.devices.filter({ $0.RSSI != nil })) } @@ -210,6 +223,10 @@ internal class DevicesReader: Reader<[BLEDevice]>, CBCentralManagerDelegate, CBP } } + func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { + self.devicesToRemove.append(peripheral.identifier) + } + // MARK: - CBPeripheral func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {