diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 98f550c..629936d 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -264,7 +264,8 @@
src/QmlControls/arrow-down.png
files/images/px4/airframes/octo_x.png
files/images/px4/boards/px4fmu_2.x.png
- src/VehicleSetup/SetupViewButtons.qml
+ src/VehicleSetup/SetupViewButtonsConnected.qml
+ src/VehicleSetup/SetupViewButtonsDisconnected.qml
src/VehicleSetup/VehicleSummary.qml
src/VehicleSetup/FirmwareUpgrade.qml
src/AutoPilotPlugins/PX4/SafetyComponent.qml
diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.cc b/src/AutoPilotPlugins/AutoPilotPlugin.cc
index 4e73549..b4b4da3 100644
--- a/src/AutoPilotPlugins/AutoPilotPlugin.cc
+++ b/src/AutoPilotPlugins/AutoPilotPlugin.cc
@@ -28,7 +28,8 @@
AutoPilotPlugin::AutoPilotPlugin(UASInterface* uas, QObject* parent) :
QObject(parent),
- _uas(uas)
+ _uas(uas),
+ _pluginReady(false)
{
Q_ASSERT(_uas);
}
diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.h b/src/AutoPilotPlugins/AutoPilotPlugin.h
index 0184249..6e0a0c6 100644
--- a/src/AutoPilotPlugins/AutoPilotPlugin.h
+++ b/src/AutoPilotPlugins/AutoPilotPlugin.h
@@ -50,6 +50,8 @@ class AutoPilotPlugin : public QObject
public:
AutoPilotPlugin(UASInterface* uas, QObject* parent);
+ Q_PROPERTY(bool pluginReady READ pluginReady NOTIFY pluginReadyChanged)
+
Q_PROPERTY(QVariantList components READ components CONSTANT)
Q_PROPERTY(QUrl setupBackgroundImage READ setupBackgroundImage CONSTANT)
@@ -71,23 +73,23 @@ public:
virtual const QVariantMap& parameters(void) = 0;
virtual QUrl setupBackgroundImage(void) = 0;
- /// Returns true if the plugin is ready for use
- virtual bool pluginIsReady(void) const = 0;
-
/// FIXME: Kind of hacky
static void clearStaticData(void);
UASInterface* uas(void) { return _uas; }
+ bool pluginReady(void) { return _pluginReady; }
+
signals:
/// Signalled when plugin is ready for use
- void pluginReady(void);
+ void pluginReadyChanged(bool pluginReady);
protected:
/// All access to AutoPilotPugin objects is through getInstanceForAutoPilotPlugin
AutoPilotPlugin(QObject* parent = NULL) : QObject(parent) { }
- UASInterface* _uas;
+ UASInterface* _uas;
+ bool _pluginReady;
};
#endif
diff --git a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc
index bdd97ef..bf92452 100644
--- a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc
+++ b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc
@@ -34,8 +34,7 @@ GenericAutoPilotPlugin::GenericAutoPilotPlugin(UASInterface* uas, QObject* paren
_parameterFacts = new GenericParameterFacts(uas, this);
Q_CHECK_PTR(_parameterFacts);
- connect(_parameterFacts, &GenericParameterFacts::factsReady, this, &GenericAutoPilotPlugin::pluginReady);
-
+ connect(_parameterFacts, &GenericParameterFacts::factsReady, this, &GenericAutoPilotPlugin::_factsReady);
}
QList GenericAutoPilotPlugin::getModes(void)
@@ -104,3 +103,9 @@ QUrl GenericAutoPilotPlugin::setupBackgroundImage(void)
{
return QUrl::fromUserInput("qrc:/qml/px4fmu_2.x.png");
}
+
+void GenericAutoPilotPlugin::_factsReady(void)
+{
+ _pluginReady = true;
+ emit pluginReadyChanged(_pluginReady);
+}
diff --git a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h
index 5a2262b..f4eb8a7 100644
--- a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h
+++ b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h
@@ -41,7 +41,6 @@ public:
GenericAutoPilotPlugin(UASInterface* uas, QObject* parent = NULL);
// Overrides from AutoPilotPlugin
- virtual bool pluginIsReady(void) const { return _parameterFacts->factsAreReady(); }
virtual QUrl setupBackgroundImage(void);
virtual const QVariantList& components(void);
virtual const QVariantMap& parameters(void);
@@ -50,6 +49,9 @@ public:
static QString getShortModeText(uint8_t baseMode, uint32_t customMode);
static void clearStaticData(void);
+private slots:
+ void _factsReady(void);
+
private:
GenericParameterFacts* _parameterFacts;
};
diff --git a/src/AutoPilotPlugins/PX4/FlightModesComponentController.cc b/src/AutoPilotPlugins/PX4/FlightModesComponentController.cc
index d6cace7..fffd440 100644
--- a/src/AutoPilotPlugins/PX4/FlightModesComponentController.cc
+++ b/src/AutoPilotPlugins/PX4/FlightModesComponentController.cc
@@ -44,7 +44,7 @@ FlightModesComponentController::FlightModesComponentController(QObject* parent)
_autoPilotPlugin = AutoPilotPluginManager::instance()->getInstanceForAutoPilotPlugin(_uas);
Q_ASSERT(_autoPilotPlugin);
- Q_ASSERT(_autoPilotPlugin->pluginIsReady());
+ Q_ASSERT(_autoPilotPlugin->pluginReady());
_initRcValues();
_validateConfiguration();
diff --git a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc
index f34ee7e..3ea406a 100644
--- a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc
+++ b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc
@@ -189,11 +189,6 @@ void PX4AutoPilotPlugin::clearStaticData(void)
PX4ParameterFacts::clearStaticData();
}
-bool PX4AutoPilotPlugin::pluginIsReady(void) const
-{
- return _parameterFacts->factsAreReady();
-}
-
const QVariantList& PX4AutoPilotPlugin::components(void)
{
if (_components.count() == 0 && !_incorrectParameterVersion) {
@@ -261,5 +256,6 @@ void PX4AutoPilotPlugin::_pluginReadyPreChecks(void)
}
}
- emit pluginReady();
+ _pluginReady = true;
+ emit pluginReadyChanged(_pluginReady);
}
diff --git a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h
index 6607810..ad7aead 100644
--- a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h
+++ b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h
@@ -50,7 +50,6 @@ public:
~PX4AutoPilotPlugin();
// Overrides from AutoPilotPlugin
- virtual bool pluginIsReady(void) const;
virtual const QVariantList& components(void);
virtual const QVariantMap& parameters(void);
virtual QUrl setupBackgroundImage(void);
diff --git a/src/FactSystem/FactBinder.cc b/src/FactSystem/FactBinder.cc
index ed305ae..9d91487 100644
--- a/src/FactSystem/FactBinder.cc
+++ b/src/FactSystem/FactBinder.cc
@@ -38,7 +38,7 @@ FactBinder::FactBinder(void) :
_autopilotPlugin = AutoPilotPluginManager::instance()->getInstanceForAutoPilotPlugin(uas);
Q_ASSERT(_autopilotPlugin);
- Q_ASSERT(_autopilotPlugin->pluginIsReady());
+ Q_ASSERT(_autopilotPlugin->pluginReady());
}
QString FactBinder::name(void) const
diff --git a/src/FactSystem/FactSystemTestBase.cc b/src/FactSystem/FactSystemTestBase.cc
index d50a60c..29d459b 100644
--- a/src/FactSystem/FactSystemTestBase.cc
+++ b/src/FactSystem/FactSystemTestBase.cc
@@ -72,11 +72,11 @@ void FactSystemTestBase::_init(MAV_AUTOPILOT autopilot)
// Wait for the plugin to be ready
- QSignalSpy spyPlugin(_plugin, SIGNAL(pluginReady()));
- if (!_plugin->pluginIsReady()) {
+ QSignalSpy spyPlugin(_plugin, SIGNAL(pluginReadyChanged(bool)));
+ if (!_plugin->pluginReady()) {
QCOMPARE(spyPlugin.wait(5000), true);
}
- Q_ASSERT(_plugin->pluginIsReady());
+ Q_ASSERT(_plugin->pluginReady());
}
void FactSystemTestBase::_cleanup(void)
diff --git a/src/VehicleSetup/SetupView.cc b/src/VehicleSetup/SetupView.cc
index 1ba00d1..e90a46c 100644
--- a/src/VehicleSetup/SetupView.cc
+++ b/src/VehicleSetup/SetupView.cc
@@ -54,12 +54,11 @@ SetupView::SetupView(QWidget* parent) :
Q_UNUSED(fSucceeded);
Q_ASSERT(fSucceeded);
- _ui->buttonHolder->setAutoPilot(NULL);
- _ui->buttonHolder->setSource(QUrl::fromUserInput("qrc:/qml/SetupViewButtons.qml"));
+ qmlRegisterType("QGroundControl.FirmwareUpgradeController", 1, 0, "FirmwareUpgradeController");
_ui->buttonHolder->rootContext()->setContextProperty("controller", this);
-
- qmlRegisterType("QGroundControl.FirmwareUpgradeController", 1, 0, "FirmwareUpgradeController");
+ _ui->buttonHolder->setAutoPilot(NULL);
+ _ui->buttonHolder->setSource(QUrl::fromUserInput("qrc:/qml/SetupViewButtonsDisconnected.qml"));
_setActiveUAS(UASManager::instance()->getActiveUAS());
}
@@ -73,35 +72,37 @@ void SetupView::_setActiveUAS(UASInterface* uas)
{
if (_uasCurrent) {
Q_ASSERT(_autoPilotPlugin);
- disconnect(_autoPilotPlugin, &AutoPilotPlugin::pluginReady, this, &SetupView::_pluginReady);
+ disconnect(_autoPilotPlugin, &AutoPilotPlugin::pluginReadyChanged, this, &SetupView::_pluginReadyChanged);
}
- _autoPilotPlugin = NULL;
- _ui->buttonHolder->setAutoPilot(NULL);
- firmwareButtonClicked();
- QObject* button = _ui->buttonHolder->rootObject()->findChild("firmwareButton");
- Q_ASSERT(button);
- button->setProperty("checked", true);
+ _pluginReadyChanged(false);
_uasCurrent = uas;
if (_uasCurrent) {
_autoPilotPlugin = AutoPilotPluginManager::instance()->getInstanceForAutoPilotPlugin(_uasCurrent);
-
- connect(_autoPilotPlugin, &AutoPilotPlugin::pluginReady, this, &SetupView::_pluginReady);
- if (_autoPilotPlugin->pluginIsReady()) {
- _pluginReady();
- }
+ _pluginReadyChanged(_autoPilotPlugin->pluginReady());
+ connect(_autoPilotPlugin, &AutoPilotPlugin::pluginReadyChanged, this, &SetupView::_pluginReadyChanged);
}
}
-void SetupView::_pluginReady(void)
+void SetupView::_pluginReadyChanged(bool pluginReady)
{
- _ui->buttonHolder->setAutoPilot(_autoPilotPlugin);
- summaryButtonClicked();
- QObject* button = _ui->buttonHolder->rootObject()->findChild("summaryButton");
- Q_ASSERT(button);
- button->setProperty("checked", true);
+ if (pluginReady) {
+ _ui->buttonHolder->setAutoPilot(_autoPilotPlugin);
+ _ui->buttonHolder->setSource(QUrl::fromUserInput("qrc:/qml/SetupViewButtonsConnected.qml"));
+ summaryButtonClicked();
+ QObject* button = _ui->buttonHolder->rootObject()->findChild("summaryButton");
+ Q_ASSERT(button);
+ button->setProperty("checked", true);
+ } else {
+ _ui->buttonHolder->setSource(QUrl::fromUserInput("qrc:/qml/SetupViewButtonsDisconnected.qml"));
+ _ui->buttonHolder->setAutoPilot(NULL);
+ firmwareButtonClicked();
+ QObject* button = _ui->buttonHolder->rootObject()->findChild("firmwareButton");
+ Q_ASSERT(button);
+ button->setProperty("checked", true);
+ }
}
void SetupView::_changeSetupWidget(QWidget* newWidget)
diff --git a/src/VehicleSetup/SetupView.h b/src/VehicleSetup/SetupView.h
index 40809ac..821bef7 100644
--- a/src/VehicleSetup/SetupView.h
+++ b/src/VehicleSetup/SetupView.h
@@ -54,7 +54,7 @@ public:
private slots:
void _setActiveUAS(UASInterface* uas);
- void _pluginReady(void);
+ void _pluginReadyChanged(bool pluginReady);
private:
void _changeSetupWidget(QWidget* newWidget);
diff --git a/src/VehicleSetup/SetupViewButtons.qml b/src/VehicleSetup/SetupViewButtons.qml
deleted file mode 100644
index c604a70..0000000
--- a/src/VehicleSetup/SetupViewButtons.qml
+++ /dev/null
@@ -1,99 +0,0 @@
-import QtQuick 2.3
-import QtQuick.Controls 1.2
-import QtQuick.Controls.Styles 1.2
-import QtGraphicalEffects 1.0
-
-import QGroundControl.FactSystem 1.0
-import QGroundControl.Palette 1.0
-import QGroundControl.Controls 1.0
-
-Rectangle {
- id: topLevel
-
- QGCPalette { id: palette; colorGroupEnabled: true }
- color: palette.window
-
- ExclusiveGroup { id: setupButtonGroup }
-
- Component {
- id: disconnectedButtons
-
- Column {
- anchors.fill: parent
-
- SubMenuButton {
- id: firmwareButton; objectName: "firmwareButton"
- width: parent.width
- text: "FIRMWARE"
- imageResource: "FirmwareUpgradeIcon.png"
- setupIndicator: false
- exclusiveGroup: setupButtonGroup
- onClicked: controller.firmwareButtonClicked()
- }
-
- Item { width: parent.width; height: 10 } // spacer
-
- QGCLabel {
- width: parent.width
- text: "Full setup options are only available when connected to vehicle and full parameter list has completed downloading."
- wrapMode: Text.WordWrap
- horizontalAlignment: Text.AlignHCenter
- }
- }
- }
-
- Component {
- id: connectedButtons
-
- Column {
- anchors.fill: parent
-
- SubMenuButton {
- id: summaryButton; objectName: "summaryButton"
- width: parent.width
- text: "SUMMARY"
- imageResource: "VehicleSummaryIcon.png"
- setupIndicator: false
- exclusiveGroup: setupButtonGroup
- onClicked: controller.summaryButtonClicked()
- }
-
- SubMenuButton {
- id: firmwareButton; objectName: "firmwareButton"
- width: parent.width
- text: "FIRMWARE"
- imageResource: "FirmwareUpgradeIcon.png"
- setupIndicator: false
- exclusiveGroup: setupButtonGroup
- onClicked: controller.firmwareButtonClicked()
- }
-
- Repeater {
- model: autopilot.components
-
- SubMenuButton {
- width: parent.width
- text: modelData.name.toUpperCase()
- imageResource: modelData.iconResource
- setupComplete: modelData.setupComplete
- exclusiveGroup: setupButtonGroup
- onClicked: controller.setupButtonClicked(modelData)
- }
- }
-
- SubMenuButton {
- width: parent.width
- text: "PARAMETERS"
- setupIndicator: false
- exclusiveGroup: setupButtonGroup
- onClicked: controller.parametersButtonClicked()
- }
- }
- }
-
-
- Loader {
- anchors.fill: parent
- sourceComponent: autopilot ? connectedButtons : disconnectedButtons
- }
-}
diff --git a/src/VehicleSetup/SetupViewButtonsConnected.qml b/src/VehicleSetup/SetupViewButtonsConnected.qml
new file mode 100644
index 0000000..f8bd4a9
--- /dev/null
+++ b/src/VehicleSetup/SetupViewButtonsConnected.qml
@@ -0,0 +1,62 @@
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+import QtGraphicalEffects 1.0
+
+import QGroundControl.FactSystem 1.0
+import QGroundControl.Palette 1.0
+import QGroundControl.Controls 1.0
+
+Rectangle {
+ id: topLevel
+
+ QGCPalette { id: palette; colorGroupEnabled: true }
+ color: palette.window
+
+ ExclusiveGroup { id: setupButtonGroup }
+
+ Column {
+ anchors.fill: parent
+
+ SubMenuButton {
+ id: summaryButton; objectName: "summaryButton"
+ width: parent.width
+ text: "SUMMARY"
+ imageResource: "VehicleSummaryIcon.png"
+ setupIndicator: false
+ exclusiveGroup: setupButtonGroup
+ onClicked: controller.summaryButtonClicked()
+ }
+
+ SubMenuButton {
+ id: firmwareButton; objectName: "firmwareButton"
+ width: parent.width
+ text: "FIRMWARE"
+ imageResource: "FirmwareUpgradeIcon.png"
+ setupIndicator: false
+ exclusiveGroup: setupButtonGroup
+ onClicked: controller.firmwareButtonClicked()
+ }
+
+ Repeater {
+ model: autopilot ? autopilot.components : 0
+
+ SubMenuButton {
+ width: parent.width
+ text: modelData.name.toUpperCase()
+ imageResource: modelData.iconResource
+ setupComplete: modelData.setupComplete
+ exclusiveGroup: setupButtonGroup
+ onClicked: controller.setupButtonClicked(modelData)
+ }
+ }
+
+ SubMenuButton {
+ width: parent.width
+ text: "PARAMETERS"
+ setupIndicator: false
+ exclusiveGroup: setupButtonGroup
+ onClicked: controller.parametersButtonClicked()
+ }
+ }
+}
diff --git a/src/VehicleSetup/SetupViewButtonsDisconnected.qml b/src/VehicleSetup/SetupViewButtonsDisconnected.qml
new file mode 100644
index 0000000..e5634cc
--- /dev/null
+++ b/src/VehicleSetup/SetupViewButtonsDisconnected.qml
@@ -0,0 +1,40 @@
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+import QtGraphicalEffects 1.0
+
+import QGroundControl.FactSystem 1.0
+import QGroundControl.Palette 1.0
+import QGroundControl.Controls 1.0
+
+Rectangle {
+ id: topLevel
+
+ QGCPalette { id: palette; colorGroupEnabled: true }
+ color: palette.window
+
+ ExclusiveGroup { id: setupButtonGroup }
+
+ Column {
+ anchors.fill: parent
+
+ SubMenuButton {
+ id: firmwareButton; objectName: "firmwareButton"
+ width: parent.width
+ text: "FIRMWARE"
+ imageResource: "FirmwareUpgradeIcon.png"
+ setupIndicator: false
+ exclusiveGroup: setupButtonGroup
+ onClicked: controller.firmwareButtonClicked()
+ }
+
+ Item { width: parent.width; height: 10 } // spacer
+
+ QGCLabel {
+ width: parent.width
+ text: "Full setup options are only available when connected to vehicle and full parameter list has completed downloading."
+ wrapMode: Text.WordWrap
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+}
diff --git a/src/ui/DebugConsole.cc b/src/ui/DebugConsole.cc
index ad8b37b..5084d88 100644
--- a/src/ui/DebugConsole.cc
+++ b/src/ui/DebugConsole.cc
@@ -181,7 +181,7 @@ void DebugConsole::addLink(LinkInterface* link)
// Register for name changes
connect(link, SIGNAL(nameChanged(QString)), this, SLOT(updateLinkName(QString)), Qt::UniqueConnection);
- connect(LinkManager::instance(), &LinkManager::linkDeleted, this, &DebugConsole::removeLink, Qt::UniqueConnection);
+ connect(LinkManager::instance(), &LinkManager::linkDisconnected, this, &DebugConsole::removeLink, Qt::UniqueConnection);
}
void DebugConsole::removeLink(LinkInterface* const linkInterface)
diff --git a/src/ui/PrimaryFlightDisplay.cc b/src/ui/PrimaryFlightDisplay.cc
index 84f3dcd..7a6b03b 100644
--- a/src/ui/PrimaryFlightDisplay.cc
+++ b/src/ui/PrimaryFlightDisplay.cc
@@ -219,10 +219,11 @@ void PrimaryFlightDisplay::forgetUAS(UASInterface* uas)
disconnect(this->uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*, double, double, double, quint64)));
disconnect(this->uas, SIGNAL(attitudeChanged(UASInterface*,int,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,int,double, double, double, quint64)));
disconnect(this->uas, SIGNAL(speedChanged(UASInterface*, double, double, quint64)), this, SLOT(updateSpeed(UASInterface*, double, double, quint64)));
- disconnect(this->uas, SIGNAL(altitudeChanged(UASInterface*, double, double, double, double, quint64)), this, SLOT(updateAltitude(UASInterface*, double, double, double, quint64)));
+ disconnect(this->uas, SIGNAL(altitudeChanged(UASInterface*, double, double, double, double, quint64)), this, SLOT(updateAltitude(UASInterface*, double, double, double, double, quint64)));
disconnect(this->uas, SIGNAL(navigationControllerErrorsChanged(UASInterface*, double, double, double)), this, SLOT(updateNavigationControllerErrors(UASInterface*, double, double, double)));
disconnect(this->uas, &UASInterface::NavigationControllerDataChanged, this, &PrimaryFlightDisplay::UpdateNavigationControllerData);
}
+ this->uas = NULL;
}
/**