Browse Source

Merge pull request #1141 from DonLakeFlyer/FactControls

Fact controls
QGC4.4
Don Gagne 10 years ago
parent
commit
b8f1fb0bbf
  1. 8
      qgroundcontrol.qrc
  2. 13
      qml/QGroundControl/FactControls/FactLabel.qml
  3. 14
      qml/QGroundControl/FactControls/FactTextField.qml
  4. 3
      qml/QGroundControl/FactControls/qmldir
  5. 13
      src/AutoPilotPlugins/PX4/PX4ParameterFacts.cc
  6. 4
      src/AutoPilotPlugins/PX4/PX4ParameterFacts.h
  7. 5
      src/AutoPilotPlugins/PX4/SafetyComponent.qml
  8. 8
      src/FactSystem/Fact.cc
  9. 7
      src/FactSystem/Fact.h
  10. 47
      src/FactSystem/FactLoader.cc
  11. 5
      src/FactSystem/FactLoader.h
  12. 7
      src/FactSystem/FactMetaData.cc
  13. 6
      src/FactSystem/FactMetaData.h

8
qgroundcontrol.qrc

@ -237,12 +237,20 @@ @@ -237,12 +237,20 @@
</qresource>
<qresource prefix="/qml">
<file alias="test.qml">src/test.qml</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/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="px4fmu_2.x.png">files/images/px4/boards/px4fmu_2.x.png</file>
<file alias="SetupViewConnected.qml">src/VehicleSetup/SetupViewConnected.qml</file>
<file alias="SetupViewDisconnected.qml">src/VehicleSetup/SetupViewDisconnected.qml</file>
<file alias="SafetyComponent.qml">src/AutoPilotPlugins/PX4/SafetyComponent.qml</file>
</qresource>
<qresource prefix="/AutoPilotPlugins/PX4">

13
qml/QGroundControl/FactControls/FactLabel.qml

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
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
}

14
qml/QGroundControl/FactControls/FactTextField.qml

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
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
}

3
qml/QGroundControl/FactControls/qmldir

@ -1,2 +1,3 @@ @@ -1,2 +1,3 @@
Module QGroundControl.FactControls
SetupButton 1.0 SetupButton.qml
FactLabel 1.0 FactLabel.qml
FactTextField 1.0 FactTextField.qml

13
src/AutoPilotPlugins/PX4/PX4ParameterFacts.cc

@ -263,4 +263,15 @@ void PX4ParameterFacts::clearStaticData(void) @@ -263,4 +263,15 @@ void PX4ParameterFacts::clearStaticData(void)
}
_mapParameterName2FactMetaData.clear();
_parameterMetaDataLoaded = false;
}
}
/// 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);
}
}

4
src/AutoPilotPlugins/PX4/PX4ParameterFacts.h

@ -52,6 +52,10 @@ public: @@ -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);

5
src/AutoPilotPlugins/PX4/SafetyComponent.qml

@ -2,6 +2,7 @@ import QtQuick 2.2 @@ -2,6 +2,7 @@ import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
Rectangle {
QGCPalette { id: palette; colorGroup: QGCPalette.Active }
@ -12,6 +13,8 @@ Rectangle { @@ -12,6 +13,8 @@ Rectangle {
Column {
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"] }
}
}

8
src/FactSystem/Fact.cc

@ -28,10 +28,12 @@ @@ -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)

7
src/FactSystem/Fact.h

@ -42,6 +42,7 @@ class Fact : public QObject @@ -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 @@ -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: @@ -102,6 +106,7 @@ signals:
void _containerValueChanged(QVariant& value);
private:
QString _name; ///< Fact name
QVariant _value; ///< Fact value
FactMetaData* _metaData; ///< FactMetaData object for Fact
};

47
src/FactSystem/FactLoader.cc

@ -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)) {
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 @@ -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 @@ -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) @@ -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);
}

5
src/FactSystem/FactLoader.h

@ -66,6 +66,11 @@ signals: @@ -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);

7
src/FactSystem/FactMetaData.cc

@ -31,5 +31,12 @@ @@ -31,5 +31,12 @@
FactMetaData::FactMetaData(QObject* parent) :
QObject(parent)
{
initFromTypeOnly(valueTypeInt32);
}
void FactMetaData::initFromTypeOnly(ValueType_t initType)
{
type = initType;
// FIXME: NYI
}

6
src/FactSystem/FactMetaData.h

@ -54,8 +54,12 @@ public: @@ -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;

Loading…
Cancel
Save