Implement readRSSI on Android and Darwin (#203)
This commit is contained in:
@@ -40,6 +40,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
private var characteristicWriteWithoutResponseFutures = [CharacteristicWriteFuture]()
|
||||
private var characteristicNotifyFutures = [CharacteristicNotifyFuture]()
|
||||
private var discoverServicesFutures = [DiscoverServicesFuture]()
|
||||
private var rssiReadFutures = [RssiReadFuture]()
|
||||
private var isManageScanning = false
|
||||
|
||||
init(callbackChannel: UniversalBleCallbackChannel) {
|
||||
@@ -200,6 +201,15 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
}
|
||||
return false
|
||||
}
|
||||
rssiReadFutures.removeAll { future in
|
||||
if future.deviceId == deviceId {
|
||||
future.result(
|
||||
Result.failure(createFlutterError(code: .deviceDisconnected, message: "Device Disconnected"))
|
||||
)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
activeServiceDiscoveries[deviceId]?.cleanup()
|
||||
activeServiceDiscoveries[deviceId] = nil
|
||||
}
|
||||
@@ -334,6 +344,16 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
completion(Result.success(mtuResult))
|
||||
}
|
||||
|
||||
func readRssi(deviceId: String, completion: @escaping (Result<Int64, Error>) -> Void) {
|
||||
UniversalBleLogger.shared.logDebug("READ_RSSI -> \(deviceId)")
|
||||
guard let peripheral = deviceId.findPeripheral(manager: manager) else {
|
||||
completion(Result.failure(createFlutterError(code: .deviceNotFound, message: "Unknown deviceId:\(deviceId)")))
|
||||
return
|
||||
}
|
||||
peripheral.readRSSI()
|
||||
rssiReadFutures.append(RssiReadFuture(deviceId: deviceId, result: completion))
|
||||
}
|
||||
|
||||
func isPaired(deviceId _: String, completion: @escaping (Result<Bool, Error>) -> Void) {
|
||||
completion(Result.failure(createFlutterError(code: .notSupported)))
|
||||
}
|
||||
@@ -531,6 +551,21 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
public func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
|
||||
rssiReadFutures.removeAll { future in
|
||||
if future.deviceId == peripheral.uuid.uuidString {
|
||||
if let flutterError = error?.toFlutterError() {
|
||||
UniversalBleLogger.shared.logError("READ_RSSI_FAILED <- \(peripheral.uuid.uuidString): \(flutterError.message ?? "")")
|
||||
future.result(Result.failure(flutterError))
|
||||
} else {
|
||||
future.result(Result.success(RSSI.int64Value))
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension CBPeripheral {
|
||||
|
||||
Reference in New Issue
Block a user