MainWindow.cc 30.8 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10
11
12
13
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15
16
17
18
19
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21
22
23
24
25

======================================================================*/

/**
 * @file
26
 *   @brief Implementation of class MainWindow
27
 *   @author Lorenz Meier <mail@qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 */

#include <QSettings>
#include <QDockWidget>
#include <QNetworkInterface>
#include <QMessageBox>
#include <QDebug>
#include <QTimer>
#include <QHostInfo>

#include "MG.h"
#include "MAVLinkSimulationLink.h"
#include "SerialLink.h"
#include "UDPLink.h"
#include "MAVLinkProtocol.h"
#include "CommConfigurationWindow.h"
#include "WaypointList.h"
#include "MainWindow.h"
#include "JoystickWidget.h"
pixhawk's avatar
pixhawk committed
47
#include "GAudioOutput.h"
lm's avatar
lm committed
48
#include "QMap3DWidget.h"
pixhawk's avatar
pixhawk committed
49

lm's avatar
lm committed
50
51
52
53
// FIXME Move
#include "PxQuadMAV.h"
#include "SlugsMAV.h"

pixhawk's avatar
pixhawk committed
54
55
56
57
58
59
60
61
62
63

#include "LogCompressor.h"

/**
* Create new mainwindow. The constructor instantiates all parts of the user
* interface. It does NOT show the mainwindow. To display it, call the show()
* method.
*
* @see QMainWindow::show()
**/
64
MainWindow::MainWindow(QWidget *parent) :
pixhawk's avatar
pixhawk committed
65
66
        QMainWindow(parent),
        settings()
pixhawk's avatar
pixhawk committed
67
{
68
69
70
    this->hide();
    this->setVisible(false);

pixhawk's avatar
pixhawk committed
71
72
73
    // Setup user interface
    ui.setupUi(this);

74
75
76
77
78
79
80
    buildWidgets();

    connectWidgets();

    arrangeCenterStack();

    configureWindowName();
pixhawk's avatar
pixhawk committed
81
82
83
84
85
86
87

    // Add status bar
    setStatusBar(createStatusBar());

    // Set the application style (not the same as a style sheet)
    // Set the style to Plastique
    qApp->setStyle("plastique");
88

pixhawk's avatar
pixhawk committed
89
90
91
92
    // Set style sheet as last step
    reloadStylesheet();


93
94
95
    // Create actions
    connectActions();

96
    // Load widgets and show application windowa
97
98
99
100
    loadWidgets();

    // Adjust the size
    adjustSize();
pixhawk's avatar
pixhawk committed
101
102
}

pixhawk's avatar
pixhawk committed
103
MainWindow::~MainWindow()
pixhawk's avatar
pixhawk committed
104
105
106
107
108
{
    delete statusBar;
    statusBar = NULL;
}

109
110
111

void MainWindow::buildWidgets()
{
pixhawk's avatar
pixhawk committed
112
113
114
115
116
117
118
119
    //FIXME: memory of acceptList will never be freed again
    QStringList* acceptList = new QStringList();
    acceptList->append("roll IMU");
    acceptList->append("pitch IMU");
    acceptList->append("yaw IMU");
    acceptList->append("rollspeed IMU");
    acceptList->append("pitchspeed IMU");
    acceptList->append("yawspeed IMU");
120

pixhawk's avatar
pixhawk committed
121
122
123
124
    //FIXME: memory of acceptList2 will never be freed again
    QStringList* acceptList2 = new QStringList();
    acceptList2->append("Battery");
    acceptList2->append("Pressure");
125

pixhawk's avatar
pixhawk committed
126
127
    //TODO:  move protocol outside UI
    mavlink     = new MAVLinkProtocol();
128

pixhawk's avatar
pixhawk committed
129
130
131
132
133
134
    // Center widgets
    linechartWidget   = new Linecharts(this);
    hudWidget         = new HUD(640, 480, this);
    mapWidget         = new MapWidget(this);
    protocolWidget    = new XMLCommProtocolWidget(this);
    dataplotWidget    = new QGCDataPlot2D(this);
lm's avatar
lm committed
135
    map3DWidget       = new QMap3DWidget(this);
136

pixhawk's avatar
pixhawk committed
137
138
139
    // Dock widgets
    controlDockWidget = new QDockWidget(tr("Control"), this);
    controlDockWidget->setWidget( new UASControlWidget(this) );
140

pixhawk's avatar
pixhawk committed
141
142
    listDockWidget = new QDockWidget(tr("Unmanned Systems"), this);
    listDockWidget->setWidget( new UASListWidget(this) );
143

pixhawk's avatar
pixhawk committed
144
145
    waypointsDockWidget = new QDockWidget(tr("Waypoint List"), this);
    waypointsDockWidget->setWidget( new WaypointList(this, NULL) );
146

pixhawk's avatar
pixhawk committed
147
148
    infoDockWidget = new QDockWidget(tr("Status Details"), this);
    infoDockWidget->setWidget( new UASInfoWidget(this) );
149

pixhawk's avatar
pixhawk committed
150
151
    detectionDockWidget = new QDockWidget(tr("Object Recognition"), this);
    detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) );
