8#include <QtCore/QJsonArray>
9#include <QtCore/QJsonDocument>
10#include <QtCore/QRegularExpression>
15 :
CompInfo(COMP_METADATA_TYPE_PARAMETER, compId_, vehicle_, parent)
21 if (metadataJsonFileName.isEmpty()) {
26 QJsonDocument jsonDoc;
29 qCWarning(CompInfoParamLog) <<
"Metadata json file open failed: compid:" <<
compId <<
errorString;
33 const QJsonObject jsonObj = jsonDoc.object();
34 const QList<JsonParsing::KeyValidateInfo> keyInfoList = {
36 {kJsonParametersKey, QJsonValue::Array,
true},
39 qCWarning(CompInfoParamLog) <<
"Metadata json validation failed: compid:" <<
compId <<
errorString;
48 _noJsonMetadata =
false;
50 const QJsonArray parameters = jsonObj[kJsonParametersKey].toArray();
51 const QString escapedTag = QRegularExpression::escape(kIndexedNameTag);
53 for (
const QJsonValue ¶meterValue : parameters) {
54 if (!parameterValue.isObject()) {
55 qCWarning(CompInfoParamLog) <<
"Metadata json read failed: compid:" <<
compId <<
"parameters array contains non-object";
61 if (newMetaData->
name().contains(kIndexedNameTag)) {
62 QString regexPattern = QRegularExpression::escape(newMetaData->
name());
63 regexPattern.replace(escapedTag, QStringLiteral(
"(\\d+)"));
64 _indexedNameMetaDataList.append({QRegularExpression(QStringLiteral(
"^%1$").arg(regexPattern)), newMetaData});
66 _nameToMetaDataMap[newMetaData->
name()] = newMetaData;
73 if (
FactMetaData *cached = _nameToMetaDataMap.value(name)) {
77 FactMetaData *factMetaData = _resolveMetaData(name, valueType);
78 _nameToMetaDataMap[name] = factMetaData;
84 if (_noJsonMetadata) {
87 return fwMeta->getMetaDataForFact(name, valueType);
98 const int sep = name.indexOf(
'_');
100 factMetaData->setGroup(name.left(sep));
102 if (
compId != MAV_COMP_ID_AUTOPILOT1) {
103 factMetaData->setCategory(tr(
"Component %1").arg(
compId));
108FactMetaData *CompInfoParam::_lookupJsonMetaData(
const QString &name)
111 for (
const auto &[regex, templateMeta] : _indexedNameMetaDataList) {
112 const QRegularExpressionMatch match = regex.match(name);
113 if (match.hasMatch()) {
114 auto *factMetaData =
new FactMetaData(*templateMeta,
this);
115 factMetaData->setName(name);
117 const QString index = match.captured(1);
118 QString desc = factMetaData->shortDescription();
119 desc.replace(kIndexedNameTag, index);
120 factMetaData->setShortDescription(desc);
122 desc = factMetaData->longDescription();
123 desc.replace(kIndexedNameTag, index);
124 factMetaData->setLongDescription(desc);
134 if (!_parameterMetaData &&
compId == MAV_COMP_ID_AUTOPILOT1) {
136 if (_parameterMetaData) {
137 _parameterMetaData->setParent(
this);
141 return _parameterMetaData;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void setJson(const QString &metadataJsonFileName) override
FactMetaData * factMetaDataForName(const QString &name, FactMetaData::ValueType_t valueType)
Base class for all CompInfo types.
ParameterMetaData * loadParameterMetaData(const Vehicle *vehicle)
FirmwarePlugin * firmwarePlugin()
Provides access to the Firmware Plugin for this Vehicle.
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)
Validates that all required keys are present and that listed keys have the expected type.
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.
constexpr const char * jsonVersionKey