Commit 8e3f1375 authored by Don Gagne's avatar Don Gagne

More work on Fact meta data

parent d7aa3a1f
......@@ -263,4 +263,15 @@ void PX4ParameterFacts::clearStaticData(void)
}
_mapParameterName2FactMetaData.clear();
_parameterMetaDataLoaded = false;
}
\ No newline at end of file
}
/// Override from FactLoad which connects the meta data to the fact
void PX4ParameterFacts::_addMetaDataToFact(Fact* fact)
{
if (_mapParameterName2FactMetaData.contains(fact->name())) {
fact->setMetaData(_mapParameterName2FactMetaData[fact->name()]);
} else {
// Use generic meta data
FactLoader::_addMetaDataToFact(fact);
}
}
......@@ -52,6 +52,10 @@ public:
static void clearStaticData(void);
private:
// Overrides from FactLoader
virtual void _addMetaDataToFact(Fact* fact);
// Class methods
static FactMetaData* _parseParameter(QXmlStreamReader& xml, const QString& group);
static void _initMetaData(FactMetaData* metaData);
static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false);
......
......@@ -28,10 +28,12 @@
#include <QtQml>
Fact::Fact(QObject* parent) :
QObject(parent)
Fact::Fact(QString name, QObject* parent) :
QObject(parent),
_name(name),
_metaData(NULL)
{
_value = "";
}
void Fact::setValue(const QVariant& value)
......
......@@ -42,6 +42,7 @@ class Fact : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true)
Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT)
Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT)
......@@ -54,10 +55,13 @@ class Fact : public QObject
Q_ENUMS(FactMetaData::ValueType_t)
public:
Fact(QObject* parent = NULL);
Fact(QString name = "", QObject* parent = NULL);
// Property system methods
/// Read accessor or name property
QString name(void) const { return _name; }
/// Read accessor for value property
QVariant value(void) const { return _value; }
......@@ -102,6 +106,7 @@ signals:
void _containerValueChanged(QVariant& value);
private:
QString _name; ///< Fact name
QVariant _value; ///< Fact value
FactMetaData* _metaData; ///< FactMetaData object for Fact
};
......
......@@ -83,7 +83,9 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName
}
if (!_mapParameterName2Variant.contains(parameterName)) {
Fact* fact = new Fact(this);
qCDebug(FactLoaderLog) << "Adding new fact" << parameterName;
Fact* fact = new Fact(parameterName, this);
_mapParameterName2Variant[parameterName] = QVariant::fromValue(fact);
_mapFact2ParameterName[fact] = parameterName;
......@@ -91,7 +93,7 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName
// We need to know when the fact changes from QML so that we can send the new value to the parameter manager
connect(fact, &Fact::_containerValueChanged, this, &FactLoader::_valueUpdated);
qCDebug(FactLoaderLog) << "Adding new fact" << parameterName;
_addMetaDataToFact(fact);
}
Q_ASSERT(_mapParameterName2Variant.contains(parameterName));
......@@ -105,7 +107,7 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName
/// Connected to Fact::valueUpdated
///
/// Sets the new value into the Parameter Manager. Paramter is persisted after send.
/// Sets the new value into the Parameter Manager. Parameter is persisted after send.
void FactLoader::_valueUpdated(QVariant value)
{
Fact* fact = qobject_cast<Fact*>(sender());
......@@ -157,3 +159,42 @@ void FactLoader::_paramMgrParameterListUpToDate(void)
emit factsReady();
}
}
void FactLoader::_addMetaDataToFact(Fact* fact)
{
// Create generic meta data based on value variant type
FactMetaData::ValueType_t factType = FactMetaData::valueTypeInt32; // init to in32 to silence compiler warning
switch ((QMetaType::Type)fact->value().type()) {
case QMetaType::Int:
factType = FactMetaData::valueTypeInt32;
break;
case QMetaType::UInt:
factType = FactMetaData::valueTypeUint32;
break;
case QMetaType::Double:
factType = FactMetaData::valueTypeDouble;
case QMetaType::Short:
factType = FactMetaData::valueTypeInt16;
break;
case QMetaType::UShort:
factType = FactMetaData::valueTypeUint16;
break;
case QMetaType::Float:
factType = FactMetaData::valueTypeFloat;
break;
default:
qCWarning(FactLoaderLog) << "Invalid variant type" << fact->value().type();
break;
}
FactMetaData* metaData = new FactMetaData(this);
metaData->initFromTypeOnly(factType);
}
......@@ -66,6 +66,11 @@ signals:
/// Signalled when the full set of facts are ready
void factsReady(void);
protected:
/// Base implementation adds generic meta data based on variant type. Derived class can override to provide
/// more details meta data.
virtual void _addMetaDataToFact(Fact* fact);
private slots:
void _parameterChanged(int uas, int component, QString parameterName, QVariant value);
void _valueUpdated(QVariant value);
......
......@@ -31,5 +31,12 @@
FactMetaData::FactMetaData(QObject* parent) :
QObject(parent)
{
initFromTypeOnly(valueTypeInt32);
}
void FactMetaData::initFromTypeOnly(ValueType_t initType)
{
type = initType;
// FIXME: NYI
}
......@@ -54,8 +54,12 @@ public:
valueTypeDouble
} ValueType_t;
QVariant defaultValue;
/// Initialize the meta data given only the type.
void initFromTypeOnly(ValueType_t initType);
// FIXME: This needs to switch over to Q_PROPERTY mechanism
ValueType_t type;
QVariant defaultValue;
QString shortDescription;
QString longDescription;
QString units;
......
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