mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-15 00:34:08 +09:00
feat: remove bluetooth device when disconnected (#805)
This commit is contained in:
@@ -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 }) {
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
Reference in New Issue
Block a user