152

pixhawk's avatar
pixhawk committed
153
154
    debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this);
    debugConsoleDockWidget->setWidget( new DebugConsole(this) );
155

pixhawk's avatar
pixhawk committed
156
157
    parametersDockWidget = new QDockWidget(tr("Onboard Parameters"), this);
    parametersDockWidget->setWidget( new ParameterInterface(this) );
158

pixhawk's avatar
pixhawk committed
159
160
    watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this);
    watchdogControlDockWidget->setWidget( new WatchdogControl(this) );
161

pixhawk's avatar
pixhawk committed
162
163
    hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this);
    hsiDockWidget->setWidget( new HSIDisplay(this) );
164

pixhawk's avatar
pixhawk committed
165
166
    headDown1DockWidget = new QDockWidget(tr("Primary Flight Display"), this);
    headDown1DockWidget->setWidget( new HDDisplay(acceptList, this) );
167

pixhawk's avatar
pixhawk committed
168
169
    headDown2DockWidget = new QDockWidget(tr("Payload Status"), this);
    headDown2DockWidget->setWidget( new HDDisplay(acceptList2, this) );
170

pixhawk's avatar
pixhawk committed
171
172
    rcViewDockWidget = new QDockWidget(tr("Radio Control"), this);
    rcViewDockWidget->setWidget( new QGCRemoteControlView(this) );
173

pixhawk's avatar
pixhawk committed
174
175
176
    // Dialogue widgets
    //FIXME: free memory in destructor
    joystick    = new JoystickInput();
177

178
179
}

pixhawk's avatar
pixhawk committed
180
181
182
/**
 * Connect all signals and slots of the main window widgets
 */
183
184
void MainWindow::connectWidgets()
{
pixhawk's avatar
pixhawk committed
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
    if (linechartWidget)
    {
        connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
                linechartWidget, SLOT(addSystem(UASInterface*)));
        connect(UASManager::instance(), SIGNAL(activeUASSet(int)),
                linechartWidget, SLOT(selectSystem(int)));
        connect(linechartWidget, SIGNAL(logfileWritten(QString)),
                this, SLOT(loadDataView(QString)));
    }
    if (infoDockWidget && infoDockWidget->widget())
    {
        connect(mavlink, SIGNAL(receiveLossChanged(int, float)),
                infoDockWidget->widget(), SLOT(updateSendLoss(int, float)));
    }
    if (mapWidget && waypointsDockWidget->widget())
    {
        // clear path create on the map
        connect(waypointsDockWidget->widget(), SIGNAL(clearPathclicked()), mapWidget, SLOT(clearPath()));
        // add Waypoint widget in the WaypointList widget when mouse clicked
        connect(mapWidget, SIGNAL(captureMapCoordinateClick(QPointF)), waypointsDockWidget->widget(), SLOT(addWaypointMouse(QPointF)));
        // it notifies that a waypoint global goes to do create
        connect(mapWidget, SIGNAL(createGlobalWP(bool)), waypointsDockWidget->widget(), SLOT(setIsWPGlobal(bool)));
        connect(mapWidget, SIGNAL(sendGeometryEndDrag(QPointF,int)), waypointsDockWidget->widget(), SLOT(waypointGlobalChanged(QPointF,int)) );
    }
209
210
}

