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

10
#include "QGCApplication.h"
11 12
#include "QGCCorePlugin.h"
#include "QGCOptions.h"
13
#include "QmlComponentInfo.h"
14
#include "FactMetaData.h"
Don Gagne's avatar
Don Gagne committed
15
#include "SettingsManager.h"
16
#include "AppMessages.h"
17
#include "QmlObjectListModel.h"
18
#include "VideoManager.h"
19 20
#if defined(QGC_GST_STREAMING)
#include "GStreamer.h"
21
#include "VideoReceiver.h"
22
#endif
23
#include "QGCLoggingCategory.h"
24
#include "QGCCameraManager.h"
25 26
#include "HorizontalFactValueGrid.h"
#include "VerticalFactValueGrid.h"
27
#include "InstrumentValueData.h"
28 29 30 31 32 33

#include <QtQml>
#include <QQmlEngine>

/// @file
///     @brief Core Plugin Interface for QGroundControl - Default Implementation
Gus Grubba's avatar
Gus Grubba committed
34
///     @author Gus Grubba <gus@auterion.com>
35 36 37 38 39 40 41

class QGCCorePlugin_p
{
public:
    QGCCorePlugin_p()
    {
    }
42

43 44 45 46 47 48 49 50
    ~QGCCorePlugin_p()
    {
        if(pGeneral)
            delete pGeneral;
        if(pCommLinks)
            delete pCommLinks;
        if(pOfflineMaps)
            delete pOfflineMaps;
51 52 53 54
#if defined(QGC_GST_TAISYNC_ENABLED)
        if(pTaisync)
            delete pTaisync;
#endif
55 56 57 58
#if defined(QGC_GST_MICROHARD_ENABLED)
        if(pMicrohard)
            delete pMicrohard;
#endif
Gus Grubba's avatar
Gus Grubba committed
59
#if defined(QGC_AIRMAP_ENABLED)
Gus Grubba's avatar
Gus Grubba committed
60 61
        if(pAirmap)
            delete pAirmap;
Gus Grubba's avatar
Gus Grubba committed
62
#endif
63 64 65 66 67 68 69 70 71
        if(pMAVLink)
            delete pMAVLink;
        if(pConsole)
            delete pConsole;
#if defined(QT_DEBUG)
        if(pMockLink)
            delete pMockLink;
        if(pDebug)
            delete pDebug;
72 73
        if(pQmlTest)
            delete pQmlTest;
74 75 76 77
#endif
        if(defaultOptions)
            delete defaultOptions;
    }
78

79 80 81 82 83 84
    QmlComponentInfo* pGeneral                  = nullptr;
    QmlComponentInfo* pCommLinks                = nullptr;
    QmlComponentInfo* pOfflineMaps              = nullptr;
#if defined(QGC_GST_TAISYNC_ENABLED)
    QmlComponentInfo* pTaisync                  = nullptr;
#endif
85 86 87
#if defined(QGC_GST_MICROHARD_ENABLED)
    QmlComponentInfo* pMicrohard                = nullptr;
#endif
Gus Grubba's avatar
Gus Grubba committed
88
#if defined(QGC_AIRMAP_ENABLED)
89
    QmlComponentInfo* pAirmap                   = nullptr;
Gus Grubba's avatar
Gus Grubba committed
90
#endif
91 92 93
    QmlComponentInfo* pMAVLink                  = nullptr;
    QmlComponentInfo* pConsole                  = nullptr;
    QmlComponentInfo* pHelp                     = nullptr;
94
#if defined(QT_DEBUG)
95 96
    QmlComponentInfo* pMockLink                 = nullptr;
    QmlComponentInfo* pDebug                    = nullptr;
97
    QmlComponentInfo* pQmlTest                  = nullptr;
98
#endif
99

100 101 102 103 104 105
    QmlComponentInfo*   cameraPageWidgetInfo    = nullptr;
    QmlComponentInfo*   videoPageWidgetInfo     = nullptr;
    QmlComponentInfo*   vibrationPageWidgetInfo = nullptr;

    QGCOptions*         defaultOptions          = nullptr;
    QVariantList        settingsList;
106
    QVariantList        analyzeList;
107 108 109
    QVariantList        instrumentPageWidgetList;

