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