QGroundControlQmlGlobal.cc 9.25 KB
Newer Older
1 2
/****************************************************************************
 *
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
9

10
#include "QGroundControlQmlGlobal.h"
11
#include "LinkManager.h"
12 13

#include <QSettings>
Don Gagne's avatar
Don Gagne committed
14 15
#include <QLineF>
#include <QPointF>
16

Don Gagne's avatar
Don Gagne committed
17
static const char* kQmlGlobalKeyName = "QGCQml";
18

19 20 21 22 23
const char* QGroundControlQmlGlobal::_flightMapPositionSettingsGroup =          "FlightMapPosition";
const char* QGroundControlQmlGlobal::_flightMapPositionLatitudeSettingsKey =    "Latitude";
const char* QGroundControlQmlGlobal::_flightMapPositionLongitudeSettingsKey =   "Longitude";
const char* QGroundControlQmlGlobal::_flightMapZoomSettingsKey =                "FlightMapZoom";

24
QGeoCoordinate   QGroundControlQmlGlobal::_coord = QGeoCoordinate(0.0,0.0);
25
double           QGroundControlQmlGlobal::_zoom = 2;
26

27
QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app, QGCToolbox* toolbox)
28
    : QGCTool               (app, toolbox)
29
{
30
    // 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.
31
    setParent(nullptr);
32 33 34
    // Load last coordinates and zoom from config file
    QSettings settings;
    settings.beginGroup(_flightMapPositionSettingsGroup);
35 36 37
    _coord.setLatitude(settings.value(_flightMapPositionLatitudeSettingsKey,    _coord.latitude()).toDouble());
    _coord.setLongitude(settings.value(_flightMapPositionLongitudeSettingsKey,  _coord.longitude()).toDouble());
    _zoom = settings.value(_flightMapZoomSettingsKey, _zoom).toDouble();
38 39 40 41
}

QGroundControlQmlGlobal::~QGroundControlQmlGlobal()
{
42 43 44 45 46 47
    // 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);
48
}
49

50 51 52
void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox)
{
    QGCTool::setToolbox(toolbox);
53

dogmaphobic's avatar
dogmaphobic committed
54 55
    _linkManager            = toolbox->linkManager();
    _multiVehicleManager    = toolbox->multiVehicleManager();
Jimmy Johnson's avatar
Jimmy Johnson committed
56
    _mapEngineManager       = toolbox->mapEngineManager();
57 58
    _qgcPositionManager     = toolbox->qgcPositionManager();
    _missionCommandTree     = toolbox->missionCommandTree();
59
    _videoManager           = toolbox->videoManager();
Gus Grubba's avatar
Gus Grubba committed
60
    _mavlinkLogManager      = toolbox->mavlinkLogManager();
61
    _corePlugin             = toolbox->corePlugin();
Gus Grubba's avatar
Gus Grubba committed
62
    _firmwarePluginManager  = toolbox->firmwarePluginManager();
63
    _settingsManager        = toolbox->settingsManager();
64
    _gpsRtkFactGroup        = qgcApp()->gpsRtkFactGroup();
65
    _airspaceManager        = toolbox->airspaceManager();
66 67 68 69 70
    _adsbVehicleManager     = toolbox->adsbVehicleManager();
    _globalPalette          = new QGCPalette(this);
#if defined(QGC_ENABLE_PAIRING)
    _pairingManager         = toolbox->pairingManager();
#endif
71
#if defined(QGC_GST_TAISYNC_ENABLED)
72 73
    _taisyncManager         = toolbox->taisyncManager();
#endif
74 75 76
#if defined(QGC_GST_MICROHARD_ENABLED)
    _microhardManager       = toolbox->microhardManager();
#endif
77 78
}

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
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();
}
106 107 108 109

void QGroundControlQmlGlobal::startPX4MockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
110
    MockLink::startPX4MockLink(sendStatusText);
Don Gagne's avatar
Don Gagne committed
111 112
#else
    Q_UNUSED(sendStatusText);
113 114 115 116 117 118
#endif
}

void QGroundControlQmlGlobal::startGenericMockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
119
    MockLink::startGenericMockLink(sendStatusText);
Don Gagne's avatar
Don Gagne committed
120 121
#else
    Q_UNUSED(sendStatusText);
122 123 124 125 126 127
#endif
}

void QGroundControlQmlGlobal::startAPMArduCopterMockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
128
    MockLink::startAPMArduCopterMockLink(sendStatusText);
Don Gagne's avatar
Don Gagne committed
129 130
#else
    Q_UNUSED(sendStatusText);
131 132 133 134 135 136
#endif
}

void QGroundControlQmlGlobal::startAPMArduPlaneMockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
137
    MockLink::startAPMArduPlaneMockLink(sendStatusText);
Don Gagne's avatar
Don Gagne committed
138 139
#else
    Q_UNUSED(sendStatusText);
140 141 142
#endif
}

143 144 145 146 147 148 149 150 151
void QGroundControlQmlGlobal::startAPMArduSubMockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
    MockLink::startAPMArduSubMockLink(sendStatusText);
#else
    Q_UNUSED(sendStatusText);
#endif
}

152 153 154 155 156 157 158 159 160
void QGroundControlQmlGlobal::startAPMArduRoverMockLink(bool sendStatusText)
{
#ifdef QT_DEBUG
    MockLink::startAPMArduRoverMockLink(sendStatusText);
#else
    Q_UNUSED(sendStatusText);
#endif
}

Don Gagne's avatar
Don Gagne committed
161
void QGroundControlQmlGlobal::stopOneMockLink(void)
162 163
{
#ifdef QT_DEBUG
164
    QList<SharedLinkInterfacePtr> sharedLinks = _toolbox->linkManager()->links();
165

166 167
    for (int i=0; i<sharedLinks.count(); i++) {
        LinkInterface* link = sharedLinks[i].get();
168 169
        MockLink* mockLink = qobject_cast<MockLink*>(link);
        if (mockLink) {
170
            mockLink->disconnect();
Don Gagne's avatar
Don Gagne committed
171
            return;
172 173 174 175
        }
    }
#endif
}
176

Don Gagne's avatar
Don Gagne committed
177 178 179 180 181 182
void QGroundControlQmlGlobal::setIsVersionCheckEnabled(bool enable)
{
    qgcApp()->toolbox()->mavlinkProtocol()->enableVersionCheck(enable);
    emit isVersionCheckEnabledChanged(enable);
}

183 184 185 186 187 188
void QGroundControlQmlGlobal::setMavlinkSystemID(int id)
{
    qgcApp()->toolbox()->mavlinkProtocol()->setSystemId(id);
    emit mavlinkSystemIDChanged(id);
}

189 190 191 192 193 194
bool QGroundControlQmlGlobal::singleFirmwareSupport(void)
{
    return _firmwarePluginManager->supportedFirmwareClasses().count() == 1;
}

bool QGroundControlQmlGlobal::singleVehicleSupport(void)
Gus Grubba's avatar
Gus Grubba committed
195
{
196 197 198 199 200
    if (singleFirmwareSupport()) {
        return _firmwarePluginManager->supportedVehicleClasses(_firmwarePluginManager->supportedFirmwareClasses()[0]).count() == 1;
    }

    return false;
Gus Grubba's avatar
Gus Grubba committed
201 202
}

203 204
bool QGroundControlQmlGlobal::px4ProFirmwareSupported()
{
205
    return _firmwarePluginManager->supportedFirmwareClasses().contains(QGCMAVLink::FirmwareClassPX4);
206 207 208 209
}

bool QGroundControlQmlGlobal::apmFirmwareSupported()
{
210
    return _firmwarePluginManager->supportedFirmwareClasses().contains(QGCMAVLink::FirmwareClassArduPilot);
211
}
Gus Grubba's avatar
Gus Grubba committed
212

213 214 215 216
bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B)
{
    QPointF intersectPoint;

217 218 219 220 221 222 223
#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 &&
224 225
            intersectPoint != line1A && intersectPoint != line1B;
}
226 227 228 229 230 231 232 233

void QGroundControlQmlGlobal::setSkipSetupPage(bool skip)
{
    if(_skipSetupPage != skip) {
        _skipSetupPage = skip;
        emit skipSetupPageChanged();
    }
}
234 235 236 237

void QGroundControlQmlGlobal::setFlightMapPosition(QGeoCoordinate& coordinate)
{
    if (coordinate != flightMapPosition()) {
238 239
        _coord.setLatitude(coordinate.latitude());
        _coord.setLongitude(coordinate.longitude());
240 241 242 243 244 245 246 247

        emit flightMapPositionChanged(coordinate);
    }
}

void QGroundControlQmlGlobal::setFlightMapZoom(double zoom)
{
    if (zoom != flightMapZoom()) {
248
        _zoom = zoom;
249 250 251
        emit flightMapZoomChanged(zoom);
    }
}
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301

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();
}