diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2017-03-19 17:07:46 +0100 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2017-03-27 14:15:33 +0000 |
commit | 6441cf2dc3dd8654a12959cab6438721701c7cdb (patch) | |
tree | 3876d189c4339494bf1109c3eb7adb862b34a06b /src | |
parent | 03a83d43a4f8087b0b648171f13189c4f991c198 (diff) |
canbusutil: Add CAN FD flag handling
* For receiving, force the CAN plugin into CAN FD mode
and show the CAN FD flags like the CAN Example
* For sending, check if an odd number of data bytes is
given and interpret the first data char as CAN FD flags
Task-number: QTBUG-56464
Change-Id: I235827ea59d58744c34d5259e5637ad9c3326112
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/canbusutil/canbusutil.cpp | 25 | ||||
-rw-r--r-- | src/tools/canbusutil/canbusutil.h | 1 | ||||
-rw-r--r-- | src/tools/canbusutil/main.cpp | 13 | ||||
-rw-r--r-- | src/tools/canbusutil/readtask.cpp | 19 | ||||
-rw-r--r-- | src/tools/canbusutil/readtask.h | 3 |
5 files changed, 53 insertions, 8 deletions
diff --git a/src/tools/canbusutil/canbusutil.cpp b/src/tools/canbusutil/canbusutil.cpp index d614583..2e7c15f 100644 --- a/src/tools/canbusutil/canbusutil.cpp +++ b/src/tools/canbusutil/canbusutil.cpp @@ -50,6 +50,11 @@ void CanBusUtil::setShowTimeStamp(bool showTimeStamp) m_readTask->setShowTimeStamp(showTimeStamp); } +void CanBusUtil::setShowFdFlags(bool showFdFlags) +{ + m_readTask->setShowFdFlags(showFdFlags); +} + bool CanBusUtil::start(const QString &pluginName, const QString &deviceName, const QString &data) { if (!m_canBus) { @@ -66,6 +71,8 @@ bool CanBusUtil::start(const QString &pluginName, const QString &deviceName, con return false; if (m_listening) { + if (m_readTask->isShowFdFlags()) + m_canDevice->setConfigurationParameter(QCanBusDevice::CanFdKey, true); connect(m_canDevice.data(), &QCanBusDevice::framesReceived, m_readTask, &ReadTask::checkMessages); } else { if (!sendData()) @@ -128,17 +135,25 @@ bool CanBusUtil::setFrameFromPayload(QString payload, QCanBusFrame *frame) payload = payload.mid(1); } - if (payload.size() % 2 != 0) { - m_output << "Data field invalid: Size is not multiple of two." << endl; - return false; - } - const QRegularExpression re(QStringLiteral("^[0-9A-Fa-f]*$")); if (!re.match(payload).hasMatch()) { m_output << "Data field invalid: Only hex numbers allowed." << endl; return false; } + if (payload.size() % 2 != 0) { + if (frame->hasFlexibleDataRateFormat()) { + enum { BitrateSwitchFlag = 1, ErrorStateIndicatorFlag = 2 }; + const int flags = payload.left(1).toInt(nullptr, 16); + frame->setBitrateSwitch(flags & BitrateSwitchFlag); + frame->setErrorStateIndicator(flags & ErrorStateIndicatorFlag); + payload.remove(0, 1); + } else { + m_output << "Data field invalid: Size is not multiple of two." << endl; + return false; + } + } + QByteArray bytes = QByteArray::fromHex(payload.toLatin1()); const int maxSize = frame->hasFlexibleDataRateFormat() ? 64 : 8; diff --git a/src/tools/canbusutil/canbusutil.h b/src/tools/canbusutil/canbusutil.h index e17fe7b..a553647 100644 --- a/src/tools/canbusutil/canbusutil.h +++ b/src/tools/canbusutil/canbusutil.h @@ -57,6 +57,7 @@ public: explicit CanBusUtil(QTextStream &output, QCoreApplication &app, QObject *parent = nullptr); void setShowTimeStamp(bool showTimeStamp); + void setShowFdFlags(bool showFdFlags); bool start(const QString &pluginName, const QString &deviceName, const QString &data = QString()); void printPlugins(); diff --git a/src/tools/canbusutil/main.cpp b/src/tools/canbusutil/main.cpp index dda8183..f594f7a 100644 --- a/src/tools/canbusutil/main.cpp +++ b/src/tools/canbusutil/main.cpp @@ -76,10 +76,12 @@ int main(int argc, char *argv[]) parser.addPositionalArgument(QStringLiteral("data"), CanBusUtil::tr( "Data to send if -l is not specified. Format:\n" - "\t\t<id>#{payload} (CAN 2.0 data frames),\n" - "\t\t<id>#Rxx (CAN 2.0 RTR frames with xx bytes data length),\n" - "\t\t<id>##{payload} (CAN FD data frames),\n" + "\t\t<id>#{payload} (CAN 2.0 data frames),\n" + "\t\t<id>#Rxx (CAN 2.0 RTR frames with xx bytes data length),\n" + "\t\t<id>##[flags]{payload} (CAN FD data frames),\n" "where {payload} has 0..8 (0..64 CAN FD) ASCII hex-value pairs, " + "and flags is one optional ASCII hex char for CAN FD flags: " + "1 = Bitrate Switch, 2 = Error State Indicator\n" "e.g. 1#1a2b3c\n"), QStringLiteral("[data]")); const QCommandLineOption listeningOption({"l", "listen"}, @@ -94,6 +96,10 @@ int main(int argc, char *argv[]) CanBusUtil::tr("Show timestamp for each received CAN bus frame.")); parser.addOption(showTimeStampOption); + const QCommandLineOption showFdFlagsOption({"f", "flags"}, + CanBusUtil::tr("Show CAN FD flags for each received CAN bus frame.")); + parser.addOption(showFdFlagsOption); + parser.process(app); if (parser.isSet(listOption)) { @@ -112,6 +118,7 @@ int main(int argc, char *argv[]) } util.setShowTimeStamp(parser.isSet(showTimeStampOption)); + util.setShowFdFlags(parser.isSet(showFdFlagsOption)); if (!util.start(args[0], args[1], data)) return -1; diff --git a/src/tools/canbusutil/readtask.cpp b/src/tools/canbusutil/readtask.cpp index 93fcae1..ae4a9ac 100644 --- a/src/tools/canbusutil/readtask.cpp +++ b/src/tools/canbusutil/readtask.cpp @@ -45,6 +45,16 @@ void ReadTask::setShowTimeStamp(bool showTimeStamp) m_showTimeStamp = showTimeStamp; } +bool ReadTask::isShowFdFlags() const +{ + return m_showFdFlags; +} + +void ReadTask::setShowFdFlags(bool showFlags) +{ + m_showFdFlags = showFlags; +} + void ReadTask::checkMessages() { auto canDevice = qobject_cast<QCanBusDevice *>(QObject::sender()); if (canDevice == nullptr) { @@ -63,6 +73,15 @@ void ReadTask::checkMessages() { .arg(frame.timeStamp().microSeconds() / 100, 4, 10, QLatin1Char('0')); } + if (m_showFdFlags) { + QString flags = QLatin1String(" - - "); + if (frame.hasBitrateSwitch()) + flags[1] = QLatin1Char('B'); + if (frame.hasErrorStateIndicator()) + flags[3] = QLatin1Char('E'); + view += flags; + } + if (frame.frameType() == QCanBusFrame::ErrorFrame) view += canDevice->interpretErrorFrame(frame); else diff --git a/src/tools/canbusutil/readtask.h b/src/tools/canbusutil/readtask.h index 7f7613b..38a1753 100644 --- a/src/tools/canbusutil/readtask.h +++ b/src/tools/canbusutil/readtask.h @@ -47,6 +47,8 @@ class ReadTask : public QObject public: explicit ReadTask(QTextStream &output, QObject *parent = nullptr); void setShowTimeStamp(bool showStamp); + bool isShowFdFlags() const; + void setShowFdFlags(bool isShowFdFlags); signals: void sigTermSignal(); @@ -58,6 +60,7 @@ public slots: private: QTextStream &output; bool m_showTimeStamp = false; + bool m_showFdFlags = false; }; #endif // READTASK_H |