211
212
void MainWindow::arrangeCenterStack()
{
213

pixhawk's avatar
pixhawk committed
214
215
    QStackedWidget *centerStack = new QStackedWidget(this);
    if (!centerStack) return;
216

pixhawk's avatar
pixhawk committed
217
218
219
    if (linechartWidget) centerStack->addWidget(linechartWidget);
    if (protocolWidget) centerStack->addWidget(protocolWidget);
    if (mapWidget) centerStack->addWidget(mapWidget);
lm's avatar
lm committed
220
    if (map3DWidget) centerStack->addWidget(map3DWidget);
pixhawk's avatar
pixhawk committed
221
222
    if (hudWidget) centerStack->addWidget(hudWidget);
    if (dataplotWidget) centerStack->addWidget(dataplotWidget);
223

pixhawk's avatar
pixhawk committed
224
    setCentralWidget(centerStack);
225
226
}

227
228
void MainWindow::configureWindowName()
{
pixhawk's avatar
pixhawk committed
229
230
231
    QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses();
    QString windowname = qApp->applicationName() + " " + qApp->applicationVersion();
    bool prevAddr = false;
232

pixhawk's avatar
pixhawk committed
233
    windowname.append(" (" + QHostInfo::localHostName() + ": ");
234

pixhawk's avatar
pixhawk committed
235
236
237
238
239
240
241
242
243
244
    for (int i = 0; i < hostAddresses.size(); i++)
    {
        // Exclude loopback IPv4 and all IPv6 addresses
        if (hostAddresses.at(i) != QHostAddress("127.0.0.1") && !hostAddresses.at(i).toString().contains(":"))
        {
            if(prevAddr) windowname.append("/");
            windowname.append(hostAddresses.at(i).toString());
            prevAddr = true;
        }
    }
245

pixhawk's avatar
pixhawk committed
246
    windowname.append(")");
247

pixhawk's avatar
pixhawk committed
248
    setWindowTitle(windowname);
249
250

#ifndef Q_WS_MAC
pixhawk's avatar
pixhawk committed
251
    //qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
252
253
254
#endif
}

pixhawk's avatar
pixhawk committed
255
QStatusBar* MainWindow::createStatusBar()
pixhawk's avatar
pixhawk committed
256
257
258
259
260
261
262
263
{
    QStatusBar* bar = new QStatusBar();
    /* Add status fields and messages */
    /* Enable resize grip in the bottom right corner */
    bar->setSizeGripEnabled(true);
    return bar;
}

pixhawk's avatar
pixhawk committed
264
void MainWindow::startVideoCapture()
pixhawk's avatar
pixhawk committed
265
266
267
268
269
270
271
272
273
274
275
{
    QString format = "bmp";
    QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

    QString screenFileName = QFileDialog::getSaveFileName(this, tr("Save As"),
                                                          initialPath,
                                                          tr("%1 Files (*.%2);;All Files (*)")
                                                          .arg(format.toUpper())
                                                          .arg(format));
    delete videoTimer;
    videoTimer = new QTimer(this);
276
277
278
    //videoTimer->setInterval(40);
    //connect(videoTimer, SIGNAL(timeout()), this, SLOT(saveScreen()));
    //videoTimer->stop();
pixhawk's avatar
pixhawk committed
279
280
}

pixhawk's avatar
pixhawk committed
281
void MainWindow::stopVideoCapture()
pixhawk's avatar
pixhawk committed
282
283
284
285
286
287
{
    videoTimer->stop();

    // TODO Convert raw images to PNG
}

pixhawk's avatar
pixhawk committed
288
void MainWindow::saveScreen()
pixhawk's avatar
pixhawk committed
289
290
291
292
293
294
295
296
297
298
{
    QPixmap window = QPixmap::grabWindow(this->winId());
    QString format = "bmp";

    if (!screenFileName.isEmpty())
    {
        window.save(screenFileName, format.toAscii());
    }
}

299
300
301
302
303
304
/**
 * Reload the style sheet from disk. The function tries to load "qgroundcontrol.css" from the application
 * directory (which by default does not exist). If it fails, it will load the bundled default CSS
 * from memory.
 * To customize the application, just create a qgroundcontrol.css file in the application directory
 */