    QmlObjectListModel _emptyCustomMapItems;
110 111 112 113 114 115 116 117 118
};

QGCCorePlugin::~QGCCorePlugin()
{
    if(_p) {
        delete _p;
    }
}

119 120
QGCCorePlugin::QGCCorePlugin(QGCApplication *app, QGCToolbox* toolbox)
    : QGCTool(app, toolbox)
121
    , _showTouchAreas(false)
122
    , _showAdvancedUI(true)
123
{
124
    QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
125 126 127 128 129
    _p = new QGCCorePlugin_p;
}

void QGCCorePlugin::setToolbox(QGCToolbox *toolbox)
{
DonLakeFlyer's avatar
DonLakeFlyer committed
130
    QGCTool::setToolbox(toolbox);
131 132 133 134 135

    qmlRegisterUncreatableType<QGCCorePlugin>       ("QGroundControl", 1, 0, "QGCCorePlugin",       "Reference only");
    qmlRegisterUncreatableType<QGCOptions>          ("QGroundControl", 1, 0, "QGCOptions",          "Reference only");
    qmlRegisterUncreatableType<QGCFlyViewOptions>   ("QGroundControl", 1, 0, "QGCFlyViewOptions",   "Reference only");

136 137 138 139 140 141 142 143 144 145 146 147
    //-- Handle Camera and Video Changes
    connect(toolbox->multiVehicleManager(), &MultiVehicleManager::activeVehicleChanged, this, &QGCCorePlugin::_activeVehicleChanged);
}

void QGCCorePlugin::_activeVehicleChanged(Vehicle* activeVehicle)
{
    if(activeVehicle != _activeVehicle) {
        if(_activeVehicle) {
            disconnect(_activeVehicle, &Vehicle::dynamicCamerasChanged, this, &QGCCorePlugin::_dynamicCamerasChanged);
        }
        if(_dynamicCameras) {
            disconnect(_dynamicCameras, &QGCCameraManager::currentCameraChanged, this, &QGCCorePlugin::_currentCameraChanged);
148
            _dynamicCameras = nullptr;
149 150
        }
        _activeVehicle = activeVehicle;
151 152 153
        if(_activeVehicle) {
            connect(_activeVehicle, &Vehicle::dynamicCamerasChanged, this, &QGCCorePlugin::_dynamicCamerasChanged);
        }
154 155 156 157 158
    }
}

void QGCCorePlugin::_dynamicCamerasChanged()
{
159 160 161 162
    if(_currentCamera) {
        disconnect(_currentCamera, &QGCCameraControl::autoStreamChanged, this, &QGCCorePlugin::_autoStreamChanged);
        _currentCamera = nullptr;
    }
163 164
    if(_activeVehicle) {
        _dynamicCameras = _activeVehicle->dynamicCameras();
165 166 167
        if(_dynamicCameras) {
            connect(_dynamicCameras, &QGCCameraManager::currentCameraChanged, this, &QGCCorePlugin::_currentCameraChanged);
        }
168 169 170 171
    }
}

void QGCCorePlugin::_currentCameraChanged()
172 173 174 175 176 177 178 179 180 181 182 183 184 185
{
    if(_dynamicCameras) {
        QGCCameraControl* cp = _dynamicCameras->currentCameraInstance();
        if(_currentCamera) {
            disconnect(_currentCamera, &QGCCameraControl::autoStreamChanged, this, &QGCCorePlugin::_autoStreamChanged);
        }
        if(_currentCamera != cp) {
            _currentCamera = cp;
            connect(_currentCamera, &QGCCameraControl::autoStreamChanged, this, &QGCCorePlugin::_autoStreamChanged);
        }
    }
}

void QGCCorePlugin::_autoStreamChanged()
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
{
    _resetInstrumentPages();
    emit instrumentPagesChanged();
}

void QGCCorePlugin::_resetInstrumentPages()
{
    if(_p->cameraPageWidgetInfo) {
        _p->cameraPageWidgetInfo->deleteLater();
        _p->cameraPageWidgetInfo = nullptr;
    }
#if defined(QGC_GST_STREAMING)
    if(_p->videoPageWidgetInfo) {
        _p->videoPageWidgetInfo->deleteLater();
        _p->videoPageWidgetInfo = nullptr;
    }
#endif
    if(_p->vibrationPageWidgetInfo) {
        _p->vibrationPageWidgetInfo->deleteLater();
        _p->vibrationPageWidgetInfo = nullptr;
    }
    _p->instrumentPageWidgetList.clear();
208 209
}

