From 0f90d8497a5b7fae2f522c923d3bec9ebdb99f3a Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 5 Nov 2025 16:21:10 -0800 Subject: [PATCH] Queue for peripherals --- .../Bluetooth Low Energy/BLETransport.swift | 50 ++++++++++++------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift b/Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift index aa1a32d4..12c9e33c 100644 --- a/Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift +++ b/Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift @@ -164,27 +164,39 @@ class BLETransport: Transport { } } + private let peripheralsQueue = DispatchQueue(label: "com.meshtastic.peripheralAccess", qos: .default) + func didDiscover(peripheral: CBPeripheral, rssi: NSNumber) { + guard !restoreInProgress else { return } - - let id = peripheral.identifier - let isNew = discoveredPeripherals[id] == nil - if isNew { - discoveredPeripherals[id] = (peripheral, Date()) - } - let device = Device(id: id, - name: peripheral.name ?? "Unknown", - transportType: .ble, - identifier: id.uuidString, - rssi: rssi.intValue) - if isNew { - Logger.transport.debug("🛜 [BLE] Did Discover new device: \(peripheral.name ?? "Unknown", privacy: .public) (\(peripheral.identifier, privacy: .public))") - discoveredDeviceContinuation?.yield(.deviceFound(device)) - } else { - let rssiVal = rssi.intValue - let deviceId = id - discoveredPeripherals[id]?.lastSeen = Date() - discoveredDeviceContinuation?.yield(.deviceReportedRssi(deviceId, rssiVal)) + + // Use the queue to ensure thread-safe access to the dictionary + peripheralsQueue.async { + let id = peripheral.identifier + let isNew = self.discoveredPeripherals[id] == nil + + // Update the dictionary + if isNew { + self.discoveredPeripherals[id] = (peripheral, Date()) + } else { + self.discoveredPeripherals[id]?.lastSeen = Date() + } + + let device = Device(id: id, + name: peripheral.name ?? "Unknown", + transportType: .ble, + identifier: id.uuidString, + rssi: rssi.intValue) + + // Safely yield results + if isNew { + Logger.transport.debug("🛜 [BLE] Did Discover new device: \(peripheral.name ?? "Unknown", privacy: .public) (\(peripheral.identifier, privacy: .public))") + self.discoveredDeviceContinuation?.yield(.deviceFound(device)) + } else { + let rssiVal = rssi.intValue + let deviceId = id + self.discoveredDeviceContinuation?.yield(.deviceReportedRssi(deviceId, rssiVal)) + } } }