diff options
-rw-r--r-- | examples/serialbus/can/mainwindow.cpp | 26 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.cpp | 25 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.h | 29 | ||||
-rw-r--r-- | src/tools/canbusutil/readtask.cpp | 28 | ||||
-rw-r--r-- | tests/auto/plugins/genericcanbus/dummybackend.cpp | 2 | ||||
-rw-r--r-- | tests/auto/qcanbusframe/tst_qcanbusframe.cpp | 75 |
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"); |