210
QVariantList &QGCCorePlugin::settingsPages()
211 212
{
    if(!_p->pGeneral) {
213
        _p->pGeneral = new QmlComponentInfo(tr("General"),
214 215
                                            QUrl::fromUserInput("qrc:/qml/GeneralSettings.qml"),
                                            QUrl::fromUserInput("qrc:/res/gear-white.svg"));
216
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pGeneral)));
217
        _p->pCommLinks = new QmlComponentInfo(tr("Comm Links"),
218 219
                                              QUrl::fromUserInput("qrc:/qml/LinkSettings.qml"),
                                              QUrl::fromUserInput("qrc:/res/waves.svg"));
220
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pCommLinks)));
221
        _p->pOfflineMaps = new QmlComponentInfo(tr("Offline Maps"),
222 223
                                                QUrl::fromUserInput("qrc:/qml/OfflineMap.qml"),
                                                QUrl::fromUserInput("qrc:/res/waves.svg"));
224
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pOfflineMaps)));
225 226
#if defined(QGC_GST_TAISYNC_ENABLED)
        _p->pTaisync = new QmlComponentInfo(tr("Taisync"),
227 228
                                            QUrl::fromUserInput("qrc:/qml/TaisyncSettings.qml"),
                                            QUrl::fromUserInput(""));
229 230
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pTaisync)));
#endif
231 232
#if defined(QGC_GST_MICROHARD_ENABLED)
        _p->pMicrohard = new QmlComponentInfo(tr("Microhard"),
233 234
                                              QUrl::fromUserInput("qrc:/qml/MicrohardSettings.qml"),
                                              QUrl::fromUserInput(""));
235 236
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pMicrohard)));
#endif
Gus Grubba's avatar
Gus Grubba committed
237
#if defined(QGC_AIRMAP_ENABLED)
Gus Grubba's avatar
Gus Grubba committed
238
        _p->pAirmap = new QmlComponentInfo(tr("AirMap"),
239 240
                                           QUrl::fromUserInput("qrc:/qml/AirmapSettings.qml"),
                                           QUrl::fromUserInput(""));
241
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pAirmap)));
Gus Grubba's avatar
Gus Grubba committed
242
#endif
243
        _p->pMAVLink = new QmlComponentInfo(tr("MAVLink"),
244 245
                                            QUrl::fromUserInput("qrc:/qml/MavlinkSettings.qml"),
                                            QUrl::fromUserInput("qrc:/res/waves.svg"));
246
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pMAVLink)));
247
        _p->pConsole = new QmlComponentInfo(tr("Console"),
248
                                            QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/AppMessages.qml"));
249
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pConsole)));
250
        _p->pHelp = new QmlComponentInfo(tr("Help"),
251
                                         QUrl::fromUserInput("qrc:/qml/HelpSettings.qml"));
252
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pHelp)));
DonLakeFlyer's avatar
DonLakeFlyer committed
253
#if defined(QT_DEBUG)
254
        //-- These are always present on Debug builds
255
        _p->pMockLink = new QmlComponentInfo(tr("Mock Link"),
256
                                             QUrl::fromUserInput("qrc:/qml/MockLink.qml"));
257
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pMockLink)));
258
        _p->pDebug = new QmlComponentInfo(tr("Debug"),
259
                                          QUrl::fromUserInput("qrc:/qml/DebugWindow.qml"));
260
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pDebug)));
261
        _p->pQmlTest = new QmlComponentInfo(tr("Palette Test"),
262
                                            QUrl::fromUserInput("qrc:/qml/QmlTest.qml"));
263
        _p->settingsList.append(QVariant::fromValue(reinterpret_cast<QmlComponentInfo*>(_p->pQmlTest)));
DonLakeFlyer's avatar
DonLakeFlyer committed
264
#endif
265 266 267 268
    }
    return _p->settingsList;
}

