QGCToolBar.cc 25.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

This file is part of the QGROUNDCONTROL project

    QGROUNDCONTROL is free software: you can redistribute it and/or modify
    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.

    QGROUNDCONTROL is distributed in the hope that it will be useful,
    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
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

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

#include <QToolButton>
#include <QLabel>
26
#include <QSpacerItem>
27
#include "SerialLink.h"
28 29
#include "QGCToolBar.h"
#include "UASManager.h"
lm's avatar
lm committed
30
#include "MainWindow.h"
31 32 33

QGCToolBar::QGCToolBar(QWidget *parent) :
    QToolBar(parent),
34
    mav(NULL),
lm's avatar
lm committed
35 36 37 38
    changed(true),
    batteryPercent(0),
    batteryVoltage(0),
    wpId(0),
39
    wpDistance(0),
40 41
    altitudeMSL(0),
    altitudeRel(0),
42
    systemArmed(false),
43
    currentLink(NULL),
44
    firstAction(NULL)
45
{
46
    setObjectName("QGCToolBar");
47
    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
lm's avatar
lm committed
48

49 50
    // Do not load UI, wait for actions
}
lm's avatar
lm committed
51

52 53 54 55 56 57 58 59 60 61
void QGCToolBar::globalPositionChanged(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{
    Q_UNUSED(uas);
    Q_UNUSED(lat);
    Q_UNUSED(lon);
    Q_UNUSED(usec);
    altitudeMSL = alt;
    changed = true;
}

62 63 64 65 66 67 68 69
void QGCToolBar::heartbeatTimeout(bool timeout, unsigned int ms)
{
    // set timeout label visible
    if (timeout)
    {
        // Alternate colors to increase visibility
        if ((ms / 1000) % 2 == 0)
        {
70
            toolBarTimeoutLabel->setStyleSheet(QString("QLabel {color: #000; background-color: #FF0037;}"));
71 72 73
        }
        else
        {
74
            toolBarTimeoutLabel->setStyleSheet(QString("QLabel {color: #FFF; background-color: #6B0017;}"));
75 76
        }
        toolBarTimeoutLabel->setText(tr("CONNECTION LOST: %1 s").arg((ms / 1000.0f), 2, 'f', 1, ' '));
77
        toolBarTimeoutAction->setVisible(true);
78 79 80 81
    }
    else
    {
        // Check if loss text is present, reset once
82
        if (toolBarTimeoutAction->isVisible())
83
        {
84
            toolBarTimeoutAction->setVisible(false);
85 86 87
        }
    }
}
lm's avatar
lm committed
88

89 90
void QGCToolBar::createUI()
{
91 92 93 94 95 96
    // CREATE TOOLBAR ITEMS
    // Add internal actions
    // Add MAV widget
    symbolLabel = new QLabel(this);
    addWidget(symbolLabel);

97
    toolBarNameLabel = new QLabel(this);
98 99
    toolBarNameLabel->setToolTip(tr("Currently controlled vehicle"));
    toolBarNameLabel->setAlignment(Qt::AlignCenter);
100
    toolBarNameLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
101 102
    addWidget(toolBarNameLabel);

103
    toolBarTimeoutLabel = new QLabel(this);
104 105
    toolBarTimeoutLabel->setToolTip(tr("System timed out, interval since last message"));
    toolBarTimeoutLabel->setAlignment(Qt::AlignCenter);
106
    toolBarTimeoutLabel->setObjectName("toolBarTimeoutLabel");
107 108
    toolBarTimeoutLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    toolBarTimeoutAction = addWidget(toolBarTimeoutLabel);
109

110
    toolBarSafetyLabel = new QLabel(this);
111 112 113 114
    toolBarSafetyLabel->setToolTip(tr("Vehicle safety state"));
    toolBarSafetyLabel->setAlignment(Qt::AlignCenter);
    addWidget(toolBarSafetyLabel);

115
    toolBarModeLabel = new QLabel(this);
116
    toolBarModeLabel->setToolTip(tr("Vehicle mode"));
117
    toolBarModeLabel->setObjectName("toolBarModeLabel");
118 119 120
    toolBarModeLabel->setAlignment(Qt::AlignCenter);
    addWidget(toolBarModeLabel);

121
    toolBarStateLabel = new QLabel(this);
122
    toolBarStateLabel->setToolTip(tr("Vehicle state"));
123
    toolBarStateLabel->setObjectName("toolBarStateLabel");
124 125 126 127 128 129 130 131 132 133
    toolBarStateLabel->setAlignment(Qt::AlignCenter);
    addWidget(toolBarStateLabel);

    toolBarBatteryBar = new QProgressBar(this);
    toolBarBatteryBar->setMinimum(0);
    toolBarBatteryBar->setMaximum(100);
    toolBarBatteryBar->setMinimumWidth(20);
    toolBarBatteryBar->setMaximumWidth(100);
    toolBarBatteryBar->setToolTip(tr("Battery charge level"));
    toolBarBatteryBar->setObjectName("toolBarBatteryBar");
134
    toolBarBatteryBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
135 136
    addWidget(toolBarBatteryBar);

137
    toolBarBatteryVoltageLabel = new QLabel(this);
138
    toolBarBatteryVoltageLabel->setToolTip(tr("Battery voltage"));
139
    toolBarBatteryVoltageLabel->setObjectName("toolBarBatteryVoltageLabel");
140 141 142
    toolBarBatteryVoltageLabel->setAlignment(Qt::AlignCenter);
    addWidget(toolBarBatteryVoltageLabel);

143
    toolBarWpLabel = new QLabel(this);
144
    toolBarWpLabel->setToolTip(tr("Current waypoint"));
145
    toolBarWpLabel->setObjectName("toolBarWpLabel");
146 147 148
    toolBarWpLabel->setAlignment(Qt::AlignCenter);
    addWidget(toolBarWpLabel);

149
    toolBarMessageLabel = new QLabel(this);
150
    toolBarMessageLabel->setToolTip(tr("Most recent system message"));
151
    toolBarMessageLabel->setObjectName("toolBarMessageLabel");
152 153 154 155 156 157
    addWidget(toolBarMessageLabel);

    QWidget* spacer = new QWidget();
    spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    addWidget(spacer);

158 159 160 161 162
    portComboBox = new QComboBox(this);
    portComboBox->setToolTip(tr("Choose the COM port to use"));
    portComboBox->setEnabled(true);
    portComboBox->setMinimumWidth(200);
    addWidget(portComboBox);
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

    baudcomboBox = new QComboBox(this);
    baudcomboBox->setToolTip(tr("Choose what baud rate to use"));
    baudcomboBox->setEnabled(true);
    baudcomboBox->setMinimumWidth(80);
    baudcomboBox->addItem("9600");
    baudcomboBox->addItem("14400");
    baudcomboBox->addItem("19200");
    baudcomboBox->addItem("38400");
    baudcomboBox->addItem("57600");
    baudcomboBox->addItem("115200");
    baudcomboBox->setCurrentIndex(5);
    addWidget(baudcomboBox);



179
    connectButton = new QPushButton(tr("Connect"), this);
180
    connectButton->setObjectName("connectButton");
181 182 183
    connectButton->setToolTip(tr("Connect wireless link to MAV"));
    connectButton->setCheckable(true);
    addWidget(connectButton);
184 185
    connect(connectButton, SIGNAL(clicked(bool)), this, SLOT(connectLink(bool)));

186 187
    resetToolbarUI();

lm's avatar
lm committed
188 189
    // DONE INITIALIZING BUTTONS

190 191 192
    // Set the toolbar to be updated every 2s
    connect(&updateViewTimer, SIGNAL(timeout()), this, SLOT(updateView()));

193
    // Configure the toolbar for the current default UAS
194 195
    setActiveUAS(UASManager::instance()->getActiveUAS());
    connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*)));
