diff options
Diffstat (limited to 'src/plugins/canbus/tinycan/tinycanbackend.cpp')
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/plugins/canbus/tinycan/tinycanbackend.cpp b/src/plugins/canbus/tinycan/tinycanbackend.cpp index e882a5e..2714bc8 100644 --- a/src/plugins/canbus/tinycan/tinycanbackend.cpp +++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp @@ -301,6 +301,7 @@ void TinyCanBackendPrivate::canWriteNotification() } else { message.Id = frame.frameId(); message.Flags.Flag.Len = payload.size(); + message.Flags.Flag.Error = (frame.frameType() == QCanBusFrame::ErrorFrame); message.Flags.Flag.RTR = (frame.frameType() == QCanBusFrame::RemoteRequestFrame); message.Flags.Flag.TxD = 1; message.Flags.Flag.EFF = frame.hasExtendedFrameFormat(); @@ -363,7 +364,13 @@ void TinyCanBackendPrivate::canReadNotification() int(message.Flags.Flag.Len))); frame.setTimeStamp(QCanBusFrame::TimeStamp(message.Time.Sec, message.Time.USec)); frame.setExtendedFrameFormat(message.Flags.Flag.EFF); - frame.setFrameType(message.Flags.Flag.RTR ? QCanBusFrame::RemoteRequestFrame : QCanBusFrame::DataFrame); + + if (message.Flags.Flag.Error) + frame.setFrameType(QCanBusFrame::ErrorFrame); + else if (message.Flags.Flag.RTR) + frame.setFrameType(QCanBusFrame::RemoteRequestFrame); + else + frame.setFrameType(QCanBusFrame::DataFrame); newFrames.append(frame); } @@ -458,6 +465,20 @@ bool TinyCanBackend::writeFrame(const QCanBusFrame &newData) if (state() != QCanBusDevice::ConnectedState) return false; + if (newData.frameType() != QCanBusFrame::DataFrame + && newData.frameType() != QCanBusFrame::RemoteRequestFrame + && newData.frameType() != QCanBusFrame::ErrorFrame) { + setError(tr("Unable to write a frame with unacceptable type"), + QCanBusDevice::WriteError); + return false; + } + + if (newData.payload().size() > 8) { + setError(tr("Unable to write a frame with unacceptable payload size"), + QCanBusDevice::WriteError); + return false; + } + enqueueOutgoingFrame(newData); d->enableWriteNotification(true); |