269
QVariantList& QGCCorePlugin::instrumentPages()
270
{
271
    if (!_p->cameraPageWidgetInfo) {
Gus Grubba's avatar
Gus Grubba committed
272 273
        _p->cameraPageWidgetInfo    = new QmlComponentInfo(tr("Camera"),    QUrl::fromUserInput("qrc:/qml/CameraPageWidget.qml"));
#if defined(QGC_GST_STREAMING)
274
        if(!_currentCamera || !_currentCamera->autoStream()) {
275 276 277
            //-- Video Page Widget only available if using manual video streaming
            _p->videoPageWidgetInfo = new QmlComponentInfo(tr("Video Stream"), QUrl::fromUserInput("qrc:/qml/VideoPageWidget.qml"));
        }
Gus Grubba's avatar
Gus Grubba committed
278
#endif
279 280

        _p->instrumentPageWidgetList.append(QVariant::fromValue(_p->cameraPageWidgetInfo));
Gus Grubba's avatar
Gus Grubba committed
281 282 283
#if defined(QGC_GST_STREAMING)
        _p->instrumentPageWidgetList.append(QVariant::fromValue(_p->videoPageWidgetInfo));
#endif
284 285 286 287 288
        _p->instrumentPageWidgetList.append(QVariant::fromValue(_p->vibrationPageWidgetInfo));
    }
    return _p->instrumentPageWidgetList;
}

289 290 291
QVariantList& QGCCorePlugin::analyzePages()
{
    if (!_p->analyzeList.count()) {
DonLakeFlyer's avatar
DonLakeFlyer committed
292
        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("Log Download"),     QUrl::fromUserInput("qrc:/qml/LogDownloadPage.qml"),        QUrl::fromUserInput("qrc:/qmlimages/LogDownloadIcon"))));
293
#if !defined(__mobile__)
DonLakeFlyer's avatar
DonLakeFlyer committed
294
        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("GeoTag Images"),    QUrl::fromUserInput("qrc:/qml/GeoTagPage.qml"),             QUrl::fromUserInput("qrc:/qmlimages/GeoTagIcon"))));
295
#endif
DonLakeFlyer's avatar
DonLakeFlyer committed
296
        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("MAVLink Console"),  QUrl::fromUserInput("qrc:/qml/MavlinkConsolePage.qml"),     QUrl::fromUserInput("qrc:/qmlimages/MavlinkConsoleIcon"))));
297
#if defined(QGC_ENABLE_MAVLINK_INSPECTOR)
DonLakeFlyer's avatar
DonLakeFlyer committed
298
        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("MAVLink Inspector"),QUrl::fromUserInput("qrc:/qml/MAVLinkInspectorPage.qml"),   QUrl::fromUserInput("qrc:/qmlimages/MAVLinkInspector"))));
299
#endif
DonLakeFlyer's avatar
DonLakeFlyer committed
300
        _p->analyzeList.append(QVariant::fromValue(new QmlComponentInfo(tr("Vibration"),        QUrl::fromUserInput("qrc:/qml/VibrationPage.qml"),          QUrl::fromUserInput("qrc:/qmlimages/VibrationPageIcon"))));
301 302 303 304
    }
    return _p->analyzeList;
}

305
int QGCCorePlugin::defaultSettings()
306 307 308 309
{
    return 0;
}

310 311
QGCOptions* QGCCorePlugin::options()
{
312 313
    if (!_p->defaultOptions) {
        _p->defaultOptions = new QGCOptions(this);
314 315 316 317
    }
    return _p->defaultOptions;
}

318 319 320
bool QGCCorePlugin::overrideSettingsGroupVisibility(QString name)
{
    Q_UNUSED(name);
321

322 323 324
    // Always show all
    return true;
}
325

