地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
4.0 KiB

/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include "CompInfoGeneral.h"
#include "JsonHelper.h"
#include "FactMetaData.h"
#include "FirmwarePlugin.h"
#include "FirmwarePluginManager.h"
#include "QGCApplication.h"
#include <QStandardPaths>
#include <QJsonDocument>
#include <QJsonArray>
QGC_LOGGING_CATEGORY(CompInfoGeneralLog, "CompInfoGeneralLog")
const char* CompInfoGeneral::_jsonMetadataTypesKey = "metadataTypes";
CompInfoGeneral::CompInfoGeneral(uint8_t compId, Vehicle* vehicle, QObject* parent)
: CompInfo(COMP_METADATA_TYPE_GENERAL, compId, vehicle, parent)
{
}
void CompInfoGeneral::setUris(CompInfo &compInfo) const
{
const auto& metadataTypeIter = _supportedTypes.constFind(compInfo.type);
if (metadataTypeIter == _supportedTypes.constEnd()) {
compInfo._uris = {}; // reset
} else {
compInfo._uris = *metadataTypeIter;
}
}
void CompInfoGeneral::setJson(const QString& metadataJsonFileName, const QString& /*translationJsonFileName*/)
{
if (metadataJsonFileName.isEmpty()) {
return;
}
QString errorString;
QJsonDocument jsonDoc;
if (!JsonHelper::isJsonFile(metadataJsonFileName, jsonDoc, errorString)) {
qCWarning(CompInfoGeneralLog) << "Metadata json file open failed: compid:" << compId << errorString;
return;
}
QJsonObject jsonObj = jsonDoc.object();
QList<JsonHelper::KeyValidateInfo> keyInfoList = {
{ JsonHelper::jsonVersionKey, QJsonValue::Double, true },
{ _jsonMetadataTypesKey, QJsonValue::Array, true },
};
if (!JsonHelper::validateKeys(jsonObj, keyInfoList, errorString)) {
qCWarning(CompInfoGeneralLog) << "Metadata json validation failed: compid:" << compId << errorString;
return;
}
int version = jsonObj[JsonHelper::jsonVersionKey].toInt();
if (version != 1) {
qCWarning(CompInfoGeneralLog) << "Metadata json unsupported version" << version;
return;
}
QJsonArray rgSupportedTypes = jsonObj[_jsonMetadataTypesKey].toArray();
for (QJsonValue typeValue : rgSupportedTypes) {
int type = typeValue["type"].toInt(-1);
if (type == -1)
continue;
Uris uris;
uris.uriMetaData = typeValue["uri"].toString();
uris.crcMetaData = typeValue["fileCrc"].toVariant().toLongLong(); // Note: can't use toInt(), as it returns 0 when exceeding 2^31
uris.crcMetaDataValid = typeValue.toObject().contains("fileCrc");
uris.uriMetaDataFallback = typeValue["uriFallback"].toString();
uris.crcMetaDataFallback = typeValue["fileCrcFallback"].toVariant().toLongLong();
uris.crcMetaDataFallbackValid = typeValue.toObject().contains("fileCrcFallback");
uris.uriTranslation = typeValue["translationUri"].toString();
uris.crcTranslation = typeValue["translationFileCrc"].toVariant().toLongLong();
uris.crcTranslationValid = typeValue.toObject().contains("translationFileCrc");
uris.uriTranslationFallback = typeValue["translationUriFallback"].toString();
uris.crcTranslationFallback = typeValue["translationFileCrcFallback"].toVariant().toLongLong();
uris.crcTranslationFallbackValid = typeValue.toObject().contains("translationFileCrcFallback");
if (uris.uriMetaData.isEmpty() || !uris.crcMetaDataValid) {
qCWarning(CompInfoGeneralLog) << "Metadata missing required fields: type:uri:crcValid" << type <<
uris.uriMetaData << uris.crcMetaDataValid;
continue;
}
_supportedTypes[(COMP_METADATA_TYPE)type] = uris;
qCDebug(CompInfoGeneralLog) << "Metadata type : uri : crc" << type << uris.uriMetaData << uris.crcMetaData;
}
}