You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
9.4 KiB
308 lines
9.4 KiB
/**************************************************************************** |
|
* |
|
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
|
* |
|
* QGroundControl is licensed according to the terms in the file |
|
* COPYING.md in the root of the source code directory. |
|
* |
|
****************************************************************************/ |
|
|
|
|
|
/// @file |
|
/// @author Don Gagne <don@thegagnes.com> |
|
|
|
#include "QGroundControlQmlGlobal.h" |
|
|
|
#include <QSettings> |
|
#include <QLineF> |
|
#include <QPointF> |
|
|
|
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 |
|
LinkManager* linkManager = qgcApp()->toolbox()->linkManager(); |
|
|
|
for (int i=0; i<linkManager->links().count(); i++) { |
|
LinkInterface* link = linkManager->links()[i]; |
|
MockLink* mockLink = qobject_cast<MockLink*>(link); |
|
|
|
if (mockLink) { |
|
linkManager->disconnectLink(mockLink); |
|
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); |
|
} |
|
|
|
int QGroundControlQmlGlobal::supportedFirmwareCount() |
|
{ |
|
return _firmwarePluginManager->supportedFirmwareTypes().count(); |
|
} |
|
|
|
int QGroundControlQmlGlobal::supportedVehicleCount() |
|
{ |
|
int count = 0; |
|
QList<MAV_AUTOPILOT> list = _firmwarePluginManager->supportedFirmwareTypes(); |
|
foreach(auto firmware, list) { |
|
if(firmware != MAV_AUTOPILOT_GENERIC) { |
|
count += _firmwarePluginManager->supportedVehicleTypes(firmware).count(); |
|
} |
|
} |
|
return count; |
|
} |
|
|
|
bool QGroundControlQmlGlobal::px4ProFirmwareSupported() |
|
{ |
|
return _firmwarePluginManager->supportedFirmwareTypes().contains(MAV_AUTOPILOT_PX4); |
|
} |
|
|
|
bool QGroundControlQmlGlobal::apmFirmwareSupported() |
|
{ |
|
return _firmwarePluginManager->supportedFirmwareTypes().contains(MAV_AUTOPILOT_ARDUPILOTMEGA); |
|
} |
|
|
|
bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B) |
|
{ |
|
QPointF intersectPoint; |
|
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 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(); |
|
}
|
|
|