lm's avatar
lm committed
196

197 198 199 200
    if (LinkManager::instance()->getLinks().count() > 2)
        addLink(LinkManager::instance()->getLinks().last());
    // XXX implies that connect button is always active for the last used link
    connect(LinkManager::instance(), SIGNAL(newLink(LinkInterface*)), this, SLOT(addLink(LinkInterface*)));
201
    connect(LinkManager::instance(), SIGNAL(linkRemoved(LinkInterface*)), this, SLOT(removeLink(LinkInterface*)));
202 203 204 205 206 207

    // Update label if required
    if (LinkManager::instance()->getLinks().count() < 3) {
        connectButton->setText(tr("New Link"));
    }

208
    loadSettings();
Lorenz Meier's avatar
Lorenz Meier committed
209 210

    changed = false;
211 212
}

213 214 215 216 217 218 219 220 221
/**
 * Reset all the labels and stuff for the toolbar to a pristine state. Done at startup after
 * all UI has been created and also when the last UAS has been deleted.
 **/
void QGCToolBar::resetToolbarUI()
{
    toolBarNameLabel->setText("------");
    toolBarNameLabel->setStyleSheet("");
    toolBarTimeoutLabel->setText(tr("UNCONNECTED"));
222
    //toolBarTimeoutLabel->show();
223 224 225 226 227 228 229 230
    toolBarSafetyLabel->setText("----");
    toolBarModeLabel->setText("------");
    toolBarStateLabel->setText("------");
    toolBarBatteryBar->setValue(0);
    toolBarBatteryBar->setDisabled(true);
    toolBarBatteryVoltageLabel->setText("xx.x V");
    toolBarWpLabel->setText("WP--");
    toolBarMessageLabel->clear();
231 232
    lastSystemMessage = "";
    lastSystemMessageTimeMs = 0;
233 234 235 236
    symbolLabel->setStyleSheet("");
    symbolLabel->clear();
}

