From a220ddf5035dc0c6095a881702d8498709756c0c Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 18 Oct 2015 13:12:49 -0700 Subject: [PATCH 1/4] MockLink support APM, Generic --- QGCApplication.pro | 3 ++ src/comm/LinkManager.cc | 2 +- src/comm/MockLink.cc | 54 +++++++++++++++++++++++++++++ src/comm/MockLink.h | 28 ++++++++------- src/ui/MockLinkConfiguration.cc | 75 +++++++++++++++++++++++++++++++++++++++++ src/ui/MockLinkConfiguration.h | 53 +++++++++++++++++++++++++++++ src/ui/MockLinkConfiguration.ui | 42 +++++++++++++++++++++++ src/ui/QGCCommConfiguration.cc | 4 ++- 8 files changed, 247 insertions(+), 14 deletions(-) create mode 100644 src/ui/MockLinkConfiguration.cc create mode 100644 src/ui/MockLinkConfiguration.h create mode 100644 src/ui/MockLinkConfiguration.ui diff --git a/QGCApplication.pro b/QGCApplication.pro index d51b142..a964713 100644 --- a/QGCApplication.pro +++ b/QGCApplication.pro @@ -166,6 +166,7 @@ FORMS += \ src/ui/LogReplayLinkConfigurationWidget.ui \ src/ui/MainWindow.ui \ src/ui/MAVLinkSettingsWidget.ui \ + src/ui/MockLinkConfiguration.ui \ src/ui/QGCCommConfiguration.ui \ src/ui/QGCLinkConfiguration.ui \ src/ui/QGCMapRCToParamDialog.ui \ @@ -257,6 +258,7 @@ HEADERS += \ src/ui/MainWindow.h \ src/ui/MAVLinkDecoder.h \ src/ui/MAVLinkSettingsWidget.h \ + src/ui/MockLinkConfiguration.h \ src/ui/QGCCommConfiguration.h \ src/ui/QGCLinkConfiguration.h \ src/ui/QGCMapRCToParamDialog.h \ @@ -368,6 +370,7 @@ SOURCES += \ src/ui/MainWindow.cc \ src/ui/MAVLinkDecoder.cc \ src/ui/MAVLinkSettingsWidget.cc \ + src/ui/MockLinkConfiguration.cc \ src/ui/QGCCommConfiguration.cc \ src/ui/QGCLinkConfiguration.cc \ src/ui/QGCMapRCToParamDialog.cpp \ diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index 793d3f3..967d1ff 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -438,7 +438,7 @@ void LinkManager::loadLinkConfigurationList() // Debug buids always add MockLink automatically #ifdef QT_DEBUG - MockConfiguration* pMock = new MockConfiguration("Mock Link"); + MockConfiguration* pMock = new MockConfiguration("Mock Link PX4"); pMock->setDynamic(true); addLinkConfiguration(pMock); linksChanged = true; diff --git a/src/comm/MockLink.cc b/src/comm/MockLink.cc index a425891..9a62d9d 100644 --- a/src/comm/MockLink.cc +++ b/src/comm/MockLink.cc @@ -71,6 +71,8 @@ float MockLink::_vehicleLatitude = 47.633033f; float MockLink::_vehicleLongitude = -122.08794f; float MockLink::_vehicleAltitude = 2.5f; +const char* MockConfiguration::_firmwareTypeKey = "FirmwareType"; + MockLink::MockLink(MockConfiguration* config) : _missionItemHandler(this) , _name("MockLink") @@ -85,6 +87,10 @@ MockLink::MockLink(MockConfiguration* config) , _fileServer(NULL) { _config = config; + if (_config) { + _autopilotType = config->firmwareType(); + } + union px4_custom_mode px4_cm; px4_cm.data = 0; @@ -740,3 +746,51 @@ void MockLink::_sendGpsRawInt(void) 8); // satellite count respondWithMavlinkMessage(msg); } + +MockConfiguration::MockConfiguration(const QString& name) + : LinkConfiguration(name) + , _firmwareType(MAV_AUTOPILOT_PX4) +{ + +} + +MockConfiguration::MockConfiguration(MockConfiguration* source) + : LinkConfiguration(source) +{ + _firmwareType = source->_firmwareType; +} + +void MockConfiguration::copyFrom(LinkConfiguration *source) +{ + LinkConfiguration::copyFrom(source); + MockConfiguration* usource = dynamic_cast(source); + Q_ASSERT(usource != NULL); + _firmwareType = usource->_firmwareType; +} + +void MockConfiguration::saveSettings(QSettings& settings, const QString& root) +{ + settings.beginGroup(root); + settings.setValue(_firmwareTypeKey, (int)_firmwareType); + settings.sync(); + settings.endGroup(); +} + +void MockConfiguration::loadSettings(QSettings& settings, const QString& root) +{ + settings.beginGroup(root); + _firmwareType = (MAV_AUTOPILOT)settings.value(_firmwareTypeKey, (int)MAV_AUTOPILOT_PX4).toInt(); + settings.endGroup(); +} + +void MockConfiguration::updateSettings() +{ + if (_link) { + MockLink* ulink = dynamic_cast(_link); + if (ulink) { + // Restart connect not supported + Q_ASSERT(false); + //ulink->_restartConnection(); + } + } +} diff --git a/src/comm/MockLink.h b/src/comm/MockLink.h index 7902918..9da4fe7 100644 --- a/src/comm/MockLink.h +++ b/src/comm/MockLink.h @@ -35,22 +35,26 @@ Q_DECLARE_LOGGING_CATEGORY(MockLinkLog) Q_DECLARE_LOGGING_CATEGORY(MockLinkVerboseLog) -/// @file -/// @brief Mock implementation of a Link. -/// -/// @author Don Gagne - class MockConfiguration : public LinkConfiguration { public: + MockConfiguration(const QString& name); + MockConfiguration(MockConfiguration* source); + + MAV_AUTOPILOT firmwareType(void) { return _firmwareType; } + void setFirmwareType(MAV_AUTOPILOT firmwareType) { _firmwareType = firmwareType; } + + // Overrides from LinkConfiguration + int type(void) { return LinkConfiguration::TypeMock; } + void copyFrom(LinkConfiguration* source); + void loadSettings(QSettings& settings, const QString& root); + void saveSettings(QSettings& settings, const QString& root); + void updateSettings(void); + +private: + MAV_AUTOPILOT _firmwareType; - MockConfiguration(const QString& name) : LinkConfiguration(name) {} - MockConfiguration(MockConfiguration* source) : LinkConfiguration(source) {} - int type() { return LinkConfiguration::TypeMock; } - void copyFrom(LinkConfiguration* source) { LinkConfiguration::copyFrom(source); } - void loadSettings(QSettings& settings, const QString& root) { Q_UNUSED(settings); Q_UNUSED(root); } - void saveSettings(QSettings& settings, const QString& root) { Q_UNUSED(settings); Q_UNUSED(root); } - void updateSettings() {} + static const char* _firmwareTypeKey; }; class MockLink : public LinkInterface diff --git a/src/ui/MockLinkConfiguration.cc b/src/ui/MockLinkConfiguration.cc new file mode 100644 index 0000000..c6b3e47 --- /dev/null +++ b/src/ui/MockLinkConfiguration.cc @@ -0,0 +1,75 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2015 QGROUNDCONTROL PROJECT + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + +======================================================================*/ + +#include "MockLinkConfiguration.h" +#include "ui_MockLinkConfiguration.h" + +MockLinkConfiguration::MockLinkConfiguration(MockConfiguration *config, QWidget *parent) + : QWidget(parent) + , _ui(new Ui::MockLinkConfiguration) + , _config(config) +{ + _ui->setupUi(this); + + switch (config->firmwareType()) { + case MAV_AUTOPILOT_PX4: + _ui->px4Radio->setChecked(true); + break; + case MAV_AUTOPILOT_ARDUPILOTMEGA: + _ui->apmRadio->setChecked(true); + break; + default: + _ui->genericRadio->setChecked(true); + break; + } + + connect(_ui->px4Radio, &QRadioButton::clicked, this, &MockLinkConfiguration::_px4RadioClicked); + connect(_ui->apmRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_apmRadioClicked); + connect(_ui->genericRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_genericRadioClicked); +} + +MockLinkConfiguration::~MockLinkConfiguration() +{ + delete _ui; +} + +void MockLinkConfiguration::_px4RadioClicked(bool checked) +{ + if (checked) { + _config->setFirmwareType(MAV_AUTOPILOT_PX4); + } +} + +void MockLinkConfiguration::_apmRadioClicked(bool checked) +{ + if (checked) { + _config->setFirmwareType(MAV_AUTOPILOT_ARDUPILOTMEGA); + } +} + +void MockLinkConfiguration::_genericRadioClicked(bool checked) +{ + if (checked) { + _config->setFirmwareType(MAV_AUTOPILOT_GENERIC); + } +} diff --git a/src/ui/MockLinkConfiguration.h b/src/ui/MockLinkConfiguration.h new file mode 100644 index 0000000..34feb99 --- /dev/null +++ b/src/ui/MockLinkConfiguration.h @@ -0,0 +1,53 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2015 QGROUNDCONTROL PROJECT + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + +======================================================================*/ + +#ifndef MockLinkConfiguration_H +#define MockLinkConfiguration_H + +#include + +#include "MockLink.h" + +namespace Ui +{ +class MockLinkConfiguration; +} + +class MockLinkConfiguration : public QWidget +{ + Q_OBJECT +public: + explicit MockLinkConfiguration(MockConfiguration *config, QWidget *parent = 0); + ~MockLinkConfiguration(); + +private slots: + void _px4RadioClicked(bool checked); + void _apmRadioClicked(bool checked); + void _genericRadioClicked(bool checked); + +private: + Ui::MockLinkConfiguration* _ui; + MockConfiguration* _config; +}; + +#endif // MockLinkConfiguration_H diff --git a/src/ui/MockLinkConfiguration.ui b/src/ui/MockLinkConfiguration.ui new file mode 100644 index 0000000..d54fbb0 --- /dev/null +++ b/src/ui/MockLinkConfiguration.ui @@ -0,0 +1,42 @@ + + + MockLinkConfiguration + + + + 0 + 0 + 187 + 116 + + + + Form + + + + + + PX4 Firmware + + + + + + + APM Firmware + + + + + + + Generic Firmware + + + + + + + + diff --git a/src/ui/QGCCommConfiguration.cc b/src/ui/QGCCommConfiguration.cc index bc32198..53f167f 100644 --- a/src/ui/QGCCommConfiguration.cc +++ b/src/ui/QGCCommConfiguration.cc @@ -36,6 +36,7 @@ This file is part of the QGROUNDCONTROL project #endif #include "QGCUDPLinkConfiguration.h" #include "QGCTCPLinkConfiguration.h" +#include "MockLinkConfiguration.h" #include "LogReplayLinkConfigurationWidget.h" #include "QGCCommConfiguration.h" #include "ui_QGCCommConfiguration.h" @@ -151,7 +152,8 @@ void QGCCommConfiguration::_loadTypeConfigWidget(int type) break; #ifdef QT_DEBUG case LinkConfiguration::TypeMock: { - _ui->linkScrollArea->setWidget(NULL); + QWidget* conf = new MockLinkConfiguration((MockConfiguration*)_config, this); + _ui->linkScrollArea->setWidget(conf); _ui->linkGroupBox->setTitle(tr("Mock Link")); _ui->typeCombo->setCurrentIndex(_ui->typeCombo->findData(LinkConfiguration::TypeMock)); } From 2470a6217eb5a9c5976404594bf9c1a600ffbacb Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 18 Oct 2015 13:13:00 -0700 Subject: [PATCH 2/4] Fix settings bug --- src/QGCApplication.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index e3e6fba..c9370a7 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -378,6 +378,8 @@ void QGCApplication::_initCommon(void) } else if (settings.allKeys().count()) { // Settings version key is missing and there are settings. This is an upgrade scenario. settingsUpgraded = true; + } else { + settings.setValue(_settingsVersionKey, QGC_SETTINGS_VERSION); } if (settingsUpgraded) { From a8a30ba1e76780bf247dd7dfe90f35e01dc24b72 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 18 Oct 2015 13:13:20 -0700 Subject: [PATCH 3/4] Better visuals on no connected, and connected no components --- src/VehicleSetup/SetupView.qml | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/VehicleSetup/SetupView.qml b/src/VehicleSetup/SetupView.qml index cc039b6..5744217 100644 --- a/src/VehicleSetup/SetupView.qml +++ b/src/VehicleSetup/SetupView.qml @@ -53,7 +53,11 @@ Item { function showSummaryPanel() { if (_fullParameterVehicleAvailable) { - panelLoader.source = "VehicleSummary.qml"; + if (multiVehicleManager.activeVehicle.autopilot.vehicleComponents.length == 0) { + panelLoader.sourceComponent = noComponentsVehicleSummaryComponent + } else { + panelLoader.source = "VehicleSummary.qml"; + } } else if (multiVehicleManager.parameterReadyVehicleAvailable) { panelLoader.sourceComponent = missingParametersVehicleSummaryComponent } else { @@ -115,7 +119,7 @@ Item { } Component { - id: disconnectedVehicleSummaryComponent + id: noComponentsVehicleSummaryComponent Rectangle { color: qgcPal.windowShade @@ -127,11 +131,8 @@ Item { horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap font.pixelSize: ScreenTools.mediumFontPixelSize - text: "Welcome to QGroundControl. " + - "QGroundControl supports any mavlink enabled vehicle. " + - "If you are using the PX4 Flight Stack, you also get full support for setting up and calibrating your vehicle. "+ - "Otherwise you will only get support for flying a vehicle which has been setup and calibrated using other means. " + - "Use the Connect button above to connect to your vehicle." + text: "QGroundControl does not currently support setup of your vehicle type. " + + "If your vehicle is already configured you can still Fly." onLinkActivated: Qt.openUrlExternally(link) } @@ -139,6 +140,25 @@ Item { } Component { + id: disconnectedVehicleSummaryComponent + + Rectangle { + color: qgcPal.windowShade + + QGCLabel { + anchors.margins: _defaultTextWidth * 2 + anchors.fill: parent + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + font.pixelSize: ScreenTools.largeFontPixelSize + text: "Click Connect on the top right to Fly. Click Firmware on the left to upgrade your vehicle." + + onLinkActivated: Qt.openUrlExternally(link) + } + } + } + Component { id: missingParametersVehicleSummaryComponent Rectangle { @@ -218,6 +238,7 @@ Item { width: _buttonWidth imageResource: "/qmlimages/VehicleSummaryIcon.png" setupIndicator: false + checked: true exclusiveGroup: setupButtonGroup text: "SUMMARY" From d24af505d1c857fe178f4916f0a1a267fa3ccd94 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 18 Oct 2015 13:13:35 -0700 Subject: [PATCH 4/4] Fix drag altitude bug --- src/MissionEditor/MissionEditor.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml index 10c6fb7..c7bb64b 100644 --- a/src/MissionEditor/MissionEditor.qml +++ b/src/MissionEditor/MissionEditor.qml @@ -206,7 +206,9 @@ QGCView { onDragActiveChanged: { if (!drag.active) { var point = Qt.point(itemEditor.x + (itemEditor.width / 2), itemEditor.y + (itemEditor.height / 2)) - itemEditor.missionItem.coordinate = editorMap.toCoordinate(point) + var coordinate = editorMap.toCoordinate(point) + coordinate.altitude = itemEditor.missionItem.coordinate.altitude + itemEditor.missionItem.coordinate = coordinate } } }