/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #include "QGroundControlQmlGlobal.h" #include "LinkManager.h" #include #include #include static const char* kQmlGlobalKeyName = "QGCQml"; const char* QGroundControlQmlGlobal::_flightMapPositionSettingsGroup = "FlightMapPosition"; const char* QGroundControlQmlGlobal::_flightMapPositionLatitudeSettingsKey = "Latitude"; const char* QGroundControlQmlGlobal::_flightMapPositionLongitudeSettingsKey = "Longitude"; const char* QGroundControlQmlGlobal::_flightMapZoomSettingsKey = "FlightMapZoom"; QGeoCoordinate QGroundControlQmlGlobal::_coord = QGeoCoordinate(0.0,0.0); double QGroundControlQmlGlobal::_zoom = 2; QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app, QGCToolbox* toolbox) : QGCTool (app, toolbox) { // We clear the parent on this object since we run into shutdown problems caused by hybrid qml app. Instead we let it leak on shutdown. setParent(nullptr); // Load last coordinates and zoom from config file QSettings settings; settings.beginGroup(_flightMapPositionSettingsGroup); _coord.setLatitude(settings.value(_flightMapPositionLatitudeSettingsKey, _coord.latitude()).toDouble()); _coord.setLongitude(settings.value(_flightMapPositionLongitudeSettingsKey, _coord.longitude()).toDouble()); _zoom = settings.value(_flightMapZoomSettingsKey, _zoom).toDouble(); } QGroundControlQmlGlobal::~QGroundControlQmlGlobal() { // Save last coordinates and zoom to config file QSettings settings; settings.beginGroup(_flightMapPositionSettingsGroup); settings.setValue(_flightMapPositionLatitudeSettingsKey, _coord.latitude()); settings.setValue(_flightMapPositionLongitudeSettingsKey, _coord.longitude()); settings.setValue(_flightMapZoomSettingsKey, _zoom); } void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) { QGCTool::setToolbox(toolbox); _linkManager = toolbox->linkManager(); _multiVehicleManager = toolbox->multiVehicleManager(); _mapEngineManager = toolbox->mapEngineManager(); _qgcPositionManager = toolbox->qgcPositionManager(); _missionCommandTree = toolbox->missionCommandTree(); _videoManager = toolbox->videoManager(); _mavlinkLogManager = toolbox->mavlinkLogManager(); _corePlugin = toolbox->corePlugin(); _firmwarePluginManager = toolbox->firmwarePluginManager(); _settingsManager = toolbox->settingsManager(); _gpsRtkFactGroup = qgcApp()->gpsRtkFactGroup(); _airspaceManager = toolbox->airspaceManager(); _adsbVehicleManager = toolbox->adsbVehicleManager(); _globalPalette = new QGCPalette(this); #if defined(QGC_ENABLE_PAIRING) _pairingManager = toolbox->pairingManager(); #endif #if defined(QGC_GST_TAISYNC_ENABLED) _taisyncManager = toolbox->taisyncManager(); #endif #if defined(QGC_GST_MICROHARD_ENABLED) _microhardManager = toolbox->microhardManager(); #endif } void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value) { QSettings settings; settings.beginGroup(kQmlGlobalKeyName); settings.setValue(key, value); } QString QGroundControlQmlGlobal::loadGlobalSetting (const QString& key, const QString& defaultValue) { QSettings settings; settings.beginGroup(kQmlGlobalKeyName); return settings.value(key, defaultValue).toString(); } void QGroundControlQmlGlobal::saveBoolGlobalSetting (const QString& key, bool value) { QSettings settings; settings.beginGroup(kQmlGlobalKeyName); settings.setValue(key, value); } bool QGroundControlQmlGlobal::loadBoolGlobalSetting (const QString& key, bool defaultValue) { QSettings settings; settings.beginGroup(kQmlGlobalKeyName); return settings.value(key, defaultValue).toBool(); } void QGroundControlQmlGlobal::startPX4MockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startPX4MockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::startGenericMockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startGenericMockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::startAPMArduCopterMockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startAPMArduCopterMockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::startAPMArduPlaneMockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startAPMArduPlaneMockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::startAPMArduSubMockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startAPMArduSubMockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::startAPMArduRoverMockLink(bool sendStatusText) { #ifdef QT_DEBUG MockLink::startAPMArduRoverMockLink(sendStatusText); #else Q_UNUSED(sendStatusText); #endif } void QGroundControlQmlGlobal::stopOneMockLink(void) { #ifdef QT_DEBUG QList sharedLinks = _toolbox->linkManager()->links(); for (int i=0; i(link); if (mockLink) { mockLink->disconnect(); return; } } #endif } void QGroundControlQmlGlobal::setIsVersionCheckEnabled(bool enable) { qgcApp()->toolbox()->mavlinkProtocol()->enableVersionCheck(enable); emit isVersionCheckEnabledChanged(enable); } void QGroundControlQmlGlobal::setMavlinkSystemID(int id) { qgcApp()->toolbox()->mavlinkProtocol()->setSystemId(id); emit mavlinkSystemIDChanged(id); } bool QGroundControlQmlGlobal::singleFirmwareSupport(void) { return _firmwarePluginManager->supportedFirmwareClasses().count() == 1; } bool QGroundControlQmlGlobal::singleVehicleSupport(void) { if (singleFirmwareSupport()) { return _firmwarePluginManager->supportedVehicleClasses(_firmwarePluginManager->supportedFirmwareClasses()[0]).count() == 1; } return false; } bool QGroundControlQmlGlobal::px4ProFirmwareSupported() { return _firmwarePluginManager->supportedFirmwareClasses().contains(QGCMAVLink::FirmwareClassPX4); } bool QGroundControlQmlGlobal::apmFirmwareSupported() { return _firmwarePluginManager->supportedFirmwareClasses().contains(QGCMAVLink::FirmwareClassArduPilot); } bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B) { QPointF intersectPoint; #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) auto intersect = QLineF(line1A, line1B).intersect(QLineF(line2A, line2B), &intersectPoint); #else auto intersect = QLineF(line1A, line1B).intersects(QLineF(line2A, line2B), &intersectPoint); #endif return intersect == QLineF::BoundedIntersection && intersectPoint != line1A && intersectPoint != line1B; } void QGroundControlQmlGlobal::setSkipSetupPage(bool skip) { if(_skipSetupPage != skip) { _skipSetupPage = skip; emit skipSetupPageChanged(); } } void QGroundControlQmlGlobal::setFlightMapPosition(QGeoCoordinate& coordinate) { if (coordinate != flightMapPosition()) { _coord.setLatitude(coordinate.latitude()); _coord.setLongitude(coordinate.longitude()); emit flightMapPositionChanged(coordinate); } } void QGroundControlQmlGlobal::setFlightMapZoom(double zoom) { if (zoom != flightMapZoom()) { _zoom = zoom; emit flightMapZoomChanged(zoom); } } QString QGroundControlQmlGlobal::qgcVersion(void) const { QString versionStr = qgcApp()->applicationVersion(); #ifdef __androidArm32__ versionStr += QStringLiteral(" %1").arg(tr("32 bit")); #elif __androidArm64__ versionStr += QStringLiteral(" %1").arg(tr("64 bit")); #endif return versionStr; } QString QGroundControlQmlGlobal::altitudeModeExtraUnits(AltitudeMode altMode) { switch (altMode) { case AltitudeModeNone: return QString(); case AltitudeModeRelative: // Showing (Rel) all the time ends up being too noisy return QString(); case AltitudeModeAbsolute: return tr("(AMSL)"); case AltitudeModeAboveTerrain: return tr("(Abv Terr)"); case AltitudeModeTerrainFrame: return tr("(TerrF)"); } // Should never get here but makes some compilers happy return QString(); } QString QGroundControlQmlGlobal::altitudeModeShortDescription(AltitudeMode altMode) { switch (altMode) { case AltitudeModeNone: return QString(); case AltitudeModeRelative: return tr("Relative To Launch"); case AltitudeModeAbsolute: return tr("Above Mean Sea Level"); case AltitudeModeAboveTerrain: return tr("Above Terrain"); case AltitudeModeTerrainFrame: return tr("Terrain Frame"); } // Should never get here but makes some compilers happy return QString(); }