326
bool QGCCorePlugin::adjustSettingMetaData(const QString& settingsGroup, FactMetaData& metaData)
327
{
328
    if (settingsGroup == AppSettings::settingsGroup) {
Gus Grubba's avatar
Gus Grubba committed
329 330 331 332 333 334 335 336
#if !defined(QGC_ENABLE_PAIRING)
        //-- If we don't support pairing, disable it.
        if (metaData.name() == AppSettings::usePairingName) {
            metaData.setRawDefaultValue(false);
            //-- And hide the option
            return false;
        }
#endif
337

338 339 340
        //-- Default Palette
        if (metaData.name() == AppSettings::indoorPaletteName) {
            QVariant outdoorPalette;
Don Gagne's avatar
Don Gagne committed
341
#if defined (__mobile__)
342
            outdoorPalette = 0;
Don Gagne's avatar
Don Gagne committed
343
#else
344
            outdoorPalette = 1;
Don Gagne's avatar
Don Gagne committed
345
#endif
346 347 348 349
            metaData.setRawDefaultValue(outdoorPalette);
            return true;
        }

350
#if defined (__mobile__)
351 352 353 354 355
        if (metaData.name() == AppSettings::telemetrySaveName) {
            // Mobile devices have limited storage so don't turn on telemtry saving by default
            metaData.setRawDefaultValue(false);
            return true;
        }
356
#endif
Don Gagne's avatar
Don Gagne committed
357
    }
358

359
    return true; // Show setting in ui
360
}
DonLakeFlyer's avatar
DonLakeFlyer committed
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376

void QGCCorePlugin::setShowTouchAreas(bool show)
{
    if (show != _showTouchAreas) {
        _showTouchAreas = show;
        emit showTouchAreasChanged(show);
    }
}

void QGCCorePlugin::setShowAdvancedUI(bool show)
{
    if (show != _showAdvancedUI) {
        _showAdvancedUI = show;
        emit showAdvancedUIChanged(show);
    }
}
377

378
void QGCCorePlugin::paletteOverride(QString /*colorName*/, QGCPalette::PaletteColorInfo_t& /*colorInfo*/)
379
{
380

381
}
382

383
QString QGCCorePlugin::showAdvancedUIMessage() const
384 385 386 387 388 389
{
    return tr("WARNING: You are about to enter Advanced Mode. "
              "If used incorrectly, this may cause your vehicle to malfunction thus voiding your warranty. "
              "You should do so only if instructed by customer support. "
              "Are you sure you want to enable Advanced Mode?");
}
390

391
void QGCCorePlugin::factValueGridCreateDefaultSettings(const QString& defaultSettingsGroup)
392
{
393
    HorizontalFactValueGrid factValueGrid(defaultSettingsGroup);
394

395
    bool        includeFWValues = factValueGrid.vehicleClass() == QGCMAVLink::VehicleClassFixedWing || factValueGrid.vehicleClass() == QGCMAVLink::VehicleClassVTOL;
396

397
    factValueGrid.setFontSize(FactValueGrid::LargeFontSize);
398

399 400 401 402 403 404 405
    factValueGrid.appendRow();
    factValueGrid.appendRow();
    factValueGrid.appendColumn();
    factValueGrid.appendColumn();
    if (includeFWValues) {
        factValueGrid.appendColumn();
    }
406

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
    int                 colIndex    = 0;
    QmlObjectListModel* row         = factValueGrid.rows()->value<QmlObjectListModel*>(0);

    InstrumentValueData* value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "AltitudeRelative");
    value->setIcon("arrow-thick-up.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(true);

    value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "ClimbRate");
    value->setIcon("arrow-simple-up.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(true);

    if (includeFWValues) {
        value = row->value<InstrumentValueData*>(colIndex++);
        value->setFact("Vehicle", "AirSpeed");
        value->setText("AirSpd");
426
        value->setShowUnits(true);
427
    }
428

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
    value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "FlightTime");
    value->setIcon("timer.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(false);

    colIndex    = 0;
    row         = factValueGrid.rows()->value<QmlObjectListModel*>(1);

    value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "DistanceToHome");
    value->setIcon("bookmark copy 3.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(true);

    value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "GroundSpeed");
    value->setIcon("arrow-simple-right.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(true);

    if (includeFWValues) {
        value = row->value<InstrumentValueData*>(colIndex++);
        value->setFact("Vehicle", "ThrottlePct");
        value->setText("Thr");
454
        value->setShowUnits(true);
455
    }
456 457 458 459 460 461

    value = row->value<InstrumentValueData*>(colIndex++);
    value->setFact("Vehicle", "FlightDistance");
    value->setIcon("travel-walk.svg");
    value->setText(value->fact()->shortDescription());
    value->setShowUnits(true);
462
}
463

464
QQmlApplicationEngine* QGCCorePlugin::createQmlApplicationEngine(QObject* parent)
465
{
466 467 468 469 470 471 472 473 474 475
    QQmlApplicationEngine* qmlEngine = new QQmlApplicationEngine(parent);
    qmlEngine->addImportPath("qrc:/qml");
    qmlEngine->rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager());
    qmlEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel());
    return qmlEngine;
}