Lorenz Meier's avatar
Lorenz Meier committed
237
void QGCToolBar::setPerspectiveChangeActions(const QList<QAction*> &actions)
238
{
Lorenz Meier's avatar
Lorenz Meier committed
239 240
    if (actions.count() > 1)
    {
241
        group = new QButtonGroup(this);
Lorenz Meier's avatar
Lorenz Meier committed
242 243
        group->setExclusive(true);

244
        // Add the first button.
Lorenz Meier's avatar
Lorenz Meier committed
245 246 247 248 249 250
        QToolButton *first = new QToolButton(this);
        first->setIcon(actions.first()->icon());
        first->setText(actions.first()->text());
        first->setToolTip(actions.first()->toolTip());
        first->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        first->setCheckable(true);
251

Lorenz Meier's avatar
Lorenz Meier committed
252
        connect(first, SIGNAL(clicked(bool)), actions.first(), SIGNAL(triggered(bool)));
253
        connect(actions.first(),SIGNAL(triggered(bool)),first,SLOT(setChecked(bool)));
254

255
        first->setObjectName("firstAction");
256 257

        //first->setStyleSheet("QToolButton { min-height: 24px; max-height: 24px; min-width: 60px; color: #222222; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #A2A3A4, stop: 1 #B6B7B8); margin-left: 8px; margin-right: 0px; padding-left: 4px; padding-right: 8px; border-radius: 0px; border : 0px solid blue; border-bottom-left-radius: 6px; border-top-left-radius: 6px; border-left: 1px solid #484848; border-top: 1px solid #484848; border-bottom: 1px solid #484848; } QToolButton:checked { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #555555, stop: 1 #787878); color: #DDDDDD; }");
Lorenz Meier's avatar
Lorenz Meier committed
258 259 260
        addWidget(first);
        group->addButton(first);

261
        // Add all the middle buttons.
262
        for (int i = 1; i < actions.count(); i++)
Lorenz Meier's avatar
Lorenz Meier committed
263 264 265 266 267 268 269 270
        {
            QToolButton *btn = new QToolButton(this);
            btn->setIcon(actions.at(i)->icon());
            btn->setText(actions.at(i)->text());
            btn->setToolTip(actions.at(i)->toolTip());
            btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
            btn->setCheckable(true);
            connect(btn, SIGNAL(clicked(bool)), actions.at(i), SIGNAL(triggered(bool)));
271
            connect(actions.at(i),SIGNAL(triggered(bool)),btn,SLOT(setChecked(bool)));
Lorenz Meier's avatar
Lorenz Meier committed
272 273 274 275 276
            addWidget(btn);
            group->addButton(btn);
        }

        // Add last button
277
        advancedButton = new QToolButton(this);
278 279 280 281
        advancedButton->setIcon(QIcon(":/files/images/apps/utilities-system-monitor.svg"));
        advancedButton->setText(tr("Pro"));
        advancedButton->setToolTip(tr("Options for advanced users"));
        advancedButton->setCheckable(true);
282
        advancedButton->setObjectName("advancedButton");
283
        advancedButton->setPopupMode(QToolButton::InstantPopup);
284
        advancedButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
285 286
        addWidget(advancedButton);
        group->addButton(advancedButton);
287
    } else {
Lorenz Meier's avatar
Lorenz Meier committed
288
        qDebug() << __FILE__ << __LINE__ << "Not enough perspective change actions provided";
289
    }
Lorenz Meier's avatar
Lorenz Meier committed
290

291
    // Add the "rest"
Lorenz Meier's avatar
Lorenz Meier committed
292
    createUI();
293 294
}