pixhawk's avatar
pixhawk committed
305
void MainWindow::reloadStylesheet()
pixhawk's avatar
pixhawk committed
306
307
{
    // Load style sheet
308
309
310
311
312
    QFile* styleSheet = new QFile(QCoreApplication::applicationDirPath() + "/qgroundcontrol.css");
    if (!styleSheet->exists())
    {
        styleSheet = new QFile(":/images/style-mission.css");
    }
313
314
    if (styleSheet->open(QIODevice::ReadOnly | QIODevice::Text))
    {
315
316
        QString style = QString(styleSheet->readAll());
        style.replace("ICONDIR", QCoreApplication::applicationDirPath()+ "/images/");
pixhawk's avatar
pixhawk committed
317
        qApp->setStyleSheet(style);
318
319
320
    }
    else
    {
321
        qDebug() << "Style not set:" << styleSheet->fileName() << "opened: " << styleSheet->isOpen();
pixhawk's avatar
pixhawk committed
322
    }
323
    delete styleSheet;
pixhawk's avatar
pixhawk committed
324
325
}

pixhawk's avatar
pixhawk committed
326
void MainWindow::showStatusMessage(const QString& status, int timeout)
pixhawk's avatar
pixhawk committed
327
328
329
330
{
    statusBar->showMessage(status, timeout);
}

331
void MainWindow::showStatusMessage(const QString& status)
pixhawk's avatar
pixhawk committed
332
{
333
    statusBar->showMessage(status, 5);
pixhawk's avatar
pixhawk committed
334
335
336
337
338
339
}

/**
* @brief Create all actions associated to the main window
*
**/
pixhawk's avatar
pixhawk committed
340
void MainWindow::connectActions()
pixhawk's avatar
pixhawk committed
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
{
    // Connect actions from ui
    connect(ui.actionAdd_Link, SIGNAL(triggered()), this, SLOT(addLink()));

    // Connect internal actions
    connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(UASCreated(UASInterface*)));

    // Connect user interface controls
    connect(ui.actionLiftoff, SIGNAL(triggered()), UASManager::instance(), SLOT(launchActiveUAS()));
    connect(ui.actionLand, SIGNAL(triggered()), UASManager::instance(), SLOT(returnActiveUAS()));
    connect(ui.actionEmergency_Land, SIGNAL(triggered()), UASManager::instance(), SLOT(stopActiveUAS()));
    connect(ui.actionEmergency_Kill, SIGNAL(triggered()), UASManager::instance(), SLOT(killActiveUAS()));

    connect(ui.actionConfiguration, SIGNAL(triggered()), UASManager::instance(), SLOT(configureActiveUAS()));

    // User interface actions
    connect(ui.actionPilotView, SIGNAL(triggered()), this, SLOT(loadPilotView()));
    connect(ui.actionEngineerView, SIGNAL(triggered()), this, SLOT(loadEngineerView()));
    connect(ui.actionOperatorView, SIGNAL(triggered()), this, SLOT(loadOperatorView()));
360
    connect(ui.action3DView, SIGNAL(triggered()), this, SLOT(load3DView()));
361
    connect(ui.actionShow_full_view, SIGNAL(triggered()), this, SLOT(loadAllView()));
362
    connect(ui.actionShow_MAVLink_view, SIGNAL(triggered()), this, SLOT(loadMAVLinkView()));
363
    connect(ui.actionShow_data_analysis_view, SIGNAL(triggered()), this, SLOT(loadDataView()));
pixhawk's avatar
pixhawk committed
364
365
    connect(ui.actionStyleConfig, SIGNAL(triggered()), this, SLOT(reloadStylesheet()));

366
367
368
369
    connect(ui.actionOnline_documentation, SIGNAL(triggered()), this, SLOT(showHelp()));
    connect(ui.actionCredits_Developers, SIGNAL(triggered()), this, SLOT(showCredits()));
    connect(ui.actionProject_Roadmap, SIGNAL(triggered()), this, SLOT(showRoadMap()));

pixhawk's avatar
pixhawk committed
370
371
    // Joystick configuration
    connect(ui.actionJoystickSettings, SIGNAL(triggered()), this, SLOT(configure()));
372
373


pixhawk's avatar
pixhawk committed
374
375
}

