diff options
-rw-r--r-- | src/serialbus/qcanbusframe.cpp | 6 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.h | 13 | ||||
-rw-r--r-- | tests/auto/qcanbusframe/tst_qcanbusframe.cpp | 66 |
3 files changed, 68 insertions, 17 deletions
diff --git a/src/serialbus/qcanbusframe.cpp b/src/serialbus/qcanbusframe.cpp index a71a0b6..37008db 100644 --- a/src/serialbus/qcanbusframe.cpp +++ b/src/serialbus/qcanbusframe.cpp @@ -68,7 +68,11 @@ QT_BEGIN_NAMESPACE /*! \fn bool QCanBusFrame::isValid() const - Returns \c true if the \l frameType() is \l InvalidFrame; otherwise \c false. + Returns \c false if the \l frameType() is \l InvalidFrame, + the \l hasExtendedFrameFormat() is not set although \l frameId() is longer than 11 bit or + the payload is longer than the maximal permitted payload length of 64 byte. + + Otherwise this function returns \c true. */ /*! diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h index 66d8e81..37ed414 100644 --- a/src/serialbus/qcanbusframe.h +++ b/src/serialbus/qcanbusframe.h @@ -110,7 +110,18 @@ public: bool isValid() const { - return (format != 0x4); + if (format == InvalidFrame) + return false; + + // long id used, but extended flag not set + if (!isExtendedFrame && (canId & 0x1FFFF800U)) + return false; + + // maximum permitted payload size in CANFD + if (load.length() > 64) + return false; + + return true; } FrameType frameType() const diff --git a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp index 899dd98..2f29a94 100644 --- a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp +++ b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp @@ -135,30 +135,66 @@ void tst_QCanBusFrame::tst_isValid_data() { QTest::addColumn<QCanBusFrame::FrameType>("frameType"); QTest::addColumn<bool>("isValid"); - - QTest::newRow("invalid frame") << QCanBusFrame::InvalidFrame << false; - QTest::newRow("data frame") << QCanBusFrame::DataFrame << true; - QTest::newRow("error frame") << QCanBusFrame::ErrorFrame << true; - QTest::newRow("remote request frame") << QCanBusFrame::RemoteRequestFrame << true; - QTest::newRow("unknown frame") << QCanBusFrame::UnknownFrame << true; -} + QTest::addColumn<QByteArray>("payload"); + QTest::addColumn<uint>("id"); + QTest::addColumn<bool>("extended"); + + QTest::newRow("invalid frame") + << QCanBusFrame::InvalidFrame << false + << QByteArray() << 0u << false; + QTest::newRow("data frame") + << QCanBusFrame::DataFrame << true + << QByteArray() << 0u << false; + QTest::newRow("error frame") + << QCanBusFrame::ErrorFrame << true + << QByteArray() << 0u << false; + QTest::newRow("remote request frame") + << QCanBusFrame::RemoteRequestFrame << true + << QByteArray() << 0u << false; + QTest::newRow("unknown frame") + << QCanBusFrame::UnknownFrame << true + << QByteArray() << 0u << false; + QTest::newRow("data frame can max payload") + << QCanBusFrame::DataFrame << true + << QByteArray(8, 0) << 0u << false; + QTest::newRow("data frame canfd max payload") + << QCanBusFrame::DataFrame << true + << QByteArray(64, 0) << 0u << false; + QTest::newRow("data frame can too much payload") + << QCanBusFrame::DataFrame << false + << QByteArray(65, 0) << 0u << false; + QTest::newRow("data frame short id") + << QCanBusFrame::DataFrame << true + << QByteArray(8, 0) << (1u << 11) - 1 << false; + QTest::newRow("data frame long id") + << QCanBusFrame::DataFrame << true + << QByteArray(8, 0) << (1u << 11) << true; + QTest::newRow("data frame bad long id") + << QCanBusFrame::DataFrame << false + << QByteArray(8, 0) << (1u << 11) << false; + } void tst_QCanBusFrame::tst_isValid() { QFETCH(QCanBusFrame::FrameType, frameType); QFETCH(bool, isValid); + QFETCH(QByteArray, payload); + QFETCH(uint, id); + QFETCH(bool, extended); QCanBusFrame frame(frameType); - QCOMPARE(isValid, frame.isValid()); - QCOMPARE(frameType, frame.frameType()); - - frame.setFrameType(QCanBusFrame::ErrorFrame); - QCOMPARE(true, frame.isValid()); - QCOMPARE(frame.frameType(), QCanBusFrame::ErrorFrame); + frame.setPayload(payload); + frame.setFrameId(id); + frame.setExtendedFrameFormat(extended); + QCOMPARE(frame.isValid(), isValid); + QCOMPARE(frame.frameType(), frameType); + QCOMPARE(frame.payload(), payload); + QCOMPARE(frame.frameId(), id); + QCOMPARE(frame.hasExtendedFrameFormat(), extended); frame.setFrameType(QCanBusFrame::InvalidFrame); - QCOMPARE(false, frame.isValid()); - QCOMPARE(frame.frameType(), QCanBusFrame::InvalidFrame); + QCOMPARE(frame.isValid(), false); + QCOMPARE(QCanBusFrame::InvalidFrame, frame.frameType()); } void tst_QCanBusFrame::streaming_data() |