295 296 297 298 299 300 301 302 303 304 305 306 307
void QGCToolBar::setPerspectiveChangeAdvancedActions(const QList<QAction*> &actions)
{
    if (actions.count() > 1)
    {
        QMenu *menu = new QMenu(advancedButton);

        for (int i = 0; i < actions.count(); i++)
        {

            menu->addAction(actions.at(i));
        }

        advancedButton->setMenu(menu);
308
        connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(advancedActivityTriggered(QAction*)));
309 310 311 312 313 314

    } else {
        qDebug() << __FILE__ << __LINE__ << "Not enough perspective change actions provided";
    }
}

315 316 317 318 319 320
void QGCToolBar::advancedActivityTriggered(QAction* action)
{
    if (action->isChecked())
        advancedButton->setChecked(true);
}

321 322
void QGCToolBar::setActiveUAS(UASInterface* active)
{
323 324
    // Do nothing if system is the same
    if (mav == active) return;
325

326
    // If switching UASes, disconnect the only one.
327 328 329 330 331 332
    if (mav)
    {
        disconnect(mav, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(updateState(UASInterface*,QString,QString)));
        disconnect(mav, SIGNAL(modeChanged(int,QString,QString)), this, SLOT(updateMode(int,QString,QString)));
        disconnect(mav, SIGNAL(nameChanged(QString)), this, SLOT(updateName(QString)));
        disconnect(mav, SIGNAL(systemTypeSet(UASInterface*,uint)), this, SLOT(setSystemType(UASInterface*,uint)));
LM's avatar
LM committed
333
        disconnect(mav, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(receiveTextMessage(int,int,int,QString)));
dongfang's avatar
dongfang committed
334
        disconnect(mav, SIGNAL(batteryChanged(UASInterface*, double, double, double,int)), this, SLOT(updateBatteryRemaining(UASInterface*, double, double, double, int)));
335
        disconnect(mav, SIGNAL(armingChanged(bool)), this, SLOT(updateArmingState(bool)));
336
        disconnect(mav, SIGNAL(heartbeatTimeout(bool, unsigned int)), this, SLOT(heartbeatTimeout(bool,unsigned int)));
337
        disconnect(active, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(globalPositionChanged(UASInterface*,double,double,double,quint64)));
338 339
        if (mav->getWaypointManager())
        {
340
            disconnect(mav->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(updateCurrentWaypoint(quint16)));
341 342
            disconnect(mav->getWaypointManager(), SIGNAL(waypointDistanceChanged(double)), this, SLOT(updateWaypointDistance(double)));
        }
343
    }
344 345 346 347 348
    else
    {
        // Only update the UI once a UAS has been selected.
        updateViewTimer.start(2000);
    }
349 350 351

    // Connect new system
    mav = active;
352
    if (mav)
353
    {
354 355 356 357 358
        connect(mav, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(updateState(UASInterface*, QString,QString)));
        connect(mav, SIGNAL(modeChanged(int,QString,QString)), this, SLOT(updateMode(int,QString,QString)));
        connect(mav, SIGNAL(nameChanged(QString)), this, SLOT(updateName(QString)));
        connect(mav, SIGNAL(systemTypeSet(UASInterface*,uint)), this, SLOT(setSystemType(UASInterface*,uint)));
        connect(mav, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(receiveTextMessage(int,int,int,QString)));
359
        connect(mav, SIGNAL(batteryChanged(UASInterface*,double,double,double,int)), this, SLOT(updateBatteryRemaining(UASInterface*,double,double,double,int)));
360 361 362 363 364 365 366 367
        connect(mav, SIGNAL(armingChanged(bool)), this, SLOT(updateArmingState(bool)));
        connect(mav, SIGNAL(heartbeatTimeout(bool, unsigned int)), this, SLOT(heartbeatTimeout(bool,unsigned int)));
        connect(mav, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(globalPositionChanged(UASInterface*,double,double,double,quint64)));
        if (mav->getWaypointManager())
        {
            connect(mav->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(updateCurrentWaypoint(quint16)));
            connect(mav->getWaypointManager(), SIGNAL(waypointDistanceChanged(double)), this, SLOT(updateWaypointDistance(double)));
        }
368

369 370 371 372 373 374 375 376
        // Update all values once
        systemName = mav->getUASName();
        systemArmed = mav->isArmed();
        toolBarNameLabel->setText(mav->getUASName());
        toolBarNameLabel->setStyleSheet(QString("QLabel {color: %1;}").arg(mav->getColor().name()));
        symbolLabel->setStyleSheet(QString("QWidget {background-color: %1;}").arg(mav->getColor().name()));
        toolBarModeLabel->setText(mav->getShortMode());
        toolBarStateLabel->setText(mav->getShortState());
377 378 379
        toolBarTimeoutAction->setVisible(false);
        toolBarMessageLabel->clear();
        lastSystemMessageTimeMs = 0;
380 381 382 383 384
        toolBarBatteryBar->setEnabled(true);
        setSystemType(mav, mav->getSystemType());
    }
    else
    {
385 386 387 388 389
        updateViewTimer.stop();
        resetToolbarUI();
    }
}

