5#include <QtCore/QJsonObject>
6#include <QtCore/QRegularExpression>
8using namespace Qt::StringLiterals;
16 qCDebug(APMParameterMetaDataLog) <<
this;
21 qCDebug(APMParameterMetaDataLog) <<
this;
24QString APMParameterMetaData::_groupFromParameterName(
const QString &name)
26 static const QRegularExpression regex(QStringLiteral(
"[0-9]*$"));
27 QString group = name.split(
'_').first();
28 return group.remove(regex);
33 for (
auto groupIt = json.constBegin(); groupIt != json.constEnd(); ++groupIt) {
34 if (!groupIt->isObject()) {
38 const QJsonObject params = groupIt->toObject();
40 for (
auto paramIt = params.constBegin(); paramIt != params.constEnd(); ++paramIt) {
41 if (!paramIt->isObject()) {
45 const QString name = paramIt.key();
46 const QString group = _groupFromParameterName(name);
48 if (_rawParams.contains(name)) {
49 qCWarning(APMParameterMetaDataLog) <<
"Duplicate parameter found:" << name;
52 _rawParams[name] = RawParamData{group, paramIt->toObject()};
56 _correctGroupMemberships();
59void APMParameterMetaData::_correctGroupMemberships()
62 QHash<QString, int> groupCount;
63 for (
const auto &raw : std::as_const(_rawParams)) {
64 groupCount[raw.group]++;
66 for (
auto &raw : _rawParams) {
67 if (groupCount.value(raw.group) == 1) {
75 auto it = _rawParams.constFind(name);
76 if (it == _rawParams.constEnd()) {
80 const RawParamData &raw = *it;
81 const QJsonObject &f = raw.fields;
84 metaData->setName(name);
85 metaData->setGroup(raw.group);
87 const QString displayName = f.value(u
"DisplayName").toString();
88 if (!displayName.isEmpty()) {
89 metaData->setShortDescription(displayName);
92 const QString description = f.value(u
"Description").toString();
93 if (!description.isEmpty()) {
94 metaData->setLongDescription(description);
97 const QString units = f.value(u
"Units").toString();
98 if (!units.isEmpty()) {
99 metaData->setRawUnits(units);
102 const QString category = f.value(u
"User").toString();
103 if (!category.isEmpty()) {
104 metaData->setCategory(category);
107 if (f.contains(u
"ReadOnly")) {
108 metaData->setReadOnly(
jsonToBool(f.value(u
"ReadOnly")));
110 if (f.contains(u
"RebootRequired")) {
111 metaData->setVehicleRebootRequired(
jsonToBool(f.value(u
"RebootRequired")));
114 const QString increment = f.value(u
"Increment").toString();
115 if (!increment.isEmpty()) {
117 const double val = increment.toDouble(&ok);
119 metaData->setRawIncrement(val);
123 const QJsonObject range = f.value(u
"Range").toObject();
124 if (!range.isEmpty()) {
125 const QString lowStr = range.value(u
"low").toString();
126 const QString highStr = range.value(u
"high").toString();
127 if (!lowStr.isEmpty()) {
131 if (!highStr.isEmpty()) {
137 const QJsonObject valuesObj = f.value(u
"Values").toObject();
138 if (!valuesObj.isEmpty()) {
139 _applyEnumValues(metaData, valuesObj);
142 const QJsonObject bitmaskObj = f.value(u
"Bitmask").toObject();
143 if (!bitmaskObj.isEmpty()) {
144 _applyBitmask(metaData, bitmaskObj);
150QList<ParameterMetaData::ValueDescPair> APMParameterMetaData::_sortedNumericPairs(
const QJsonObject &obj,
const QString ¶mName)
154 struct Entry {
double sortKey; QString key; QString desc; };
155 QList<Entry> entries;
156 entries.reserve(obj.size());
157 for (
auto it = obj.constBegin(); it != obj.constEnd(); ++it) {
159 const double sortKey = it.key().toDouble(&ok);
161 qCWarning(APMParameterMetaDataLog) <<
"Non-numeric key:" << it.key() <<
"for" << paramName;
164 entries.append({sortKey, it.key(), it->toString()});
166 std::sort(entries.begin(), entries.end(), [](
const auto &a,
const auto &b) {
167 return a.sortKey < b.sortKey;
170 QList<ValueDescPair> pairs;
171 pairs.reserve(entries.size());
172 for (
const auto &e : std::as_const(entries)) {
173 pairs.append({e.key, e.desc});
178void APMParameterMetaData::_applyEnumValues(
FactMetaData *metaData,
const QJsonObject &valuesObj)
183void APMParameterMetaData::_applyBitmask(
FactMetaData *metaData,
const QJsonObject &bitmaskObj)
192 metaData->
setGroup(_groupFromParameterName(name));
198 if ((name.endsWith(u
"_P") || name.endsWith(u
"_I") || name.endsWith(u
"_D")) &&
#define QGC_LOGGING_CATEGORY(name, categoryStr)
The FirmwarePlugin class represents the methods and objects which are specific to a certain Firmware ...