summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2017-01-13 22:35:13 +0100
committerAndré Hartmann <aha_1980@gmx.de>2017-01-17 15:11:30 +0000
commit19d4d81e8dd7ccb9831bea725989d2a08d258207 (patch)
treeaf1867778dbb33c3786b24becbe0dcfcf8b376ef /src
parentd4bbdb83b26f8219b6c64bcff3967aa15db07d9c (diff)
CAN: Introduce CAN FD flag Error State Indicator (ESI)
Added hasErrorStateIndicator and setErrorStateIndicator to QCanBusFrame. * Setting QCanBusFrame::setErrorStateIndicator(true) also sets QCanBusFrame::setFlexibleDataRateFormat(true) * Setting QCanBusFrame::setFlexibleDataRateFormat(false) also sets QCanBusFrame::setErrorStateIndicator(false) [ChangeLog][QCanBusFrame] Added error state indicator flag to QCanBusFrame and set it appropriate receiving CAN FD frames with the SocketCAN plugin. Setting this flag for testing purposes is also possible. Change-Id: I406b693fc7b7cde8a0d6b2c34c1f313800f11203 Reviewed-by: Rolf Eike Beer <eb@emlix.com> Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp3
-rw-r--r--src/serialbus/qcanbusframe.cpp30
-rw-r--r--src/serialbus/qcanbusframe.h17
3 files changed, 46 insertions, 4 deletions
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp
index 53836b0..a41c8d1 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.cpp
+++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp
@@ -450,6 +450,7 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData)
frame.len = newData.payload().size();
frame.can_id = canId;
frame.flags = newData.hasBitrateSwitch() ? CANFD_BRS : 0;
+ frame.flags |= newData.hasErrorStateIndicator() ? CANFD_ESI : 0;
::memcpy(frame.data, newData.payload().constData(), frame.len);
bytesWritten = ::write(canSocket, &frame, sizeof(frame));
@@ -679,6 +680,8 @@ void SocketCanBackend::readSocket()
bufferedFrame.setFrameType(QCanBusFrame::ErrorFrame);
if (frame.flags & CANFD_BRS)
bufferedFrame.setBitrateSwitch(true);
+ if (frame.flags & CANFD_ESI)
+ bufferedFrame.setErrorStateIndicator(true);
bufferedFrame.setFrameId(frame.can_id & CAN_EFF_MASK);
diff --git a/src/serialbus/qcanbusframe.cpp b/src/serialbus/qcanbusframe.cpp
index 26e1964..4f00c88 100644
--- a/src/serialbus/qcanbusframe.cpp
+++ b/src/serialbus/qcanbusframe.cpp
@@ -288,6 +288,30 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn QCanBusFrame::hasErrorStateIndicator() const
+ \since 5.9
+
+ Returns \c true if the CAN uses \e {Flexible Data-Rate} with \e {Error State Indicator} set.
+
+ This flag is set by the transmitter's CAN FD hardware to indicate the transmitter's error state.
+
+ \sa setErrorStateIndicator()
+*/
+
+/*!
+ \fn void QCanBusFrame::setErrorStateIndicator(bool errorStateIndicator)
+ \since 5.9
+
+ Set the \e {Flexible Data-Rate} flag \e {Error State Indicator} flag to \a errorStateIndicator.
+
+ When sending CAN FD frames, this flag is automatically set by the CAN FD hardware.
+ \c QCanBusFrame::setErrorStateIndicator() should only be used for application testing,
+ e.g. on virtual CAN FD busses.
+
+ \sa hasErrorStateIndicator()
+*/
+
+/*!
\class QCanBusFrame::TimeStamp
\inmodule QtSerialBus
\since 5.8
@@ -397,7 +421,7 @@ QDataStream &operator<<(QDataStream &out, const QCanBusFrame &frame)
out << stamp.seconds();
out << stamp.microSeconds();
if (frame.version >= QCanBusFrame::Version::Qt_5_9)
- out << frame.hasBitrateSwitch();
+ out << frame.hasBitrateSwitch() << frame.hasErrorStateIndicator();
return out;
}
@@ -414,6 +438,7 @@ QDataStream &operator>>(QDataStream &in, QCanBusFrame &frame)
bool extendedFrameFormat;
bool flexibleDataRate;
bool bitrateSwitch = false;
+ bool errorStateIndicator = false;
QByteArray payload;
qint64 seconds;
qint64 microSeconds;
@@ -422,7 +447,7 @@ QDataStream &operator>>(QDataStream &in, QCanBusFrame &frame)
>> payload >> seconds >> microSeconds;
if (version >= QCanBusFrame::Version::Qt_5_9)
- in >> bitrateSwitch;
+ in >> bitrateSwitch >> errorStateIndicator;
frame.setFrameId(frameId);
frame.version = version;
@@ -431,6 +456,7 @@ QDataStream &operator>>(QDataStream &in, QCanBusFrame &frame)
frame.setExtendedFrameFormat(extendedFrameFormat);
frame.setFlexibleDataRateFormat(flexibleDataRate);
frame.setBitrateSwitch(bitrateSwitch);
+ frame.setErrorStateIndicator(errorStateIndicator);
frame.setPayload(payload);
frame.setTimeStamp(QCanBusFrame::TimeStamp(seconds, microSeconds));
diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h
index 2c32cd8..7cab3e9 100644
--- a/src/serialbus/qcanbusframe.h
+++ b/src/serialbus/qcanbusframe.h
@@ -77,6 +77,7 @@ public:
version(Qt_5_9),
isFlexibleDataRate(0x0),
isBitrateSwitch(0x0),
+ isErrorStateIndicator(0x0),
reserved0(0x0)
{
Q_UNUSED(reserved0);
@@ -109,6 +110,7 @@ public:
version(Qt_5_9),
isFlexibleDataRate(data.length() > 8 ? 0x1 : 0x0),
isBitrateSwitch(0x0),
+ isErrorStateIndicator(0x0),
reserved0(0x0),
load(data)
{
@@ -226,8 +228,10 @@ public:
void setFlexibleDataRateFormat(bool isFlexibleData) Q_DECL_NOTHROW
{
isFlexibleDataRate = (isFlexibleData & 0x1);
- if (!isFlexibleData)
+ if (!isFlexibleData) {
isBitrateSwitch = 0x0;
+ isErrorStateIndicator = 0x0;
+ }
}
bool hasBitrateSwitch() const Q_DECL_NOTHROW { return (isBitrateSwitch & 0x1); }
@@ -238,6 +242,14 @@ public:
isFlexibleDataRate = 0x1;
}
+ bool hasErrorStateIndicator() const Q_DECL_NOTHROW { return (isErrorStateIndicator & 0x1); }
+ void setErrorStateIndicator(bool errorStateIndicator) Q_DECL_NOTHROW
+ {
+ isErrorStateIndicator = (errorStateIndicator & 0x1);
+ if (errorStateIndicator)
+ isFlexibleDataRate = 0x1;
+ }
+
#ifndef QT_NO_DATASTREAM
friend Q_SERIALBUS_EXPORT QDataStream &operator<<(QDataStream &, const QCanBusFrame &);
friend Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &, QCanBusFrame &);
@@ -258,7 +270,8 @@ private:
quint8 isFlexibleDataRate:1;
quint8 isBitrateSwitch:1;
- quint8 reserved0:7;
+ quint8 isErrorStateIndicator:1;
+ quint8 reserved0:6;
// reserved for future use
quint8 reserved[2];