send method
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);
}
}