9#include <QtCore/QJsonArray>
10#include <QtCore/QJsonDocument>
11#include <QtCore/QRegularExpression>
16 :
CompInfo(COMP_METADATA_TYPE_PARAMETER, compId_, vehicle_, parent)
22 if (metadataJsonFileName.isEmpty()) {
27 QJsonDocument jsonDoc;
30 qCWarning(CompInfoParamLog) <<
"Metadata json file open failed: compid:" <<
compId <<
errorString;
36 qCWarning(CompInfoParamLog) <<
"Metadata json schema validation failed: compid:" <<
compId << schemaError;
39 const QJsonObject jsonObj = jsonDoc.object();
40 const QList<JsonParsing::KeyValidateInfo> keyInfoList = {
42 {kJsonParametersKey, QJsonValue::Array,
true},
45 qCWarning(CompInfoParamLog) <<
"Metadata json validation failed: compid:" <<
compId <<
errorString;
54 _noJsonMetadata =
false;
56 const QJsonArray parameters = jsonObj[kJsonParametersKey].toArray();
57 const QString escapedTag = QRegularExpression::escape(kIndexedNameTag);
59 for (
const QJsonValue ¶meterValue : parameters) {
60 if (!parameterValue.isObject()) {
61 qCWarning(CompInfoParamLog) <<
"Metadata json read failed: compid:" <<
compId <<
"parameters array contains non-object";
67 if (newMetaData->
name().contains(kIndexedNameTag)) {
68 QString regexPattern = QRegularExpression::escape(newMetaData->
name());
69 regexPattern.replace(escapedTag, QStringLiteral(
"(\\d+)"));
70 _indexedNameMetaDataList.append({QRegularExpression(QStringLiteral(
"^%1$").arg(regexPattern)), newMetaData});
72 _nameToMetaDataMap[newMetaData->
name()] = newMetaData;
79 if (
FactMetaData *cached = _nameToMetaDataMap.value(name)) {
83 FactMetaData *factMetaData = _resolveMetaData(name, valueType);
84 _nameToMetaDataMap[name] = factMetaData;
90 if (_noJsonMetadata) {
93 return fwMeta->getMetaDataForFact(name, valueType);
104 const int sep = name.indexOf(
'_');
106 factMetaData->setGroup(name.left(sep));
108 if (
compId != MAV_COMP_ID_AUTOPILOT1) {
109 factMetaData->setCategory(tr(
"Component %1").arg(
compId));
114FactMetaData *CompInfoParam::_lookupJsonMetaData(
const QString &name)
117 for (
const auto &[regex, templateMeta] : _indexedNameMetaDataList) {
118 const QRegularExpressionMatch match = regex.match(name);
119 if (match.hasMatch()) {
120 auto *factMetaData =
new FactMetaData(*templateMeta,
this);
121 factMetaData->setName(name);
123 const QString index = match.captured(1);
124 QString desc = factMetaData->shortDescription();
125 desc.replace(kIndexedNameTag, index);
126 factMetaData->setShortDescription(desc);
128 desc = factMetaData->longDescription();
129 desc.replace(kIndexedNameTag, index);
130 factMetaData->setLongDescription(desc);
140 if (!_parameterMetaData &&
compId == MAV_COMP_ID_AUTOPILOT1) {
142 if (_parameterMetaData) {
143 _parameterMetaData->setParent(
this);
147 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
bool validate(const QJsonDocument &doc, const QString &schemaResourcePath, QString &errorString)