390 391 392 393
void QGCToolBar::updateArmingState(bool armed)
{
    systemArmed = armed;
    changed = true;
Lorenz Meier's avatar
Lorenz Meier committed
394 395
    /* important, immediately update */
    updateView();
396 397
}

lm's avatar
lm committed
398 399 400 401 402
void QGCToolBar::updateView()
{
    if (!changed) return;
    toolBarWpLabel->setText(tr("WP%1").arg(wpId));
    toolBarBatteryBar->setValue(batteryPercent);
Lorenz Meier's avatar
Lorenz Meier committed
403
    if (batteryPercent < 30 && toolBarBatteryBar->value() >= 30) {
404 405 406 407 408 409 410 411
        if (MainWindow::instance()->getStyle() == MainWindow::QGC_MAINWINDOW_STYLE_LIGHT)
        {
            toolBarBatteryBar->setStyleSheet("QProgressBar {color: #FFF} QProgressBar::chunk { background-color: #008000}");
        }
        else
        {
            toolBarBatteryBar->setStyleSheet("QProgressBar {color: #000} QProgressBar QProgressBar::chunk { background-color: #0F0}");
        }
Lorenz Meier's avatar
Lorenz Meier committed
412
    } else if (batteryPercent >= 30 && toolBarBatteryBar->value() < 30){
413 414 415 416 417 418 419 420
        if (MainWindow::instance()->getStyle() == MainWindow::QGC_MAINWINDOW_STYLE_LIGHT)
        {
            toolBarBatteryBar->setStyleSheet("QProgressBar {color: #FFF} QProgressBar::chunk { background-color: #808000}");
        }
        else
        {
            toolBarBatteryBar->setStyleSheet("QProgressBar {color: #000} QProgressBar QProgressBar::chunk { background-color: #FF0}");
        }
Lorenz Meier's avatar
Lorenz Meier committed
421 422
    }

lm's avatar
lm committed
423
    toolBarBatteryVoltageLabel->setText(tr("%1 V").arg(batteryVoltage, 4, 'f', 1, ' '));
424 425
    toolBarStateLabel->setText(QString("%1").arg(state));
    toolBarModeLabel->setText(QString("%1").arg(mode));
lm's avatar
lm committed
426
    toolBarNameLabel->setText(systemName);
427 428
    // expire after 15 seconds
    if (QGC::groundTimeMilliseconds() - lastSystemMessageTimeMs < 15000) {
429
        toolBarMessageLabel->setText(QString("%1").arg(lastSystemMessage));
430
    } else {
431
        toolBarMessageLabel->clear();
432
    }
433

434
    // Display the system armed state with a red-on-yellow background if armed or green text if safe.
435 436
    if (systemArmed)
    {
437
        toolBarSafetyLabel->setStyleSheet(QString("QLabel {color: %1; background-color: %2; font-size: 15pt;}").arg(QGC::colorRed.name()).arg(QGC::colorYellow.name()));
438 439 440 441
        toolBarSafetyLabel->setText(tr("ARMED"));
    }
    else
    {
442 443
        if (MainWindow::instance()->getStyle() == MainWindow::QGC_MAINWINDOW_STYLE_LIGHT)
        {
444
            toolBarSafetyLabel->setStyleSheet("QLabel {color: #0D820D; font-size: 15pt;}");
445 446 447
        }
        else
        {
448
            toolBarSafetyLabel->setStyleSheet("QLabel {color: #14C814; font-size: 15pt;}");
449
        }
450 451 452
        toolBarSafetyLabel->setText(tr("SAFE"));
    }

lm's avatar
lm committed
453
    changed = false;
lm's avatar
lm committed
454 455
}

