summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2017-03-19 17:07:46 +0100
committerAndré Hartmann <aha_1980@gmx.de>2017-03-27 14:15:33 +0000
commit6441cf2dc3dd8654a12959cab6438721701c7cdb (patch)
tree3876d189c4339494bf1109c3eb7adb862b34a06b
parent03a83d43a4f8087b0b648171f13189c4f991c198 (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>
-rw-r--r--src/tools/canbusutil/canbusutil.cpp25
-rw-r--r--src/tools/canbusutil/canbusutil.h1
-rw-r--r--src/tools/canbusutil/main.cpp13
-rw-r--r--src/tools/canbusutil/readtask.cpp19
-rw-r--r--src/tools/canbusutil/readtask.h3
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