summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-01-13 19:41:44 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-19 16:45:22 +0000
commit0fbef8c9c81ab21e8e399c3815e3c51bcf4e9527 (patch)
tree8e33886b35a438a802769bb6cd1e67b8662dbf3a
parent98a263fb10d679bfa1d5baa4dc91383ccbd3f3a4 (diff)
Introduce struct QCanSignalDescription::MultiplexValueRange
... and use it instead of QPair<QVarian, QVariant> to define a range of values for a multiplexor signal. Change-Id: Ibc04d9618ec46fa0af2f94d9808a82af35fb7dd7 Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit 53631e08169f285e81cc6c991d05cc511a7d9ed1) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/serialbus/qcandbcfileparser.cpp4
-rw-r--r--src/serialbus/qcansignaldescription.cpp40
-rw-r--r--src/serialbus/qcansignaldescription.h26
-rw-r--r--tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp16
-rw-r--r--tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp12
-rw-r--r--tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp2
6 files changed, 77 insertions, 23 deletions
diff --git a/src/serialbus/qcandbcfileparser.cpp b/src/serialbus/qcandbcfileparser.cpp
index e327d7f..422efb0 100644
--- a/src/serialbus/qcandbcfileparser.cpp
+++ b/src/serialbus/qcandbcfileparser.cpp
@@ -843,7 +843,7 @@ void QCanDbcFileParserPrivate::parseExtendedMux(const QStringView data)
if (sepIdx != -1) {
const auto min = rangeView.first(sepIdx).trimmed().toUInt();
const auto max = rangeView.sliced(sepIdx + 1).trimmed().toUInt();
- rangeValues.emplaceBack(qMakePair(min, max));
+ rangeValues.push_back({min, max});
}
// We can have an arbitrary amount of ranges, so we can't use capture groups
@@ -861,7 +861,7 @@ void QCanDbcFileParserPrivate::parseExtendedMux(const QStringView data)
if (sepIdx != -1) {
const auto min = range.first(sepIdx).trimmed().toUInt();
const auto max = range.sliced(sepIdx + 1).trimmed().toUInt();
- rangeValues.emplaceBack(qMakePair(min, max));
+ rangeValues.push_back({min, max});
}
}
}
diff --git a/src/serialbus/qcansignaldescription.cpp b/src/serialbus/qcansignaldescription.cpp
index 7a016ad..113e736 100644
--- a/src/serialbus/qcansignaldescription.cpp
+++ b/src/serialbus/qcansignaldescription.cpp
@@ -162,6 +162,32 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \struct QCanSignalDescription::MultiplexValueRange
+ \inmodule QtSerialBus
+ \since 6.5
+
+ \brief Defines a range of values for a multiplexor signal.
+
+ Each multiplexor signal can have several ranges of values assigned to it.
+ This type represents one range. Both minimum and maximum values are
+ included in the range. Minimum and maximum values can be equal, so a
+ MultiplexValueRange is never empty. If maximum is less than minimum, the
+ values will be swapped while doing the range check.
+
+ \sa {Multiplexed Signals Explained}
+*/
+
+/*!
+ \variable QCanSignalDescription::MultiplexValueRange::minimum
+ \brief the minimum value of the range.
+*/
+
+/*!
+ \variable QCanSignalDescription::MultiplexValueRange::maximum
+ \brief the maximum value of the range.
+*/
+
+/*!
\typealias QCanSignalDescription::MultiplexValues
*/
@@ -747,7 +773,7 @@ void QCanSignalDescription::addMultiplexSignal(const QString &name, const Multip
void QCanSignalDescription::addMultiplexSignal(const QString &name, const QVariant &value)
{
d.detach();
- d->muxSignals.insert(name, { qMakePair(value, value) });
+ d->muxSignals.insert(name, { {value, value} });
}
// copied from qtbase/src/testlib/qtestcase.cpp
@@ -820,6 +846,14 @@ QDebug QCanSignalDescription::debugStreaming(QDebug dbg, const QCanSignalDescrip
dbg << ")";
return dbg;
}
+
+QDebug QCanSignalDescription::MultiplexValueRange::debugStreaming(QDebug dbg,
+ const MultiplexValueRange &range)
+{
+ QDebugStateSaver saver(dbg);
+ dbg.nospace() << "MultiplexValueRange(" << range.minimum << ", " << range.maximum << ")";
+ return dbg;
+}
#endif // QT_NO_DEBUG_STREAM
template <typename T>
@@ -828,8 +862,8 @@ static bool checkValue(const QVariant &valueVar,
{
const T val = valueVar.value<T>();
for (const auto &pair : ranges) {
- T min = pair.first.value<T>();
- T max = pair.second.value<T>();
+ T min = pair.minimum.value<T>();
+ T max = pair.maximum.value<T>();
if (min > max)
max = std::exchange(min, max);
if (val >= min && val <= max)
diff --git a/src/serialbus/qcansignaldescription.h b/src/serialbus/qcansignaldescription.h
index aa54419..cbd2d9c 100644
--- a/src/serialbus/qcansignaldescription.h
+++ b/src/serialbus/qcansignaldescription.h
@@ -6,6 +6,7 @@
#include <QtCore/QDebug>
#include <QtCore/QExplicitlySharedDataPointer>
+#include <QtCore/QVariant>
#include <QtSerialBus/qcancommondefinitions.h>
#include <QtSerialBus/qtserialbusglobal.h>
@@ -18,7 +19,30 @@ QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QCanSignalDescriptionPrivate, Q
class Q_SERIALBUS_EXPORT QCanSignalDescription
{
public:
- using MultiplexValues = QList<QPair<QVariant, QVariant>>;
+ struct MultiplexValueRange {
+ QVariant minimum;
+ QVariant maximum;
+ private:
+ friend bool operator==(const MultiplexValueRange &lhs,
+ const MultiplexValueRange &rhs) noexcept
+ {
+ return lhs.minimum == rhs.minimum && lhs.maximum == rhs.maximum;
+ }
+ friend bool operator!=(const MultiplexValueRange &lhs,
+ const MultiplexValueRange &rhs) noexcept
+ {
+ return !(lhs == rhs);
+ }
+ friend size_t qHash(const MultiplexValueRange &, size_t) noexcept = delete;
+#ifndef QT_NO_DEBUG_STREAM
+ friend QDebug operator<<(QDebug dbg, const MultiplexValueRange &range)
+ {
+ return debugStreaming(dbg, range);
+ }
+ static QDebug debugStreaming(QDebug dbg, const MultiplexValueRange &range);
+#endif // QT_NO_DEBUG_STREAM
+ };
+ using MultiplexValues = QList<MultiplexValueRange>;
using MultiplexSignalValues = QHash<QString, MultiplexValues>;
diff --git a/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp b/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp
index f6f5c4f..f7e0828 100644
--- a/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp
+++ b/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp
@@ -662,8 +662,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setMultiplexState(QtCanBus::MultiplexState::SwitchAndSignal);
signalDesc.setStartBit(4);
signalDesc.setBitLength(4);
- signalDesc.addMultiplexSignal("s0", { qMakePair(1U, 1U), qMakePair(5U, 5U),
- qMakePair(9U, 9U) });
+ signalDesc.addMultiplexSignal("s0", { {1U, 1U}, {5U, 5U}, {9U, 9U} });
messageDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
@@ -672,8 +671,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
signalDesc.setStartBit(4);
signalDesc.setBitLength(12);
- signalDesc.addMultiplexSignal("s0", { qMakePair(2U, 4U), qMakePair(6U, 8U),
- qMakePair(10U, 10U) });
+ signalDesc.addMultiplexSignal("s0", { {2U, 4U}, {6U, 8U}, {10U, 10U} });
messageDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
@@ -687,7 +685,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setName("s4");
signalDesc.setStartBit(8);
signalDesc.setBitLength(8);
- signalDesc.addMultiplexSignal("s1", { qMakePair(2U, 3U), qMakePair(5U, 5U) });
+ signalDesc.addMultiplexSignal("s1", { {2U, 3U}, {5U, 5U} });
messageDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
@@ -829,8 +827,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setMultiplexState(QtCanBus::MultiplexState::SwitchAndSignal);
signalDesc.setStartBit(4);
signalDesc.setBitLength(4);
- signalDesc.addMultiplexSignal("s0", { qMakePair(1U, 1U), qMakePair(5U, 5U),
- qMakePair(9U, 9U) });
+ signalDesc.addMultiplexSignal("s0", { {1U, 1U}, {5U, 5U}, {9U, 9U} });
otherDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
@@ -839,8 +836,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
signalDesc.setStartBit(4);
signalDesc.setBitLength(12);
- signalDesc.addMultiplexSignal("s0", { qMakePair(2U, 4U), qMakePair(6U, 8U),
- qMakePair(10U, 10U) });
+ signalDesc.addMultiplexSignal("s0", { {2U, 4U}, {6U, 8U}, {10U, 10U} });
otherDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
@@ -854,7 +850,7 @@ void tst_QCanDbcFileParser::parseFile_data()
signalDesc.setName("s4");
signalDesc.setStartBit(8);
signalDesc.setBitLength(8);
- signalDesc.addMultiplexSignal("s1", { qMakePair(2U, 3U), qMakePair(5U, 5U) });
+ signalDesc.addMultiplexSignal("s1", { {2U, 3U}, {5U, 5U} });
otherDesc.addSignalDescription(signalDesc);
signalDesc.clearMultiplexSignals();
diff --git a/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp b/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp
index 2dbc826..28bd204 100644
--- a/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp
+++ b/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp
@@ -684,7 +684,7 @@ void tst_QCanFrameProcessor::parseExtendedMultiplexedSignals()
s2.setStartBit(4);
s2.setBitLength(12);
s2.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
- const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4) };
+ const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4} };
s2.addMultiplexSignal(s0.name(), muxValuesS0);
QCanSignalDescription s3; // depends on mux2 (so indirectly on mux1)
@@ -701,7 +701,7 @@ void tst_QCanFrameProcessor::parseExtendedMultiplexedSignals()
s4.setStartBit(8);
s4.setBitLength(8);
s4.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
- const QCanSignalDescription::MultiplexValues muxValuesS1 { qMakePair(2, 3), qMakePair(5, 5) };
+ const QCanSignalDescription::MultiplexValues muxValuesS1 { {2, 3}, {5, 5} };
s4.addMultiplexSignal(s1.name(), muxValuesS1);
const QtCanBus::UniqueId uniqueId = 123;
@@ -1529,7 +1529,7 @@ void tst_QCanFrameProcessor::prepareMultiplexedPayload()
s2.setStartBit(4);
s2.setBitLength(12);
s2.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
- const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4) };
+ const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4} };
s2.addMultiplexSignal(s0.name(), muxValuesS0);
QCanSignalDescription s3; // depends on mux2 (so indirectly on mux1)
@@ -1546,7 +1546,7 @@ void tst_QCanFrameProcessor::prepareMultiplexedPayload()
s4.setStartBit(8);
s4.setBitLength(8);
s4.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
- const QCanSignalDescription::MultiplexValues muxValuesS1 { qMakePair(2, 3), qMakePair(5, 5) };
+ const QCanSignalDescription::MultiplexValues muxValuesS1 { {2, 3}, {5, 5} };
s4.addMultiplexSignal(s1.name(), muxValuesS1);
const QtCanBus::UniqueId uniqueId = 123;
@@ -1683,7 +1683,7 @@ void tst_QCanFrameProcessor::prepareWithErrorsAndWarnings_data()
signalDesc.setStartBit(3);
signalDesc.setBitLength(12);
signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
- const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4), qMakePair(6, 6) };
+ const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4}, {6, 6} };
signalDesc.addMultiplexSignal("s0", muxValuesS0);
messageDesc.addSignalDescription(signalDesc);
@@ -1701,7 +1701,7 @@ void tst_QCanFrameProcessor::prepareWithErrorsAndWarnings_data()
signalDesc.setBitLength(8);
signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal);
signalDesc.addMultiplexSignal("s0", 1);
- const QCanSignalDescription::MultiplexValues muxValuesS2 { qMakePair(1, 3), qMakePair(5, 6) };
+ const QCanSignalDescription::MultiplexValues muxValuesS2 { {1, 3}, {5, 6} };
signalDesc.addMultiplexSignal("s2", muxValuesS2);
messageDesc.addSignalDescription(signalDesc);
diff --git a/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp b/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp
index 81e3f4a..2a4ef79 100644
--- a/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp
+++ b/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp
@@ -208,7 +208,7 @@ void tst_QCanSignalDescription::comparison()
{
QCanSignalDescription d1 = d;
QCanSignalDescription::MultiplexSignalValues muxValues;
- muxValues.insert("s0", QCanSignalDescription::MultiplexValues{ qMakePair(1, 1) });
+ muxValues.insert("s0", QCanSignalDescription::MultiplexValues{ {1, 1} });
d1.setMultiplexSignals(muxValues);
QCOMPARE_NE(d1, d);
QVERIFY(!QCanSignalDescriptionPrivate::get(d1)->isShared());