456 457
void QGCToolBar::updateWaypointDistance(double distance)
{
lm's avatar
lm committed
458 459
    if (wpDistance != distance) changed = true;
    wpDistance = distance;
460 461 462 463
}

void QGCToolBar::updateCurrentWaypoint(quint16 id)
{
lm's avatar
lm committed
464
    if (wpId != id) changed = true;
lm's avatar
lm committed
465
    wpId = id;
466 467
}

dongfang's avatar
dongfang committed
468
void QGCToolBar::updateBatteryRemaining(UASInterface* uas, double voltage, double current, double percent, int seconds)
LM's avatar
LM committed
469
{
470 471
    Q_UNUSED(uas);
    Q_UNUSED(seconds);
472
    Q_UNUSED(current);
473

lm's avatar
lm committed
474
    if (batteryPercent != percent || batteryVoltage != voltage) changed = true;
lm's avatar
lm committed
475 476
    batteryPercent = percent;
    batteryVoltage = voltage;
LM's avatar
LM committed
477 478
}

479 480 481 482
void QGCToolBar::updateState(UASInterface* system, QString name, QString description)
{
    Q_UNUSED(system);
    Q_UNUSED(description);
lm's avatar
lm committed
483
    if (state != name) changed = true;
lm's avatar
lm committed
484
    state = name;
Lorenz Meier's avatar
Lorenz Meier committed
485 486
    /* important, immediately update */
    updateView();
487 488 489 490 491 492
}

void QGCToolBar::updateMode(int system, QString name, QString description)
{
    Q_UNUSED(system);
    Q_UNUSED(description);
lm's avatar
lm committed
493 494
    if (mode != name) changed = true;
    mode = name;
Lorenz Meier's avatar
Lorenz Meier committed
495 496
    /* important, immediately update */
    updateView();
497 498 499 500
}

void QGCToolBar::updateName(const QString& name)
{
Lorenz Meier's avatar
Lorenz Meier committed
501 502 503 504
    if (systemName != name)
    {
        changed = true;
    }
lm's avatar
lm committed
505
    systemName = name;
506 507 508 509 510 511 512 513 514 515 516 517
}

