diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2017-01-13 22:35:13 +0100 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2017-01-17 15:11:30 +0000 |
commit | 19d4d81e8dd7ccb9831bea725989d2a08d258207 (patch) | |
tree | af1867778dbb33c3786b24becbe0dcfcf8b376ef /src | |
parent | d4bbdb83b26f8219b6c64bcff3967aa15db07d9c (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.cpp | 3 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.cpp | 30 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.h | 17 |
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]; |