void QGCCorePlugin::createRootWindow(QQmlApplicationEngine* qmlEngine)
{
    qmlEngine->load(QUrl(QStringLiteral("qrc:/qml/MainRootWindow.qml")));
476
}
477 478 479 480 481 482 483 484 485

bool QGCCorePlugin::mavlinkMessage(Vehicle* vehicle, LinkInterface* link, mavlink_message_t message)
{
    Q_UNUSED(vehicle);
    Q_UNUSED(link);
    Q_UNUSED(message);

    return true;
}
486

487
QmlObjectListModel* QGCCorePlugin::customMapItems()
488 489 490
{
    return &_p->_emptyCustomMapItems;
}
491

492 493 494 495 496
VideoManager* QGCCorePlugin::createVideoManager(QGCApplication *app, QGCToolbox *toolbox)
{
    return new VideoManager(app, toolbox);
}

497 498
VideoReceiver* QGCCorePlugin::createVideoReceiver(QObject* parent)
{
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
#if defined(QGC_GST_STREAMING)
    return GStreamer::createVideoReceiver(parent);
#else
    Q_UNUSED(parent)
    return nullptr;
#endif
}

void* QGCCorePlugin::createVideoSink(QObject* parent, QQuickItem* widget)
{
#if defined(QGC_GST_STREAMING)
    return GStreamer::createVideoSink(parent, widget);
#else
    Q_UNUSED(parent)
    Q_UNUSED(widget)
    return nullptr;
#endif
516
}
517

518 519 520 521 522 523 524 525 526
void QGCCorePlugin::releaseVideoSink(void* sink)
{
#if defined(QGC_GST_STREAMING)
    GStreamer::releaseVideoSink(sink);
#else
    Q_UNUSED(sink)
#endif
}

527
bool QGCCorePlugin::guidedActionsControllerLogging() const
528 529 530
{
    return GuidedActionsControllerLog().isDebugEnabled();
}
531

532
QString QGCCorePlugin::stableVersionCheckFileUrl() const
533 534 535 536 537 538 539 540
{
#ifdef QGC_CUSTOM_BUILD
    // Custom builds must override to turn on and provide their own location
    return QString();
#else
    return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt");
#endif
}
541

542
const QVariantList& QGCCorePlugin::toolBarIndicators(void)
543 544 545 546
{
    //-- Default list of indicators for all vehicles.
    if(_toolBarIndicatorList.size() == 0) {
        _toolBarIndicatorList = QVariantList({
547 548
                                                 QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSRTKIndicator.qml")),
                                             });
549 550 551
    }
    return _toolBarIndicatorList;
}
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596

QList<int> QGCCorePlugin::firstRunPromptStdIds(void)
{
    QList<int> rgStdIds = { unitsFirstRunPromptId, offlineVehicleFirstRunPromptId };
    return rgStdIds;
}

QList<int> QGCCorePlugin::firstRunPromptCustomIds(void)
{
    return QList<int>();
}

QVariantList QGCCorePlugin::firstRunPromptsToShow(void)
{
    QList<int> rgIdsToShow;

    rgIdsToShow.append(firstRunPromptStdIds());
    rgIdsToShow.append(firstRunPromptCustomIds());

    QList<int> rgAlreadyShownIds = AppSettings::firstRunPromptsIdsVariantToList(_toolbox->settingsManager()->appSettings()->firstRunPromptIdsShown()->rawValue());

    for (int idToRemove: rgAlreadyShownIds) {
        rgIdsToShow.removeOne(idToRemove);
    }

    QVariantList rgVarIdsToShow;
    for (int id: rgIdsToShow) {
        rgVarIdsToShow.append(id);
    }

    return rgVarIdsToShow;
}

QString QGCCorePlugin::firstRunPromptResource(int id)
{
    switch (id) {
    case unitsFirstRunPromptId:
        return "/FirstRunPromptDialogs/UnitsFirstRunPrompt.qml";
    case offlineVehicleFirstRunPromptId:
        return "/FirstRunPromptDialogs/OfflineVehicleFirstRunPrompt.qml";
        break;
    }

    return QString();
}