From a6691ac17232863b063d6e6dd4fd7da3bab9f908 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Wed, 7 Sep 2016 21:03:44 +0200 Subject: QCanBusFrame: Easier TimeStamp creation from microseconds only The new function fromMicroSeconds() automatically converts overflow microseconds to seconds. [ChangeLog][QtSerialBus][QCanBusFrame::TimeStamp] TimeStamp::fromMicroSeconds() creates time stamps with normalized microseconds and the overflow added to seconds. Change-Id: I55aab33c1bcf444c50b09415e038a3c8929caeab Reviewed-by: Denis Shienkov Reviewed-by: Alex Blasche --- src/plugins/canbus/vectorcan/vectorcanbackend.cpp | 3 +-- src/serialbus/qcanbusframe.cpp | 13 +++++++++++++ src/serialbus/qcanbusframe.h | 4 ++++ tests/auto/qcanbusframe/tst_qcanbusframe.cpp | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp index c178b50..d06f124 100644 --- a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp +++ b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp @@ -324,8 +324,7 @@ void VectorCanBackendPrivate::startRead() QCanBusFrame frame(msg.id, QByteArray(reinterpret_cast(msg.data), int(msg.dlc))); - const quint64 usecs = event.timeStamp / 1000; - frame.setTimeStamp(QCanBusFrame::TimeStamp(usecs / 1000000, usecs % 1000000)); + frame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(event.timeStamp / 1000)); frame.setExtendedFrameFormat(msg.id & XL_CAN_EXT_MSG_ID); frame.setFrameType((msg.flags & XL_CAN_MSG_FLAG_REMOTE_FRAME) ? QCanBusFrame::RemoteRequestFrame diff --git a/src/serialbus/qcanbusframe.cpp b/src/serialbus/qcanbusframe.cpp index da8a595..d963f51 100644 --- a/src/serialbus/qcanbusframe.cpp +++ b/src/serialbus/qcanbusframe.cpp @@ -243,6 +243,19 @@ QT_BEGIN_NAMESPACE \fn TimeStamp::TimeStamp(qint64 s, qint64 usec) Constructs a TimeStamp in seconds, \a s, and microseconds, \a usec. + + \note The TimeStamp is not normalized, i.e. microseconds greater 1000000 are not + converted to seconds. +*/ + +/*! + \fn static TimeStamp TimeStamp::fromMicroSeconds(qint64 usec) + \since 5.8 + + Constructs a normalized TimeStamp from microseconds \a usec. + + The created TimeStamp is normalized, i.e. microsconds greater 1000000 are converted + to seconds. */ /*! diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h index 5658f94..131236d 100644 --- a/src/serialbus/qcanbusframe.h +++ b/src/serialbus/qcanbusframe.h @@ -52,6 +52,10 @@ public: public: Q_DECL_CONSTEXPR TimeStamp(qint64 s = 0, qint64 usec = 0) Q_DECL_NOTHROW : secs(s), usecs(usec) {} + + Q_DECL_CONSTEXPR static TimeStamp fromMicroSeconds(qint64 usec) Q_DECL_NOTHROW + { return TimeStamp(usec / 1000000, usec % 1000000); } + Q_DECL_CONSTEXPR qint64 seconds() const Q_DECL_NOTHROW { return secs; } Q_DECL_CONSTEXPR qint64 microSeconds() const Q_DECL_NOTHROW { return usecs; } diff --git a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp index 763d116..e647a55 100644 --- a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp +++ b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp @@ -140,6 +140,21 @@ void tst_QCanBusFrame::timeStamp() timeStamp.setSeconds(4); QCOMPARE(timeStamp.seconds(), 4); QCOMPARE(timeStamp.microSeconds(), 5); + + // fromMicroSeconds: no microsecond overflow + timeStamp = QCanBusFrame::TimeStamp::fromMicroSeconds(999999); + QCOMPARE(timeStamp.seconds(), 0); + QCOMPARE(timeStamp.microSeconds(), 999999); + + // fromMicroSeconds: microsecond overflow + timeStamp = QCanBusFrame::TimeStamp::fromMicroSeconds(1000000); + QCOMPARE(timeStamp.seconds(), 1); + QCOMPARE(timeStamp.microSeconds(), 0); + + // fromMicroSeconds: microsecond overflow + timeStamp = QCanBusFrame::TimeStamp::fromMicroSeconds(2000001); + QCOMPARE(timeStamp.seconds(), 2); + QCOMPARE(timeStamp.microSeconds(), 1); } void tst_QCanBusFrame::tst_isValid_data() -- cgit v1.2.3