Commit 5fb168e1 authored by Don Gagne's avatar Don Gagne

parent 6b641477
...@@ -37,7 +37,8 @@ FactGroup::FactGroup(int updateRateMsecs, QObject* parent) ...@@ -37,7 +37,8 @@ FactGroup::FactGroup(int updateRateMsecs, QObject* parent)
void FactGroup::_loadFromJsonArray(const QJsonArray jsonArray) void FactGroup::_loadFromJsonArray(const QJsonArray jsonArray)
{ {
_nameToFactMetaDataMap = FactMetaData::createMapFromJsonArray(jsonArray, this); QMap<QString, QString> defineMap;
_nameToFactMetaDataMap = FactMetaData::createMapFromJsonArray(jsonArray, defineMap, this);
} }
void FactGroup::_setupTimer() void FactGroup::_setupTimer()
......
...@@ -35,6 +35,9 @@ const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54; ...@@ -35,6 +35,9 @@ const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54;
static const char* kDefaultCategory = QT_TRANSLATE_NOOP("FactMetaData", "Other"); static const char* kDefaultCategory = QT_TRANSLATE_NOOP("FactMetaData", "Other");
static const char* kDefaultGroup = QT_TRANSLATE_NOOP("FactMetaData", "Misc"); 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 // Built in translations for all Facts
const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = { const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = {
{ "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees }, { "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees },
...@@ -1057,7 +1060,7 @@ int FactMetaData::decimalPlaces(void) const ...@@ -1057,7 +1060,7 @@ int FactMetaData::decimalPlaces(void) const
return actualDecimalPlaces; return actualDecimalPlaces;
} }
FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObject* metaDataParent) FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap<QString, QString>& defineMap, QObject* metaDataParent)
{ {
QString errorString; QString errorString;
...@@ -1098,7 +1101,7 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec ...@@ -1098,7 +1101,7 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec
metaData->_name = json[_nameJsonKey].toString(); metaData->_name = json[_nameJsonKey].toString();
QStringList enumValues, enumStrings; 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<enumValues.count(); i++) { for (int i=0; i<enumValues.count(); i++) {
QVariant enumVariant; QVariant enumVariant;
QString errorString; QString errorString;
...@@ -1204,6 +1207,14 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec ...@@ -1204,6 +1207,14 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec
return metaData; return metaData;
} }
void FactMetaData::_loadJsonDefines(const QJsonObject& jsonDefinesObject, QMap<QString, QString>& defineMap)
{
for (const QString& defineName: jsonDefinesObject.keys()) {
QString mapKey = _jsonMetaDataDefinesName + QString(".") + defineName;
defineMap[mapKey] = jsonDefinesObject[defineName].toString();
}
}
QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent) QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent)
{ {
QMap<QString, FactMetaData*> metaDataMap; QMap<QString, FactMetaData*> metaDataMap;
...@@ -1223,16 +1234,34 @@ QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonFile(const QString& ...@@ -1223,16 +1234,34 @@ QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonFile(const QString&
return metaDataMap; return metaDataMap;
} }
if (!doc.isArray()) { QJsonArray factArray;
qWarning() << "json document is not array"; QMap<QString /* define name */, QString /* define value */> defineMap;
if (doc.isObject()) {
// Check for Defines/Facts format
QString errorString;
QList<JsonHelper::KeyValidateInfo> 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; return metaDataMap;
} }
QJsonArray jsonArray = doc.array(); return createMapFromJsonArray(factArray, defineMap, metaDataParent);
return createMapFromJsonArray(jsonArray, metaDataParent);
} }
QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonArray(const QJsonArray jsonArray, QObject* metaDataParent) QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonArray(const QJsonArray jsonArray, QMap<QString, QString>& defineMap, QObject* metaDataParent)
{ {
QMap<QString, FactMetaData*> metaDataMap; QMap<QString, FactMetaData*> metaDataMap;
for (int i=0; i<jsonArray.count(); i++) { for (int i=0; i<jsonArray.count(); i++) {
...@@ -1242,7 +1271,7 @@ QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonArray(const QJsonArr ...@@ -1242,7 +1271,7 @@ QMap<QString, FactMetaData*> FactMetaData::createMapFromJsonArray(const QJsonArr
continue; continue;
} }
QJsonObject jsonObject = jsonValue.toObject(); QJsonObject jsonObject = jsonValue.toObject();
FactMetaData* metaData = createFromJsonObject(jsonObject, metaDataParent); FactMetaData* metaData = createFromJsonObject(jsonObject, defineMap, metaDataParent);
if (metaDataMap.contains(metaData->name())) { if (metaDataMap.contains(metaData->name())) {
qWarning() << QStringLiteral("Duplicate fact name:") << metaData->name(); qWarning() << QStringLiteral("Duplicate fact name:") << metaData->name();
delete metaData; delete metaData;
......
...@@ -54,9 +54,9 @@ public: ...@@ -54,9 +54,9 @@ public:
FactMetaData(const FactMetaData& other, QObject* parent = nullptr); FactMetaData(const FactMetaData& other, QObject* parent = nullptr);
static QMap<QString, FactMetaData*> createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent); static QMap<QString, FactMetaData*> createMapFromJsonFile(const QString& jsonFilename, QObject* metaDataParent);
static QMap<QString, FactMetaData*> createMapFromJsonArray(const QJsonArray jsonArray, QObject* metaDataParent); static QMap<QString, FactMetaData*> createMapFromJsonArray(const QJsonArray jsonArray, QMap<QString, QString>& defineMap, QObject* metaDataParent);
static FactMetaData* createFromJsonObject(const QJsonObject& json, QObject* metaDataParent); static FactMetaData* createFromJsonObject(const QJsonObject& json, QMap<QString, QString>& defineMap, QObject* metaDataParent);
const FactMetaData& operator=(const FactMetaData& other); const FactMetaData& operator=(const FactMetaData& other);
...@@ -229,6 +229,8 @@ private: ...@@ -229,6 +229,8 @@ private:
static const AppSettingsTranslation_s* _findAppSettingsDistanceUnitsTranslation(const QString& rawUnits); static const AppSettingsTranslation_s* _findAppSettingsDistanceUnitsTranslation(const QString& rawUnits);
static const AppSettingsTranslation_s* _findAppSettingsAreaUnitsTranslation(const QString& rawUnits); static const AppSettingsTranslation_s* _findAppSettingsAreaUnitsTranslation(const QString& rawUnits);
static void _loadJsonDefines(const QJsonObject& jsonDefinesObject, QMap<QString, QString>& defineMap);
ValueType_t _type; // must be first for correct constructor init ValueType_t _type; // must be first for correct constructor init
int _decimalPlaces; int _decimalPlaces;
QVariant _rawDefaultValue; QVariant _rawDefaultValue;
...@@ -292,6 +294,9 @@ private: ...@@ -292,6 +294,9 @@ private:
static const char* _incrementJsonKey; static const char* _incrementJsonKey;
static const char* _hasControlJsonKey; static const char* _hasControlJsonKey;
static const char* _qgcRebootRequiredJsonKey; static const char* _qgcRebootRequiredJsonKey;
static const char* _jsonMetaDataDefinesName;
static const char* _jsonMetaDataFactsName;
}; };
#endif #endif
...@@ -152,7 +152,7 @@ bool JsonHelper::validateKeyTypes(const QJsonObject& jsonObject, const QStringLi ...@@ -152,7 +152,7 @@ bool JsonHelper::validateKeyTypes(const QJsonObject& jsonObject, const QStringLi
return true; return true;
} }
bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName) bool JsonHelper::_parseEnumWorker(const QJsonObject& jsonObject, QMap<QString, QString>& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName)
{ {
if(jsonObject.value(_enumStringsJsonKey).isArray()) { if(jsonObject.value(_enumStringsJsonKey).isArray()) {
// "enumStrings": ["Auto" , "Manual", "Shutter Priority", "Aperture Priority"], // "enumStrings": ["Auto" , "Manual", "Shutter Priority", "Aperture Priority"],
...@@ -162,7 +162,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin ...@@ -162,7 +162,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin
} }
} else { } else {
// "enumStrings": "Auto,Manual,Shutter Priority,Aperture Priority", // "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()) { if(jsonObject.value(_enumValuesJsonKey).isArray()) {
...@@ -177,7 +178,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin ...@@ -177,7 +178,8 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin
} }
} else { } else {
// "enumValues": "0,1,2,3,4,5", // "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()) { if (enumStrings.count() != enumValues.count()) {
...@@ -188,6 +190,17 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin ...@@ -188,6 +190,17 @@ bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QStringList& enumStrin
return true; return true;
} }
bool JsonHelper::parseEnum(const QJsonObject& jsonObject, QMap<QString, QString>& 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<QString, QString> defineMap;
return _parseEnumWorker(jsonObject, defineMap, enumStrings, enumValues, errorString, valueName);
}
bool JsonHelper::isJsonFile(const QByteArray& bytes, QJsonDocument& jsonDoc, QString& errorString) bool JsonHelper::isJsonFile(const QByteArray& bytes, QJsonDocument& jsonDoc, QString& errorString)
{ {
QJsonParseError parseError; QJsonParseError parseError;
......
...@@ -122,6 +122,7 @@ public: ...@@ -122,6 +122,7 @@ public:
QJsonArray& polygonArray); ///< Array to save into 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, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName = QString());
static bool parseEnum(const QJsonObject& jsonObject, QMap<QString, QString>& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName = QString());
/// Returns NaN if the value is null, or if not, the double value /// Returns NaN if the value is null, or if not, the double value
static double possibleNaNJsonValue(const QJsonValue& value); static double possibleNaNJsonValue(const QJsonValue& value);
...@@ -142,6 +143,7 @@ private: ...@@ -142,6 +143,7 @@ private:
bool writeAltitude, bool writeAltitude,
QJsonValue& jsonValue, QJsonValue& jsonValue,
bool geoJsonFormat); bool geoJsonFormat);
static bool _parseEnumWorker(const QJsonObject& jsonObject, QMap<QString, QString>& defineMap, QStringList& enumStrings, QStringList& enumValues, QString& errorString, QString valueName);
static const char* _enumStringsJsonKey; static const char* _enumStringsJsonKey;
static const char* _enumValuesJsonKey; static const char* _enumValuesJsonKey;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment