Commit b8f1fb0b authored by Don Gagne's avatar Don Gagne

Merge pull request #1141 from DonLakeFlyer/FactControls

Fact controls
parents 6b1383fe 8e3f1375
...@@ -237,12 +237,20 @@ ...@@ -237,12 +237,20 @@
</qresource> </qresource>
<qresource prefix="/qml"> <qresource prefix="/qml">
<file alias="test.qml">src/test.qml</file> <file alias="test.qml">src/test.qml</file>
<file alias="QGroundControl/FactControls/qmldir">qml/QGroundControl/FactControls/qmldir</file> <file alias="QGroundControl/FactControls/qmldir">qml/QGroundControl/FactControls/qmldir</file>
<file alias="QGroundControl/FactControls/SetupButton.qml">qml/QGroundControl/FactControls/SetupButton.qml</file> <file alias="QGroundControl/FactControls/SetupButton.qml">qml/QGroundControl/FactControls/SetupButton.qml</file>
<file alias="QGroundControl/FactControls/FactLabel.qml">qml/QGroundControl/FactControls/FactLabel.qml</file>
<file alias="QGroundControl/FactControls/FactTextField.qml">qml/QGroundControl/FactControls/FactTextField.qml</file>
<file alias="octo_x.png">files/images/px4/airframes/octo_x.png</file> <file alias="octo_x.png">files/images/px4/airframes/octo_x.png</file>
<file alias="px4fmu_2.x.png">files/images/px4/boards/px4fmu_2.x.png</file> <file alias="px4fmu_2.x.png">files/images/px4/boards/px4fmu_2.x.png</file>
<file alias="SetupViewConnected.qml">src/VehicleSetup/SetupViewConnected.qml</file> <file alias="SetupViewConnected.qml">src/VehicleSetup/SetupViewConnected.qml</file>
<file alias="SetupViewDisconnected.qml">src/VehicleSetup/SetupViewDisconnected.qml</file> <file alias="SetupViewDisconnected.qml">src/VehicleSetup/SetupViewDisconnected.qml</file>
<file alias="SafetyComponent.qml">src/AutoPilotPlugins/PX4/SafetyComponent.qml</file> <file alias="SafetyComponent.qml">src/AutoPilotPlugins/PX4/SafetyComponent.qml</file>
</qresource> </qresource>
<qresource prefix="/AutoPilotPlugins/PX4"> <qresource prefix="/AutoPilotPlugins/PX4">
......
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.FactSystem 1.0
Label {
property Fact fact: Fact { value: "FactLabel" }
QGCPalette { id: palette; colorGroup: QGCPalette.Active }
color: palette.windowText
text: fact.value
}
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.FactSystem 1.0
TextField {
property Fact fact: Fact { value: 0 }
QGCPalette { id: palette; colorGroup: QGCPalette.Active }
text: fact.value
onAccepted: fact.value = text
}
Module QGroundControl.FactControls Module QGroundControl.FactControls
SetupButton 1.0 SetupButton.qml FactLabel 1.0 FactLabel.qml
\ No newline at end of file FactTextField 1.0 FactTextField.qml
\ No newline at end of file
...@@ -263,4 +263,15 @@ void PX4ParameterFacts::clearStaticData(void) ...@@ -263,4 +263,15 @@ void PX4ParameterFacts::clearStaticData(void)
} }
_mapParameterName2FactMetaData.clear(); _mapParameterName2FactMetaData.clear();
_parameterMetaDataLoaded = false; _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: ...@@ -52,6 +52,10 @@ public:
static void clearStaticData(void); static void clearStaticData(void);
private: private:
// Overrides from FactLoader
virtual void _addMetaDataToFact(Fact* fact);
// Class methods
static FactMetaData* _parseParameter(QXmlStreamReader& xml, const QString& group); static FactMetaData* _parseParameter(QXmlStreamReader& xml, const QString& group);
static void _initMetaData(FactMetaData* metaData); static void _initMetaData(FactMetaData* metaData);
static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false);
......
...@@ -2,6 +2,7 @@ import QtQuick 2.2 ...@@ -2,6 +2,7 @@ import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QGroundControl.FactSystem 1.0 import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
Rectangle { Rectangle {
QGCPalette { id: palette; colorGroup: QGCPalette.Active } QGCPalette { id: palette; colorGroup: QGCPalette.Active }
...@@ -12,6 +13,8 @@ Rectangle { ...@@ -12,6 +13,8 @@ Rectangle {
Column { Column {
Label { text: "Work in Progress"; color: palette.windowText } Label { text: "Work in Progress"; color: palette.windowText }
Label { text: autopilot.parameters["RTL_RETURN_ALT"].value; color: palette.windowText } Label { text: "Return to Land Altitude"; color: palette.windowText }
FactLabel { fact: autopilot.parameters["RTL_RETURN_ALT"] }
FactTextField { fact: autopilot.parameters["RTL_RETURN_ALT"] }
} }
} }
...@@ -28,10 +28,12 @@ ...@@ -28,10 +28,12 @@
#include <QtQml> #include <QtQml>
Fact::Fact(QObject* parent) : Fact::Fact(QString name, QObject* parent) :
QObject(parent) QObject(parent),
_name(name),
_metaData(NULL)
{ {
_value = "";
} }
void Fact::setValue(const QVariant& value) void Fact::setValue(const QVariant& value)
......
...@@ -42,6 +42,7 @@ class Fact : public QObject ...@@ -42,6 +42,7 @@ class Fact : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true) Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true)
Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT) Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT)
Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT) Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT)
...@@ -54,10 +55,13 @@ class Fact : public QObject ...@@ -54,10 +55,13 @@ class Fact : public QObject
Q_ENUMS(FactMetaData::ValueType_t) Q_ENUMS(FactMetaData::ValueType_t)
public: public:
Fact(QObject* parent = NULL); Fact(QString name = "", QObject* parent = NULL);
// Property system methods // Property system methods
/// Read accessor or name property
QString name(void) const { return _name; }
/// Read accessor for value property /// Read accessor for value property
QVariant value(void) const { return _value; } QVariant value(void) const { return _value; }
...@@ -102,6 +106,7 @@ signals: ...@@ -102,6 +106,7 @@ signals:
void _containerValueChanged(QVariant& value); void _containerValueChanged(QVariant& value);
private: private:
QString _name; ///< Fact name
QVariant _value; ///< Fact value QVariant _value; ///< Fact value
FactMetaData* _metaData; ///< FactMetaData object for Fact FactMetaData* _metaData; ///< FactMetaData object for Fact
}; };
......
...@@ -83,7 +83,9 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName ...@@ -83,7 +83,9 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName
} }
if (!_mapParameterName2Variant.contains(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); _mapParameterName2Variant[parameterName] = QVariant::fromValue(fact);
_mapFact2ParameterName[fact] = parameterName; _mapFact2ParameterName[fact] = parameterName;
...@@ -91,7 +93,7 @@ void FactLoader::_parameterChanged(int uas, int component, QString 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 // 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); connect(fact, &Fact::_containerValueChanged, this, &FactLoader::_valueUpdated);
qCDebug(FactLoaderLog) << "Adding new fact" << parameterName; _addMetaDataToFact(fact);
} }
Q_ASSERT(_mapParameterName2Variant.contains(parameterName)); Q_ASSERT(_mapParameterName2Variant.contains(parameterName));
...@@ -105,7 +107,7 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName ...@@ -105,7 +107,7 @@ void FactLoader::_parameterChanged(int uas, int component, QString parameterName
/// Connected to Fact::valueUpdated /// 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) void FactLoader::_valueUpdated(QVariant value)
{ {
Fact* fact = qobject_cast<Fact*>(sender()); Fact* fact = qobject_cast<Fact*>(sender());
...@@ -157,3 +159,42 @@ void FactLoader::_paramMgrParameterListUpToDate(void) ...@@ -157,3 +159,42 @@ void FactLoader::_paramMgrParameterListUpToDate(void)
emit factsReady(); 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: ...@@ -66,6 +66,11 @@ signals:
/// Signalled when the full set of facts are ready /// Signalled when the full set of facts are ready
void factsReady(void); 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: private slots:
void _parameterChanged(int uas, int component, QString parameterName, QVariant value); void _parameterChanged(int uas, int component, QString parameterName, QVariant value);
void _valueUpdated(QVariant value); void _valueUpdated(QVariant value);
......
...@@ -31,5 +31,12 @@ ...@@ -31,5 +31,12 @@
FactMetaData::FactMetaData(QObject* parent) : FactMetaData::FactMetaData(QObject* parent) :
QObject(parent) QObject(parent)
{ {
initFromTypeOnly(valueTypeInt32);
}
void FactMetaData::initFromTypeOnly(ValueType_t initType)
{
type = initType;
// FIXME: NYI
} }
...@@ -54,8 +54,12 @@ public: ...@@ -54,8 +54,12 @@ public:
valueTypeDouble valueTypeDouble
} ValueType_t; } 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; ValueType_t type;
QVariant defaultValue;
QString shortDescription; QString shortDescription;
QString longDescription; QString longDescription;
QString units; 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