376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
void MainWindow::showHelp()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/user_guide")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open help in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/user_guide in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

void MainWindow::showCredits()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/credits")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open credits in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/credits in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

void MainWindow::showRoadMap()
{
    if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/roadmap")))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not open roadmap in browser");
        msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/roadmap in a browser.");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
    }
}

pixhawk's avatar
pixhawk committed
418
void MainWindow::configure()
pixhawk's avatar
pixhawk committed
419
420
421
422
{
    joystickWidget = new JoystickWidget(joystick, this);
}

pixhawk's avatar
pixhawk committed
423
void MainWindow::addLink()
pixhawk's avatar
pixhawk committed
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
{
    SerialLink* link = new SerialLink();
    // TODO This should be only done in the dialog itself

    LinkManager::instance()->addProtocol(link, mavlink);

    CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);

    ui.menuNetwork->addAction(commWidget->getAction());

    commWidget->show();

    // TODO Implement the link removal!
}

pixhawk's avatar
pixhawk committed
439
440
void MainWindow::addLink(LinkInterface *link)
{
441
    LinkManager::instance()->addProtocol(link, mavlink);
pixhawk's avatar
pixhawk committed
442
443
444
445
446
447
448
    CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);
    ui.menuNetwork->addAction(commWidget->getAction());

    // Special case for simulationlink
    MAVLinkSimulationLink* sim = dynamic_cast<MAVLinkSimulationLink*>(link);
    if (sim)
    {
449
        //connect(sim, SIGNAL(valueChanged(int,QString,double,quint64)), linechart, SLOT(appendData(int,QString,double,quint64)));
pixhawk's avatar
pixhawk committed
450
451
452
453
        connect(ui.actionSimulate, SIGNAL(triggered(bool)), sim, SLOT(connectLink(bool)));
    }
}

pixhawk's avatar
pixhawk committed
454
void MainWindow::UASCreated(UASInterface* uas)
pixhawk's avatar
pixhawk committed
455
456
457
{
    // Connect the UAS to the full user interface

458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
    if (uas != NULL)
    {
        QIcon icon;
        // Set matching icon
        switch (uas->getSystemType())
        {
        case 0:
            icon = QIcon(":/images/mavs/generic.svg");
            break;
        case 1:
            icon = QIcon(":/images/mavs/fixed-wing.svg");
            break;
        case 2:
            icon = QIcon(":/images/mavs/quadrotor.svg");
            break;
        case 3:
            icon = QIcon(":/images/mavs/coaxial.svg");
            break;
        case 4:
            icon = QIcon(":/images/mavs/helicopter.svg");
            break;
        case 5:
            icon = QIcon(":/images/mavs/groundstation.svg");
            break;
        default:
            icon = QIcon(":/images/mavs/unknown.svg");
            break;
        }

        ui.menuConnected_Systems->addAction(icon, tr("Select %1 for control").arg(uas->getUASName()), uas, SLOT(setSelected()));

        // FIXME Should be not inside the mainwindow
490
491
        if (debugConsoleDockWidget)
        {
pixhawk's avatar
pixhawk committed
492
493
494
495
496
497
            DebugConsole *debugConsole = dynamic_cast<DebugConsole*>(debugConsoleDockWidget->widget());
            if (debugConsole)
            {
                connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)),
                        debugConsole, SLOT(receiveTextMessage(int,int,int,QString)));
            }
498
        }
499
500

        // Health / System status indicator
501
502
        if (infoDockWidget)
        {
pixhawk's avatar
pixhawk committed
503
504
505
506
507
            UASInfoWidget *infoWidget = dynamic_cast<UASInfoWidget*>(infoDockWidget->widget());
            if (infoWidget)
            {
                infoWidget->addUAS(uas);
            }
508
        }
509
510

        // UAS List
511
512
        if (listDockWidget)
        {
pixhawk's avatar
pixhawk committed
513
514
515
516
517
            UASListWidget *listWidget = dynamic_cast<UASListWidget*>(listDockWidget->widget());
            if (listWidget)
            {
                listWidget->addUAS(uas);
            }
518
        }
