From dee99ea532eded2df5f4109c138b5a8a11f40250 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Thu, 26 Mar 2015 15:46:48 -0700 Subject: [PATCH] Changed pluginReady mechanism More consistent with Qml usage pattern --- qgroundcontrol.qrc | 3 +- src/AutoPilotPlugins/AutoPilotPlugin.cc | 3 +- src/AutoPilotPlugins/AutoPilotPlugin.h | 12 ++- .../Generic/GenericAutoPilotPlugin.cc | 9 +- .../Generic/GenericAutoPilotPlugin.h | 4 +- .../PX4/FlightModesComponentController.cc | 2 +- .../PX4/PX4AutoPilotPlugin.cc | 8 +- src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h | 1 - src/FactSystem/FactBinder.cc | 2 +- src/FactSystem/FactSystemTestBase.cc | 6 +- src/VehicleSetup/SetupView.cc | 45 ++++----- src/VehicleSetup/SetupView.h | 2 +- src/VehicleSetup/SetupViewButtons.qml | 99 ------------------- .../SetupViewButtonsConnected.qml | 62 ++++++++++++ .../SetupViewButtonsDisconnected.qml | 40 ++++++++ src/ui/DebugConsole.cc | 2 +- src/ui/PrimaryFlightDisplay.cc | 3 +- 17 files changed, 157 insertions(+), 146 deletions(-) delete mode 100644 src/VehicleSetup/SetupViewButtons.qml create mode 100644 src/VehicleSetup/SetupViewButtonsConnected.qml create mode 100644 src/VehicleSetup/SetupViewButtonsDisconnected.qml diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 98f550c8a..629936dd5 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 4e7354970..b4b4da38f 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 01842495c..6e0a0c694 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 bdd97ef10..bf92452a5 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 5a2262b1e..f4eb8a71b 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 d6cace7d1..fffd4400c 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 f34ee7e66..3ea406a24 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 66078107b..ad7aead1a 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 ed305ae50..9d91487e6 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 d50a60cc6..29d459bb8 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 1ba00d1c8..e90a46cc3 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 40809ac05..821bef722 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 c604a70cc..000000000 --- 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 000000000..f8bd4a915 --- /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 000000000..e5634ccbf --- /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 ad8b37b50..5084d884b 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 84f3dcd50..7a6b03bc9 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; } /** -- 2.22.0