write method
Writes the value of a descriptor
Implementation
Future<void> write(List<int> value, {int timeout = 15}) async {
// check connected
if (device.isDisconnected) {
throw FlutterBluePlusException(
ErrorPlatform.fbp, "writeDescriptor", FbpErrorCode.deviceIsDisconnected.index, "device is not connected");
}
// Only allow a single ble operation to be underway at a time
_Mutex mtx = _MutexFactory.getMutexForKey("global");
await mtx.take();
try {
var request = BmWriteDescriptorRequest(
remoteId: remoteId,
primaryServiceUuid: primaryServiceUuid,
serviceUuid: serviceUuid,
characteristicUuid: characteristicUuid,
instanceId: instanceId,
descriptorUuid: descriptorUuid,
value: value,
);
Stream<BmDescriptorData> responseStream = FlutterBluePlusPlatform.instance.onDescriptorWritten
.where((p) => p.remoteId == request.remoteId)
.where((p) => p.primaryServiceUuid == request.primaryServiceUuid)
.where((p) => p.serviceUuid == request.serviceUuid)
.where((p) => p.characteristicUuid == request.characteristicUuid)
.where((p) => p.instanceId == instanceId)
.where((p) => p.descriptorUuid == request.descriptorUuid);
// Start listening now, before invokeMethod, to ensure we don't miss the response
Future<BmDescriptorData> futureResponse = responseStream.first;
// invoke
await FlutterBluePlus._invokePlatform(() => FlutterBluePlusPlatform.instance.writeDescriptor(request));
// wait for response
BmDescriptorData response = await futureResponse
.fbpEnsureAdapterIsOn("writeDescriptor")
.fbpEnsureDeviceIsConnected(device, "writeDescriptor")
.fbpTimeout(timeout, "writeDescriptor");
// failed?
if (!response.success) {
throw FlutterBluePlusException(_nativeError, "writeDescriptor", response.errorCode, response.errorString);
}
} finally {
mtx.give();
}
return Future.value();
}