summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/serialbus/can/mainwindow.cpp26
-rw-r--r--src/serialbus/qcanbusframe.cpp25
-rw-r--r--src/serialbus/qcanbusframe.h29
-rw-r--r--src/tools/canbusutil/readtask.cpp28
-rw-r--r--tests/auto/plugins/genericcanbus/dummybackend.cpp2
-rw-r--r--tests/auto/qcanbusframe/tst_qcanbusframe.cpp75
6 files changed, 137 insertions, 48 deletions
diff --git a/examples/serialbus/can/mainwindow.cpp b/examples/serialbus/can/mainwindow.cpp
index ba4cd6d..26dead3 100644
--- a/examples/serialbus/can/mainwindow.cpp
+++ b/examples/serialbus/can/mainwindow.cpp
@@ -170,16 +170,6 @@ void MainWindow::framesWritten(qint64 count)
qDebug() << "Number of frames written:" << count;
}
-static QByteArray dataToHex(const QByteArray &data)
-{
- QByteArray result = data.toHex().toUpper();
-
- for (int i = 0; i < result.size(); i += 3)
- result.insert(i, ' ');
-
- return result;
-}
-
void MainWindow::checkMessages()
{
if (!m_canDevice)
@@ -187,21 +177,11 @@ void MainWindow::checkMessages()
const QCanBusFrame frame = m_canDevice->readFrame();
- const qint8 dataLength = frame.payload().size();
-
- const qint32 id = frame.frameId();
-
QString view;
- if (frame.frameType() == QCanBusFrame::ErrorFrame) {
+ if (frame.frameType() == QCanBusFrame::ErrorFrame)
interpretError(view, frame);
- } else {
- view += QLatin1String("Id: ");
- view += QString::number(id, 16).toUpper();
- view += QLatin1String(" bytes: ");
- view += QString::number(dataLength, 10);
- view += QLatin1String(" data: ");
- view += dataToHex(frame.payload());
- }
+ else
+ view = frame.toString();
if (frame.frameType() == QCanBusFrame::RemoteRequestFrame) {
m_ui->requestList->addItem(view);
diff --git a/src/serialbus/qcanbusframe.cpp b/src/serialbus/qcanbusframe.cpp
index 46498a3..8c39dad 100644
--- a/src/serialbus/qcanbusframe.cpp
+++ b/src/serialbus/qcanbusframe.cpp
@@ -277,6 +277,31 @@ QT_BEGIN_NAMESPACE
\sa TimeStamp::microSeconds
*/
+/*!
+ \fn QCanBusFrame::toString()
+
+ Returns the CAN frame as a formatted string.
+
+ The output contains the CAN identfier in hexadecimal format, right
+ adjusted to 32 bit, followed by the data length in square brackets
+ and the payload in hexadecimal format.
+
+ Standard identifiers are filled with spaces while extended identifiers
+ are filled with zeros.
+
+ Typical outputs are:
+
+ \code
+ (Error) - error frame
+ 7FF [1] 01 - data frame with standard identifier
+ 1FFFFFFF [8] 01 23 45 67 89 AB CD EF - data frame with extended identifier
+ 123 [5] Remote Request - remote frame with standard identifier
+ 00000234 [0] Remote Request - remote frame with extended identifier
+ \endcode
+
+ \since 5.8
+*/
+
#ifndef QT_NO_DATASTREAM
/*! \relates QCanBusFrame
diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h
index de11331..4488ee9 100644
--- a/src/serialbus/qcanbusframe.h
+++ b/src/serialbus/qcanbusframe.h
@@ -190,6 +190,35 @@ public:
canId = (e & AnyError);
}
+ QString toString() const
+ {
+ const FrameType type = frameType();
+
+ if (type == InvalidFrame)
+ return QStringLiteral("(Invalid)");
+
+ if (type == ErrorFrame)
+ return QStringLiteral("(Error)");
+
+ if (type == UnknownFrame)
+ return QStringLiteral("(Unknown)");
+
+ const char *formatStr = hasExtendedFrameFormat() ? "%08X [%d]" : " %03X [%d]";
+ QString result = QString::asprintf(formatStr, static_cast<uint>(frameId()),
+ payload().size());
+
+ if (type == RemoteRequestFrame) {
+ result.append(QLatin1String(" Remote Request"));
+ } else {
+ QByteArray data = payload().toHex().toUpper();
+ for (int i = 0; i < data.size(); i += 3)
+ data.insert(i, ' ');
+ result.append(QLatin1String(data));
+ }
+
+ return result;
+ }
+
#ifndef QT_NO_DATASTREAM
friend Q_SERIALBUS_EXPORT QDataStream &operator<<(QDataStream &, const QCanBusFrame &);
friend Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &, QCanBusFrame &);
diff --git a/src/tools/canbusutil/readtask.cpp b/src/tools/canbusutil/readtask.cpp
index bb9b344..6c09e02 100644
--- a/src/tools/canbusutil/readtask.cpp
+++ b/src/tools/canbusutil/readtask.cpp
@@ -51,33 +51,13 @@ void ReadTask::checkMessages() {
const QCanBusFrame frame = canDevice->readFrame();
- const qint32 id = frame.frameId();
- const qint8 dataLength = frame.payload().size();
-
QString view;
- if (frame.frameType() == QCanBusFrame::ErrorFrame) {
+ if (frame.frameType() == QCanBusFrame::ErrorFrame)
view = canDevice->interpretErrorFrame(frame);
- } else {
- view += QLatin1String("Id: ");
- view += QString::number(id, 16);
- view += QLatin1String(" bytes: ");
- view += QString::number(dataLength, 10);
- view += QLatin1String(" data:");
- QByteArray array = frame.payload();
- for (int i=0; i < array.size(); i++) {
- view += QLatin1String(" 0x");
- quint8 number = array[i];
- view += QString::number(number, 16);
- }
- }
+ else
+ view = frame.toString();
- if (frame.frameType() == QCanBusFrame::RemoteRequestFrame) {
- output << "RTR: " << view << endl;
- } else if (frame.frameType() == QCanBusFrame::ErrorFrame) {
- output << "ERR: " << view << endl;
- } else {
- output << view << endl;
- }
+ output << view << endl;
}
void ReadTask::receiveError(QCanBusDevice::CanBusError /*error*/) {
diff --git a/tests/auto/plugins/genericcanbus/dummybackend.cpp b/tests/auto/plugins/genericcanbus/dummybackend.cpp
index 71d1c0f..73edddb 100644
--- a/tests/auto/plugins/genericcanbus/dummybackend.cpp
+++ b/tests/auto/plugins/genericcanbus/dummybackend.cpp
@@ -75,7 +75,7 @@ void DummyBackend::sendMessage()
bool DummyBackend::writeFrame(const QCanBusFrame &data)
{
- qDebug() << "DummyBackend::writeFrame: " << data.payload();
+ qDebug() << "DummyBackend::writeFrame: " << data.toString();
return true;
}
diff --git a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
index eb427fb..4aae1a6 100644
--- a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
+++ b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
@@ -52,6 +52,9 @@ private slots:
void tst_isValid_data();
void tst_isValid();
+ void tst_toString_data();
+ void tst_toString();
+
void streaming_data();
void streaming();
@@ -205,6 +208,78 @@ void tst_QCanBusFrame::tst_isValid()
QCOMPARE(QCanBusFrame::InvalidFrame, frame.frameType());
}
+void tst_QCanBusFrame::tst_toString_data()
+{
+ QTest::addColumn<QCanBusFrame::FrameType>("frameType");
+ QTest::addColumn<quint32>("id");
+ QTest::addColumn<bool>("extended");
+ QTest::addColumn<QByteArray>("payload");
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("invalid frame")
+ << QCanBusFrame::InvalidFrame << 0x0u << false
+ << QByteArray()
+ << "(Invalid)";
+ QTest::newRow("error frame")
+ << QCanBusFrame::ErrorFrame << 0x0u << false
+ << QByteArray()
+ << "(Error)";
+ QTest::newRow("unknown frame")
+ << QCanBusFrame::UnknownFrame << 0x0u << false
+ << QByteArray()
+ << "(Unknown)";
+ QTest::newRow("remote request frame")
+ << QCanBusFrame::RemoteRequestFrame << 0x123u << false
+ << QByteArray::fromHex("01") // fake data to get a DLC > 0
+ << " 123 [1] Remote Request";
+ QTest::newRow("data frame min std id")
+ << QCanBusFrame::DataFrame << 0x0u << false
+ << QByteArray()
+ << QString(" 000 [0]");
+ QTest::newRow("data frame max std id")
+ << QCanBusFrame::DataFrame << 0x7FFu << false
+ << QByteArray()
+ << QString(" 7FF [0]");
+ QTest::newRow("data frame min ext id")
+ << QCanBusFrame::DataFrame << 0x0u << true
+ << QByteArray()
+ << QString("00000000 [0]");
+ QTest::newRow("data frame max ext id")
+ << QCanBusFrame::DataFrame << 0x1FFFFFFFu << true
+ << QByteArray()
+ << QString("1FFFFFFF [0]");
+ QTest::newRow("data frame minimal size")
+ << QCanBusFrame::DataFrame << 0x7FFu << false
+ << QByteArray::fromHex("01")
+ << QString(" 7FF [1] 01");
+ QTest::newRow("data frame maximal size")
+ << QCanBusFrame::DataFrame << 0x1FFFFFFFu << true
+ << QByteArray::fromHex("0123456789ABCDEF")
+ << QString("1FFFFFFF [8] 01 23 45 67 89 AB CD EF");
+ QTest::newRow("data frame FD")
+ << QCanBusFrame::DataFrame << 0x123u << false
+ << QByteArray::fromHex("00112233445566778899AABBCCDDEEFF")
+ << QString(" 123 [16] 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF");
+}
+
+void tst_QCanBusFrame::tst_toString()
+{
+ QFETCH(QCanBusFrame::FrameType, frameType);
+ QFETCH(quint32, id);
+ QFETCH(bool, extended);
+ QFETCH(QByteArray, payload);
+ QFETCH(QString, expected);
+ QCanBusFrame frame;
+ frame.setFrameType(frameType);
+ frame.setFrameId(id);
+ frame.setExtendedFrameFormat(extended);
+ frame.setPayload(payload);
+
+ const QString result = frame.toString();
+
+ QCOMPARE(result, expected);
+}
+
void tst_QCanBusFrame::streaming_data()
{
QTest::addColumn<quint32>("frameId");