From 9293f6b42acf96c002722bd88504855eb2549528 Mon Sep 17 00:00:00 2001 From: Holden Date: Sat, 27 Apr 2024 16:22:22 -0400 Subject: [PATCH] Correct NO_SERIAL_LINK Checks --- CMakeLists.txt | 2 + android/src/AndroidInterface.cc | 2 +- src/FactSystem/CMakeLists.txt | 2 +- src/GPS/CMakeLists.txt | 107 ++++--- src/Joystick/CMakeLists.txt | 2 +- src/MissionManager/CMakeLists.txt | 1 + src/MissionManager/VisualMissionItem.h | 1 - src/PositionManager/CMakeLists.txt | 1 + src/QGCApplication.cc | 13 +- src/QGCToolbox.cc | 6 +- src/QGCToolbox.h | 4 +- src/QmlControls/QGroundControlQmlGlobal.cc | 4 +- src/QmlControls/QGroundControlQmlGlobal.h | 6 + src/VehicleSetup/CMakeLists.txt | 30 +- src/comm/CMakeLists.txt | 28 +- src/comm/LinkManager.cc | 347 ++++++++++----------- src/comm/LinkManager.h | 67 ++-- src/comm/QGCSerialPortInfo.cc | 7 +- src/comm/QGCSerialPortInfo.h | 1 - src/comm/SerialLink.cc | 3 +- src/comm/SerialLink.h | 1 - src/main.cc | 22 +- 22 files changed, 310 insertions(+), 347 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b530ba07546..a7175c3e5b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,6 +191,8 @@ if(QGC_DEBUG_QML) add_compile_definitions(QT_QML_DEBUG) endif() +cmake_dependent_option(QGC_NO_SERIAL_LINK "Build QGroundControl without Serial Support Support." OFF "NOT IOS" ON) + ####################################################### # QGroundControl Resources ####################################################### diff --git a/android/src/AndroidInterface.cc b/android/src/AndroidInterface.cc index c19089b2b66..f5a8d16a925 100644 --- a/android/src/AndroidInterface.cc +++ b/android/src/AndroidInterface.cc @@ -9,7 +9,7 @@ #include "AndroidInterface.h" -#include +#include #include bool AndroidInterface::checkStoragePermissions() diff --git a/src/FactSystem/CMakeLists.txt b/src/FactSystem/CMakeLists.txt index a52f325613e..fdb7790bf7b 100644 --- a/src/FactSystem/CMakeLists.txt +++ b/src/FactSystem/CMakeLists.txt @@ -24,7 +24,6 @@ target_link_libraries(FactSystem Qt6::Qml api AutoPilotPlugins - comm FactControls FirmwarePlugin Settings @@ -33,6 +32,7 @@ target_link_libraries(FactSystem VehicleComponents PUBLIC Qt6::Core + comm qgc ) diff --git a/src/GPS/CMakeLists.txt b/src/GPS/CMakeLists.txt index f2e6fee4df7..6c612145287 100644 --- a/src/GPS/CMakeLists.txt +++ b/src/GPS/CMakeLists.txt @@ -1,56 +1,61 @@ find_package(Qt6 REQUIRED COMPONENTS Core) -# include(FetchContent) -# FetchContent_Declare(gps_drivers -# GIT_REPOSITORY https://github.com/PX4/PX4-GPSDrivers.git -# GIT_TAG main -# GIT_SHALLOW TRUE -# ) -# FetchContent_GetProperties(gps_drivers) -# if(NOT gps_drivers_POPULATED) -# FetchContent_Populate(gps_drivers) -# add_subdirectory(${gps_drivers_SOURCE_DIR} ${gps_drivers_BINARY_DIR} EXCLUDE_FROM_ALL) -# endif() +qt_add_library(gps STATIC) -qt_add_library(gps STATIC - definitions.h - Drivers/src/ashtech.cpp - Drivers/src/ashtech.h - Drivers/src/gps_helper.cpp - Drivers/src/gps_helper.h - Drivers/src/mtk.cpp - Drivers/src/mtk.h - Drivers/src/rtcm.cpp - Drivers/src/rtcm.h - Drivers/src/sbf.cpp - Drivers/src/sbf.h - Drivers/src/ubx.cpp - Drivers/src/ubx.h - GPSManager.cc - GPSManager.h - GPSPositionMessage.h - GPSProvider.cc - GPSProvider.h - RTCMMavlink.cc - RTCMMavlink.h - satellite_info.h - sensor_gnss_relative.h - sensor_gps.h -) +if(NOT QGC_NO_SERIAL_LINK) + # include(FetchContent) + # FetchContent_Declare(gps_drivers + # GIT_REPOSITORY https://github.com/PX4/PX4-GPSDrivers.git + # GIT_TAG main + # GIT_SHALLOW TRUE + # ) + # FetchContent_GetProperties(gps_drivers) + # if(NOT gps_drivers_POPULATED) + # FetchContent_Populate(gps_drivers) + # add_subdirectory(${gps_drivers_SOURCE_DIR} ${gps_drivers_BINARY_DIR} EXCLUDE_FROM_ALL) + # endif() -target_link_libraries(gps - PRIVATE - comm - Settings - Utilities - Vehicle - PUBLIC - Qt6::Core - qgc -) + target_sources(gps + PRIVATE + definitions.h + Drivers/src/ashtech.cpp + Drivers/src/ashtech.h + Drivers/src/gps_helper.cpp + Drivers/src/gps_helper.h + Drivers/src/mtk.cpp + Drivers/src/mtk.h + Drivers/src/rtcm.cpp + Drivers/src/rtcm.h + Drivers/src/sbf.cpp + Drivers/src/sbf.h + Drivers/src/ubx.cpp + Drivers/src/ubx.h + GPSManager.cc + GPSManager.h + GPSPositionMessage.h + GPSProvider.cc + GPSProvider.h + RTCMMavlink.cc + RTCMMavlink.h + satellite_info.h + sensor_gnss_relative.h + sensor_gps.h + ) -target_include_directories(gps - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR} - Drivers/src -) + target_link_libraries(gps + PRIVATE + Settings + Utilities + Vehicle + PUBLIC + Qt6::Core + comm + qgc + ) + + target_include_directories(gps + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + Drivers/src + ) +endif() diff --git a/src/Joystick/CMakeLists.txt b/src/Joystick/CMakeLists.txt index 827680446b1..5ad110ce144 100644 --- a/src/Joystick/CMakeLists.txt +++ b/src/Joystick/CMakeLists.txt @@ -54,7 +54,6 @@ target_link_libraries(Joystick AutoPilotPlugins Camera FirmwarePlugin - qgc Settings Utilities Vehicle @@ -62,6 +61,7 @@ target_link_libraries(Joystick PUBLIC Qt6::Core comm + qgc QmlControls ) diff --git a/src/MissionManager/CMakeLists.txt b/src/MissionManager/CMakeLists.txt index 7c10171b62b..be323b42b31 100644 --- a/src/MissionManager/CMakeLists.txt +++ b/src/MissionManager/CMakeLists.txt @@ -105,6 +105,7 @@ target_link_libraries(MissionManager Geo PUBLIC Qt6::Xml + comm qgc Settings UTMSP diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index 4a245f68ef2..91075bacfc2 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -18,7 +18,6 @@ #include "QGCMAVLink.h" #include "QmlObjectListModel.h" -#include "QmlObjectListModel.h" #include "Vehicle.h" #include "MissionController.h" diff --git a/src/PositionManager/CMakeLists.txt b/src/PositionManager/CMakeLists.txt index 75702e06c1d..c3e84c5c0a7 100644 --- a/src/PositionManager/CMakeLists.txt +++ b/src/PositionManager/CMakeLists.txt @@ -9,6 +9,7 @@ qt_add_library(PositionManager STATIC target_link_libraries(PositionManager PRIVATE + Qt6::PositioningPrivate api Vehicle PUBLIC diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 3023c17bef6..3e5cc1935e9 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -110,16 +110,13 @@ #include "Viewer3DTerrainTexture.h" #include "LinkConfiguration.h" -#ifndef __mobile__ -#include "FirmwareUpgradeController.h" -#endif - #ifndef NO_SERIAL_LINK +#include "FirmwareUpgradeController.h" #include "SerialLink.h" #endif #ifdef Q_OS_LINUX -#ifndef __mobile__ +#ifndef Q_OS_ANDROID #include #include #endif @@ -185,7 +182,7 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) _msecsElapsedTime.start(); #ifdef Q_OS_LINUX -#ifndef __mobile__ +#ifndef Q_OS_ANDROID if (!_runningUnitTests) { if (getuid() == 0) { _exitWithError(QString( @@ -486,10 +483,8 @@ void QGCApplication::_initCommon() qmlRegisterType ("QGroundControl.Controls", 1, 0, "ToolStripAction"); qmlRegisterType ("QGroundControl.Controls", 1, 0, "ToolStripActionList"); -#ifndef __mobile__ #ifndef NO_SERIAL_LINK qmlRegisterType (kQGCControllers, 1, 0, "FirmwareUpgradeController"); -#endif #endif qmlRegisterType (kQGCControllers, 1, 0, "GeoTagController"); qmlRegisterType (kQGCControllers, 1, 0, "MavlinkConsoleController"); @@ -543,7 +538,7 @@ bool QGCApplication::_initForNormalAppBoot() } #ifdef Q_OS_LINUX - #ifndef __mobile__ + #ifndef Q_OS_ANDROID #ifndef NO_SERIAL_LINK if (!_runningUnitTests) { // Determine if we have the correct permissions to access USB serial devices diff --git a/src/QGCToolbox.cc b/src/QGCToolbox.cc index a306b039c0b..b43c9880e36 100644 --- a/src/QGCToolbox.cc +++ b/src/QGCToolbox.cc @@ -10,7 +10,7 @@ #include "FactSystem.h" #include "FirmwarePluginManager.h" -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK #include "GPSManager.h" #endif #include "JoystickManager.h" @@ -64,7 +64,7 @@ QGCToolbox::QGCToolbox(QGCApplication* app) _scanAndLoadPlugins(app); _factSystem = new FactSystem (app, this); _firmwarePluginManager = new FirmwarePluginManager (app, this); -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK _gpsManager = new GPSManager (app, this); #endif _imageProvider = new QGCImageProvider (app, this); @@ -99,7 +99,7 @@ void QGCToolbox::setChildToolboxes(void) _corePlugin->setToolbox(this); _factSystem->setToolbox(this); _firmwarePluginManager->setToolbox(this); -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK _gpsManager->setToolbox(this); #endif _imageProvider->setToolbox(this); diff --git a/src/QGCToolbox.h b/src/QGCToolbox.h index 37657f1c6f7..f89e0810162 100644 --- a/src/QGCToolbox.h +++ b/src/QGCToolbox.h @@ -62,7 +62,7 @@ class QGCToolbox : public QObject { QGCCorePlugin* corePlugin () { return _corePlugin; } SettingsManager* settingsManager () { return _settingsManager; } ADSBVehicleManager* adsbVehicleManager () { return _adsbVehicleManager; } -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK GPSManager* gpsManager () { return _gpsManager; } #endif #ifndef QGC_AIRLINK_DISABLED @@ -79,7 +79,7 @@ class QGCToolbox : public QObject { FactSystem* _factSystem = nullptr; FirmwarePluginManager* _firmwarePluginManager = nullptr; -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK GPSManager* _gpsManager = nullptr; #endif QGCImageProvider* _imageProvider = nullptr; diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 700c8740165..2695c4339c1 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -14,7 +14,7 @@ #include "QGCMapUrlEngine.h" #include "FirmwarePluginManager.h" #include "AppSettings.h" -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK #include "GPSManager.h" #endif #include "QGCPalette.h" @@ -86,7 +86,7 @@ void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) _corePlugin = toolbox->corePlugin(); _firmwarePluginManager = toolbox->firmwarePluginManager(); _settingsManager = toolbox->settingsManager(); -#ifndef __mobile__ +#ifndef NO_SERIAL_LINK _gpsRtkFactGroup = toolbox->gpsManager()->gpsRtkFactGroup(); #endif _adsbVehicleManager = toolbox->adsbVehicleManager(); diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index 036533ced0b..3520b4cd036 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -80,7 +80,9 @@ class QGroundControlQmlGlobal : public QGCTool Q_PROPERTY(ADSBVehicleManager* adsbVehicleManager READ adsbVehicleManager CONSTANT) Q_PROPERTY(QGCCorePlugin* corePlugin READ corePlugin CONSTANT) Q_PROPERTY(MissionCommandTree* missionCommandTree READ missionCommandTree CONSTANT) +#ifndef NO_SERIAL_LINK Q_PROPERTY(FactGroup* gpsRtk READ gpsRtkFactGroup CONSTANT) +#endif #ifndef QGC_AIRLINK_DISABLED Q_PROPERTY(AirLinkManager* airlinkManager READ airlinkManager CONSTANT) #endif @@ -173,7 +175,9 @@ class QGroundControlQmlGlobal : public QGCTool MAVLinkLogManager* mavlinkLogManager () { return _mavlinkLogManager; } QGCCorePlugin* corePlugin () { return _corePlugin; } SettingsManager* settingsManager () { return _settingsManager; } +#ifndef NO_SERIAL_LINK FactGroup* gpsRtkFactGroup () { return _gpsRtkFactGroup; } +#endif ADSBVehicleManager* adsbVehicleManager () { return _adsbVehicleManager; } QmlUnitsConversion* unitsConversion () { return &_unitsConversion; } static QGeoCoordinate flightMapPosition () { return _coord; } @@ -262,7 +266,9 @@ class QGroundControlQmlGlobal : public QGCTool QGCCorePlugin* _corePlugin = nullptr; FirmwarePluginManager* _firmwarePluginManager = nullptr; SettingsManager* _settingsManager = nullptr; +#ifndef NO_SERIAL_LINK FactGroup* _gpsRtkFactGroup = nullptr; +#endif AirLinkManager* _airlinkManager = nullptr; ADSBVehicleManager* _adsbVehicleManager = nullptr; QGCPalette* _globalPalette = nullptr; diff --git a/src/VehicleSetup/CMakeLists.txt b/src/VehicleSetup/CMakeLists.txt index 0cb1f93d56a..f94f54b7350 100644 --- a/src/VehicleSetup/CMakeLists.txt +++ b/src/VehicleSetup/CMakeLists.txt @@ -1,23 +1,14 @@ find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick) qt_add_library(VehicleSetup STATIC - Bootloader.cc - Bootloader.h - FirmwareImage.cc - FirmwareImage.h - FirmwareUpgradeController.cc - FirmwareUpgradeController.h JoystickConfigController.cc JoystickConfigController.h - PX4FirmwareUpgradeThread.cc - PX4FirmwareUpgradeThread.h VehicleComponent.cc VehicleComponent.h ) add_custom_target(VehicleSetupQml SOURCES - FirmwareUpgrade.qml JoystickConfig.qml JoystickConfigAdvanced.qml JoystickConfigButtons.qml @@ -51,3 +42,24 @@ target_link_libraries(VehicleSetup ) target_include_directories(VehicleSetup PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +if(NOT QGC_NO_SERIAL_LINK) + target_sources(VehicleSetup + PRIVATE + Bootloader.cc + Bootloader.h + FirmwareImage.cc + FirmwareImage.h + FirmwareUpgradeController.cc + FirmwareUpgradeController.h + PX4FirmwareUpgradeThread.cc + PX4FirmwareUpgradeThread.h + ) + + target_link_libraries(VehicleSetup PUBLIC comm) + + target_sources(VehicleSetupQml + PRIVATE + FirmwareUpgrade.qml + ) +endif() diff --git a/src/comm/CMakeLists.txt b/src/comm/CMakeLists.txt index 66fc324a488..9786545b411 100644 --- a/src/comm/CMakeLists.txt +++ b/src/comm/CMakeLists.txt @@ -40,27 +40,11 @@ target_link_libraries(comm Utilities ) -if(NOT MOBILE) - target_link_libraries(comm - PRIVATE - gps - PositionManager - ) -endif() - target_include_directories(comm PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -option(QGC_NO_SERIAL_LINK "Disable Serial Links" OFF) if(QGC_NO_SERIAL_LINK) target_compile_definitions(comm PUBLIC NO_SERIAL_LINK) else() - if(ANDROID) - add_subdirectory(${CMAKE_SOURCE_DIR}/libs/qtandroidserialport qtandroidserialport.build) - target_link_libraries(comm PUBLIC qtandroidserialport) - else() - find_package(Qt6 REQUIRED COMPONENTS SerialPort) - target_link_libraries(comm PUBLIC Qt6::SerialPort) - endif() target_sources(comm PRIVATE QGCSerialPortInfo.cc @@ -68,6 +52,18 @@ else() SerialLink.cc SerialLink.h ) + target_link_libraries(comm + PRIVATE + gps + PositionManager + ) + if(ANDROID) + add_subdirectory(${CMAKE_SOURCE_DIR}/libs/qtandroidserialport qtandroidserialport.build) + target_link_libraries(comm PUBLIC qtandroidserialport) + else() + find_package(Qt6 REQUIRED COMPONENTS SerialPort) + target_link_libraries(comm PUBLIC Qt6::SerialPort) + endif() endif() # option(QGC_NO_SERIAL_LINK "Enable Bluetooth Links" ON) diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index 6f7852f6d4f..bc9fb53c8f0 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -21,9 +21,9 @@ #include "BluetoothLink.h" #endif -#ifndef __mobile__ -#include "GPSManager.h" #include "PositionManager.h" +#ifndef NO_SERIAL_LINK +#include "GPSManager.h" #endif #ifdef QT_DEBUG @@ -75,11 +75,9 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox) , _mavlinkChannelsUsedBitMask(1) // We never use channel 0 to avoid sequence numbering problems , _autoConnectSettings(nullptr) , _mavlinkProtocol(nullptr) - #ifndef __mobile__ #ifndef NO_SERIAL_LINK , _nmeaPort(nullptr) #endif - #endif { qmlRegisterUncreatableType ("QGroundControl", 1, 0, "LinkManager", "Reference only"); qmlRegisterUncreatableType ("QGroundControl", 1, 0, "LinkConfiguration", "Reference only"); @@ -88,11 +86,9 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox) LinkManager::~LinkManager() { -#ifndef __mobile__ #ifndef NO_SERIAL_LINK delete _nmeaPort; #endif -#endif } void LinkManager::setToolbox(QGCToolbox *toolbox) @@ -104,7 +100,6 @@ void LinkManager::setToolbox(QGCToolbox *toolbox) connect(&_portListTimer, &QTimer::timeout, this, &LinkManager::_updateAutoConnectLinks); _portListTimer.start(_autoconnectUpdateTimerMSecs); // timeout must be long enough to get past bootloader on second pass - } // This should only be used by Qml code @@ -384,24 +379,6 @@ void LinkManager::loadLinkConfigurationList() _configurationsLoaded = true; } -#ifndef NO_SERIAL_LINK -bool LinkManager::_portAlreadyConnected(const QString& portName) -{ - QString searchPort = portName.trimmed(); - - for (int i=0; i<_rgLinks.count(); i++) { - SharedLinkConfigurationPtr linkConfig = _rgLinks[i]->linkConfiguration(); - SerialConfiguration* serialConfig = qobject_cast(linkConfig.get()); - if (serialConfig) { - if (serialConfig->portName() == searchPort) { - return true; - } - } - } - return false; -} -#endif - void LinkManager::_addUDPAutoConnectLink(void) { if (_autoConnectSettings->autoConnectUDP()->rawValue().toBool()) { @@ -520,44 +497,6 @@ void LinkManager::_addZeroConfAutoConnectLink(void) } #endif -bool LinkManager::_allowAutoConnectToBoard(QGCSerialPortInfo::BoardType_t boardType) -{ - switch (boardType) { - case QGCSerialPortInfo::BoardTypePixhawk: - if (_autoConnectSettings->autoConnectPixhawk()->rawValue().toBool()) { - return true; - } - break; - case QGCSerialPortInfo::BoardTypePX4Flow: - if (_autoConnectSettings->autoConnectPX4Flow()->rawValue().toBool()) { - return true; - } - break; - case QGCSerialPortInfo::BoardTypeSiKRadio: - if (_autoConnectSettings->autoConnectSiKRadio()->rawValue().toBool()) { - return true; - } - break; - case QGCSerialPortInfo::BoardTypeOpenPilot: - if (_autoConnectSettings->autoConnectLibrePilot()->rawValue().toBool()) { - return true; - } - break; -#ifndef __mobile__ - case QGCSerialPortInfo::BoardTypeRTKGPS: - if (_autoConnectSettings->autoConnectRTKGPS()->rawValue().toBool() && !_toolbox->gpsManager()->connected()) { - return true; - } - break; -#endif - default: - qCWarning(LinkManagerLog) << "Internal error: Unknown board type" << boardType; - return false; - } - - return false; // Some compilers as too stupid to understand that all paths are covered -} - void LinkManager::_updateAutoConnectLinks(void) { if (_connectionsSuspended || qgcApp()->runningUnitTests()) { @@ -570,8 +509,6 @@ void LinkManager::_updateAutoConnectLinks(void) _addZeroConfAutoConnectLink(); #endif -#ifndef __mobile__ -#ifndef NO_SERIAL_LINK // check to see if nmea gps is configured for UDP input, if so, set it up to connect if (_autoConnectSettings->autoConnectNmeaPort()->cookedValueString() == "UDP Port") { if (_nmeaSocket.localPort() != _autoConnectSettings->nmeaUdpPort()->rawValue().toUInt() @@ -581,6 +518,7 @@ void LinkManager::_updateAutoConnectLinks(void) _nmeaSocket.bind(QHostAddress::AnyIPv4, _autoConnectSettings->nmeaUdpPort()->rawValue().toUInt()); _toolbox->qgcPositionManager()->setNmeaSourceDevice(&_nmeaSocket); } +#ifndef NO_SERIAL_LINK //close serial port if (_nmeaPort) { _nmeaPort->close(); @@ -588,11 +526,10 @@ void LinkManager::_updateAutoConnectLinks(void) _nmeaPort = nullptr; _nmeaDeviceName = ""; } +#endif } else { _nmeaSocket.close(); } -#endif -#endif #ifndef NO_SERIAL_LINK QStringList currentPorts; @@ -625,8 +562,6 @@ void LinkManager::_updateAutoConnectLinks(void) QGCSerialPortInfo::BoardType_t boardType; QString boardName; -#ifndef NO_SERIAL_LINK -#ifndef __mobile__ // check to see if nmea gps is configured for current Serial port, if so, set it up to connect if (portInfo.systemLocation().trimmed() == _autoConnectSettings->autoConnectNmeaPort()->cookedValueString()) { if (portInfo.systemLocation().trimmed() != _nmeaDeviceName) { @@ -647,78 +582,71 @@ void LinkManager::_updateAutoConnectLinks(void) _nmeaPort->setBaudRate(static_cast(_nmeaBaud)); qCDebug(LinkManagerLog) << "Configuring nmea baudrate" << _nmeaBaud; } - } else -#endif -#endif - if (portInfo.getBoardInfo(boardType, boardName)) { - // Should we be auto-connecting to this board type? - if (!_allowAutoConnectToBoard(boardType)) { - continue; - } + } else if (portInfo.getBoardInfo(boardType, boardName)) { + // Should we be auto-connecting to this board type? + if (!_allowAutoConnectToBoard(boardType)) { + continue; + } - if (portInfo.isBootloader()) { - // Don't connect to bootloader - qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation(); + if (portInfo.isBootloader()) { + // Don't connect to bootloader + qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation(); + continue; + } + if (_portAlreadyConnected(portInfo.systemLocation()) || _autoConnectRTKPort == portInfo.systemLocation()) { + qCDebug(LinkManagerVerboseLog) << "Skipping existing autoconnect" << portInfo.systemLocation(); + } else if (!_autoconnectPortWaitList.contains(portInfo.systemLocation())) { + // We don't connect to the port the first time we see it. The ability to correctly detect whether we + // are in the bootloader is flaky from a cross-platform standpoint. So by putting it on a wait list + // and only connect on the second pass we leave enough time for the board to boot up. + qCDebug(LinkManagerLog) << "Waiting for next autoconnect pass" << portInfo.systemLocation() << boardName; + _autoconnectPortWaitList[portInfo.systemLocation()] = 1; + } else if (++_autoconnectPortWaitList[portInfo.systemLocation()] * _autoconnectUpdateTimerMSecs > _autoconnectConnectDelayMSecs) { + SerialConfiguration* pSerialConfig = nullptr; + _autoconnectPortWaitList.remove(portInfo.systemLocation()); + switch (boardType) { + case QGCSerialPortInfo::BoardTypePixhawk: + pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); + pSerialConfig->setUsbDirect(true); + break; + case QGCSerialPortInfo::BoardTypePX4Flow: + pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); + break; + case QGCSerialPortInfo::BoardTypeSiKRadio: + pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); + break; + case QGCSerialPortInfo::BoardTypeOpenPilot: + pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); + break; + case QGCSerialPortInfo::BoardTypeRTKGPS: + qCDebug(LinkManagerLog) << "RTK GPS auto-connected" << portInfo.portName().trimmed(); + _autoConnectRTKPort = portInfo.systemLocation(); + _toolbox->gpsManager()->connectGPS(portInfo.systemLocation(), boardName); + break; + default: + qCWarning(LinkManagerLog) << "Internal error: Unknown board type" << boardType; continue; } - if (_portAlreadyConnected(portInfo.systemLocation()) || _autoConnectRTKPort == portInfo.systemLocation()) { - qCDebug(LinkManagerVerboseLog) << "Skipping existing autoconnect" << portInfo.systemLocation(); - } else if (!_autoconnectPortWaitList.contains(portInfo.systemLocation())) { - // We don't connect to the port the first time we see it. The ability to correctly detect whether we - // are in the bootloader is flaky from a cross-platform standpoint. So by putting it on a wait list - // and only connect on the second pass we leave enough time for the board to boot up. - qCDebug(LinkManagerLog) << "Waiting for next autoconnect pass" << portInfo.systemLocation() << boardName; - _autoconnectPortWaitList[portInfo.systemLocation()] = 1; - } else if (++_autoconnectPortWaitList[portInfo.systemLocation()] * _autoconnectUpdateTimerMSecs > _autoconnectConnectDelayMSecs) { - SerialConfiguration* pSerialConfig = nullptr; - _autoconnectPortWaitList.remove(portInfo.systemLocation()); - switch (boardType) { - case QGCSerialPortInfo::BoardTypePixhawk: - pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); - pSerialConfig->setUsbDirect(true); - break; - case QGCSerialPortInfo::BoardTypePX4Flow: - pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); - break; - case QGCSerialPortInfo::BoardTypeSiKRadio: - pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); - break; - case QGCSerialPortInfo::BoardTypeOpenPilot: - pSerialConfig = new SerialConfiguration(tr("%1 on %2 (AutoConnect)").arg(boardName).arg(portInfo.portName().trimmed())); - break; -#ifndef __mobile__ - case QGCSerialPortInfo::BoardTypeRTKGPS: - qCDebug(LinkManagerLog) << "RTK GPS auto-connected" << portInfo.portName().trimmed(); - _autoConnectRTKPort = portInfo.systemLocation(); - _toolbox->gpsManager()->connectGPS(portInfo.systemLocation(), boardName); - break; -#endif - default: - qCWarning(LinkManagerLog) << "Internal error: Unknown board type" << boardType; - continue; - } - if (pSerialConfig) { - qCDebug(LinkManagerLog) << "New auto-connect port added: " << pSerialConfig->name() << portInfo.systemLocation(); - pSerialConfig->setBaud (boardType == QGCSerialPortInfo::BoardTypeSiKRadio ? 57600 : 115200); - pSerialConfig->setDynamic (true); - pSerialConfig->setPortName (portInfo.systemLocation()); - pSerialConfig->setAutoConnect(true); - - SharedLinkConfigurationPtr sharedConfig(pSerialConfig); - createConnectedLink(sharedConfig, boardType == QGCSerialPortInfo::BoardTypePX4Flow); - } + if (pSerialConfig) { + qCDebug(LinkManagerLog) << "New auto-connect port added: " << pSerialConfig->name() << portInfo.systemLocation(); + pSerialConfig->setBaud (boardType == QGCSerialPortInfo::BoardTypeSiKRadio ? 57600 : 115200); + pSerialConfig->setDynamic (true); + pSerialConfig->setPortName (portInfo.systemLocation()); + pSerialConfig->setAutoConnect(true); + + SharedLinkConfigurationPtr sharedConfig(pSerialConfig); + createConnectedLink(sharedConfig, boardType == QGCSerialPortInfo::BoardTypePX4Flow); } } + } } -#ifndef __mobile__ // Check for RTK GPS connection gone if (!_autoConnectRTKPort.isEmpty() && !currentPorts.contains(_autoConnectRTKPort)) { qCDebug(LinkManagerLog) << "RTK GPS disconnected" << _autoConnectRTKPort; _toolbox->gpsManager()->disconnectGPS(); _autoConnectRTKPort.clear(); } -#endif #endif // NO_SERIAL_LINK } @@ -754,9 +682,7 @@ QStringList LinkManager::linkTypeStrings(void) const #ifndef QGC_AIRLINK_DISABLED list += tr("AirLink"); #endif -#ifndef __mobile__ list += tr("Log Replay"); -#endif if (list.size() != static_cast(LinkConfiguration::TypeLast)) { qWarning() << "Internal error"; } @@ -764,49 +690,6 @@ QStringList LinkManager::linkTypeStrings(void) const return list; } -void LinkManager::_updateSerialPorts() -{ - _commPortList.clear(); - _commPortDisplayList.clear(); -#ifndef NO_SERIAL_LINK - QList portList = QGCSerialPortInfo::availablePorts(); - for (const QGCSerialPortInfo &info: portList) - { - QString port = info.systemLocation().trimmed(); - _commPortList += port; - _commPortDisplayList += SerialConfiguration::cleanPortDisplayname(port); - } -#endif -} - -QStringList LinkManager::serialPortStrings(void) -{ - if(!_commPortDisplayList.size()) - { - _updateSerialPorts(); - } - return _commPortDisplayList; -} - -QStringList LinkManager::serialPorts(void) -{ - if(!_commPortList.size()) - { - _updateSerialPorts(); - } - return _commPortList; -} - -QStringList LinkManager::serialBaudRates(void) -{ -#ifdef NO_SERIAL_LINK - QStringList foo; - return foo; -#else - return SerialConfiguration::supportedBaudRates(); -#endif -} - bool LinkManager::endConfigurationEditing(LinkConfiguration* config, LinkConfiguration* editedConfig) { if (config && editedConfig) { @@ -965,27 +848,117 @@ LogReplayLink* LinkManager::startLogReplay(const QString& logFile) } } -bool LinkManager::_isSerialPortConnected(void) -{ -#ifndef NO_SERIAL_LINK - for (SharedLinkInterfacePtr link: _rgLinks) { - if (qobject_cast(link.get())) { - return true; - } - } -#endif - return false; -} - void LinkManager::_createDynamicForwardLink(const char* linkName, QString hostName) { UDPConfiguration* udpConfig = new UDPConfiguration(linkName); udpConfig->setDynamic(true); - + udpConfig->addHost(hostName); - + SharedLinkConfigurationPtr config = addConfiguration(udpConfig); createConnectedLink(config); qCDebug(LinkManagerLog) << "New dynamic MAVLink forwarding port added: " << linkName << " hostname: " << hostName; } + +#ifndef NO_SERIAL_LINK // Serial Only Functions + +bool LinkManager::_allowAutoConnectToBoard(QGCSerialPortInfo::BoardType_t boardType) +{ + switch (boardType) { + case QGCSerialPortInfo::BoardTypePixhawk: + if (_autoConnectSettings->autoConnectPixhawk()->rawValue().toBool()) { + return true; + } + break; + case QGCSerialPortInfo::BoardTypePX4Flow: + if (_autoConnectSettings->autoConnectPX4Flow()->rawValue().toBool()) { + return true; + } + break; + case QGCSerialPortInfo::BoardTypeSiKRadio: + if (_autoConnectSettings->autoConnectSiKRadio()->rawValue().toBool()) { + return true; + } + break; + case QGCSerialPortInfo::BoardTypeOpenPilot: + if (_autoConnectSettings->autoConnectLibrePilot()->rawValue().toBool()) { + return true; + } + break; + case QGCSerialPortInfo::BoardTypeRTKGPS: + if (_autoConnectSettings->autoConnectRTKGPS()->rawValue().toBool() && !_toolbox->gpsManager()->connected()) { + return true; + } + break; + default: + qCWarning(LinkManagerLog) << "Internal error: Unknown board type" << boardType; + return false; + } + + return false; // Some compilers as too stupid to understand that all paths are covered +} + +bool LinkManager::_portAlreadyConnected(const QString& portName) +{ + QString searchPort = portName.trimmed(); + + for (int i=0; i<_rgLinks.count(); i++) { + SharedLinkConfigurationPtr linkConfig = _rgLinks[i]->linkConfiguration(); + SerialConfiguration* serialConfig = qobject_cast(linkConfig.get()); + if (serialConfig) { + if (serialConfig->portName() == searchPort) { + return true; + } + } + } + return false; +} + +void LinkManager::_updateSerialPorts() +{ + _commPortList.clear(); + _commPortDisplayList.clear(); + QList portList = QGCSerialPortInfo::availablePorts(); + for (const QGCSerialPortInfo &info: portList) + { + QString port = info.systemLocation().trimmed(); + _commPortList += port; + _commPortDisplayList += SerialConfiguration::cleanPortDisplayname(port); + } +} + +QStringList LinkManager::serialPortStrings(void) +{ + if(!_commPortDisplayList.size()) + { + _updateSerialPorts(); + } + return _commPortDisplayList; +} + +QStringList LinkManager::serialPorts(void) +{ + if(!_commPortList.size()) + { + _updateSerialPorts(); + } + return _commPortList; +} + +QStringList LinkManager::serialBaudRates(void) +{ + return SerialConfiguration::supportedBaudRates(); +} + +bool LinkManager::_isSerialPortConnected(void) +{ + for (SharedLinkInterfacePtr link: _rgLinks) { + if (qobject_cast(link.get())) { + return true; + } + } + return false; +} + +#endif // NO_SERIAL_LINK diff --git a/src/comm/LinkManager.h b/src/comm/LinkManager.h index cd4371e5267..435682ed6ca 100644 --- a/src/comm/LinkManager.h +++ b/src/comm/LinkManager.h @@ -13,12 +13,9 @@ #include "LinkInterface.h" #include "QGCToolbox.h" #include "QmlObjectListModel.h" - +#include "UdpIODevice.h" #ifndef NO_SERIAL_LINK #include "QGCSerialPortInfo.h" - #ifndef __mobile__ - #include "UdpIODevice.h" - #endif #endif #include @@ -57,9 +54,6 @@ class LinkManager : public QGCTool Q_PROPERTY(bool isBluetoothAvailable READ isBluetoothAvailable CONSTANT) Q_PROPERTY(QmlObjectListModel* linkConfigurations READ _qmlLinkConfigurations CONSTANT) Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT) - Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT) - Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged) - Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged) Q_PROPERTY(bool mavlinkSupportForwardingEnabled READ mavlinkSupportForwardingEnabled NOTIFY mavlinkSupportForwardingEnabledChanged) /// Create/Edit Link Configuration @@ -82,9 +76,6 @@ class LinkManager : public QGCTool QList links (void) { return _rgLinks; } QStringList linkTypeStrings (void) const; - QStringList serialBaudRates (void); - QStringList serialPortStrings (void); - QStringList serialPorts (void); bool mavlinkSupportForwardingEnabled (void) { return _mavlinkSupportForwardingEnabled; } void loadLinkConfigurationList(); @@ -142,8 +133,6 @@ class LinkManager : public QGCTool static const char* settingsGroup; signals: - void commPortStringsChanged(); - void commPortsChanged(); void mavlinkSupportForwardingEnabledChanged(); private slots: @@ -153,19 +142,13 @@ private slots: QmlObjectListModel* _qmlLinkConfigurations (void) { return &_qmlConfigurations; } bool _connectionsSuspendedMsg (void); void _updateAutoConnectLinks (void); - void _updateSerialPorts (void); void _removeConfiguration (LinkConfiguration* config); void _addUDPAutoConnectLink (void); #ifdef QGC_ZEROCONF_ENABLED void _addZeroConfAutoConnectLink (void); #endif void _addMAVLinkForwardingLink (void); - bool _isSerialPortConnected (void); void _createDynamicForwardLink (const char* linkName, QString hostName); - bool _allowAutoConnectToBoard (QGCSerialPortInfo::BoardType_t boardType); -#ifndef NO_SERIAL_LINK - bool _portAlreadyConnected (const QString& portName); -#endif bool _configUpdateSuspended; ///< true: stop updating configuration list bool _configurationsLoaded; ///< true: Link configurations have been loaded @@ -179,26 +162,10 @@ private slots: QList _rgLinks; QList _rgLinkConfigs; - QString _autoConnectRTKPort; QmlObjectListModel _qmlConfigurations; - QMap _autoconnectPortWaitList; ///< key: QGCSerialPortInfo::systemLocation, value: wait count - QStringList _commPortList; - QStringList _commPortDisplayList; - -#ifndef NO_SERIAL_LINK - QList _activeLinkCheckList; ///< List of links we are waiting for a vehicle to show up on -#endif - - // NMEA GPS device for GCS position -#ifndef __mobile__ -#ifndef NO_SERIAL_LINK QString _nmeaDeviceName; - QSerialPort* _nmeaPort; - uint32_t _nmeaBaud; UdpIODevice _nmeaSocket; -#endif -#endif static const char* _defaultUDPLinkName; static const char* _mavlinkForwardingLinkName; @@ -207,5 +174,35 @@ private slots: static const int _autoconnectConnectDelayMSecs; bool _mavlinkSupportForwardingEnabled = false; -}; +#ifndef NO_SERIAL_LINK + +public: + Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT) + Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged) + Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged) + + QStringList serialBaudRates (void); + QStringList serialPortStrings (void); + QStringList serialPorts (void); +signals: + void commPortStringsChanged(); + void commPortsChanged(); + +private: + bool _isSerialPortConnected (void); + void _updateSerialPorts (void); + bool _allowAutoConnectToBoard (QGCSerialPortInfo::BoardType_t boardType); + bool _portAlreadyConnected (const QString& portName); + + QMap _autoconnectPortWaitList; ///< key: QGCSerialPortInfo::systemLocation, value: wait count + QStringList _commPortList; + QStringList _commPortDisplayList; + QString _autoConnectRTKPort; + QList _activeLinkCheckList; ///< List of links we are waiting for a vehicle to show up on + + QSerialPort* _nmeaPort; + uint32_t _nmeaBaud; + +#endif // NO_SERIAL_LINK +}; diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc index 950c419392f..e282704a25c 100644 --- a/src/comm/QGCSerialPortInfo.cc +++ b/src/comm/QGCSerialPortInfo.cc @@ -7,7 +7,6 @@ * ****************************************************************************/ - #include "QGCSerialPortInfo.h" #include "JsonHelper.h" #include "QGCLoggingCategory.h" @@ -46,7 +45,7 @@ QList QGCSerialPortInfo::_boardManufac QGCSerialPortInfo::QGCSerialPortInfo(void) : QSerialPortInfo() { - + qRegisterMetaType(); } QGCSerialPortInfo::QGCSerialPortInfo(const QSerialPort & port) : @@ -240,7 +239,7 @@ bool QGCSerialPortInfo::getBoardInfo(QGCSerialPortInfo::BoardType_t& boardType, const BoardRegExpFallback_t& boardFallback = _boardDescriptionFallbackList[i]; if (description().contains(QRegularExpression(boardFallback.regExp, QRegularExpression::CaseInsensitiveOption))) { -#ifndef __android +#ifndef Q_OS_ANDROID if (boardFallback.androidOnly) { continue; } @@ -255,7 +254,7 @@ bool QGCSerialPortInfo::getBoardInfo(QGCSerialPortInfo::BoardType_t& boardType, const BoardRegExpFallback_t& boardFallback = _boardManufacturerFallbackList[i]; if (manufacturer().contains(QRegularExpression(boardFallback.regExp, QRegularExpression::CaseInsensitiveOption))) { -#ifndef __android +#ifndef Q_OS_ANDROID if (boardFallback.androidOnly) { continue; } diff --git a/src/comm/QGCSerialPortInfo.h b/src/comm/QGCSerialPortInfo.h index 5f37be083e4..56d147d1ef2 100644 --- a/src/comm/QGCSerialPortInfo.h +++ b/src/comm/QGCSerialPortInfo.h @@ -92,4 +92,3 @@ class QGCSerialPortInfo : public QSerialPortInfo static QList _boardDescriptionFallbackList; static QList _boardManufacturerFallbackList; }; - diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index 2cbdc57bacd..129eebbe468 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -13,8 +13,6 @@ #include "QGCLoggingCategory.h" #ifdef Q_OS_ANDROID #include "LinkManager.h" -#endif -#ifdef Q_OS_ANDROID #include "qserialportinfo.h" #else #include @@ -29,6 +27,7 @@ SerialLink::SerialLink(SharedLinkConfigurationPtr& config, bool isPX4Flow) : LinkInterface(config, isPX4Flow) , _serialConfig(qobject_cast(config.get())) { + qRegisterMetaType(); qCDebug(SerialLinkLog) << "Create SerialLink portName:baud:flowControl:parity:dataButs:stopBits" << _serialConfig->portName() << _serialConfig->baud() << _serialConfig->flowControl() << _serialConfig->parity() << _serialConfig->dataBits() << _serialConfig->stopBits(); } diff --git a/src/comm/SerialLink.h b/src/comm/SerialLink.h index 41030046365..5a147df365a 100644 --- a/src/comm/SerialLink.h +++ b/src/comm/SerialLink.h @@ -145,4 +145,3 @@ private slots: SerialConfiguration* _serialConfig = nullptr; }; - diff --git a/src/main.cc b/src/main.cc index 44323e9197c..df930a57187 100644 --- a/src/main.cc +++ b/src/main.cc @@ -12,19 +12,13 @@ #include "AppMessages.h" #include "QGCMapEngine.h" #include "Vehicle.h" + #ifndef __mobile__ - #ifndef NO_SERIAL_LINK - #include - #endif - #include "QGCSerialPortInfo.h" #include "RunGuard.h" #endif #ifdef Q_OS_ANDROID #include "AndroidInterface.h" - #ifndef NO_SERIAL_LINK - #include "qserialport.h" - #endif #endif #ifdef UNITTEST_BUILD @@ -54,12 +48,6 @@ #undef main #endif -#ifndef __mobile__ -#ifndef NO_SERIAL_LINK - Q_DECLARE_METATYPE(QGCSerialPortInfo) -#endif -#endif - #ifdef Q_OS_WIN #include @@ -168,19 +156,11 @@ int main(int argc, char *argv[]) // that we use these types in signals, and without calling qRegisterMetaType we can't queue // these signals. In general we don't queue these signals, but we do what the warning says // anyway to silence the debug output. -#ifndef NO_SERIAL_LINK - qRegisterMetaType(); -#endif #ifdef QGC_ENABLE_BLUETOOTH qRegisterMetaType(); qRegisterMetaType(); #endif qRegisterMetaType(); -#ifndef __mobile__ -#ifndef NO_SERIAL_LINK - qRegisterMetaType(); -#endif -#endif qRegisterMetaType("Vehicle::MavCmdResultFailureCode_t");