send method

  1. @override
Future<void> send(
  1. CanFrame frame
)
override

Transmit a frame. Completes when the frame is handed off to the bus.

Implementation

@override
Future<void> send(CanFrame frame) async {
  final bindings = _bindings;
  final port = _portHandle;
  if (!_open || bindings == null || port == null) {
    throw StateError('VectorXlCanTransport not open');
  }
  if (frame.fd) {
    throw StateError(
        'VectorXlCanTransport (legacy event path) cannot send FD frame');
  }
  if (frame.data.length > 8) {
    throw StateError(
        'VectorXlCanTransport classic frame data > 8 bytes: '
        '${frame.data.length}');
  }

  final eventPtr = malloc<VectorXlEvent>();
  final countPtr = malloc<Uint32>()..value = 1;
  try {
    final ev = eventPtr.ref;
    ev.tag = VectorXlEventTag.transmitMsg;
    ev.chanIndex = 0;
    ev.transId = 0;
    ev.portHandle = 0;
    ev.flags = 0;
    ev.reserved = 0;
    ev.timeStamp = 0;
    ev.canMsg.id = frame.extended
        ? (frame.id | kVectorXlCanExtMsgId)
        : frame.id;
    var fl = 0;
    if (frame.rtr) fl |= VectorXlCanMsgFlag.remoteFrame;
    ev.canMsg.flags = fl;
    ev.canMsg.dlc = frame.data.length;
    ev.canMsg.reserved1 = 0;
    ev.canMsg.reserved2 = 0;
    for (var i = 0; i < frame.data.length; i++) {
      ev.canMsg.data[i] = frame.data[i];
    }
    for (var i = frame.data.length; i < 8; i++) {
      ev.canMsg.data[i] = 0;
    }
    final st =
        bindings.xlCanTransmit(port, accessMask, countPtr, eventPtr);
    if (st != VectorXlStatus.success) {
      throw StateError(
          'xlCanTransmit failed status=$st id=0x${frame.id.toRadixString(16)}');
    }
  } finally {
    malloc.free(eventPtr);
    malloc.free(countPtr);
  }
}