feat: remove bluetooth device when disconnected (#805)

This commit is contained in:
Serhiy Mytrovtsiy
2022-01-22 14:42:02 +01:00
parent 2c10e790b2
commit 252274eaf9
2 changed files with 22 additions and 3 deletions

View File

@@ -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 }) {

View File

@@ -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?) {