call method

Future<List<int>?> call(
  1. List<int> data,
  2. QualifiedCharacteristic writer,
  3. Function listen, {
  4. int retry = 3,
  5. int timeout = 500,
})

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;
}