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:
Rohit Sangwan
2025-11-12 00:04:29 +05:30
committed by GitHub
parent b52ca9ee84
commit acfa3200ca
32 changed files with 3399 additions and 1721 deletions
+8 -3
View File
@@ -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',
),
);
}
+64 -37
View File
@@ -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 {
+426 -114
View File
@@ -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;
}
}