519
520
521
522
523
524
525
526
527
528
529
530
531

        // Camera view
        //camera->addUAS(uas);

        // Revalidate UI
        // TODO Stylesheet reloading should in theory not be necessary
        reloadStylesheet();

        // Check which type this UAS is of
        PxQuadMAV* mav = dynamic_cast<PxQuadMAV*>(uas);
        if (mav) loadPixhawkView();
        SlugsMAV* mav2 = dynamic_cast<SlugsMAV*>(uas);
        if (mav2) loadSlugsView();
lm's avatar
lm committed
532

533
    }
pixhawk's avatar
pixhawk committed
534
535
}

536
537
538
/**
 * Clears the current view completely
 */
pixhawk's avatar
pixhawk committed
539
void MainWindow::clearView()
pixhawk's avatar
pixhawk committed
540
541
{ 
    // Halt HUD
542
543
544
545
546
547
548
549
550
    if (hudWidget) hudWidget->stop();
    // Disable linechart
    if (linechartWidget) linechartWidget->setActive(false);
    // Halt HDDs
    if (headDown1DockWidget)
    {
        HDDisplay* hddWidget = dynamic_cast<HDDisplay*>( headDown1DockWidget->widget() );
        if (hddWidget) hddWidget->stop();
    }
pixhawk's avatar
pixhawk committed
551
    if (headDown2DockWidget)
552
553
554
555
556
557
558
559
560
561
    {
        HDDisplay* hddWidget = dynamic_cast<HDDisplay*>( headDown2DockWidget->widget() );
        if (hddWidget) hddWidget->stop();
    }
    // Halt HSI
    if (hsiDockWidget)
    {
        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
        if (hsi) hsi->stop();
    }
pixhawk's avatar
pixhawk committed
562

563
564
    // Remove all dock widgets from main window
    QObjectList childList( this->children() );
pixhawk's avatar
pixhawk committed
565

566
567
568
    QObjectList::iterator i;
    QDockWidget* dockWidget;
    for (i = childList.begin(); i != childList.end(); ++i)
pixhawk's avatar
pixhawk committed
569
    {
570
571
        dockWidget = dynamic_cast<QDockWidget*>(*i);
        if (dockWidget)
pixhawk's avatar
pixhawk committed
572
        {
573
574
575
576
577
            // Remove dock widget from main window
            this->removeDockWidget(dockWidget);
            // Deletion of dockWidget would also delete all child
            // widgets of dockWidget
            // Is there a way to unset a widget from QDockWidget?
pixhawk's avatar
pixhawk committed
578
579
580
581
        }
    }
}

lm's avatar
lm committed
582
583
584
585
586
587
void MainWindow::loadSlugsView()
{
    clearView();
    // Engineer view, used in EMAV2009

    // LINE CHART
588
589
590
591
592
593
594
595
596
    if (linechartWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            linechartWidget->setActive(true);
            centerStack->setCurrentWidget(linechartWidget);
        }
    }
lm's avatar
lm committed
597
598

    // UAS CONTROL
599
600
601
602
603
    if (controlDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget);
        controlDockWidget->show();
    }
lm's avatar
lm committed
604
605

    // UAS LIST
606
607
608
609
610
    if (listDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, listDockWidget);
        listDockWidget->show();
    }
lm's avatar
lm committed
611
612

    // UAS STATUS
613
614
615
616
617
    if (infoDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget);
        infoDockWidget->show();
    }
lm's avatar
lm committed
618
619

    // HORIZONTAL SITUATION INDICATOR
620
621
622
623
624
625
626
627
628
629
    if (hsiDockWidget)
    {
        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
        if (hsi)
        {
            hsi->start();
            addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget);
            hsiDockWidget->show();
        }
    }
lm's avatar
lm committed
630
631

    // WAYPOINT LIST
632
633
634
635
636
    if (waypointsDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget);
        waypointsDockWidget->show();
    }
lm's avatar
lm committed
637
638

    // DEBUG CONSOLE
639
640
641
642
643
    if (debugConsoleDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget);
        debugConsoleDockWidget->show();
    }
lm's avatar
lm committed
644
645

    // ONBOARD PARAMETERS
646
647
648
649
650
    if (parametersDockWidget)
    {
        addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget);
        parametersDockWidget->show();
    }
lm's avatar
lm committed
651
652
653
654
655
656
657
658
659

    this->show();
}

