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;
  if (!_open || bindings == null) {
    throw StateError('PcanCanTransport not open');
  }
  if (frame.fd) {
    throw StateError(
        'PcanCanTransport: classic-mode transport cannot send FD frame');
  }
  if (frame.data.length > 8) {
    throw StateError(
        'PcanCanTransport classic frame data > 8 bytes: ${frame.data.length}');
  }

  final msgPtr = malloc<TpcanMsg>();
  try {
    final m = msgPtr.ref;
    m.id = frame.id;
    var t = 0;
    if (frame.extended) t |= PcanMsgType.extended;
    if (frame.rtr) t |= PcanMsgType.rtr;
    m.msgtype = t;
    m.len = frame.data.length;
    for (var i = 0; i < frame.data.length; i++) {
      m.data[i] = frame.data[i];
    }
    // Zero unused bytes (PCAN driver expects exactly 8 bytes set).
    for (var i = frame.data.length; i < 8; i++) {
      m.data[i] = 0;
    }
    final st = bindings.canWrite(channel, msgPtr);
    if (st != PcanStatus.ok) {
      throw StateError(
          'CAN_Write failed: status=0x${st.toRadixString(16)} '
          'id=0x${frame.id.toRadixString(16)}');
    }
  } finally {
    malloc.free(msgPtr);
  }
}