|
|
|
@ -28,20 +28,30 @@ const qreal FactMetaData::UnitConsts_s::secondsPerHour = 3600.0;
@@ -28,20 +28,30 @@ const qreal FactMetaData::UnitConsts_s::secondsPerHour = 3600.0;
|
|
|
|
|
const qreal FactMetaData::UnitConsts_s::knotsToKPH = 1.852; // exact, hence weird base for knotsToMetersPerSecond
|
|
|
|
|
|
|
|
|
|
// Length
|
|
|
|
|
const qreal FactMetaData::UnitConsts_s::milesToMeters = 1609.344; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::feetToMeters = 0.3048; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::milesToMeters = 1609.344; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::feetToMeters = 0.3048; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54; |
|
|
|
|
|
|
|
|
|
//Weight
|
|
|
|
|
const qreal FactMetaData::UnitConsts_s::ouncesToGrams = 28.3495; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::poundsToGrams = 453.592; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::ouncesToGrams = 28.3495; |
|
|
|
|
const qreal FactMetaData::UnitConsts_s::poundsToGrams = 453.592; |
|
|
|
|
|
|
|
|
|
const char* FactMetaData::kDefaultCategory = QT_TRANSLATE_NOOP("FactMetaData", "Other"); |
|
|
|
|
const char* FactMetaData::kDefaultGroup = QT_TRANSLATE_NOOP("FactMetaData", "Misc"); |
|
|
|
|
|
|
|
|
|
const char* FactMetaData::qgcFileType = "FactMetaData"; |
|
|
|
|
const char* FactMetaData::_jsonMetaDataDefinesName = "QGC.MetaData.Defines"; |
|
|
|
|
const char* FactMetaData::_jsonMetaDataFactsName = "QGC.MetaData.Facts"; |
|
|
|
|
const char* FactMetaData::qgcFileType = "FactMetaData"; |
|
|
|
|
const char* FactMetaData::_jsonMetaDataDefinesName = "QGC.MetaData.Defines"; |
|
|
|
|
const char* FactMetaData::_jsonMetaDataFactsName = "QGC.MetaData.Facts"; |
|
|
|
|
const char* FactMetaData::_enumStringsJsonKey = "enumStrings"; |
|
|
|
|
const char* FactMetaData::_enumValuesJsonKey = "enumValues"; |
|
|
|
|
|
|
|
|
|
// This is the newer json format for enums and bitmasks. They are used by the new COMPONENT_INFORMATION parameter metadata for example.
|
|
|
|
|
const char* FactMetaData::_enumValuesArrayJsonKey = "values"; |
|
|
|
|
const char* FactMetaData::_enumBitmaskArrayJsonKey = "bitmask"; |
|
|
|
|
const char* FactMetaData::_enumValuesArrayValueJsonKey = "value"; |
|
|
|
|
const char* FactMetaData::_enumValuesArrayDescriptionJsonKey = "description"; |
|
|
|
|
const char* FactMetaData::_enumBitmaskArrayIndexJsonKey = "index"; |
|
|
|
|
const char* FactMetaData::_enumBitmaskArrayDescriptionJsonKey = "description"; |
|
|
|
|
|
|
|
|
|
// Built in translations for all Facts
|
|
|
|
|
const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = { |
|
|
|
@ -707,7 +717,7 @@ void FactMetaData::setTranslators(Translator rawTranslator, Translator cookedTra
@@ -707,7 +717,7 @@ void FactMetaData::setTranslators(Translator rawTranslator, Translator cookedTra
|
|
|
|
|
|
|
|
|
|
void FactMetaData::setBuiltInTranslator(void) |
|
|
|
|
{ |
|
|
|
|
if (_enumStrings.count()) { |
|
|
|
|
if (_enumStrings.count() || _bitmaskStrings.count()) { |
|
|
|
|
// No translation if enum
|
|
|
|
|
setTranslators(_defaultTranslator, _defaultTranslator); |
|
|
|
|
_cookedUnits = _rawUnits; |
|
|
|
@ -1009,7 +1019,7 @@ void FactMetaData::_setAppSettingsTranslators(void)
@@ -1009,7 +1019,7 @@ void FactMetaData::_setAppSettingsTranslators(void)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (settingsUnits == pAppSettingsTranslation->unitOption) { |
|
|
|
|
_cookedUnits = pAppSettingsTranslation->cookedUnits; |
|
|
|
|
_cookedUnits = pAppSettingsTranslation->cookedUnits; |
|
|
|
|
setTranslators(pAppSettingsTranslation->rawTranslator, pAppSettingsTranslation->cookedTranslator); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -1249,6 +1259,10 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap<Q
@@ -1249,6 +1259,10 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap<Q
|
|
|
|
|
{ _categoryJsonKey, QJsonValue::String, false }, |
|
|
|
|
{ _groupJsonKey, QJsonValue::String, false }, |
|
|
|
|
{ _volatileJsonKey, QJsonValue::Bool, false }, |
|
|
|
|
{ _enumBitmaskArrayJsonKey, QJsonValue::Array, false }, |
|
|
|
|
{ _enumValuesArrayJsonKey, QJsonValue::Array, false }, |
|
|
|
|
{ _enumValuesJsonKey, QJsonValue::String, false }, |
|
|
|
|
{ _enumStringsJsonKey, QJsonValue::String, false }, |
|
|
|
|
}; |
|
|
|
|
if (!JsonHelper::validateKeys(json, keyInfoList, errorString)) { |
|
|
|
|
qWarning() << errorString; |
|
|
|
@ -1262,27 +1276,49 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap<Q
@@ -1262,27 +1276,49 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMap<Q
|
|
|
|
|
return new FactMetaData(valueTypeUint32, metaDataParent); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FactMetaData* metaData = new FactMetaData(type, metaDataParent); |
|
|
|
|
FactMetaData* metaData = new FactMetaData(type, metaDataParent); |
|
|
|
|
|
|
|
|
|
metaData->_name = json[_nameJsonKey].toString(); |
|
|
|
|
|
|
|
|
|
QStringList enumValues, enumStrings; |
|
|
|
|
if (JsonHelper::parseEnum(json, defineMap, enumStrings, enumValues, errorString, metaData->name())) { |
|
|
|
|
for (int i=0; i<enumValues.count(); i++) { |
|
|
|
|
QVariant enumVariant; |
|
|
|
|
QStringList rgDescriptions; |
|
|
|
|
QList<double> rgDoubleValues; |
|
|
|
|
QStringList rgStringValues; |
|
|
|
|
|
|
|
|
|
bool foundBitmask = false; |
|
|
|
|
if (!_parseValuesArray(json, rgDescriptions, rgDoubleValues, errorString)) { |
|
|
|
|
qWarning() << QStringLiteral("FactMetaData::createFromJsonObject _parseValueDescriptionArray for %1 failed. %2").arg(metaData->_name).arg(errorString); |
|
|
|
|
} |
|
|
|
|
if (rgDescriptions.isEmpty()) { |
|
|
|
|
if (!_parseBitmaskArray(json, rgDescriptions, rgDoubleValues, errorString)) { |
|
|
|
|
qWarning() << QStringLiteral("FactMetaData::createFromJsonObject _parseBitmaskArray for %1 failed. %2").arg(metaData->_name).arg(errorString); |
|
|
|
|
} |
|
|
|
|
foundBitmask = rgDescriptions.count() != 0; |
|
|
|
|
} |
|
|
|
|
if (rgDescriptions.isEmpty()) { |
|
|
|
|
if (!_parseEnum(json, defineMap, rgDescriptions, rgStringValues, errorString)) { |
|
|
|
|
qWarning() << QStringLiteral("FactMetaData::createFromJsonObject _parseEnum for %1 failed. %2").arg(metaData->_name).arg(errorString); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (errorString.isEmpty() && rgDescriptions.count()) { |
|
|
|
|
for (int i=0; i<rgDescriptions.count(); i++) { |
|
|
|
|
QVariant rawValueVariant = rgDoubleValues.count() ? QVariant(rgDoubleValues[i]) : QVariant(rgStringValues[i]); |
|
|
|
|
QVariant convertedValueVariant; |
|
|
|
|
QString errorString; |
|
|
|
|
|
|
|
|
|
if (metaData->convertAndValidateRaw(enumValues[i], false /* validate */, enumVariant, errorString)) { |
|
|
|
|
metaData->addEnumInfo(enumStrings[i], enumVariant); |
|
|
|
|
if (foundBitmask) { |
|
|
|
|
metaData->addBitmaskInfo(rgDescriptions[i], rawValueVariant); |
|
|
|
|
} else { |
|
|
|
|
qWarning() << "Invalid enum value, name:" << metaData->name() |
|
|
|
|
<< " type:" << metaData->type() |
|
|
|
|
<< " value:" << enumValues[i] |
|
|
|
|
<< " error:" << errorString; |
|
|
|
|
if (metaData->convertAndValidateRaw(rawValueVariant, false /* validate */, convertedValueVariant, errorString)) { |
|
|
|
|
metaData->addEnumInfo(rgDescriptions[i], convertedValueVariant); |
|
|
|
|
} else { |
|
|
|
|
qWarning() << QStringLiteral("FactMetaData::createFromJsonObject convertAndValidateRaw on enum value for %1 failed.").arg(metaData->_name) |
|
|
|
|
<< " type:" << metaData->type() |
|
|
|
|
<< " value:" << rawValueVariant |
|
|
|
|
<< " error:" << errorString; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
qWarning() << errorString; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
metaData->setDecimalPlaces(json[_decimalPlacesJsonKey].toInt(0)); |
|
|
|
@ -1470,3 +1506,105 @@ void FactMetaData::setVolatileValue(bool bValue)
@@ -1470,3 +1506,105 @@ void FactMetaData::setVolatileValue(bool bValue)
|
|
|
|
|
_readOnly = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FactMetaData::_parseEnum(const QJsonObject& jsonObject, DefineMap_t defineMap, QStringList& rgDescriptions, QStringList& rgValues, QString& errorString) |
|
|
|
|
{ |
|
|
|
|
rgDescriptions.clear(); |
|
|
|
|
rgValues.clear(); |
|
|
|
|
errorString.clear(); |
|
|
|
|
|
|
|
|
|
if (!jsonObject.contains(_enumStringsJsonKey)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QString strings = jsonObject.value(_enumStringsJsonKey).toString(); |
|
|
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) |
|
|
|
|
rgDescriptions = defineMap.value(strings, strings).split(",", QString::SkipEmptyParts); |
|
|
|
|
#else |
|
|
|
|
rgDescriptions = defineMap.value(strings, strings).split(",", Qt::SkipEmptyParts); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
QString values = jsonObject.value(_enumValuesJsonKey).toString(); |
|
|
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) |
|
|
|
|
rgValues = defineMap.value(values, values).split(",", QString::SkipEmptyParts); |
|
|
|
|
#else |
|
|
|
|
rgValues = defineMap.value(values, values).split(",", Qt::SkipEmptyParts); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (rgDescriptions.count() != rgValues.count()) { |
|
|
|
|
errorString = QStringLiteral("Enum strings/values count mismatch - strings:values %1:%2").arg(rgDescriptions.count()).arg(rgValues.count()); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FactMetaData::_parseValuesArray(const QJsonObject& jsonObject, QStringList& rgDescriptions, QList<double>& rgValues, QString& errorString) |
|
|
|
|
{ |
|
|
|
|
rgDescriptions.clear(); |
|
|
|
|
rgValues.clear(); |
|
|
|
|
errorString.clear(); |
|
|
|
|
|
|
|
|
|
if (!jsonObject.contains(_enumValuesArrayJsonKey)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QList<JsonHelper::KeyValidateInfo> keyInfoList = { |
|
|
|
|
{ _enumValuesArrayDescriptionJsonKey, QJsonValue::String, true }, |
|
|
|
|
{ _enumValuesArrayValueJsonKey, QJsonValue::Double, true }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const QJsonArray& rgValueDescription = jsonObject[_enumValuesArrayJsonKey].toArray(); |
|
|
|
|
for (int i=0; i<rgValueDescription.count(); i++) { |
|
|
|
|
if (rgValueDescription[i].type() != QJsonValue::Object) { |
|
|
|
|
errorString = QStringLiteral("Value at index %1 in \"values\" array is not an object.").arg(i); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const QJsonObject& valueDescriptionObject = rgValueDescription[i].toObject(); |
|
|
|
|
if (!JsonHelper::validateKeys(valueDescriptionObject, keyInfoList, errorString)) { |
|
|
|
|
errorString = QStringLiteral("Object at index %1 in \"values\" array failed validation '%2'.").arg(i).arg(errorString); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rgDescriptions.append(valueDescriptionObject[_enumValuesArrayDescriptionJsonKey].toString()); |
|
|
|
|
rgValues.append(valueDescriptionObject[_enumValuesArrayValueJsonKey].toDouble()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FactMetaData::_parseBitmaskArray(const QJsonObject& jsonObject, QStringList& rgDescriptions, QList<double>& rgValues, QString& errorString) |
|
|
|
|
{ |
|
|
|
|
rgDescriptions.clear(); |
|
|
|
|
rgValues.clear(); |
|
|
|
|
errorString.clear(); |
|
|
|
|
|
|
|
|
|
if (!jsonObject.contains(_enumBitmaskArrayJsonKey)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QList<JsonHelper::KeyValidateInfo> keyInfoList = { |
|
|
|
|
{ _enumBitmaskArrayDescriptionJsonKey, QJsonValue::String, true }, |
|
|
|
|
{ _enumBitmaskArrayIndexJsonKey, QJsonValue::Double, true }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const QJsonArray& rgValueDescription = jsonObject[_enumBitmaskArrayJsonKey].toArray(); |
|
|
|
|
for (int i=0; i<rgValueDescription.count(); i++) { |
|
|
|
|
if (rgValueDescription[i].type() != QJsonValue::Object) { |
|
|
|
|
errorString = QStringLiteral("Value at index %1 in \"values\" array is not an object.").arg(i); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const QJsonObject& valueDescriptionObject = rgValueDescription[i].toObject(); |
|
|
|
|
if (!JsonHelper::validateKeys(valueDescriptionObject, keyInfoList, errorString)) { |
|
|
|
|
errorString = QStringLiteral("Object at index %1 in \"values\" array failed validation '%2'.").arg(i).arg(errorString); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rgDescriptions.append(valueDescriptionObject[_enumBitmaskArrayDescriptionJsonKey].toString()); |
|
|
|
|
rgValues.append(valueDescriptionObject[_enumBitmaskArrayIndexJsonKey].toDouble()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|