QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
CompInfoGeneral.cc
Go to the documentation of this file.
1#include "CompInfoGeneral.h"
3#include "JsonHelper.h"
4#include "JsonParsing.h"
6
7#include <QtCore/QJsonDocument>
8#include <QtCore/QJsonArray>
9
10QGC_LOGGING_CATEGORY(CompInfoGeneralLog, "ComponentInformation.CompInfoGeneral")
11
12CompInfoGeneral::CompInfoGeneral(uint8_t compId_, Vehicle* vehicle_, QObject* parent)
13 : CompInfo(COMP_METADATA_TYPE_GENERAL, compId_, vehicle_, parent)
14{
15
16}
17
19{
20 const auto& metadataTypeIter = _supportedTypes.constFind(compInfo.type);
21 if (metadataTypeIter == _supportedTypes.constEnd()) {
22 compInfo._uris = {}; // reset
23 } else {
24 compInfo._uris = *metadataTypeIter;
25 }
26}
27
28void CompInfoGeneral::setJson(const QString& metadataJsonFileName)
29{
30 if (metadataJsonFileName.isEmpty()) {
31 return;
32 }
33
34 QString errorString;
35 QJsonDocument jsonDoc;
36
37 if (!JsonParsing::isJsonFile(metadataJsonFileName, jsonDoc, errorString)) {
38 qCWarning(CompInfoGeneralLog) << "Metadata json file open failed: compid:" << compId << errorString;
39 return;
40 }
41 QJsonObject jsonObj = jsonDoc.object();
42
43 QList<JsonHelper::KeyValidateInfo> keyInfoList = {
44 { JsonHelper::jsonVersionKey, QJsonValue::Double, true },
45 { _jsonMetadataTypesKey, QJsonValue::Array, true },
46 };
47 if (!JsonHelper::validateKeys(jsonObj, keyInfoList, errorString)) {
48 qCWarning(CompInfoGeneralLog) << "Metadata json validation failed: compid:" << compId << errorString;
49 return;
50 }
51
52 int version = jsonObj[JsonHelper::jsonVersionKey].toInt();
53 if (version != 1) {
54 qCWarning(CompInfoGeneralLog) << "Metadata json unsupported version" << version;
55 return;
56 }
57
58 QJsonArray rgSupportedTypes = jsonObj[_jsonMetadataTypesKey].toArray();
59 for (QJsonValue typeValue : rgSupportedTypes) {
60 int metadataType = typeValue["type"].toInt(-1);
61 if (metadataType == -1)
62 continue;
63 Uris uris;
64 uris.uriMetaData = typeValue["uri"].toString();
65 uris.crcMetaData = typeValue["fileCrc"].toVariant().toLongLong(); // Note: can't use toInt(), as it returns 0 when exceeding 2^31
66 uris.crcMetaDataValid = typeValue.toObject().contains("fileCrc");
67 uris.uriMetaDataFallback = typeValue["uriFallback"].toString();
68 uris.crcMetaDataFallback = typeValue["fileCrcFallback"].toVariant().toLongLong();
69 uris.crcMetaDataFallbackValid = typeValue.toObject().contains("fileCrcFallback");
70 uris.uriTranslation = typeValue["translationUri"].toString();
71 uris.uriTranslationFallback = typeValue["translationUriFallback"].toString();
72
73 if (uris.uriMetaData.isEmpty() || !uris.crcMetaDataValid) {
74 // The CRC is optional for dynamically updated metadata, and once we want to support that this logic needs
75 // to be updated.
76 qCDebug(ComponentInformationManagerLog) << "Metadata missing fields: type:uri:crcValid" << metadataType <<
77 uris.uriMetaData << uris.crcMetaDataValid;
78 continue;
79 }
80
81 _supportedTypes[(COMP_METADATA_TYPE)metadataType] = uris;
82 qCDebug(CompInfoGeneralLog) << "Metadata type : uri : crc" << metadataType << uris.uriMetaData << uris.crcMetaData;
83 }
84}
QString errorString
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void setJson(const QString &metadataJsonFileName) override
void setUris(CompInfo &compInfo) const
Base class for all CompInfo types.
Definition CompInfo.h:14
const COMP_METADATA_TYPE type
Definition CompInfo.h:35
const uint8_t compId
Definition CompInfo.h:37
constexpr const char * jsonVersionKey
Definition JsonHelper.h:109
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.