/**
 * The current system type is represented through the system icon.
 *
 * @param uas Source system, has to be the same as this->uas
 * @param systemType type ID, following the MAVLink system type conventions
 * @see http://pixhawk.ethz.ch/software/mavlink
 */
void QGCToolBar::setSystemType(UASInterface* uas, unsigned int systemType)
{
    Q_UNUSED(uas);
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 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
    QPixmap newPixmap;
    switch (systemType) {
    case MAV_TYPE_GENERIC:
        newPixmap = QPixmap(":/files/images/mavs/generic.svg");
        break;
    case MAV_TYPE_FIXED_WING:
        newPixmap = QPixmap(":/files/images/mavs/fixed-wing.svg");
        break;
    case MAV_TYPE_QUADROTOR:
        newPixmap = QPixmap(":/files/images/mavs/quadrotor.svg");
        break;
    case MAV_TYPE_COAXIAL:
        newPixmap = QPixmap(":/files/images/mavs/coaxial.svg");
        break;
    case MAV_TYPE_HELICOPTER:
        newPixmap = QPixmap(":/files/images/mavs/helicopter.svg");
        break;
    case MAV_TYPE_ANTENNA_TRACKER:
        newPixmap = QPixmap(":/files/images/mavs/antenna-tracker.svg");
        break;
    case MAV_TYPE_GCS:
        newPixmap = QPixmap(":files/images/mavs/groundstation.svg");
        break;
    case MAV_TYPE_AIRSHIP:
        newPixmap = QPixmap(":files/images/mavs/airship.svg");
        break;
    case MAV_TYPE_FREE_BALLOON:
        newPixmap = QPixmap(":files/images/mavs/free-balloon.svg");
        break;
    case MAV_TYPE_ROCKET:
        newPixmap = QPixmap(":files/images/mavs/rocket.svg");
        break;
    case MAV_TYPE_GROUND_ROVER:
        newPixmap = QPixmap(":files/images/mavs/ground-rover.svg");
        break;
    case MAV_TYPE_SURFACE_BOAT:
        newPixmap = QPixmap(":files/images/mavs/surface-boat.svg");
        break;
    case MAV_TYPE_SUBMARINE:
        newPixmap = QPixmap(":files/images/mavs/submarine.svg");
        break;
    case MAV_TYPE_HEXAROTOR:
        newPixmap = QPixmap(":files/images/mavs/hexarotor.svg");
        break;
    case MAV_TYPE_OCTOROTOR:
        newPixmap = QPixmap(":files/images/mavs/octorotor.svg");
        break;
    case MAV_TYPE_TRICOPTER:
        newPixmap = QPixmap(":files/images/mavs/tricopter.svg");
        break;
    case MAV_TYPE_FLAPPING_WING:
        newPixmap = QPixmap(":files/images/mavs/flapping-wing.svg");
        break;
    case MAV_TYPE_KITE:
        newPixmap = QPixmap(":files/images/mavs/kite.svg");
        break;
    default:
        newPixmap = QPixmap(":/files/images/mavs/unknown.svg");
        break;
    }
    symbolLabel->setPixmap(newPixmap.scaledToHeight(24));
579 580
}

LM's avatar
LM committed
581 582 583 584 585
void QGCToolBar::receiveTextMessage(int uasid, int componentid, int severity, QString text)
{
    Q_UNUSED(uasid);
    Q_UNUSED(componentid);
    Q_UNUSED(severity);
lm's avatar
lm committed
586
    if (lastSystemMessage != text) changed = true;
lm's avatar
lm committed
587
    lastSystemMessage = text;
588
    lastSystemMessageTimeMs = QGC::groundTimeMilliseconds();
LM's avatar
LM committed
589 590
}

591 592 593 594 595 596 597 598
void QGCToolBar::addLink(LinkInterface* link)
{
    // XXX magic number
    if (LinkManager::instance()->getLinks().count() > 2) {
        currentLink = link;
        connect(currentLink, SIGNAL(connected(bool)), this, SLOT(updateLinkState(bool)));
        updateLinkState(link->isConnected());
    }
599
    updateComboBox();
600 601 602 603 604 605
}

