From 5fb168e1f2aaf2c014c28c02b869e08f02beed42 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Wed, 27 Feb 2019 10:16:35 -0800 Subject: [PATCH] Add support for DEFINE replacement in FactMetaData enumString/Value json loading --- src/FactSystem/FactGroup.cc | 3 ++- src/FactSystem/FactMetaData.cc | 45 ++++++++++++++++++++++++++++------ src/FactSystem/FactMetaData.h | 9 +++++-- src/JsonHelper.cc | 19 +++++++++++--- src/JsonHelper.h | 2 ++ 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/FactSystem/FactGroup.cc b/src/FactSystem/FactGroup.cc index 31913205c..c67c02d8f 100644 --- a/src/FactSystem/FactGroup.cc +++ b/src/FactSystem/FactGroup.cc @@ -37,7 +37,8 @@ FactGroup::FactGroup(int updateRateMsecs, QObject* parent) void FactGroup::_loadFromJsonArray(const QJsonArray jsonArray) { - _nameToFactMetaDataMap = FactMetaData::createMapFromJsonArray(jsonArray, this); + QMap defineMap; + _nameToFactMetaDataMap = FactMetaData::createMapFromJsonArray(jsonArray, defineMap, this); } void FactGroup::_setupTimer() diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 4d07e198b..570149ab9 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -35,6 +35,9 @@ const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54; static const char* kDefaultCategory = QT_TRANSLATE_NOOP("FactMetaData", "Other"); static const char* kDefaultGroup = QT_TRANSLATE_NOOP("FactMetaData", "Misc"); +const char* FactMetaData::_jsonMetaDataDefinesName = "QGC.MetaData.Defines"; +const char* FactMetaData::_jsonMetaDataFactsName = "QGC.MetaData.Facts"; + // Built in translations for all Facts const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = { { "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees }, @@ -1057,7 +1060,7 @@ int FactMetaData::decimalPlaces(void) const return actualDecimalPlaces; } -FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObject* metaDataParent) +FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap& defineMap, QObject* metaDataParent) { QString errorString; @@ -1098,7 +1101,7 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec metaData->_name = json[_nameJsonKey].toString(); QStringList enumValues, enumStrings; - if (JsonHelper::parseEnum(json, enumStrings, enumValues, errorString, metaData->name())) { + if (JsonHelper::parseEnum(json, defineMap, enumStrings, enumValues, errorString, metaData->name())) { for (int i=0; i& defineMap) +{ + for (const QString& defineName: jsonDefinesObject.keys()) { + QString mapKey = _jsonMetaDataDefinesName + QString(".") + defineName; + defineMap[mapKey] = jsonDefinesObject[defineName].toString(); + } +} + QMap FactMetaData::createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent) { QMap metaDataMap; @@ -1223,16 +1234,34 @@ QMap FactMetaData::createMapFromJsonFile(const QString& return metaDataMap; } - if (!doc.isArray()) { - qWarning() << "json document is not array"; + QJsonArray factArray; + QMap defineMap; + + if (doc.isObject()) { + // Check for Defines/Facts format + QString errorString; + QList keyInfoList = { + { FactMetaData::_jsonMetaDataDefinesName, QJsonValue::Object, true }, + { FactMetaData::_jsonMetaDataFactsName, QJsonValue::Array, true }, + }; + if (!JsonHelper::validateKeys(doc.object(), keyInfoList, errorString)) { + qWarning() << "Json document incorrect format:" << errorString; + return metaDataMap; + } + + _loadJsonDefines(doc.object()[FactMetaData::_jsonMetaDataDefinesName].toObject(), defineMap); + factArray = doc.object()[FactMetaData::_jsonMetaDataFactsName].toArray(); + } else if (doc.isArray()) { + factArray = doc.array(); + } else { + qWarning() << "Json document is neither array nor object"; return metaDataMap; } - QJsonArray jsonArray = doc.array(); - return createMapFromJsonArray(jsonArray, metaDataParent); + return createMapFromJsonArray(factArray, defineMap, metaDataParent); } -QMap FactMetaData::createMapFromJsonArray(const QJsonArray jsonArray, QObject* metaDataParent) +QMap FactMetaData::createMapFromJsonArray(const QJsonArray jsonArray, QMap& defineMap, QObject* metaDataParent) { QMap metaDataMap; for (int i=0; i FactMetaData::createMapFromJsonArray(const QJsonArr continue; } QJsonObject jsonObject = jsonValue.toObject(); - FactMetaData* metaData = createFromJsonObject(jsonObject, metaDataParent); + FactMetaData* metaData = createFromJsonObject(jsonObject, defineMap, metaDataParent); if (metaDataMap.contains(metaData->name())) { qWarning() << QStringLiteral("Duplicate fact name:") << metaData->name(); delete metaData; diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 8b02c9930..04a7837f1 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -54,9 +54,9 @@ public: FactMetaData(const FactMetaData& other, QObject* parent = nullptr); static QMap createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent); - static QMap createMapFromJsonArray(const QJsonArray jsonArray, QObject* metaDataParent); + static QMap createMapFromJsonArray(const QJsonArray jsonArray, QMap& defineMap, QObject* metaDataParent); - static FactMetaData* createFromJsonObject(const QJsonObject& json, QObject* metaDataParent); + static FactMetaData* createFromJsonObject(const QJsonObject& json, QMap& defineMap, QObject* metaDataParent); const FactMetaData& operator=(const FactMetaData& other); @@ -229,6 +229,8 @@ private: static const AppSettingsTranslation_s* _findAppSettingsDistanceUnitsTranslation(const QString& rawUnits); static const AppSettingsTranslation_s* _findAppSettingsAreaUnitsTranslation(const QString& rawUnits); + static void _loadJsonDefines(const QJsonObject& jsonDefinesObject, QMap& defineMap); + ValueType_t _type; // must be first for correct constructor init int _decimalPlaces; QVariant _rawDefaultValue; @@ -292,6 +294,9 @@ private: static const char* _incrementJsonKey; static const char* _hasControlJsonKey; static const char* _qgcRebootRequiredJsonKey; + + static const char* _jsonMetaDataDefinesName; + static const char* _jsonMetaDataFactsName; }; #endif diff --git a/src/JsonHelper.cc b/src/JsonHelper.cc index 6ef592720..247025115 100644 --- a/src/JsonHelper.cc +++ b/src/JsonHelper.cc @@ -152,7 +152,7 @@ bool JsonHelper::validateKeyTypes(const QJsonObject& jsonObject, const QStringLi return true; } -bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName) +bool JsonHelper::_parseEnumWorker(const QJsonObject& jsonObject, QMap& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName) { if(jsonObject.value(_enumStringsJsonKey).isArray()) { // "enumStrings": ["Auto" , "Manual", "Shutter Priority", "Aperture Priority"], @@ -162,7 +162,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin } } else { // "enumStrings": "Auto,Manual,Shutter Priority,Aperture Priority", - enumStrings = jsonObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts); + QString value = jsonObject.value(_enumStringsJsonKey).toString(); + enumStrings = defineMap.value(value, value).split(",", QString::SkipEmptyParts); } if(jsonObject.value(_enumValuesJsonKey).isArray()) { @@ -177,7 +178,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin } } else { // "enumValues": "0,1,2,3,4,5", - enumValues = jsonObject.value(_enumValuesJsonKey).toString().split(",", QString::SkipEmptyParts); + QString value = jsonObject.value(_enumValuesJsonKey).toString(); + enumValues = defineMap.value(value, value).split(",", QString::SkipEmptyParts); } if (enumStrings.count() != enumValues.count()) { @@ -188,6 +190,17 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin return true; } +bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QMap& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName) +{ + return _parseEnumWorker(jsonObject, defineMap, enumStrings, enumValues, errorString, valueName); +} + +bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName) +{ + QMap defineMap; + return _parseEnumWorker(jsonObject, defineMap, enumStrings, enumValues, errorString, valueName); +} + bool JsonHelper::isJsonFile(const QByteArray& bytes, QJsonDocument& jsonDoc, QString& errorString) { QJsonParseError parseError; diff --git a/src/JsonHelper.h b/src/JsonHelper.h index 711c38ace..2398e6f2c 100644 --- a/src/JsonHelper.h +++ b/src/JsonHelper.h @@ -122,6 +122,7 @@ public: QJsonArray& polygonArray); ///< Array to save into static bool parseEnum(const QJsonObject& jsonObject, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName = QString()); + static bool parseEnum(const QJsonObject& jsonObject, QMap& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName = QString()); /// Returns NaN if the value is null, or if not, the double value static double possibleNaNJsonValue(const QJsonValue& value); @@ -142,6 +143,7 @@ private: bool writeAltitude, QJsonValue& jsonValue, bool geoJsonFormat); + static bool _parseEnumWorker(const QJsonObject& jsonObject, QMap& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName); static const char* _enumStringsJsonKey; static const char* _enumValuesJsonKey; -- 2.22.0