From 526e5c531c5c2b3c9387a064122a279c4c3016ff Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 18 Feb 2017 20:17:23 -0800 Subject: [PATCH] Fact string support --- src/FactSystem/FactControls/FactTextField.qml | 8 +++--- src/FactSystem/FactMetaData.cc | 34 ++++++++++++++---------- src/FactSystem/FactMetaData.h | 5 +++- src/FactSystem/FactSystem.cc | 1 + src/FirmwarePlugin/APM/APMParameterMetaData.cc | 36 ++++++++++++++------------ src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc | 36 ++++++++++++++------------ 6 files changed, 71 insertions(+), 49 deletions(-) diff --git a/src/FactSystem/FactControls/FactTextField.qml b/src/FactSystem/FactControls/FactTextField.qml index 494a73f..dc62061 100644 --- a/src/FactSystem/FactControls/FactTextField.qml +++ b/src/FactSystem/FactControls/FactTextField.qml @@ -16,12 +16,14 @@ QGCTextField { showUnits: true showHelp: true - property Fact fact: null + property Fact fact: null + property string _validateString + property bool _factIsString: fact ? fact.type === FactMetaData.valueTypeString : false // At this point all Facts are numeric - inputMethodHints: ScreenTools.isiOS ? - Qt.ImhNone : // iOS numeric keyboard has not done button, we can't use it + inputMethodHints: (_factIsString || ScreenTools.isiOS) ? + Qt.ImhNone : // iOS numeric keyboard has no done button, we can't use it Qt.ImhFormattedNumbersOnly // Forces use of virtual numeric keyboard onEditingFinished: { diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 6d9f47f..ade759c 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -7,12 +7,6 @@ * ****************************************************************************/ - -/// @file -/// @brief Object which exposes a FactMetaData -/// -/// @author Don Gagne - #include "FactMetaData.h" #include "SettingsManager.h" #include "JsonHelper.h" @@ -157,7 +151,7 @@ QVariant FactMetaData::rawDefaultValue(void) const void FactMetaData::setRawDefaultValue(const QVariant& rawDefaultValue) { - if (_rawMin <= rawDefaultValue && rawDefaultValue <= _rawMax) { + if (_type == valueTypeString || (_rawMin <= rawDefaultValue && rawDefaultValue <= _rawMax)) { _rawDefaultValue = rawDefaultValue; _defaultValueAvailable = true; } else { @@ -208,6 +202,8 @@ QVariant FactMetaData::_minForType(void) const return QVariant(-std::numeric_limits::max()); case valueTypeDouble: return QVariant(-std::numeric_limits::max()); + case valueTypeString: + return QVariant(); } // Make windows compiler happy, even switch is full cased @@ -233,6 +229,8 @@ QVariant FactMetaData::_maxForType(void) const return QVariant(std::numeric_limits::max()); case valueTypeDouble: return QVariant(std::numeric_limits::max()); + case valueTypeString: + return QVariant(); } // Make windows compiler happy, even switch is full cased @@ -285,6 +283,10 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO } } break; + case FactMetaData::valueTypeString: + convertOk = true; + typedValue = QVariant(rawValue.toString()); + break; } if (!convertOk) { @@ -340,6 +342,10 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co } } break; + case FactMetaData::valueTypeString: + convertOk = true; + typedValue = QVariant(cookedValue.toString()); + break; } if (!convertOk) { @@ -556,7 +562,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, << QStringLiteral("Uint32") << QStringLiteral("Int32") << QStringLiteral("Float") - << QStringLiteral("Double"); + << QStringLiteral("Double") + << QStringLiteral("String"); knownTypes << valueTypeUint8 << valueTypeInt8 @@ -565,7 +572,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, << valueTypeUint32 << valueTypeInt32 << valueTypeFloat - << valueTypeDouble; + << valueTypeDouble + << valueTypeString; for (int i=0; i types; - keys << _nameJsonKey << _decimalPlacesJsonKey << _typeJsonKey << _shortDescriptionJsonKey << _longDescriptionJsonKey << _unitsJsonKey << _defaultValueJsonKey << _minJsonKey << _maxJsonKey; - types << QJsonValue::String << QJsonValue::Double << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::Double << QJsonValue::Double << QJsonValue::Double; + keys << _nameJsonKey << _decimalPlacesJsonKey << _typeJsonKey << _shortDescriptionJsonKey << _longDescriptionJsonKey << _unitsJsonKey << _minJsonKey << _maxJsonKey; + types << QJsonValue::String << QJsonValue::Double << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::Double << QJsonValue::Double; if (!JsonHelper::validateKeyTypes(json, keys, types, errorString)) { qWarning() << errorString; return new FactMetaData(valueTypeUint32, metaDataParent); @@ -811,7 +819,7 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QObjec metaData->setRawUnits(json[_unitsJsonKey].toString()); } if (json.contains(_defaultValueJsonKey)) { - metaData->setRawDefaultValue(json[_defaultValueJsonKey].toDouble()); + metaData->setRawDefaultValue(json[_defaultValueJsonKey]); } if (json.contains(_minJsonKey)) { metaData->setRawMin(json[_minJsonKey].toDouble()); diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 07d4b4d..abe3b7a 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -37,9 +37,12 @@ public: valueTypeUint32, valueTypeInt32, valueTypeFloat, - valueTypeDouble + valueTypeDouble, + valueTypeString } ValueType_t; + Q_ENUM(ValueType_t) + typedef QVariant (*Translator)(const QVariant& from); FactMetaData(QObject* parent = NULL); diff --git a/src/FactSystem/FactSystem.cc b/src/FactSystem/FactSystem.cc index e88b8ce..0b9cb3d 100644 --- a/src/FactSystem/FactSystem.cc +++ b/src/FactSystem/FactSystem.cc @@ -30,6 +30,7 @@ void FactSystem::setToolbox(QGCToolbox *toolbox) QGCTool::setToolbox(toolbox); qmlRegisterType (_factSystemQmlUri, 1, 0, "Fact"); + qmlRegisterType (_factSystemQmlUri, 1, 0, "FactMetaData"); qmlRegisterType(_factSystemQmlUri, 1, 0, "FactPanelController"); qmlRegisterUncreatableType(_factSystemQmlUri, 1, 0, "FactGroup", "ReferenceOnly"); diff --git a/src/FirmwarePlugin/APM/APMParameterMetaData.cc b/src/FirmwarePlugin/APM/APMParameterMetaData.cc index 929fe9e..fa05f49 100644 --- a/src/FirmwarePlugin/APM/APMParameterMetaData.cc +++ b/src/FirmwarePlugin/APM/APMParameterMetaData.cc @@ -39,22 +39,26 @@ QVariant APMParameterMetaData::_stringToTypedVariant(const QString& string, int convertTo = QVariant::Int; // keep compiler warning happy switch (type) { - case FactMetaData::valueTypeUint8: - case FactMetaData::valueTypeUint16: - case FactMetaData::valueTypeUint32: - convertTo = QVariant::UInt; - break; - case FactMetaData::valueTypeInt8: - case FactMetaData::valueTypeInt16: - case FactMetaData::valueTypeInt32: - convertTo = QVariant::Int; - break; - case FactMetaData::valueTypeFloat: - convertTo = QMetaType::Float; - break; - case FactMetaData::valueTypeDouble: - convertTo = QVariant::Double; - break; + case FactMetaData::valueTypeUint8: + case FactMetaData::valueTypeUint16: + case FactMetaData::valueTypeUint32: + convertTo = QVariant::UInt; + break; + case FactMetaData::valueTypeInt8: + case FactMetaData::valueTypeInt16: + case FactMetaData::valueTypeInt32: + convertTo = QVariant::Int; + break; + case FactMetaData::valueTypeFloat: + convertTo = QMetaType::Float; + break; + case FactMetaData::valueTypeDouble: + convertTo = QVariant::Double; + break; + case FactMetaData::valueTypeString: + qWarning() << "Internal Error: No support for string parameters"; + convertTo = QVariant::String; + break; } *convertOk = var.convert(convertTo); diff --git a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc index 7fcfaeb..3adbce5 100644 --- a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc +++ b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc @@ -39,22 +39,26 @@ QVariant PX4ParameterMetaData::_stringToTypedVariant(const QString& string, Fact int convertTo = QVariant::Int; // keep compiler warning happy switch (type) { - case FactMetaData::valueTypeUint8: - case FactMetaData::valueTypeUint16: - case FactMetaData::valueTypeUint32: - convertTo = QVariant::UInt; - break; - case FactMetaData::valueTypeInt8: - case FactMetaData::valueTypeInt16: - case FactMetaData::valueTypeInt32: - convertTo = QVariant::Int; - break; - case FactMetaData::valueTypeFloat: - convertTo = QMetaType::Float; - break; - case FactMetaData::valueTypeDouble: - convertTo = QVariant::Double; - break; + case FactMetaData::valueTypeUint8: + case FactMetaData::valueTypeUint16: + case FactMetaData::valueTypeUint32: + convertTo = QVariant::UInt; + break; + case FactMetaData::valueTypeInt8: + case FactMetaData::valueTypeInt16: + case FactMetaData::valueTypeInt32: + convertTo = QVariant::Int; + break; + case FactMetaData::valueTypeFloat: + convertTo = QMetaType::Float; + break; + case FactMetaData::valueTypeDouble: + convertTo = QVariant::Double; + break; + case FactMetaData::valueTypeString: + qWarning() << "Internal Error: No support for string parameters"; + convertTo = QVariant::String; + break; } *convertOk = var.convert(convertTo);