call method
Implementation
Future<List<int>?> call(List<int> data,QualifiedCharacteristic writer,Function listen, {int retry = 3, int timeout = 500}) async {
if (![0x00, 0x03, 0x04, 0x10].contains(data[1])) throw UnsupportedError('modbus function ${data[1]} not supported.');
var syncer = Syncer<List<int>?>();
List<int> recv = [];
listen((event) {
recv.addAll(event);
if (recv.length < 3) return;
if (recv[0] != data[0]) return;
if (recv[1] == data[1] + 0x80) {
syncer.onNotify(null);
return;
}
if (recv[0] != data[0]) return;
ByteData tmp = ByteData(data.length);
for(int i=0; i<data.length; i++) tmp.setUint8(i, data[i]);
if ([0x03,0x04].contains(recv[1])){
if (recv.length < tmp.getUint16(4)*2 + 5) return;
}else if([0x10].contains(recv[1])){
if (recv.length < 8) return;
}
print('recv: $recv');
syncer.onNotify(recv);
});
List<int>? ret = await syncer.sendRetryFor(() async {
print('${DateTime.now()}, send: $data');
recv.clear();
await ble.writeCharacteristicWithoutResponse( writer, value: data);
print('${DateTime.now()}, sent: $data');
}, timeout: timeout, retry: retry);
listen(null);
return ret;
}