Implement unified and type safe error messages (#186)
* Implement unified and type safe error messages * Fix Apple error handling * improve linux exception handling * improve web exception handling * fix window imports * update pigeon generated files * Fix compilaton issue * Fix windows error parsing * Fix windows compilation * Improve error handling on dart side * rename _wrapFuture to _executeWithErrorHandling * Add pigeon generation script and format generated dart file * Update changelog * Update readme --------- Co-authored-by: Foti Dim <foti@navideck.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/src/utils/cache_handler.dart';
|
||||
import 'package:universal_ble/universal_ble.dart';
|
||||
|
||||
@@ -105,13 +106,17 @@ extension BleDeviceExtension on BleDevice {
|
||||
}
|
||||
|
||||
if (discoveredServices.isEmpty) {
|
||||
throw ServiceNotFoundException('No services found');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.serviceNotFound,
|
||||
message: 'No services found',
|
||||
);
|
||||
}
|
||||
|
||||
return discoveredServices.firstWhere(
|
||||
(s) => BleUuidParser.compareStrings(s.uuid, service),
|
||||
orElse: () => throw ServiceNotFoundException(
|
||||
'Service "$service" not available',
|
||||
orElse: () => throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.serviceNotFound,
|
||||
message: 'Service "$service" not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/universal_ble.dart';
|
||||
|
||||
/// Extension methods for [BleService] objects.
|
||||
@@ -8,12 +9,16 @@ extension BleServiceExtension on BleService {
|
||||
/// with the given UUID is not available.
|
||||
BleCharacteristic getCharacteristic(String characteristicId) {
|
||||
if (characteristics.isEmpty) {
|
||||
throw CharacteristicNotFoundException('No characteristics found');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message: 'No characteristics found',
|
||||
);
|
||||
}
|
||||
return characteristics.firstWhere(
|
||||
(c) => BleUuidParser.compareStrings(c.uuid, characteristicId),
|
||||
orElse: () => throw CharacteristicNotFoundException(
|
||||
'Characteristic "$characteristicId" not available',
|
||||
orElse: () => throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message: 'Characteristic "$characteristicId" not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,58 +1,85 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/src/utils/universal_ble_error_parser.dart';
|
||||
|
||||
class ConnectionException implements Exception {
|
||||
late String message;
|
||||
/// Base exception class for all BLE errors with typed error codes
|
||||
class UniversalBleException implements Exception {
|
||||
final UniversalBleErrorCode code;
|
||||
final String message;
|
||||
final dynamic details;
|
||||
|
||||
ConnectionException([dynamic error]) {
|
||||
message = _errorParser(error);
|
||||
UniversalBleException({
|
||||
required this.code,
|
||||
required this.message,
|
||||
this.details,
|
||||
});
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
|
||||
factory UniversalBleException.fromError(dynamic error) {
|
||||
String message = error.toString();
|
||||
dynamic details = error;
|
||||
if (error is PlatformException) {
|
||||
message = error.message ?? error.details?.toString() ?? error.code;
|
||||
details = error.details;
|
||||
}
|
||||
return UniversalBleException(
|
||||
code: UniversalBleErrorParser.getCode(error),
|
||||
message: message,
|
||||
details: details,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
}
|
||||
|
||||
class PairingException implements Exception {
|
||||
late String message;
|
||||
/// Exception thrown when connection-related errors occur
|
||||
class ConnectionException extends UniversalBleException {
|
||||
ConnectionException._({
|
||||
required super.code,
|
||||
required super.message,
|
||||
super.details,
|
||||
});
|
||||
|
||||
PairingException([dynamic error]) {
|
||||
message = _errorParser(error);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
ConnectionException([dynamic error])
|
||||
: this._(
|
||||
code: UniversalBleErrorParser.getCode(error),
|
||||
message: _errorParser(error),
|
||||
details: error,
|
||||
);
|
||||
}
|
||||
|
||||
class WebBluetoothGloballyDisabled implements Exception {
|
||||
String message;
|
||||
WebBluetoothGloballyDisabled(this.message);
|
||||
/// Exception thrown when pairing-related errors occur
|
||||
class PairingException extends UniversalBleException {
|
||||
PairingException._({
|
||||
required super.code,
|
||||
required super.message,
|
||||
super.details,
|
||||
});
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
/// Legacy constructor for backward compatibility
|
||||
PairingException([dynamic error])
|
||||
: this._(
|
||||
code: UniversalBleErrorParser.getCode(error),
|
||||
message: _errorParser(error),
|
||||
details: error,
|
||||
);
|
||||
}
|
||||
|
||||
class NotFoundException implements Exception {}
|
||||
|
||||
class ServiceNotFoundException implements NotFoundException {
|
||||
String message;
|
||||
ServiceNotFoundException(this.message);
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
}
|
||||
|
||||
class CharacteristicNotFoundException implements NotFoundException {
|
||||
String message;
|
||||
CharacteristicNotFoundException(this.message);
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
/// Exception thrown when Web Bluetooth API is globally disabled
|
||||
class WebBluetoothGloballyDisabled extends UniversalBleException {
|
||||
WebBluetoothGloballyDisabled({
|
||||
super.code = UniversalBleErrorCode.webBluetoothGloballyDisabled,
|
||||
required super.message,
|
||||
super.details,
|
||||
});
|
||||
}
|
||||
|
||||
/// Legacy error parser for backward compatibility
|
||||
String _errorParser(dynamic error) {
|
||||
if (error == null) {
|
||||
return "Failed";
|
||||
} else if (error is PlatformException) {
|
||||
return error.message ?? error.details ?? error.code;
|
||||
return error.message ?? error.details ?? error.code ?? 'Unknown error';
|
||||
} else if (error is String) {
|
||||
return error;
|
||||
} else {
|
||||
|
||||
@@ -3,9 +3,12 @@ import 'dart:async';
|
||||
import 'package:bluez/bluez.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:universal_ble/src/models/model_exports.dart';
|
||||
import 'package:universal_ble/src/utils/universal_ble_error_parser.dart';
|
||||
import 'package:universal_ble/src/utils/universal_ble_filter_util.dart';
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/src/universal_ble_platform_interface.dart';
|
||||
import 'package:universal_ble/src/utils/universal_logger.dart';
|
||||
import 'package:universal_ble/src/universal_ble_exceptions.dart';
|
||||
|
||||
class UniversalBleLinux extends UniversalBlePlatform {
|
||||
UniversalBleLinux._();
|
||||
@@ -180,7 +183,10 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
|
||||
if (device.gattServices.isEmpty && !device.servicesResolved) {
|
||||
throw "Failed to resolve services";
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.failed,
|
||||
message: "Failed to resolve services",
|
||||
);
|
||||
}
|
||||
|
||||
List<BleService> services = [];
|
||||
@@ -217,7 +223,10 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
orElse: () => null);
|
||||
|
||||
if (c == null) {
|
||||
throw Exception('Unknown characteristic:$characteristic');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message: 'Unknown characteristic:$characteristic',
|
||||
);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
@@ -279,9 +288,8 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
final data = await c.readValue();
|
||||
return Uint8List.fromList(data);
|
||||
} on BlueZFailedException catch (e) {
|
||||
throw PlatformException(
|
||||
code: e.errorCode ?? "ReadFailed",
|
||||
message: e.message,
|
||||
throw e.toUniversalBleException(
|
||||
defaultCode: UniversalBleErrorCode.readFailed,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -307,9 +315,8 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
);
|
||||
}
|
||||
} on BlueZFailedException catch (e) {
|
||||
throw PlatformException(
|
||||
code: e.errorCode ?? "WriteFailed",
|
||||
message: e.message,
|
||||
throw e.toUniversalBleException(
|
||||
defaultCode: UniversalBleErrorCode.writeFailed,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -317,7 +324,12 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
@override
|
||||
Future<int> requestMtu(String deviceId, int expectedMtu) async {
|
||||
final device = _findDeviceById(deviceId);
|
||||
if (!device.connected) throw Exception('Device not connected');
|
||||
if (!device.connected) {
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.deviceDisconnected,
|
||||
message: 'Device not connected',
|
||||
);
|
||||
}
|
||||
for (BlueZGattService service in device.gattServices) {
|
||||
for (BlueZGattCharacteristic characteristic in service.characteristics) {
|
||||
int? mtu = characteristic.mtu;
|
||||
@@ -325,7 +337,10 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
if (mtu != null) return mtu - 3;
|
||||
}
|
||||
}
|
||||
throw Exception('MTU not available');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.operationNotSupported,
|
||||
message: 'MTU not available',
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -393,7 +408,10 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
(device) => device?.address == deviceId,
|
||||
orElse: () => null);
|
||||
if (device == null) {
|
||||
throw Exception('Unknown deviceId:$deviceId');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.deviceNotFound,
|
||||
message: 'Unknown deviceId:$deviceId',
|
||||
);
|
||||
}
|
||||
return device;
|
||||
}
|
||||
@@ -459,7 +477,10 @@ class UniversalBleLinux extends UniversalBlePlatform {
|
||||
}
|
||||
|
||||
if (client.adapters.isEmpty) {
|
||||
throw Exception('Bluetooth adapter unavailable');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.bluetoothNotAvailable,
|
||||
message: 'Bluetooth adapter unavailable',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -584,6 +605,21 @@ extension on BlueZGattCharacteristicFlag {
|
||||
}
|
||||
|
||||
extension on BlueZFailedException {
|
||||
UniversalBleException toUniversalBleException({
|
||||
required UniversalBleErrorCode defaultCode,
|
||||
}) {
|
||||
// Map BlueZ error code to UniversalBleErrorCode
|
||||
UniversalBleErrorCode code = UniversalBleErrorParser.getCode(errorCode);
|
||||
if (code == UniversalBleErrorCode.unknownError) {
|
||||
code = defaultCode;
|
||||
}
|
||||
throw UniversalBleException(
|
||||
code: code,
|
||||
message: message,
|
||||
details: errorCode,
|
||||
);
|
||||
}
|
||||
|
||||
/// Extract error code from message and parse into decimal
|
||||
/// example: 'Operation failed with ATT error: 0x90' => 144
|
||||
String? get errorCode {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Autogenerated from Pigeon (v22.6.1), do not edit directly.
|
||||
// Autogenerated from Pigeon (v26.0.5), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers
|
||||
|
||||
@@ -15,7 +15,8 @@ PlatformException _createConnectionError(String channelName) {
|
||||
);
|
||||
}
|
||||
|
||||
List<Object?> wrapResponse({Object? result, PlatformException? error, bool empty = false}) {
|
||||
List<Object?> wrapResponse(
|
||||
{Object? result, PlatformException? error, bool empty = false}) {
|
||||
if (empty) {
|
||||
return <Object?>[];
|
||||
}
|
||||
@@ -25,6 +26,86 @@ List<Object?> wrapResponse({Object? result, PlatformException? error, bool empty
|
||||
return <Object?>[error.code, error.message, error.details];
|
||||
}
|
||||
|
||||
bool _deepEquals(Object? a, Object? b) {
|
||||
if (a is List && b is List) {
|
||||
return a.length == b.length &&
|
||||
a.indexed
|
||||
.every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));
|
||||
}
|
||||
if (a is Map && b is Map) {
|
||||
return a.length == b.length &&
|
||||
a.entries.every((MapEntry<Object?, Object?> entry) =>
|
||||
(b as Map<Object?, Object?>).containsKey(entry.key) &&
|
||||
_deepEquals(entry.value, b[entry.key]));
|
||||
}
|
||||
return a == b;
|
||||
}
|
||||
|
||||
/// Unified error codes for all platforms
|
||||
enum UniversalBleErrorCode {
|
||||
unknownError,
|
||||
failed,
|
||||
notSupported,
|
||||
notImplemented,
|
||||
channelError,
|
||||
bluetoothNotAvailable,
|
||||
bluetoothNotEnabled,
|
||||
bluetoothNotAllowed,
|
||||
bluetoothUnauthorized,
|
||||
deviceDisconnected,
|
||||
connectionTimeout,
|
||||
connectionFailed,
|
||||
connectionRejected,
|
||||
connectionLimitExceeded,
|
||||
connectionAlreadyExists,
|
||||
connectionTerminated,
|
||||
connectionInProgress,
|
||||
illegalArgument,
|
||||
deviceNotFound,
|
||||
serviceNotFound,
|
||||
characteristicNotFound,
|
||||
invalidServiceUuid,
|
||||
invalidCharacteristicUuid,
|
||||
invalidOffset,
|
||||
invalidAttributeLength,
|
||||
invalidPdu,
|
||||
invalidHandle,
|
||||
readFailed,
|
||||
readNotPermitted,
|
||||
writeFailed,
|
||||
writeNotPermitted,
|
||||
writeRequestBusy,
|
||||
invalidAction,
|
||||
operationNotSupported,
|
||||
operationTimeout,
|
||||
operationCancelled,
|
||||
operationInProgress,
|
||||
characteristicDoesNotSupportRead,
|
||||
characteristicDoesNotSupportWrite,
|
||||
characteristicDoesNotSupportWriteWithoutResponse,
|
||||
characteristicDoesNotSupportNotify,
|
||||
characteristicDoesNotSupportIndicate,
|
||||
notPaired,
|
||||
notPairable,
|
||||
alreadyPaired,
|
||||
pairingFailed,
|
||||
pairingCancelled,
|
||||
pairingTimeout,
|
||||
pairingNotAllowed,
|
||||
authenticationFailure,
|
||||
insufficientAuthentication,
|
||||
insufficientAuthorization,
|
||||
insufficientEncryption,
|
||||
insufficientKeySize,
|
||||
protectionLevelNotMet,
|
||||
accessDenied,
|
||||
unpairingFailed,
|
||||
alreadyUnpaired,
|
||||
scanFailed,
|
||||
stoppingScanInProgress,
|
||||
webBluetoothGloballyDisabled,
|
||||
}
|
||||
|
||||
class UniversalBleScanResult {
|
||||
UniversalBleScanResult({
|
||||
required this.deviceId,
|
||||
@@ -47,7 +128,7 @@ class UniversalBleScanResult {
|
||||
|
||||
List<String>? services;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
deviceId,
|
||||
name,
|
||||
@@ -58,6 +139,10 @@ class UniversalBleScanResult {
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalBleScanResult decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalBleScanResult(
|
||||
@@ -65,10 +150,27 @@ class UniversalBleScanResult {
|
||||
name: result[1] as String?,
|
||||
isPaired: result[2] as bool?,
|
||||
rssi: result[3] as int?,
|
||||
manufacturerDataList: (result[4] as List<Object?>?)?.cast<UniversalManufacturerData>(),
|
||||
manufacturerDataList:
|
||||
(result[4] as List<Object?>?)?.cast<UniversalManufacturerData>(),
|
||||
services: (result[5] as List<Object?>?)?.cast<String>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalBleScanResult || other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
class UniversalBleService {
|
||||
@@ -81,20 +183,41 @@ class UniversalBleService {
|
||||
|
||||
List<UniversalBleCharacteristic>? characteristics;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
uuid,
|
||||
characteristics,
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalBleService decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalBleService(
|
||||
uuid: result[0]! as String,
|
||||
characteristics: (result[1] as List<Object?>?)?.cast<UniversalBleCharacteristic>(),
|
||||
characteristics:
|
||||
(result[1] as List<Object?>?)?.cast<UniversalBleCharacteristic>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalBleService || other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
class UniversalBleCharacteristic {
|
||||
@@ -107,13 +230,17 @@ class UniversalBleCharacteristic {
|
||||
|
||||
List<int> properties;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
uuid,
|
||||
properties,
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalBleCharacteristic decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalBleCharacteristic(
|
||||
@@ -121,6 +248,23 @@ class UniversalBleCharacteristic {
|
||||
properties: (result[1] as List<Object?>?)!.cast<int>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalBleCharacteristic ||
|
||||
other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
/// Scan Filters
|
||||
@@ -137,7 +281,7 @@ class UniversalScanFilter {
|
||||
|
||||
List<UniversalManufacturerDataFilter> withManufacturerData;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
withServices,
|
||||
withNamePrefix,
|
||||
@@ -145,14 +289,35 @@ class UniversalScanFilter {
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalScanFilter decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalScanFilter(
|
||||
withServices: (result[0] as List<Object?>?)!.cast<String>(),
|
||||
withNamePrefix: (result[1] as List<Object?>?)!.cast<String>(),
|
||||
withManufacturerData: (result[2] as List<Object?>?)!.cast<UniversalManufacturerDataFilter>(),
|
||||
withManufacturerData: (result[2] as List<Object?>?)!
|
||||
.cast<UniversalManufacturerDataFilter>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalScanFilter || other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
class UniversalManufacturerDataFilter {
|
||||
@@ -168,7 +333,7 @@ class UniversalManufacturerDataFilter {
|
||||
|
||||
Uint8List? mask;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
companyIdentifier,
|
||||
data,
|
||||
@@ -176,6 +341,10 @@ class UniversalManufacturerDataFilter {
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalManufacturerDataFilter decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalManufacturerDataFilter(
|
||||
@@ -184,6 +353,23 @@ class UniversalManufacturerDataFilter {
|
||||
mask: result[2] as Uint8List?,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalManufacturerDataFilter ||
|
||||
other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
class UniversalManufacturerData {
|
||||
@@ -196,13 +382,17 @@ class UniversalManufacturerData {
|
||||
|
||||
Uint8List data;
|
||||
|
||||
Object encode() {
|
||||
List<Object?> _toList() {
|
||||
return <Object?>[
|
||||
companyIdentifier,
|
||||
data,
|
||||
];
|
||||
}
|
||||
|
||||
Object encode() {
|
||||
return _toList();
|
||||
}
|
||||
|
||||
static UniversalManufacturerData decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return UniversalManufacturerData(
|
||||
@@ -210,8 +400,24 @@ class UniversalManufacturerData {
|
||||
data: result[1]! as Uint8List,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
bool operator ==(Object other) {
|
||||
if (other is! UniversalManufacturerData ||
|
||||
other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
return _deepEquals(encode(), other.encode());
|
||||
}
|
||||
|
||||
@override
|
||||
// ignore: avoid_equals_and_hash_code_on_mutable_classes
|
||||
int get hashCode => Object.hashAll(_toList());
|
||||
}
|
||||
|
||||
class _PigeonCodec extends StandardMessageCodec {
|
||||
const _PigeonCodec();
|
||||
@@ -220,24 +426,27 @@ class _PigeonCodec extends StandardMessageCodec {
|
||||
if (value is int) {
|
||||
buffer.putUint8(4);
|
||||
buffer.putInt64(value);
|
||||
} else if (value is UniversalBleScanResult) {
|
||||
} else if (value is UniversalBleErrorCode) {
|
||||
buffer.putUint8(129);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalBleService) {
|
||||
writeValue(buffer, value.index);
|
||||
} else if (value is UniversalBleScanResult) {
|
||||
buffer.putUint8(130);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalBleCharacteristic) {
|
||||
} else if (value is UniversalBleService) {
|
||||
buffer.putUint8(131);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalScanFilter) {
|
||||
} else if (value is UniversalBleCharacteristic) {
|
||||
buffer.putUint8(132);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalManufacturerDataFilter) {
|
||||
} else if (value is UniversalScanFilter) {
|
||||
buffer.putUint8(133);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalManufacturerData) {
|
||||
} else if (value is UniversalManufacturerDataFilter) {
|
||||
buffer.putUint8(134);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is UniversalManufacturerData) {
|
||||
buffer.putUint8(135);
|
||||
writeValue(buffer, value.encode());
|
||||
} else {
|
||||
super.writeValue(buffer, value);
|
||||
}
|
||||
@@ -246,17 +455,20 @@ class _PigeonCodec extends StandardMessageCodec {
|
||||
@override
|
||||
Object? readValueOfType(int type, ReadBuffer buffer) {
|
||||
switch (type) {
|
||||
case 129:
|
||||
case 129:
|
||||
final int? value = readValue(buffer) as int?;
|
||||
return value == null ? null : UniversalBleErrorCode.values[value];
|
||||
case 130:
|
||||
return UniversalBleScanResult.decode(readValue(buffer)!);
|
||||
case 130:
|
||||
case 131:
|
||||
return UniversalBleService.decode(readValue(buffer)!);
|
||||
case 131:
|
||||
case 132:
|
||||
return UniversalBleCharacteristic.decode(readValue(buffer)!);
|
||||
case 132:
|
||||
case 133:
|
||||
return UniversalScanFilter.decode(readValue(buffer)!);
|
||||
case 133:
|
||||
case 134:
|
||||
return UniversalManufacturerDataFilter.decode(readValue(buffer)!);
|
||||
case 134:
|
||||
case 135:
|
||||
return UniversalManufacturerData.decode(readValue(buffer)!);
|
||||
default:
|
||||
return super.readValueOfType(type, buffer);
|
||||
@@ -269,9 +481,11 @@ class UniversalBlePlatformChannel {
|
||||
/// Constructor for [UniversalBlePlatformChannel]. The [binaryMessenger] named argument is
|
||||
/// available for dependency injection. If it is left null, the default
|
||||
/// BinaryMessenger will be used which routes to the host platform.
|
||||
UniversalBlePlatformChannel({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
|
||||
UniversalBlePlatformChannel(
|
||||
{BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
|
||||
: pigeonVar_binaryMessenger = binaryMessenger,
|
||||
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
|
||||
pigeonVar_messageChannelSuffix =
|
||||
messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
|
||||
final BinaryMessenger? pigeonVar_binaryMessenger;
|
||||
|
||||
static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();
|
||||
@@ -279,14 +493,17 @@ class UniversalBlePlatformChannel {
|
||||
final String pigeonVar_messageChannelSuffix;
|
||||
|
||||
Future<int> getBluetoothAvailabilityState() async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getBluetoothAvailabilityState$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getBluetoothAvailabilityState$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(null) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -306,14 +523,17 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<bool> enableBluetooth() async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.enableBluetooth$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.enableBluetooth$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(null) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -333,14 +553,17 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<bool> disableBluetooth() async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.disableBluetooth$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.disableBluetooth$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(null) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -360,14 +583,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<void> startScan(UniversalScanFilter? filter) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.startScan$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.startScan$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[filter]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[filter]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -382,14 +609,17 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<void> stopScan() async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.stopScan$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.stopScan$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(null) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -404,14 +634,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<void> connect(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.connect$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.connect$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -426,14 +660,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<void> disconnect(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.disconnect$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.disconnect$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -447,15 +685,20 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setNotifiable(String deviceId, String service, String characteristic, int bleInputProperty) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.setNotifiable$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
Future<void> setNotifiable(String deviceId, String service,
|
||||
String characteristic, int bleInputProperty) async {
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.setNotifiable$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel
|
||||
.send(<Object?>[deviceId, service, characteristic, bleInputProperty]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId, service, characteristic, bleInputProperty]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -470,14 +713,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<List<UniversalBleService>> discoverServices(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.discoverServices$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.discoverServices$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -492,19 +739,25 @@ class UniversalBlePlatformChannel {
|
||||
message: 'Host platform returned null value for non-null return value.',
|
||||
);
|
||||
} else {
|
||||
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<UniversalBleService>();
|
||||
return (pigeonVar_replyList[0] as List<Object?>?)!
|
||||
.cast<UniversalBleService>();
|
||||
}
|
||||
}
|
||||
|
||||
Future<Uint8List> readValue(String deviceId, String service, String characteristic) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.readValue$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
Future<Uint8List> readValue(
|
||||
String deviceId, String service, String characteristic) async {
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.readValue$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId, service, characteristic]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId, service, characteristic]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -524,14 +777,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<int> requestMtu(String deviceId, int expectedMtu) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.requestMtu$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.requestMtu$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId, expectedMtu]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId, expectedMtu]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -550,15 +807,20 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> writeValue(String deviceId, String service, String characteristic, Uint8List value, int bleOutputProperty) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.writeValue$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
Future<void> writeValue(String deviceId, String service,
|
||||
String characteristic, Uint8List value, int bleOutputProperty) async {
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.writeValue$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(
|
||||
<Object?>[deviceId, service, characteristic, value, bleOutputProperty]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId, service, characteristic, value, bleOutputProperty]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -573,14 +835,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<bool> isPaired(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.isPaired$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.isPaired$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -600,14 +866,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<bool> pair(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.pair$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.pair$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -627,14 +897,18 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
|
||||
Future<void> unPair(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.unPair$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.unPair$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -648,15 +922,20 @@ class UniversalBlePlatformChannel {
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<UniversalBleScanResult>> getSystemDevices(List<String> withServices) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getSystemDevices$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
Future<List<UniversalBleScanResult>> getSystemDevices(
|
||||
List<String> withServices) async {
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getSystemDevices$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[withServices]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[withServices]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -671,19 +950,24 @@ class UniversalBlePlatformChannel {
|
||||
message: 'Host platform returned null value for non-null return value.',
|
||||
);
|
||||
} else {
|
||||
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<UniversalBleScanResult>();
|
||||
return (pigeonVar_replyList[0] as List<Object?>?)!
|
||||
.cast<UniversalBleScanResult>();
|
||||
}
|
||||
}
|
||||
|
||||
Future<int> getConnectionState(String deviceId) async {
|
||||
final String pigeonVar_channelName = 'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getConnectionState$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
final String pigeonVar_channelName =
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.getConnectionState$pigeonVar_messageChannelSuffix';
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel =
|
||||
BasicMessageChannel<Object?>(
|
||||
pigeonVar_channelName,
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: pigeonVar_binaryMessenger,
|
||||
);
|
||||
final Future<Object?> pigeonVar_sendFuture =
|
||||
pigeonVar_channel.send(<Object?>[deviceId]);
|
||||
final List<Object?>? pigeonVar_replyList =
|
||||
await pigeonVar_channel.send(<Object?>[deviceId]) as List<Object?>?;
|
||||
await pigeonVar_sendFuture as List<Object?>?;
|
||||
if (pigeonVar_replyList == null) {
|
||||
throw _createConnectionError(pigeonVar_channelName);
|
||||
} else if (pigeonVar_replyList.length > 1) {
|
||||
@@ -713,22 +997,31 @@ abstract class UniversalBleCallbackChannel {
|
||||
|
||||
void onScanResult(UniversalBleScanResult result);
|
||||
|
||||
void onValueChanged(String deviceId, String characteristicId, Uint8List value);
|
||||
void onValueChanged(
|
||||
String deviceId, String characteristicId, Uint8List value);
|
||||
|
||||
void onConnectionChanged(String deviceId, bool connected, String? error);
|
||||
|
||||
static void setUp(UniversalBleCallbackChannel? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) {
|
||||
messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
|
||||
static void setUp(
|
||||
UniversalBleCallbackChannel? api, {
|
||||
BinaryMessenger? binaryMessenger,
|
||||
String messageChannelSuffix = '',
|
||||
}) {
|
||||
messageChannelSuffix =
|
||||
messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
|
||||
{
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onAvailabilityChanged$messageChannelSuffix', pigeonChannelCodec,
|
||||
final BasicMessageChannel<
|
||||
Object?> pigeonVar_channel = BasicMessageChannel<
|
||||
Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onAvailabilityChanged$messageChannelSuffix',
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: binaryMessenger);
|
||||
if (api == null) {
|
||||
pigeonVar_channel.setMessageHandler(null);
|
||||
} else {
|
||||
pigeonVar_channel.setMessageHandler((Object? message) async {
|
||||
assert(message != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onAvailabilityChanged was null.');
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onAvailabilityChanged was null.');
|
||||
final List<Object?> args = (message as List<Object?>?)!;
|
||||
final int? arg_state = (args[0] as int?);
|
||||
assert(arg_state != null,
|
||||
@@ -738,22 +1031,26 @@ abstract class UniversalBleCallbackChannel {
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
} catch (e) {
|
||||
return wrapResponse(
|
||||
error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
{
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onPairStateChange$messageChannelSuffix', pigeonChannelCodec,
|
||||
final BasicMessageChannel<
|
||||
Object?> pigeonVar_channel = BasicMessageChannel<
|
||||
Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onPairStateChange$messageChannelSuffix',
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: binaryMessenger);
|
||||
if (api == null) {
|
||||
pigeonVar_channel.setMessageHandler(null);
|
||||
} else {
|
||||
pigeonVar_channel.setMessageHandler((Object? message) async {
|
||||
assert(message != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onPairStateChange was null.');
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onPairStateChange was null.');
|
||||
final List<Object?> args = (message as List<Object?>?)!;
|
||||
final String? arg_deviceId = (args[0] as String?);
|
||||
assert(arg_deviceId != null,
|
||||
@@ -767,24 +1064,29 @@ abstract class UniversalBleCallbackChannel {
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
} catch (e) {
|
||||
return wrapResponse(
|
||||
error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
{
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onScanResult$messageChannelSuffix', pigeonChannelCodec,
|
||||
final BasicMessageChannel<
|
||||
Object?> pigeonVar_channel = BasicMessageChannel<
|
||||
Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onScanResult$messageChannelSuffix',
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: binaryMessenger);
|
||||
if (api == null) {
|
||||
pigeonVar_channel.setMessageHandler(null);
|
||||
} else {
|
||||
pigeonVar_channel.setMessageHandler((Object? message) async {
|
||||
assert(message != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onScanResult was null.');
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onScanResult was null.');
|
||||
final List<Object?> args = (message as List<Object?>?)!;
|
||||
final UniversalBleScanResult? arg_result = (args[0] as UniversalBleScanResult?);
|
||||
final UniversalBleScanResult? arg_result =
|
||||
(args[0] as UniversalBleScanResult?);
|
||||
assert(arg_result != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onScanResult was null, expected non-null UniversalBleScanResult.');
|
||||
try {
|
||||
@@ -792,22 +1094,26 @@ abstract class UniversalBleCallbackChannel {
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
} catch (e) {
|
||||
return wrapResponse(
|
||||
error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
{
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onValueChanged$messageChannelSuffix', pigeonChannelCodec,
|
||||
final BasicMessageChannel<
|
||||
Object?> pigeonVar_channel = BasicMessageChannel<
|
||||
Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onValueChanged$messageChannelSuffix',
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: binaryMessenger);
|
||||
if (api == null) {
|
||||
pigeonVar_channel.setMessageHandler(null);
|
||||
} else {
|
||||
pigeonVar_channel.setMessageHandler((Object? message) async {
|
||||
assert(message != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onValueChanged was null.');
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onValueChanged was null.');
|
||||
final List<Object?> args = (message as List<Object?>?)!;
|
||||
final String? arg_deviceId = (args[0] as String?);
|
||||
assert(arg_deviceId != null,
|
||||
@@ -819,26 +1125,31 @@ abstract class UniversalBleCallbackChannel {
|
||||
assert(arg_value != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onValueChanged was null, expected non-null Uint8List.');
|
||||
try {
|
||||
api.onValueChanged(arg_deviceId!, arg_characteristicId!, arg_value!);
|
||||
api.onValueChanged(
|
||||
arg_deviceId!, arg_characteristicId!, arg_value!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
} catch (e) {
|
||||
return wrapResponse(
|
||||
error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
{
|
||||
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onConnectionChanged$messageChannelSuffix', pigeonChannelCodec,
|
||||
final BasicMessageChannel<
|
||||
Object?> pigeonVar_channel = BasicMessageChannel<
|
||||
Object?>(
|
||||
'dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onConnectionChanged$messageChannelSuffix',
|
||||
pigeonChannelCodec,
|
||||
binaryMessenger: binaryMessenger);
|
||||
if (api == null) {
|
||||
pigeonVar_channel.setMessageHandler(null);
|
||||
} else {
|
||||
pigeonVar_channel.setMessageHandler((Object? message) async {
|
||||
assert(message != null,
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onConnectionChanged was null.');
|
||||
'Argument for dev.flutter.pigeon.universal_ble.UniversalBleCallbackChannel.onConnectionChanged was null.');
|
||||
final List<Object?> args = (message as List<Object?>?)!;
|
||||
final String? arg_deviceId = (args[0] as String?);
|
||||
assert(arg_deviceId != null,
|
||||
@@ -852,8 +1163,9 @@ abstract class UniversalBleCallbackChannel {
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
} catch (e) {
|
||||
return wrapResponse(
|
||||
error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/src/utils/universal_ble_filter_util.dart';
|
||||
import 'package:universal_ble/universal_ble.dart';
|
||||
@@ -18,7 +17,9 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
|
||||
@override
|
||||
Future<AvailabilityState> getBluetoothAvailabilityState() async {
|
||||
int state = await _channel.getBluetoothAvailabilityState();
|
||||
int state = await _executeWithErrorHandling(
|
||||
() => _channel.getBluetoothAvailabilityState(),
|
||||
);
|
||||
return AvailabilityState.parse(state);
|
||||
}
|
||||
|
||||
@@ -27,7 +28,7 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
if (!BleCapabilities.supportsBluetoothEnableApi) {
|
||||
throw UnsupportedError("Not supported");
|
||||
}
|
||||
return _channel.enableBluetooth();
|
||||
return _executeWithErrorHandling(() => _channel.enableBluetooth());
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -35,7 +36,7 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
if (!BleCapabilities.supportsBluetoothEnableApi) {
|
||||
throw UnsupportedError("Not supported");
|
||||
}
|
||||
return _channel.disableBluetooth();
|
||||
return _executeWithErrorHandling(() => _channel.disableBluetooth());
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -45,31 +46,37 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
}) async {
|
||||
await _ensureInitialized();
|
||||
_bleFilter.scanFilter = scanFilter;
|
||||
await _channel.startScan(
|
||||
scanFilter.toUniversalScanFilter(),
|
||||
await _executeWithErrorHandling(
|
||||
() => _channel.startScan(
|
||||
scanFilter.toUniversalScanFilter(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> stopScan() => _channel.stopScan();
|
||||
Future<void> stopScan() =>
|
||||
_executeWithErrorHandling(() => _channel.stopScan());
|
||||
|
||||
@override
|
||||
Future<BleConnectionState> getConnectionState(String deviceId) async {
|
||||
int state = await _channel.getConnectionState(deviceId);
|
||||
int state = await _executeWithErrorHandling(
|
||||
() => _channel.getConnectionState(deviceId));
|
||||
return BleConnectionState.parse(state);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> connect(String deviceId, {Duration? connectionTimeout}) =>
|
||||
_channel.connect(deviceId);
|
||||
_executeWithErrorHandling(() => _channel.connect(deviceId));
|
||||
|
||||
@override
|
||||
Future<void> disconnect(String deviceId) => _channel.disconnect(deviceId);
|
||||
Future<void> disconnect(String deviceId) =>
|
||||
_executeWithErrorHandling(() => _channel.disconnect(deviceId));
|
||||
|
||||
@override
|
||||
Future<List<BleService>> discoverServices(String deviceId) async {
|
||||
List<UniversalBleService?> universalBleServices =
|
||||
await _channel.discoverServices(deviceId);
|
||||
await _executeWithErrorHandling(
|
||||
() => _channel.discoverServices(deviceId));
|
||||
return List<BleService>.from(universalBleServices
|
||||
.where((e) => e != null)
|
||||
.map((e) => e!.toBleService(deviceId))
|
||||
@@ -79,12 +86,12 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
@override
|
||||
Future<void> setNotifiable(String deviceId, String service,
|
||||
String characteristic, BleInputProperty bleInputProperty) {
|
||||
return _channel.setNotifiable(
|
||||
deviceId,
|
||||
service,
|
||||
characteristic,
|
||||
bleInputProperty.index,
|
||||
);
|
||||
return _executeWithErrorHandling(() => _channel.setNotifiable(
|
||||
deviceId,
|
||||
service,
|
||||
characteristic,
|
||||
bleInputProperty.index,
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -94,7 +101,8 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
String characteristic, {
|
||||
final Duration? timeout,
|
||||
}) {
|
||||
return _channel.readValue(deviceId, service, characteristic);
|
||||
return _executeWithErrorHandling(
|
||||
() => _channel.readValue(deviceId, service, characteristic));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -104,33 +112,38 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
String characteristic,
|
||||
Uint8List value,
|
||||
BleOutputProperty bleOutputProperty) {
|
||||
return _channel.writeValue(
|
||||
deviceId,
|
||||
service,
|
||||
characteristic,
|
||||
value,
|
||||
bleOutputProperty.index,
|
||||
);
|
||||
return _executeWithErrorHandling(() => _channel.writeValue(
|
||||
deviceId,
|
||||
service,
|
||||
characteristic,
|
||||
value,
|
||||
bleOutputProperty.index,
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> requestMtu(String deviceId, int expectedMtu) =>
|
||||
_channel.requestMtu(deviceId, expectedMtu);
|
||||
_executeWithErrorHandling(
|
||||
() => _channel.requestMtu(deviceId, expectedMtu));
|
||||
|
||||
@override
|
||||
Future<bool> isPaired(String deviceId) => _channel.isPaired(deviceId);
|
||||
Future<bool> isPaired(String deviceId) =>
|
||||
_executeWithErrorHandling(() => _channel.isPaired(deviceId));
|
||||
|
||||
@override
|
||||
Future<bool> pair(String deviceId) => _channel.pair(deviceId);
|
||||
Future<bool> pair(String deviceId) =>
|
||||
_executeWithErrorHandling(() => _channel.pair(deviceId));
|
||||
|
||||
@override
|
||||
Future<void> unpair(String deviceId) => _channel.unPair(deviceId);
|
||||
Future<void> unpair(String deviceId) =>
|
||||
_executeWithErrorHandling(() => _channel.unPair(deviceId));
|
||||
|
||||
@override
|
||||
Future<List<BleDevice>> getSystemDevices(
|
||||
List<String>? withServices,
|
||||
) async {
|
||||
var devices = await _channel.getSystemDevices(withServices ?? []);
|
||||
var devices = await _executeWithErrorHandling(
|
||||
() => _channel.getSystemDevices(withServices ?? []));
|
||||
return List<BleDevice>.from(
|
||||
devices.map((e) => e.toBleDevice(isSystemDevice: true)).toList(),
|
||||
);
|
||||
@@ -152,6 +165,16 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
));
|
||||
}
|
||||
|
||||
/// Executes a platform call with error handling
|
||||
/// Converts any errors to UniversalBleException
|
||||
Future<T> _executeWithErrorHandling<T>(Future<T> Function() future) async {
|
||||
try {
|
||||
return await future();
|
||||
} catch (error) {
|
||||
throw UniversalBleException.fromError(error);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _ensureInitialized() async {
|
||||
// Check bluetooth availability on Apple
|
||||
// so that it will ask permission only when required, and throw error on failed
|
||||
@@ -160,13 +183,13 @@ class UniversalBlePigeonChannel extends UniversalBlePlatform {
|
||||
AvailabilityState state = await getBluetoothAvailabilityState();
|
||||
switch (state) {
|
||||
case AvailabilityState.unauthorized:
|
||||
throw PlatformException(
|
||||
code: "Unauthorized",
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.bluetoothUnauthorized,
|
||||
message: "Not authorized to access Bluetooth",
|
||||
);
|
||||
case AvailabilityState.unsupported:
|
||||
throw PlatformException(
|
||||
code: "Unsupported",
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notSupported,
|
||||
message: "Bluetooth is not supported",
|
||||
);
|
||||
default:
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'dart:collection';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_web_bluetooth/flutter_web_bluetooth.dart';
|
||||
import 'package:universal_ble/src/utils/universal_logger.dart';
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
import 'package:universal_ble/universal_ble.dart';
|
||||
|
||||
class UniversalBleWeb extends UniversalBlePlatform {
|
||||
@@ -35,7 +36,12 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
Duration? connectionTimeout = const Duration(seconds: 10),
|
||||
}) async {
|
||||
var device = _getDeviceById(deviceId);
|
||||
if (device == null) throw "$deviceId Not Found";
|
||||
if (device == null) {
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.deviceNotFound,
|
||||
message: "$deviceId Not Found",
|
||||
);
|
||||
}
|
||||
await device.connect(timeout: connectionTimeout);
|
||||
|
||||
// Subscribe to Connection Stream
|
||||
@@ -92,7 +98,7 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
} catch (e) {
|
||||
String error = e.toString().replaceAll("DeviceNotFoundError:", "").trim();
|
||||
if (error.toLowerCase().contains("api globally disabled")) {
|
||||
throw WebBluetoothGloballyDisabled(error);
|
||||
throw WebBluetoothGloballyDisabled(message: error);
|
||||
}
|
||||
rethrow;
|
||||
}
|
||||
@@ -154,8 +160,10 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
);
|
||||
|
||||
if (bleCharacteristic == null) {
|
||||
throw Exception(
|
||||
'Characteristic $characteristic for service $service not found',
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message:
|
||||
'Characteristic $characteristic for service $service not found',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -195,8 +203,10 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
);
|
||||
|
||||
if (bleCharacteristic == null) {
|
||||
throw Exception(
|
||||
'Characteristic $characteristic for service $service not found',
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message:
|
||||
'Characteristic $characteristic for service $service not found',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -221,8 +231,11 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
characteristicId: characteristic,
|
||||
);
|
||||
if (bleCharacteristic == null) {
|
||||
throw Exception(
|
||||
'Characteristic $characteristic for service $service not found');
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.characteristicNotFound,
|
||||
message:
|
||||
'Characteristic $characteristic for service $service not found',
|
||||
);
|
||||
}
|
||||
var data = timeout != null
|
||||
? bleCharacteristic.readValue(timeout: timeout)
|
||||
@@ -233,29 +246,44 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
/// `Unimplemented`
|
||||
@override
|
||||
Future<int> requestMtu(String deviceId, int expectedMtu) {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "requestMtu is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> isPaired(String deviceId) {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "isPaired is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> pair(String deviceId) {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "pair is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> unpair(String deviceId) {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "unpair is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<BleDevice>> getSystemDevices(
|
||||
List<String>? withServices,
|
||||
) {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "getSystemDevices is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
/// Helpers
|
||||
@@ -335,12 +363,18 @@ class UniversalBleWeb extends UniversalBlePlatform {
|
||||
|
||||
@override
|
||||
Future<bool> enableBluetooth() {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "enableBluetooth is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> disableBluetooth() {
|
||||
throw UnimplementedError();
|
||||
throw UniversalBleException(
|
||||
code: UniversalBleErrorCode.notImplemented,
|
||||
message: "disableBluetooth is not implemented on Web platform",
|
||||
);
|
||||
}
|
||||
|
||||
RequestOptionsBuilder _getRequestOptionBuilder(
|
||||
|
||||
@@ -0,0 +1,417 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:universal_ble/src/universal_ble_pigeon/universal_ble.g.dart';
|
||||
|
||||
/// Utility class to parse error codes from dynamic errors
|
||||
class UniversalBleErrorParser {
|
||||
static UniversalBleErrorCode getCode(dynamic error) {
|
||||
if (error is UniversalBleErrorCode) return error;
|
||||
|
||||
if (error is PlatformException) {
|
||||
int? errorCodeInt = int.tryParse((error).code);
|
||||
if (errorCodeInt != null) {
|
||||
return UniversalBleErrorCode.values[errorCodeInt];
|
||||
}
|
||||
}
|
||||
|
||||
if (error is num) {
|
||||
return _parseNumericErrorCode((error).toInt());
|
||||
}
|
||||
|
||||
if (error is String) {
|
||||
int? errorCodeInt = int.tryParse(error);
|
||||
if (errorCodeInt != null) {
|
||||
return _parseNumericErrorCode(errorCodeInt);
|
||||
} else {
|
||||
return _parseStringErrorCode(error) ??
|
||||
UniversalBleErrorCode.unknownError;
|
||||
}
|
||||
}
|
||||
|
||||
return UniversalBleErrorCode.unknownError;
|
||||
}
|
||||
|
||||
static UniversalBleErrorCode? _parseStringErrorCode(String code) {
|
||||
switch (code.toLowerCase()) {
|
||||
case 'notsupported':
|
||||
case 'not_supported':
|
||||
return UniversalBleErrorCode.notSupported;
|
||||
case 'notimplemented':
|
||||
case 'not_implemented':
|
||||
return UniversalBleErrorCode.notImplemented;
|
||||
case 'channel-error':
|
||||
case 'channelerror':
|
||||
return UniversalBleErrorCode.channelError;
|
||||
case 'failed':
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 'bluetoothnotavailable':
|
||||
case 'bluetooth_not_available':
|
||||
return UniversalBleErrorCode.bluetoothNotAvailable;
|
||||
case 'bluetoothnotenabled':
|
||||
case 'bluetooth_not_enabled':
|
||||
return UniversalBleErrorCode.bluetoothNotEnabled;
|
||||
case 'bluetoothnotallowed':
|
||||
case 'bluetooth_not_allowed':
|
||||
return UniversalBleErrorCode.bluetoothNotAllowed;
|
||||
case 'bluetoothunauthorized':
|
||||
case 'bluetooth_unauthorized':
|
||||
return UniversalBleErrorCode.bluetoothUnauthorized;
|
||||
case 'devicedisconnected':
|
||||
case 'device_disconnected':
|
||||
return UniversalBleErrorCode.deviceDisconnected;
|
||||
case 'connectiontimeout':
|
||||
case 'connection_timeout':
|
||||
return UniversalBleErrorCode.connectionTimeout;
|
||||
case 'connectionfailed':
|
||||
case 'connection_failed':
|
||||
return UniversalBleErrorCode.connectionFailed;
|
||||
case 'connectionrejected':
|
||||
case 'connection_rejected':
|
||||
return UniversalBleErrorCode.connectionRejected;
|
||||
case 'connecting':
|
||||
case 'connectioninprogress':
|
||||
case 'connection_in_progress':
|
||||
return UniversalBleErrorCode.connectionInProgress;
|
||||
case 'connectionterminated':
|
||||
case 'connection_terminated':
|
||||
return UniversalBleErrorCode.connectionTerminated;
|
||||
case 'illegalargument':
|
||||
case 'illegal_argument':
|
||||
return UniversalBleErrorCode.illegalArgument;
|
||||
case 'devicenotfound':
|
||||
case 'device_not_found':
|
||||
return UniversalBleErrorCode.deviceNotFound;
|
||||
case 'servicenotfound':
|
||||
case 'service_not_found':
|
||||
return UniversalBleErrorCode.serviceNotFound;
|
||||
case 'characteristicnotfound':
|
||||
case 'characteristic_not_found':
|
||||
return UniversalBleErrorCode.characteristicNotFound;
|
||||
case 'invalidserviceuuid':
|
||||
case 'invalid_service_uuid':
|
||||
return UniversalBleErrorCode.invalidServiceUuid;
|
||||
case 'invalidcharacteristicuuid':
|
||||
case 'invalid_characteristic_uuid':
|
||||
return UniversalBleErrorCode.invalidCharacteristicUuid;
|
||||
case 'readfailed':
|
||||
case 'read_failed':
|
||||
return UniversalBleErrorCode.readFailed;
|
||||
case 'writefailed':
|
||||
case 'write_failed':
|
||||
case 'writeerror':
|
||||
case 'write_error':
|
||||
return UniversalBleErrorCode.writeFailed;
|
||||
case 'invalidaction':
|
||||
case 'invalid_action':
|
||||
return UniversalBleErrorCode.invalidAction;
|
||||
case 'operationnotsupported':
|
||||
case 'operation_not_supported':
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
case 'operationtimeout':
|
||||
case 'operation_timeout':
|
||||
return UniversalBleErrorCode.operationTimeout;
|
||||
case 'operationcancelled':
|
||||
case 'operation_cancelled':
|
||||
return UniversalBleErrorCode.operationCancelled;
|
||||
case 'inprogress':
|
||||
case 'alreadyinprogress':
|
||||
case 'already_in_progress':
|
||||
return UniversalBleErrorCode.operationInProgress;
|
||||
case 'notpaired':
|
||||
case 'not_paired':
|
||||
return UniversalBleErrorCode.notPaired;
|
||||
case 'notpairable':
|
||||
case 'not_pairable':
|
||||
return UniversalBleErrorCode.notPairable;
|
||||
case 'alreadypaired':
|
||||
case 'already_paired':
|
||||
return UniversalBleErrorCode.alreadyPaired;
|
||||
case 'pairingfailed':
|
||||
case 'pairing_failed':
|
||||
return UniversalBleErrorCode.pairingFailed;
|
||||
case 'pairingcancelled':
|
||||
case 'pairing_cancelled':
|
||||
return UniversalBleErrorCode.pairingCancelled;
|
||||
case 'pairingtimeout':
|
||||
case 'pairing_timeout':
|
||||
return UniversalBleErrorCode.pairingTimeout;
|
||||
case 'pairingnotallowed':
|
||||
case 'pairing_not_allowed':
|
||||
return UniversalBleErrorCode.pairingNotAllowed;
|
||||
case 'authenticationfailure':
|
||||
case 'authentication_failure':
|
||||
return UniversalBleErrorCode.authenticationFailure;
|
||||
case 'authenticationtimeout':
|
||||
case 'authentication_timeout':
|
||||
case 'authenticationnotallowed':
|
||||
case 'authentication_not_allowed':
|
||||
return UniversalBleErrorCode.authenticationFailure;
|
||||
case 'hardwarefailure':
|
||||
case 'hardware_failure':
|
||||
case 'toomanyconnections':
|
||||
case 'too_many_connections':
|
||||
case 'notreadytopair':
|
||||
case 'not_ready_to_pair':
|
||||
case 'nonsupportedprofiles':
|
||||
case 'no_supported_profiles':
|
||||
case 'invalidceremonydata':
|
||||
case 'invalid_ceremony_data':
|
||||
case 'requiredhandlernotregistered':
|
||||
case 'required_handler_not_registered':
|
||||
case 'rejectedbyhandler':
|
||||
case 'rejected_by_handler':
|
||||
case 'remotedevicehasassociation':
|
||||
case 'remote_device_has_association':
|
||||
return UniversalBleErrorCode.pairingFailed;
|
||||
case 'protectionlevelcouldnotbemet':
|
||||
case 'protection_level_could_not_be_met':
|
||||
return UniversalBleErrorCode.protectionLevelNotMet;
|
||||
case 'unpairingfailed':
|
||||
case 'unpairing_failed':
|
||||
return UniversalBleErrorCode.unpairingFailed;
|
||||
case 'alreadyunpaired':
|
||||
case 'already_unpaired':
|
||||
return UniversalBleErrorCode.alreadyUnpaired;
|
||||
case 'accessdenied':
|
||||
case 'access_denied':
|
||||
return UniversalBleErrorCode.accessDenied;
|
||||
case 'scan_failed_already_started':
|
||||
case 'scanfailedalreadystarted':
|
||||
case 'scan_failed_application_registration_failed':
|
||||
case 'scanfailedapplicationregistrationfailed':
|
||||
case 'scan_failed_feature_unsupported':
|
||||
case 'scanfailedfeatureunsupported':
|
||||
case 'scan_failed_internal_error':
|
||||
case 'scanfailedinternalerror':
|
||||
case 'scan_failed_out_of_hardware_resources':
|
||||
case 'scanfailedoutofhardwareresources':
|
||||
case 'scan_failed_scanning_too_frequently':
|
||||
case 'scanfailedscanningtoofrequently':
|
||||
return UniversalBleErrorCode.scanFailed;
|
||||
case 'stoppingscaninprogress':
|
||||
case 'stopping_scan_in_progress':
|
||||
return UniversalBleErrorCode.stoppingScanInProgress;
|
||||
case 'gatt_failure':
|
||||
case 'gattfailure':
|
||||
case 'unreachable':
|
||||
case 'protocolerror':
|
||||
case 'protocol_error':
|
||||
case 'gattunreachable':
|
||||
case 'gatt_protocol_error':
|
||||
case 'gatt_unlikely':
|
||||
case 'gattunlikely':
|
||||
case 'gatt_insufficient_resources':
|
||||
case 'gattinsufficientresources':
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 'gatt_read_not_permitted':
|
||||
case 'gattreadnotpermitted':
|
||||
return UniversalBleErrorCode.readNotPermitted;
|
||||
case 'gatt_write_not_permitted':
|
||||
case 'gattwritenotpermitted':
|
||||
return UniversalBleErrorCode.writeNotPermitted;
|
||||
case 'gatt_insufficient_authentication':
|
||||
case 'gattinsufficientauthentication':
|
||||
return UniversalBleErrorCode.insufficientAuthentication;
|
||||
case 'gatt_insufficient_authorization':
|
||||
case 'gattinsufficientauthorization':
|
||||
return UniversalBleErrorCode.insufficientAuthorization;
|
||||
case 'gatt_insufficient_encryption':
|
||||
case 'gattinsufficientencryption':
|
||||
return UniversalBleErrorCode.insufficientEncryption;
|
||||
case 'gatt_insufficient_key_size':
|
||||
case 'gattinsufficientkeysize':
|
||||
return UniversalBleErrorCode.insufficientKeySize;
|
||||
case 'gatt_request_not_supported':
|
||||
case 'gattrequestnotsupported':
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
case 'gatt_invalid_offset':
|
||||
case 'gattinvalidoffset':
|
||||
return UniversalBleErrorCode.invalidOffset;
|
||||
case 'gatt_invalid_attribute_length':
|
||||
case 'gattinvalidattributelength':
|
||||
return UniversalBleErrorCode.invalidAttributeLength;
|
||||
case 'gatt_connection_congested':
|
||||
case 'gattconnectioncongested':
|
||||
return UniversalBleErrorCode.connectionFailed;
|
||||
case 'gatt_invalid_handle':
|
||||
case 'gattinvalidhandle':
|
||||
return UniversalBleErrorCode.invalidHandle;
|
||||
case 'gatt_invalid_pdu':
|
||||
case 'gattinvalidpdu':
|
||||
return UniversalBleErrorCode.invalidPdu;
|
||||
case 'gatt_prepare_queue_full':
|
||||
case 'gattpreparequeuefull':
|
||||
return UniversalBleErrorCode.operationInProgress;
|
||||
case 'gatt_attr_not_found':
|
||||
case 'gattattrnotfound':
|
||||
return UniversalBleErrorCode.serviceNotFound;
|
||||
case 'gatt_attr_not_long':
|
||||
case 'gattattrnotlong':
|
||||
return UniversalBleErrorCode.invalidAttributeLength;
|
||||
case 'gatt_unsupported_group':
|
||||
case 'gattunsupportedgroup':
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
case 'feature_not_configured':
|
||||
case 'featurenotconfigured':
|
||||
case 'feature_not_supported':
|
||||
case 'featurenotsupported':
|
||||
case 'feature_supported':
|
||||
case 'featuresupported':
|
||||
return UniversalBleErrorCode.notSupported;
|
||||
case 'error_profile_service_not_bound':
|
||||
case 'errorprofileservicenotbound':
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 'error_missing_bluetooth_connect_permission':
|
||||
case 'errormissingbluetoothconnectpermission':
|
||||
return UniversalBleErrorCode.bluetoothNotAllowed;
|
||||
case 'error_device_not_bonded':
|
||||
case 'errordevicenotbonded':
|
||||
return UniversalBleErrorCode.notPaired;
|
||||
case 'error_gatt_write_not_allowed':
|
||||
case 'errorgattwritenotallowed':
|
||||
return UniversalBleErrorCode.writeNotPermitted;
|
||||
case 'error_gatt_write_request_busy':
|
||||
case 'errorgattwriterequestbusy':
|
||||
return UniversalBleErrorCode.writeRequestBusy;
|
||||
case 'error_unknown':
|
||||
case 'errorunknown':
|
||||
return UniversalBleErrorCode.unknownError;
|
||||
case 'webbluetoothgloballydisabled':
|
||||
case 'web_bluetooth_globally_disabled':
|
||||
return UniversalBleErrorCode.webBluetoothGloballyDisabled;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static UniversalBleErrorCode _parseNumericErrorCode(int code) {
|
||||
switch (code) {
|
||||
case 0x00:
|
||||
return UniversalBleErrorCode.unknownError;
|
||||
case 0x01:
|
||||
return UniversalBleErrorCode.invalidHandle;
|
||||
case 0x02:
|
||||
return UniversalBleErrorCode.readNotPermitted;
|
||||
case 0x03:
|
||||
return UniversalBleErrorCode.writeNotPermitted;
|
||||
case 0x04:
|
||||
return UniversalBleErrorCode.invalidPdu;
|
||||
case 0x05:
|
||||
return UniversalBleErrorCode.insufficientAuthentication;
|
||||
// Consolidated: gattRequestNotSupported -> operationNotSupported
|
||||
case 0x06:
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
case 0x07:
|
||||
return UniversalBleErrorCode.invalidOffset;
|
||||
case 0x08:
|
||||
return UniversalBleErrorCode.insufficientAuthorization;
|
||||
// Consolidated: gattPrepareQueueFull -> operationInProgress
|
||||
case 0x09:
|
||||
return UniversalBleErrorCode.operationInProgress;
|
||||
// Consolidated: gattAttrNotFound -> serviceNotFound
|
||||
case 0x0A:
|
||||
return UniversalBleErrorCode.serviceNotFound;
|
||||
// Consolidated: gattAttrNotLong -> invalidAttributeLength
|
||||
case 0x0B:
|
||||
return UniversalBleErrorCode.invalidAttributeLength;
|
||||
case 0x0C:
|
||||
return UniversalBleErrorCode.insufficientKeySize;
|
||||
case 0x0D:
|
||||
return UniversalBleErrorCode.invalidAttributeLength;
|
||||
// Consolidated: gattUnlikely -> failed
|
||||
case 0x0E:
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 0x0F:
|
||||
return UniversalBleErrorCode.insufficientEncryption;
|
||||
// Consolidated: gattUnsupportedGroup -> operationNotSupported
|
||||
case 0x10:
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
// Consolidated: gattInsufficientResources -> failed
|
||||
case 0x11:
|
||||
return UniversalBleErrorCode.failed;
|
||||
// Consolidated: gattConnectionCongested -> connectionFailed
|
||||
case 0x85:
|
||||
return UniversalBleErrorCode.connectionFailed;
|
||||
// Consolidated: gattFailure -> failed
|
||||
case 0x101:
|
||||
return UniversalBleErrorCode.failed;
|
||||
}
|
||||
// HCI error codes - consolidated to higher-level errors
|
||||
switch (code) {
|
||||
// Connection errors
|
||||
case 0x08: // Connection Timeout
|
||||
case 0x10: // Connection Accept Timeout Exceeded
|
||||
return UniversalBleErrorCode.connectionTimeout;
|
||||
case 0x09: // Connection Limit Exceeded
|
||||
case 0x0A: // Synchronous Connection Limit To A Device Exceeded
|
||||
return UniversalBleErrorCode.connectionLimitExceeded;
|
||||
case 0x0B: // Connection Already Exists
|
||||
return UniversalBleErrorCode.connectionAlreadyExists;
|
||||
case 0x0D: // Connection Rejected due to Limited Resources
|
||||
case 0x0F: // Connection Rejected due to Unacceptable BD_ADDR
|
||||
case 0x39: // Connection Rejected due to No Suitable Channel Found
|
||||
return UniversalBleErrorCode.connectionRejected;
|
||||
case 0x0E: // Connection Rejected Due To Security Reasons
|
||||
return UniversalBleErrorCode.connectionRejected;
|
||||
case 0x13: // Remote User Terminated Connection
|
||||
case 0x14: // Remote Device Terminated Connection due to Low Resources
|
||||
case 0x15: // Remote Device Terminated Connection due to Power Off
|
||||
case 0x16: // Connection Terminated By Local Host
|
||||
case 0x3D: // Connection Terminated due to MIC Failure
|
||||
return UniversalBleErrorCode.connectionTerminated;
|
||||
case 0x3E: // Connection Failed to be Established
|
||||
case 0x3F: // MAC Connection Failed
|
||||
return UniversalBleErrorCode.connectionFailed;
|
||||
// Pairing/Authentication errors
|
||||
case 0x05: // Authentication Failure
|
||||
return UniversalBleErrorCode.authenticationFailure;
|
||||
case 0x18: // Pairing Not Allowed
|
||||
return UniversalBleErrorCode.pairingNotAllowed;
|
||||
case 0x03: // Hardware Failure
|
||||
case 0x29: // Pairing With Unit Key Not Supported
|
||||
case 0x37: // Secure Simple Pairing Not Supported By Host
|
||||
case 0x38: // Host Busy - Pairing
|
||||
return UniversalBleErrorCode.pairingFailed;
|
||||
case 0x2F: // Insufficient Security
|
||||
return UniversalBleErrorCode.insufficientEncryption;
|
||||
// Operation errors
|
||||
case 0x0C: // Command Disallowed
|
||||
case 0x11: // Unsupported Feature or Parameter Value
|
||||
case 0x12: // Invalid HCI Command Parameters
|
||||
case 0x1A: // Unsupported Remote Feature
|
||||
case 0x1E: // Invalid LMP Parameters
|
||||
case 0x20: // Unsupported LMP Parameter Value
|
||||
return UniversalBleErrorCode.operationNotSupported;
|
||||
case 0x22: // LMP Response Timeout
|
||||
return UniversalBleErrorCode.operationTimeout;
|
||||
// General errors
|
||||
case 0x01: // Unknown HCI Command
|
||||
case 0x02: // Unknown Connection Identifier
|
||||
return UniversalBleErrorCode.unknownError;
|
||||
case 0x04: // Page Timeout
|
||||
return UniversalBleErrorCode.connectionTimeout;
|
||||
case 0x06: // PIN or Key Missing
|
||||
return UniversalBleErrorCode.authenticationFailure;
|
||||
case 0x07: // Memory Capacity Exceeded
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 0x17: // Repeated Attempts
|
||||
return UniversalBleErrorCode.failed;
|
||||
case 0x25: // Encryption Mode Not Acceptable
|
||||
return UniversalBleErrorCode.insufficientEncryption;
|
||||
case 0x26: // Link Key cannot be Changed
|
||||
case 0x27: // Requested QoS Not Supported
|
||||
case 0x2C: // QoS Unacceptable Parameter
|
||||
case 0x2D: // QoS Rejected
|
||||
case 0x2E: // Channel Classification Not Supported
|
||||
case 0x30: // Parameter Out Of Mandatory Range
|
||||
case 0x32: // Role Switch Pending
|
||||
case 0x35: // Role Switch Failed
|
||||
case 0x36: // Extended Inquiry Response Too Large
|
||||
case 0x3A: // Controller Busy
|
||||
case 0x3B: // Unacceptable Connection Parameters
|
||||
case 0x3C: // Advertising Timeout
|
||||
return UniversalBleErrorCode.failed;
|
||||
}
|
||||
// Default to unknown error for unmapped codes
|
||||
return UniversalBleErrorCode.unknownError;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user