void MainWindow::loadPixhawkView()
{
    clearView();
    // Engineer view, used in EMAV2009

660
661
    // 3D map
    if (map3DWidget)
662
663
664
665
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
666
667
            //map3DWidget->setActive(true);
            centerStack->setCurrentWidget(map3DWidget);
668
669
        }
    }
lm's avatar
lm committed
670
671

    // UAS CONTROL
672
673
674
675
676
    if (controlDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget);
        controlDockWidget->show();
    }
lm's avatar
lm committed
677

678
679
680
681
682
683
684
685
686
687
688
689
    // HORIZONTAL SITUATION INDICATOR
    if (hsiDockWidget)
    {
        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
        if (hsi)
        {
            hsi->start();
            addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget);
            hsiDockWidget->show();
        }
    }

lm's avatar
lm committed
690
    // UAS LIST
691
692
693
694
695
    if (listDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, listDockWidget);
        listDockWidget->show();
    }
lm's avatar
lm committed
696
697

    // UAS STATUS
698
699
700
701
702
    if (infoDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget);
        infoDockWidget->show();
    }
lm's avatar
lm committed
703
704

    // WAYPOINT LIST
705
706
707
708
709
    if (waypointsDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget);
        waypointsDockWidget->show();
    }
lm's avatar
lm committed
710
711

    // DEBUG CONSOLE
712
713
714
715
716
    if (debugConsoleDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget);
        debugConsoleDockWidget->show();
    }
lm's avatar
lm committed
717
718

    // ONBOARD PARAMETERS
719
720
721
722
723
    if (parametersDockWidget)
    {
        addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget);
        parametersDockWidget->show();
    }
lm's avatar
lm committed
724
725
726
727

    this->show();
}

728
729
730
void MainWindow::loadDataView()
{
    clearView();
731
732
733
734
735
736
737
738

    // DATAPLOT
    if (dataplotWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
            centerStack->setCurrentWidget(dataplotWidget);
    }
739
740
}

741
742
743
void MainWindow::loadDataView(QString fileName)
{
    clearView();
pixhawk's avatar
pixhawk committed
744

745
746
747
748
749
750
751
752
753
754
    // DATAPLOT
    if (dataplotWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            centerStack->setCurrentWidget(dataplotWidget);
            dataplotWidget->loadFile(fileName);
        }
    }
755
756
}

pixhawk's avatar
pixhawk committed
757
void MainWindow::loadPilotView()
pixhawk's avatar
pixhawk committed
758
759
760
761
{
    clearView();

    // HEAD UP DISPLAY
762
763
764
765
766
767
768
769
770
    if (hudWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            centerStack->setCurrentWidget(hudWidget);
            hudWidget->start();
        }
    }
pixhawk's avatar
pixhawk committed
771
772

    //connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), pfd, SLOT(setActiveUAS(UASInterface*)));
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
    if (headDown1DockWidget)
    {
        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown1DockWidget->widget());
        if (hdd)
        {
            addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget);
            headDown1DockWidget->show();
            hdd->start();
        }
        
    }
    if (headDown2DockWidget)
    {
        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown2DockWidget->widget());
        if (hdd)
        {
            addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget);
            headDown2DockWidget->show();
            hdd->start();
        }
    }
pixhawk's avatar
pixhawk committed
794

pixhawk's avatar
pixhawk committed
795
796
797
    this->show();
}

pixhawk's avatar
pixhawk committed
798
void MainWindow::loadOperatorView()
pixhawk's avatar
pixhawk committed
799
800
801
{
    clearView();

802
    // MAP
803
804
805
806
807
808
809
810
    if (mapWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            centerStack->setCurrentWidget(mapWidget);
        }
    }
pixhawk's avatar
pixhawk committed
811
    // UAS CONTROL
812
813
814
815
816
    if (controlDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget);
        controlDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
817
818

    // UAS LIST
819
820
821
822
823
    if (listDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, listDockWidget);
        listDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
824
825

    // UAS STATUS
826
827
828
829
830
    if (infoDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget);
        infoDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
831
832

    // WAYPOINT LIST
833
834
835
836
837
    if (waypointsDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget);
        waypointsDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
838

