diff --git a/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml b/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml index 2dcfddebea5f9592b8cd876e5796965fb594a5d3..5e5a5ae14c77563e10188573cc99b6e0895fd74f 100644 --- a/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml +++ b/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml @@ -8262,6 +8262,21 @@ is less than 50% of this value This parameter defines a rotational offset in degrees around the Z (Yaw) axis. It allows the user to fine tune the board offset in the event of misalignment. deg + + Serial Configuration for Lanbao PSK-CM8JL65-CC5 + Configure on which serial port to run Lanbao PSK-CM8JL65-CC5. + true + + Disabled + UART 6 + TELEM 1 + TELEM 2 + TELEM 3 + TELEM/SERIAL 4 + GPS 1 + GPS 2 + + SMBUS Smart battery driver (BQ40Z50) diff --git a/src/VehicleSetup/Bootloader.h b/src/VehicleSetup/Bootloader.h index 10a1b55ad75f4711d7c27c1a7e66eea5ccf13e89..d2d3c19ca6b96104fd9a2a5a61cd084c6040ec9e 100644 --- a/src/VehicleSetup/Bootloader.h +++ b/src/VehicleSetup/Bootloader.h @@ -74,6 +74,7 @@ public: static const int boardIDTAPV1 = 64; ///< TAP V1 board, as from USB PID static const int boardIDASCV1 = 65; ///< ASC V1 board, as from USB PID static const int boardIDCrazyflie2 = 12; ///< Crazyflie 2.0 board, as from USB PID + static const int boardIDOmnibusF4SD = 42; ///< Omnibus F4 SD, as from USB PID static const int boardIDNXPHliteV3 = 28; ///< NXPHliteV3 board, as from USB PID /// Simulated board id for V3 which is a V2 board which supports larger flash space diff --git a/src/VehicleSetup/FirmwareUpgradeController.cc b/src/VehicleSetup/FirmwareUpgradeController.cc index a6fa917f4d215cee20debe7298745140945ba99e..3d189f463e2a66192f5eca85b611a8556fc5a22f 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.cc +++ b/src/VehicleSetup/FirmwareUpgradeController.cc @@ -262,6 +262,12 @@ void FirmwareUpgradeController::_initFirmwareHash() { AutoPilotStackPX4, DeveloperFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/master/crazyflie_default.px4"}, }; + FirmwareToUrlElement_t rgOmnibusF4SDFirmwareArray[] = { + { AutoPilotStackPX4, StableFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/stable/omnibus_f4sd_default.px4"}, + { AutoPilotStackPX4, BetaFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/beta/omnibus_f4sd_default.px4"}, + { AutoPilotStackPX4, DeveloperFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/master/omnibus_f4sd_default.px4"}, + }; + /////////////////////////////// px4flow firmwares /////////////////////////////////////// FirmwareToUrlElement_t rgPX4FLowFirmwareArray[] = { { PX4FlowPX4, StableFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Flow/master/px4flow.px4" }, @@ -447,6 +453,12 @@ void FirmwareUpgradeController::_initFirmwareHash() _rgCrazyflie2Firmware.insert(FirmwareIdentifier(element.stackType, element.firmwareType, element.vehicleType), element.url); } + size = sizeof(rgOmnibusF4SDFirmwareArray)/sizeof(rgOmnibusF4SDFirmwareArray[0]); + for (int i = 0; i < size; i++) { + const FirmwareToUrlElement_t& element = rgOmnibusF4SDFirmwareArray[i]; + _rgOmnibusF4SDFirmware.insert(FirmwareIdentifier(element.stackType, element.firmwareType, element.vehicleType), element.url); + } + size = sizeof(rgPX4FLowFirmwareArray)/sizeof(rgPX4FLowFirmwareArray[0]); for (int i = 0; i < size; i++) { const FirmwareToUrlElement_t& element = rgPX4FLowFirmwareArray[i]; @@ -514,6 +526,9 @@ QHash* FirmwareUpgradeCo case Bootloader::boardIDCrazyflie2: rgFirmware = &_rgCrazyflie2Firmware; break; + case Bootloader::boardIDOmnibusF4SD: + rgFirmware = &_rgOmnibusF4SDFirmware; + break; case Bootloader::boardIDNXPHliteV3: rgFirmware = &_rgNXPHliteV3Firmware; break; diff --git a/src/VehicleSetup/FirmwareUpgradeController.h b/src/VehicleSetup/FirmwareUpgradeController.h index d4cc36d19a0e8f66ad0554333bc5826c65a63bea..3aaed12733850f1ac4571ef0410a1d6b947a69c6 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.h +++ b/src/VehicleSetup/FirmwareUpgradeController.h @@ -211,6 +211,7 @@ private: QHash _rgTAPV1Firmware; QHash _rgASCV1Firmware; QHash _rgCrazyflie2Firmware; + QHash _rgOmnibusF4SDFirmware; QHash _rgNXPHliteV3Firmware; QHash _rgPX4FLowFirmware; QHash _rg3DRRadioFirmware; diff --git a/src/VideoStreaming/VideoReceiver.cc b/src/VideoStreaming/VideoReceiver.cc index f7e52eb68578f39b5c5c24c7f855d508bb9bfaf6..ed750ce71e813ad1b49fa2848341646f9343e6f5 100644 --- a/src/VideoStreaming/VideoReceiver.cc +++ b/src/VideoStreaming/VideoReceiver.cc @@ -472,7 +472,7 @@ VideoReceiver::start() void VideoReceiver::stop() { - if(qgcApp()->runningUnitTests()) { + if(qgcApp() && qgcApp()->runningUnitTests()) { return; } #if defined(QGC_GST_STREAMING) diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc index eebaf95401cf429422a57a1113f4d008557e80f2..eeaa2678d986dc3ea8197af98667e065caf9ad8a 100644 --- a/src/api/QGCCorePlugin.cc +++ b/src/api/QGCCorePlugin.cc @@ -18,6 +18,10 @@ #include "VideoReceiver.h" #include "QGCLoggingCategory.h" +#if !defined(__mobile__) +#include "QGCQmlWidgetHolder.h" +#endif + #include #include @@ -324,3 +328,17 @@ QString QGCCorePlugin::stableVersionCheckFileUrl(void) const return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt"); #endif } + +#if !defined(__mobile__) +QGCQmlWidgetHolder* QGCCorePlugin::createMainQmlWidgetHolder(QLayout *mainLayout, QWidget* parent) +{ + QGCQmlWidgetHolder* pMainQmlWidgetHolder = new QGCQmlWidgetHolder(QString(), nullptr, parent); + mainLayout->addWidget(pMainQmlWidgetHolder); + pMainQmlWidgetHolder->setVisible(true); + QQmlEngine::setObjectOwnership(parent, QQmlEngine::CppOwnership); + pMainQmlWidgetHolder->setContextPropertyObject("controller", parent); + pMainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", AppMessages::getModel()); + pMainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml")); + return pMainQmlWidgetHolder; +} +#endif diff --git a/src/api/QGCCorePlugin.h b/src/api/QGCCorePlugin.h index a4812577ec933c2593e3647e866efb722b113ad0..c5ec1db8c06018f050abbe4fe3ae0a49ed3577f8 100644 --- a/src/api/QGCCorePlugin.h +++ b/src/api/QGCCorePlugin.h @@ -34,6 +34,12 @@ class QmlObjectListModel; class VideoReceiver; class PlanMasterController; +#if !defined(__mobile__) +class QLayout; +class QMainWindow; +class QGCQmlWidgetHolder; +#endif + class QGCCorePlugin : public QGCTool { Q_OBJECT @@ -102,6 +108,11 @@ public: /// Allows the plugin to override the creation of the root (native) window. virtual QQmlApplicationEngine* createRootWindow(QObject* parent); + /// Allows the plugin to have a chance to initialize the creation of the root (non native) window. +#if !defined(__mobile__) + virtual QGCQmlWidgetHolder* createMainQmlWidgetHolder(QLayout* mainLayout, QWidget *parent); +#endif + /// Allows the plugin to override the creation of VideoReceiver. virtual VideoReceiver* createVideoReceiver(QObject* parent); diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 1116629e60237f72481e74b31e23e430b8b4c3d5..f9e721e31455b213c5793696c836713bed65ff97 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -84,7 +84,7 @@ static const char *rgDockWidgetNames[] = { static const char* _visibleWidgetsKey = "VisibleWidgets"; #endif -static MainWindow* _instance = NULL; ///< @brief MainWindow singleton +static MainWindow* _instance = nullptr; ///< @brief MainWindow singleton MainWindow* MainWindow::_create() { @@ -106,10 +106,10 @@ void MainWindow::deleteInstance(void) /// by MainWindow::_create method. Hence no other code should have access to /// constructor. MainWindow::MainWindow() - : _mavlinkDecoder (NULL) + : _mavlinkDecoder (nullptr) , _lowPowerMode (false) , _showStatusBar (false) - , _mainQmlWidgetHolder (NULL) + , _mainQmlWidgetHolder (nullptr) , _forceClose (false) { _instance = this; @@ -138,21 +138,15 @@ MainWindow::MainWindow() _centralLayout->setContentsMargins(0, 0, 0, 0); centralWidget()->setLayout(_centralLayout); - _mainQmlWidgetHolder = new QGCQmlWidgetHolder(QString(), NULL, this); - _centralLayout->addWidget(_mainQmlWidgetHolder); - _mainQmlWidgetHolder->setVisible(true); - - QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); - _mainQmlWidgetHolder->setContextPropertyObject("controller", this); - _mainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", AppMessages::getModel()); - _mainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml")); + //-- Allow plugin to initialize main QML Widget + _mainQmlWidgetHolder = qgcApp()->toolbox()->corePlugin()->createMainQmlWidgetHolder(_centralLayout, this); // Image provider QQuickImageProvider* pImgProvider = dynamic_cast(qgcApp()->toolbox()->imageProvider()); _mainQmlWidgetHolder->getEngine()->addImageProvider(QStringLiteral("QGCImages"), pImgProvider); // Set dock options - setDockOptions(0); + setDockOptions(nullptr); // Setup corners setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); @@ -162,7 +156,7 @@ MainWindow::MainWindow() #endif #ifdef UNITTEST_BUILD - QAction* qmlTestAction = new QAction("Test QML palette and controls", NULL); + QAction* qmlTestAction = new QAction("Test QML palette and controls", nullptr); connect(qmlTestAction, &QAction::triggered, this, &MainWindow::_showQmlTestWidget); _ui.menuWidgets->addAction(qmlTestAction); #endif @@ -246,14 +240,14 @@ MainWindow::~MainWindow() _mavlinkDecoder->finish(); _mavlinkDecoder->wait(1000); _mavlinkDecoder->deleteLater(); - _mavlinkDecoder = NULL; + _mavlinkDecoder = nullptr; } // This needs to happen before we get into the QWidget dtor // otherwise the QML engine reads freed data and tries to // destroy MainWindow a second time. delete _mainQmlWidgetHolder; - _instance = NULL; + _instance = nullptr; } QString MainWindow::_getWindowGeometryKey() @@ -315,7 +309,7 @@ void MainWindow::_showDockWidget(const QString& name, bool show) /// Creates the specified inner dock widget and adds to the QDockWidget bool MainWindow::_createInnerDockWidget(const QString& widgetName) { - QGCDockWidget* widget = NULL; + QGCDockWidget* widget = nullptr; QAction *action = _mapName2Action[widgetName]; if(action) { switch(action->data().toInt()) { @@ -339,7 +333,7 @@ bool MainWindow::_createInnerDockWidget(const QString& widgetName) _mapName2DockWidget[widgetName] = widget; } } - return widget != NULL; + return widget != nullptr; } void MainWindow::_hideAllDockWidgets(void)