summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/serialbus/qcanbusframe.cpp6
-rw-r--r--src/serialbus/qcanbusframe.h13
-rw-r--r--tests/auto/qcanbusframe/tst_qcanbusframe.cpp66
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()