lm's avatar
lm committed
839
    // HORIZONTAL SITUATION INDICATOR
840
841
842
843
844
845
846
847
848
849
    if (hsiDockWidget)
    {
        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
        if (hsi)
        {
            addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget);
            hsiDockWidget->show();
            hsi->start();
        }
    }
pixhawk's avatar
pixhawk committed
850
851

    // OBJECT DETECTION
852
853
854
855
856
    if (detectionDockWidget)
    {
        addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget);
        detectionDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
857

pixhawk's avatar
pixhawk committed
858
    // PROCESS CONTROL
859
860
861
862
863
864
    if (watchdogControlDockWidget)
    {
        addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget);
        watchdogControlDockWidget->show();
    }

pixhawk's avatar
pixhawk committed
865
866
867
    this->show();
}

868
void MainWindow::load3DView()
pixhawk's avatar
pixhawk committed
869
{
870
            clearView();
pixhawk's avatar
pixhawk committed
871

872
873
874
875
876
877
878
879
880
881
            // 3D map
            if (map3DWidget)
            {
                QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
                if (centerStack)
                {
                    //map3DWidget->setActive(true);
                    centerStack->setCurrentWidget(map3DWidget);
                }
            }
pixhawk's avatar
pixhawk committed
882

883
884
885
886
887
888
            // UAS CONTROL
            if (controlDockWidget)
            {
                addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget);
                controlDockWidget->show();
            }
pixhawk's avatar
pixhawk committed
889

890
891
892
893
894
895
            // UAS LIST
            if (listDockWidget)
            {
                addDockWidget(Qt::BottomDockWidgetArea, listDockWidget);
                listDockWidget->show();
            }
896

897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
            // WAYPOINT LIST
            if (waypointsDockWidget)
            {
                addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget);
                waypointsDockWidget->show();
            }

            // HORIZONTAL SITUATION INDICATOR
            if (hsiDockWidget)
            {
                HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
                if (hsi)
                {
                    hsi->start();
                    addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget);
                    hsiDockWidget->show();
                }
            }

            this->show();
        }
pixhawk's avatar
pixhawk committed
918

pixhawk's avatar
pixhawk committed
919
void MainWindow::loadEngineerView()
pixhawk's avatar
pixhawk committed
920
921
922
923
924
{
    clearView();
    // Engineer view, used in EMAV2009

    // LINE CHART
925
926
927
928
929
930
931
932
933
    if (linechartWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            linechartWidget->setActive(true);
            centerStack->setCurrentWidget(linechartWidget);
        }
    }
pixhawk's avatar
pixhawk committed
934
935

    // UAS CONTROL
936
937
938
939
940
    if (controlDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget);
        controlDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
941
942

    // UAS LIST
943
944
945
946
947
    if (listDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, listDockWidget);
        listDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
948
949

    // UAS STATUS
950
951
952
953
954
    if (infoDockWidget)
    {
        addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget);
        infoDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
955

lm's avatar
lm committed
956
    // WAYPOINT LIST
957
958
959
960
961
    if (waypointsDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget);
        waypointsDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
962
963

    // DEBUG CONSOLE
964
965
966
967
968
    if (debugConsoleDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget);
        debugConsoleDockWidget->show();
    }
pixhawk's avatar
pixhawk committed
969

lm's avatar
lm committed
970
    // ONBOARD PARAMETERS
971
972
973
974
975
    if (parametersDockWidget)
    {
        addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget);
        parametersDockWidget->show();
    }
lm's avatar
lm committed
976

Bryan Godbolt's avatar
Bryan Godbolt committed
977
978
979
980
981
982
983
    // RADIO CONTROL VIEW
    if (rcViewDockWidget)
    {
        addDockWidget(Qt::BottomDockWidgetArea, rcViewDockWidget);
        rcViewDockWidget->show();
    }

pixhawk's avatar
pixhawk committed
984
985
986
    this->show();
}

987
988
989
void MainWindow::loadMAVLinkView()
{
    clearView();
990
991
992
993
994
995
996
997
998
999

    if (protocolWidget)
    {
        QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
        if (centerStack)
        {
            centerStack->setCurrentWidget(protocolWidget);
        }
    }

1000
    this->show();
For faster browsing, not all history is shown. View entire blame