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)