void QGCToolBar::removeLink(LinkInterface* link)
{
    if (link == currentLink) {
        currentLink = NULL;
606 607
        //portComboBox->setEnabled(false);
        //portComboBox->clear();
608 609 610 611 612 613 614 615
        // XXX magic number
        if (LinkManager::instance()->getLinks().count() > 2) {
            currentLink = LinkManager::instance()->getLinks().last();
            updateLinkState(currentLink->isConnected());
        } else {
            connectButton->setText(tr("New Link"));
        }
    }
616 617 618 619 620 621 622 623 624 625 626
    updateComboBox();
}
void QGCToolBar::updateComboBox()
{
    portComboBox->clear();
    for (int i=0;i<LinkManager::instance()->getLinks().count();i++)
    {
        SerialLink *slink = qobject_cast<SerialLink*>(LinkManager::instance()->getLinks()[i]);
        if (slink)
        {
            //It's a serial link
627
            QList<QString> portlist = slink->getCurrentPorts();
628 629
            //if (!slink->isConnected())
            //{
630
                for (int j=0;j<portlist.count();j++)
631
                {
632
                    portComboBox->addItem("Serial port:" + QString::number(i) + ":" + portlist[j]);
633 634 635 636 637 638 639 640 641
                }
            //}
            //We only really want to display from unconnected sources.
        }
        else
        {
            portComboBox->addItem(LinkManager::instance()->getLinks()[i]->getName());
        }
    }
642 643 644 645
}

void QGCToolBar::updateLinkState(bool connected)
{
646
    Q_UNUSED(connected);
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
    if (currentLink && currentLink->isConnected())
    {
        connectButton->setText(tr("Disconnect"));
        connectButton->blockSignals(true);
        connectButton->setChecked(true);
        connectButton->blockSignals(false);
    }
    else
    {
        connectButton->setText(tr("Connect"));
        connectButton->blockSignals(true);
        connectButton->setChecked(false);
        connectButton->blockSignals(false);
    }
}

663 664
void QGCToolBar::connectLink(bool connect)
{
665 666
    // No serial port yet present
    // XXX magic number
667 668 669 670
    if (connect && LinkManager::instance()->getLinks().count() < 3)
    {
        MainWindow::instance()->addLink();
    } else if (connect) {
671 672 673 674 675 676 677 678 679
        if (portComboBox->currentText().split(":").count()>2)
        {
            int linknum = portComboBox->currentText().split(":")[1].toInt();
            SerialLink *link = qobject_cast<SerialLink*>(LinkManager::instance()->getLinks().at(linknum));
            if (link)
            {
                QString portname = portComboBox->currentText().split(":")[2];
                link->setPortName(portname.trimmed());
            }
680 681
            int baud = baudcomboBox->currentText().toInt();
            link->setBaudRate(baud);
682 683 684 685 686 687
            link->connect();
        }
        else
        {
            LinkManager::instance()->getLinks().last()->connect();
        }
688 689 690 691 692
    } else if (!connect && LinkManager::instance()->getLinks().count() > 2) {
        LinkManager::instance()->getLinks().last()->disconnect();
    }
}

693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708

void QGCToolBar::loadSettings()
{
    QSettings settings;
    settings.beginGroup("QGC_TOOLBAR");
    settings.endGroup();
}

void QGCToolBar::storeSettings()
{
    QSettings settings;
    settings.beginGroup("QGC_TOOLBAR");
    settings.endGroup();
    settings.sync();
}

709 710
void QGCToolBar::clearStatusString()
{
Lorenz Meier's avatar
Lorenz Meier committed
711 712 713 714 715
    if (toolBarMessageLabel->text().length() > 0)
    {
        lastSystemMessage = "";
        changed = true;
    }
716 717
}

718 719
QGCToolBar::~QGCToolBar()
{
720
    storeSettings();
721
}