QGCToolBar.cc 24.2 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 28
#include "QGCToolBar.h"
#include "UASManager.h"
lm's avatar
lm committed
29
#include "MainWindow.h"
30 31 32

QGCToolBar::QGCToolBar(QWidget *parent) :
    QToolBar(parent),
33
    mav(NULL),
lm's avatar
lm committed
34 35 36 37 38
    player(NULL),
    changed(true),
    batteryPercent(0),
    batteryVoltage(0),
    wpId(0),
39
    wpDistance(0),
40
    systemArmed(false),
41 42
    currentLink(NULL),
    firstAction(NULL)
43 44
{
    setObjectName("QGC_TOOLBAR");
lm's avatar
lm committed
45

46 47
    // Do not load UI, wait for actions
}
lm's avatar
lm committed
48

49 50 51 52 53 54 55 56
void QGCToolBar::heartbeatTimeout(bool timeout, unsigned int ms)
{
    // set timeout label visible
    if (timeout)
    {
        // Alternate colors to increase visibility
        if ((ms / 1000) % 2 == 0)
        {
57
            toolBarTimeoutLabel->setStyleSheet(QString("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: %1; background-color: %2; border-radius: 4px;}").arg(QGC::colorDarkWhite.name()).arg(QGC::colorMagenta.name()));
58 59 60
        }
        else
        {
61
            toolBarTimeoutLabel->setStyleSheet(QString("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: %1; background-color: %2; border-radius: 4px;}").arg(QGC::colorDarkWhite.name()).arg(QGC::colorMagenta.dark(250).name()));
62 63 64 65 66 67 68 69 70 71 72 73 74
        }
        toolBarTimeoutLabel->setText(tr("CONNECTION LOST: %1 s").arg((ms / 1000.0f), 2, 'f', 1, ' '));
    }
    else
    {
        // Check if loss text is present, reset once
        if (toolBarTimeoutLabel->text() != "")
        {
            toolBarTimeoutLabel->setText("");
            toolBarTimeoutLabel->setStyleSheet(QString(""));
        }
    }
}
lm's avatar
lm committed
75

76 77
void QGCToolBar::createUI()
{
lm's avatar
lm committed
78 79 80 81
    // CREATE TOOLBAR ITEMS
    // Add internal actions
    // Add MAV widget
    symbolButton = new QToolButton(this);
Lorenz Meier's avatar
Lorenz Meier committed
82
    symbolButton->setStyleSheet("QWidget { margin-left: 10px; background-color: #050508; color: #DDDDDF; background-clip: border; }");
83
    addWidget(symbolButton);
84

LM's avatar
LM committed
85
    toolBarNameLabel = new QLabel("------", this);
86
    toolBarNameLabel->setToolTip(tr("Currently controlled vehicle"));
Lorenz Meier's avatar
Lorenz Meier committed
87
    toolBarNameLabel->setAlignment(Qt::AlignCenter);
88 89
    addWidget(toolBarNameLabel);

90 91
    toolBarTimeoutLabel = new QLabel("UNCONNECTED", this);
    toolBarTimeoutLabel->setToolTip(tr("System timed out, interval since last message"));
92
    toolBarTimeoutLabel->setStyleSheet(QString("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: %1; background-color: %2; border-radius: 4px;}").arg(QGC::colorDarkWhite.name()).arg(QGC::colorMagenta.name()));
Lorenz Meier's avatar
Lorenz Meier committed
93
    toolBarTimeoutLabel->setAlignment(Qt::AlignCenter);
94 95
    addWidget(toolBarTimeoutLabel);

96
    toolBarSafetyLabel = new QLabel("SAFE", this);
97
    toolBarSafetyLabel->setStyleSheet("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: #14C814; }");
98
    toolBarSafetyLabel->setToolTip(tr("Vehicle safety state"));
Lorenz Meier's avatar
Lorenz Meier committed
99
    toolBarSafetyLabel->setAlignment(Qt::AlignCenter);
100 101
    addWidget(toolBarSafetyLabel);

LM's avatar
LM committed
102
    toolBarModeLabel = new QLabel("------", this);
Lorenz Meier's avatar
Lorenz Meier committed
103
    toolBarModeLabel->setStyleSheet("QLabel { margin: 3px 2px; font: 14px; color: #ACEBFE; }");
104
    toolBarModeLabel->setToolTip(tr("Vehicle mode"));
Lorenz Meier's avatar
Lorenz Meier committed
105
    toolBarModeLabel->setAlignment(Qt::AlignCenter);
106 107
    addWidget(toolBarModeLabel);

LM's avatar
LM committed
108
    toolBarStateLabel = new QLabel("------", this);
Lorenz Meier's avatar
Lorenz Meier committed
109
    toolBarStateLabel->setStyleSheet("QLabel { margin: 3px 2px; font: 14px; color: #FEC654; }");
110
    toolBarStateLabel->setToolTip(tr("Vehicle state"));
Lorenz Meier's avatar
Lorenz Meier committed
111
    toolBarStateLabel->setAlignment(Qt::AlignCenter);
112 113
    addWidget(toolBarStateLabel);

LM's avatar
LM committed
114 115 116
    toolBarBatteryBar = new QProgressBar(this);
    toolBarBatteryBar->setMinimum(0);
    toolBarBatteryBar->setMaximum(100);
117
    toolBarBatteryBar->setMinimumWidth(20);
118
    toolBarBatteryBar->setMaximumWidth(100);
Lorenz Meier's avatar
Lorenz Meier committed
119
    toolBarBatteryBar->setValue(0);
lm's avatar
lm committed
120
    toolBarBatteryBar->setToolTip(tr("Battery charge level"));
121 122
    addWidget(toolBarBatteryBar);

123
    toolBarBatteryVoltageLabel = new QLabel("xx.x V");
124
    toolBarBatteryVoltageLabel->setStyleSheet(QString("QLabel { margin: 0px 0px 0px 4px; font: 14px; color: %1; }").arg(QColor(Qt::green).name()));
125
    toolBarBatteryVoltageLabel->setToolTip(tr("Battery voltage"));
Lorenz Meier's avatar
Lorenz Meier committed
126
    toolBarBatteryVoltageLabel->setAlignment(Qt::AlignCenter);
127
    addWidget(toolBarBatteryVoltageLabel);
128 129

    toolBarWpLabel = new QLabel("WP--", this);
Lorenz Meier's avatar
Lorenz Meier committed
130
    toolBarWpLabel->setStyleSheet("QLabel { margin: 3px 2px; font: 18px; color: #ACEBFE; }");
131
    toolBarWpLabel->setToolTip(tr("Current waypoint"));
Lorenz Meier's avatar
Lorenz Meier committed
132
    toolBarWpLabel->setAlignment(Qt::AlignCenter);
LM's avatar
LM committed
133
    addWidget(toolBarWpLabel);
134 135

    toolBarDistLabel = new QLabel("--- ---- m", this);
136
    toolBarDistLabel->setToolTip(tr("Distance to current waypoint"));
Lorenz Meier's avatar
Lorenz Meier committed
137
    toolBarDistLabel->setAlignment(Qt::AlignCenter);
LM's avatar
LM committed
138
    addWidget(toolBarDistLabel);
139

Lorenz Meier's avatar
Lorenz Meier committed
140
    toolBarMessageLabel = new QLabel("", this);
Lorenz Meier's avatar
Lorenz Meier committed
141
    toolBarMessageLabel->setStyleSheet("QLabel { margin: 3px 2px; font: 14px; color: #ACEBFE; }");
142
    toolBarMessageLabel->setToolTip(tr("Most recent system message"));
LM's avatar
LM committed
143
    addWidget(toolBarMessageLabel);
lm's avatar
lm committed
144

145 146
    QWidget* spacer = new QWidget();
    spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
147
    spacer->setStyleSheet("* { margin: 0px; background-color: transparent; min-height: 24px}");
148 149
    addWidget(spacer);

150 151
    connectButton = new QPushButton(tr("Connect"), this);
    connectButton->setToolTip(tr("Connect wireless link to MAV"));
152
    connectButton->setCheckable(true);
Lorenz Meier's avatar
Lorenz Meier committed
153
    connectButton->setStyleSheet("QPushButton {min-height: 20px; color: #222222; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #5AAA49, stop: 1 #106B38);  margin-left: 4px; margin-right: 4px; border-radius: 4px; border: 1px solid #085B35; } QPushButton:checked { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #FF9000, stop: 1 #FFD450); color: #222222; border-color: #D1892A}");
154 155 156
    addWidget(connectButton);
    connect(connectButton, SIGNAL(clicked(bool)), this, SLOT(connectLink(bool)));

lm's avatar
lm committed
157 158
    // DONE INITIALIZING BUTTONS

159
    // Configure the toolbar for the current default UAS
160 161
    setActiveUAS(UASManager::instance()->getActiveUAS());
    connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*)));
lm's avatar
lm committed
162

163 164 165 166 167 168 169 170 171 172
    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*)));

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

173
    // Set the toolbar to be updated every 2s
lm's avatar
lm committed
174 175
    connect(&updateViewTimer, SIGNAL(timeout()), this, SLOT(updateView()));
    updateViewTimer.start(2000);
176 177

    loadSettings();
Lorenz Meier's avatar
Lorenz Meier committed
178 179

    changed = false;
180 181
}

Lorenz Meier's avatar
Lorenz Meier committed
182
void QGCToolBar::setPerspectiveChangeActions(const QList<QAction*> &actions)
183
{
Lorenz Meier's avatar
Lorenz Meier committed
184 185
    if (actions.count() > 1)
    {
186
        group = new QButtonGroup(this);
Lorenz Meier's avatar
Lorenz Meier committed
187 188 189 190 191 192 193 194 195 196
        group->setExclusive(true);

        QToolButton *first = new QToolButton(this);
        // Add first button
        first->setIcon(actions.first()->icon());
        first->setText(actions.first()->text());
        first->setToolTip(actions.first()->toolTip());
        first->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        first->setCheckable(true);
        connect(first, SIGNAL(clicked(bool)), actions.first(), SIGNAL(triggered(bool)));
197
        connect(actions.first(),SIGNAL(triggered(bool)),first,SLOT(setChecked(bool)));
198
        first->setStyleSheet("QToolButton { 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
199 200 201
        addWidget(first);
        group->addButton(first);

202
        for (int i = 1; i < actions.count(); i++)
Lorenz Meier's avatar
Lorenz Meier committed
203 204 205 206 207 208 209 210 211 212
        {
            // Add last button
            QToolButton *btn = new QToolButton(this);
            // Add first button
            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)));
213
            connect(actions.at(i),SIGNAL(triggered(bool)),btn,SLOT(setChecked(bool)));
214
            btn->setStyleSheet("QToolButton { min-width: 60px; color: #222222; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #A2A3A4, stop: 1 #B6B7B8);  margin-left: -2px; margin-right: -2px; padding-left: 0px; padding-right: 0px; border-radius: 0px; 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
215 216 217 218 219
            addWidget(btn);
            group->addButton(btn);
        }

        // Add last button
220
        advancedButton = new QPushButton(this);
Lorenz Meier's avatar
Lorenz Meier committed
221
        // Add first button
222 223 224 225
        advancedButton->setIcon(QIcon(":/files/images/apps/utilities-system-monitor.svg"));
        advancedButton->setText(tr("Pro"));
        advancedButton->setToolTip(tr("Options for advanced users"));
        advancedButton->setCheckable(true);
Lorenz Meier's avatar
Lorenz Meier committed
226
        advancedButton->setStyleSheet("QPushButton { min-width: 60px; font-weight: bold; text-align: left; color: #222222; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #A2A3A4, stop: 1 #B6B7B8);  margin-left: 0px; margin-right: 13px; padding-left: 4px; padding-right: 8px; border-radius: 0px; border : 0px solid blue; border-bottom-right-radius: 6px; border-top-right-radius: 6px; border-right: 1px solid #484848; border-top: 1px solid #484848; border-bottom: 1px solid #484848; } QPushButton:checked { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #555555, stop: 1 #787878); color: #DDDDDD; }");
227 228
        addWidget(advancedButton);
        group->addButton(advancedButton);
229
    } else {
Lorenz Meier's avatar
Lorenz Meier committed
230
        qDebug() << __FILE__ << __LINE__ << "Not enough perspective change actions provided";
231
    }
Lorenz Meier's avatar
Lorenz Meier committed
232 233 234

    // Add the "rest"
    createUI();
235 236
}

237 238 239 240 241 242 243 244 245 246 247 248
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));
        }

249
        menu->setStyleSheet("QMenu { font-weight: bold; min-width: 70px; color: #222222; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #A2A3A4, stop: 1 #B6B7B8); border: 1px solid #484848; } QMenu::item:checked { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #555555, stop: 1 #787878); color: #DDDDDD; }");
250 251

        advancedButton->setMenu(menu);
252
        connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(advancedActivityTriggered(QAction*)));
253 254 255 256 257 258

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

259 260 261 262 263 264
void QGCToolBar::advancedActivityTriggered(QAction* action)
{
    if (action->isChecked())
        advancedButton->setChecked(true);
}

265 266 267 268 269 270 271 272 273 274 275 276
void QGCToolBar::setActiveUAS(UASInterface* active)
{
    // Do nothing if system is the same or NULL
    if ((active == NULL) || mav == active) return;

    if (mav)
    {
        // Disconnect old system
        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
277
        disconnect(mav, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(receiveTextMessage(int,int,int,QString)));
LM's avatar
LM committed
278
        disconnect(mav, SIGNAL(batteryChanged(UASInterface*,double,double,int)), this, SLOT(updateBatteryRemaining(UASInterface*,double,double,int)));
279
        disconnect(mav, SIGNAL(armingChanged(bool)), this, SLOT(updateArmingState(bool)));
280
        disconnect(mav, SIGNAL(heartbeatTimeout(bool, unsigned int)), this, SLOT(heartbeatTimeout(bool,unsigned int)));
281 282
        if (mav->getWaypointManager())
        {
283
            disconnect(mav->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(updateCurrentWaypoint(quint16)));
284 285
            disconnect(mav->getWaypointManager(), SIGNAL(waypointDistanceChanged(double)), this, SLOT(updateWaypointDistance(double)));
        }
286 287 288 289 290 291 292 293
    }

    // Connect new system
    mav = active;
    connect(active, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(updateState(UASInterface*, QString,QString)));
    connect(active, SIGNAL(modeChanged(int,QString,QString)), this, SLOT(updateMode(int,QString,QString)));
    connect(active, SIGNAL(nameChanged(QString)), this, SLOT(updateName(QString)));
    connect(active, SIGNAL(systemTypeSet(UASInterface*,uint)), this, SLOT(setSystemType(UASInterface*,uint)));
LM's avatar
LM committed
294
    connect(active, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(receiveTextMessage(int,int,int,QString)));
LM's avatar
LM committed
295
    connect(active, SIGNAL(batteryChanged(UASInterface*,double,double,int)), this, SLOT(updateBatteryRemaining(UASInterface*,double,double,int)));
296
    connect(active, SIGNAL(armingChanged(bool)), this, SLOT(updateArmingState(bool)));
297
    connect(active, SIGNAL(heartbeatTimeout(bool, unsigned int)), this, SLOT(heartbeatTimeout(bool,unsigned int)));
298 299 300 301 302
    if (active->getWaypointManager())
    {
        connect(active->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(updateCurrentWaypoint(quint16)));
        connect(active->getWaypointManager(), SIGNAL(waypointDistanceChanged(double)), this, SLOT(updateWaypointDistance(double)));
    }
303 304

    // Update all values once
305
    systemName = mav->getUASName();
306
    systemArmed = mav->isArmed();
LM's avatar
LM committed
307 308
    toolBarNameLabel->setText(mav->getUASName());
    toolBarNameLabel->setStyleSheet(QString("QLabel { font: bold 16px; color: %1; }").arg(mav->getColor().name()));
Lorenz Meier's avatar
Lorenz Meier committed
309
    symbolButton->setStyleSheet(QString("QWidget { background-color: %1; color: #DDDDDF; background-clip: border; } QToolButton { font-weight: bold; font-size: 14px; border: 0px solid #484848; border-radius: 5px; min-width:22px; max-width: 22px; min-height: 22px; max-height: 22px; padding: 0px; margin: 0px 4px 0px 20px; background-color: none; }").arg(mav->getColor().name()));
LM's avatar
LM committed
310 311
    toolBarModeLabel->setText(mav->getShortMode());
    toolBarStateLabel->setText(mav->getShortState());
312 313
    toolBarTimeoutLabel->setStyleSheet(QString(""));
    toolBarTimeoutLabel->setText("");
314 315 316 317 318 319 320 321
    setSystemType(mav, mav->getSystemType());
}

void QGCToolBar::createCustomWidgets()
{

}

322 323 324 325
void QGCToolBar::updateArmingState(bool armed)
{
    systemArmed = armed;
    changed = true;
Lorenz Meier's avatar
Lorenz Meier committed
326 327
    /* important, immediately update */
    updateView();
328 329
}

lm's avatar
lm committed
330 331 332 333 334 335
void QGCToolBar::updateView()
{
    if (!changed) return;
    toolBarDistLabel->setText(tr("%1 m").arg(wpDistance, 6, 'f', 2, '0'));
    toolBarWpLabel->setText(tr("WP%1").arg(wpId));
    toolBarBatteryBar->setValue(batteryPercent);
Lorenz Meier's avatar
Lorenz Meier committed
336
    if (batteryPercent < 30 && toolBarBatteryBar->value() >= 30) {
337
        toolBarBatteryBar->setStyleSheet("QProgressBar::chunk { background-color: green}");
Lorenz Meier's avatar
Lorenz Meier committed
338
    } else if (batteryPercent >= 30 && toolBarBatteryBar->value() < 30){
339
        toolBarBatteryBar->setStyleSheet("QProgressBar::chunk { background-color: yellow}");
Lorenz Meier's avatar
Lorenz Meier committed
340 341
    }

lm's avatar
lm committed
342 343 344 345
    toolBarBatteryVoltageLabel->setText(tr("%1 V").arg(batteryVoltage, 4, 'f', 1, ' '));
    toolBarStateLabel->setText(tr("%1").arg(state));
    toolBarModeLabel->setText(tr("%1").arg(mode));
    toolBarNameLabel->setText(systemName);
346 347
    // expire after 15 seconds
    if (QGC::groundTimeMilliseconds() - lastSystemMessageTimeMs < 15000) {
Lorenz Meier's avatar
Lorenz Meier committed
348
        toolBarMessageLabel->setText(tr("%1").arg(lastSystemMessage));
349
    } else {
Lorenz Meier's avatar
Lorenz Meier committed
350
        toolBarMessageLabel->setText(tr("%1").arg(""));
351
    }
352 353 354

    if (systemArmed)
    {
355
        toolBarSafetyLabel->setStyleSheet(QString("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: %1; background-color: %2; border-radius: 4px;}").arg(QGC::colorRed.name()).arg(QGC::colorYellow.name()));
356 357 358 359
        toolBarSafetyLabel->setText(tr("ARMED"));
    }
    else
    {
360
        toolBarSafetyLabel->setStyleSheet("QLabel { margin: 3px 2px; padding: 2px; padding-left: 4px; padding-right: 4px; font: 14px; color: #14C814; }");
361 362 363
        toolBarSafetyLabel->setText(tr("SAFE"));
    }

lm's avatar
lm committed
364
    changed = false;
lm's avatar
lm committed
365 366
}

367 368
void QGCToolBar::updateWaypointDistance(double distance)
{
lm's avatar
lm committed
369 370
    if (wpDistance != distance) changed = true;
    wpDistance = distance;
371 372 373 374
}

void QGCToolBar::updateCurrentWaypoint(quint16 id)
{
lm's avatar
lm committed
375
    if (wpId != id) changed = true;
lm's avatar
lm committed
376
    wpId = id;
377 378
}

LM's avatar
LM committed
379 380
void QGCToolBar::updateBatteryRemaining(UASInterface* uas, double voltage, double percent, int seconds)
{
381 382
    Q_UNUSED(uas);
    Q_UNUSED(seconds);
lm's avatar
lm committed
383
    if (batteryPercent != percent || batteryVoltage != voltage) changed = true;
lm's avatar
lm committed
384 385
    batteryPercent = percent;
    batteryVoltage = voltage;
LM's avatar
LM committed
386 387
}

388 389 390 391
void QGCToolBar::updateState(UASInterface* system, QString name, QString description)
{
    Q_UNUSED(system);
    Q_UNUSED(description);
lm's avatar
lm committed
392
    if (state != name) changed = true;
lm's avatar
lm committed
393
    state = name;
Lorenz Meier's avatar
Lorenz Meier committed
394 395
    /* important, immediately update */
    updateView();
396 397 398 399 400 401
}

void QGCToolBar::updateMode(int system, QString name, QString description)
{
    Q_UNUSED(system);
    Q_UNUSED(description);
lm's avatar
lm committed
402 403
    if (mode != name) changed = true;
    mode = name;
Lorenz Meier's avatar
Lorenz Meier committed
404 405
    /* important, immediately update */
    updateView();
406 407 408 409
}

void QGCToolBar::updateName(const QString& name)
{
Lorenz Meier's avatar
Lorenz Meier committed
410 411 412 413
    if (systemName != name)
    {
        changed = true;
    }
lm's avatar
lm committed
414
    systemName = name;
415 416 417 418 419 420 421 422 423 424 425 426 427 428
}

/**
 * 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);
        // Set matching icon
        switch (systemType) {
429
        case MAV_TYPE_GENERIC:
430
            symbolButton->setIcon(QIcon(":/files/images/mavs/generic.svg"));
431
            break;
432
        case MAV_TYPE_FIXED_WING:
433
            symbolButton->setIcon(QIcon(":/files/images/mavs/fixed-wing.svg"));
434
            break;
435
        case MAV_TYPE_QUADROTOR:
436
            symbolButton->setIcon(QIcon(":/files/images/mavs/quadrotor.svg"));
437
            break;
438
        case MAV_TYPE_COAXIAL:
439
            symbolButton->setIcon(QIcon(":/files/images/mavs/coaxial.svg"));
440
            break;
441
        case MAV_TYPE_HELICOPTER:
442
            symbolButton->setIcon(QIcon(":/files/images/mavs/helicopter.svg"));
443
            break;
444
        case MAV_TYPE_ANTENNA_TRACKER:
barthess's avatar
barthess committed
445
            symbolButton->setIcon(QIcon(":/files/images/mavs/antenna-tracker.svg"));
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
            break;
        case MAV_TYPE_GCS:
            symbolButton->setIcon(QIcon(":files/images/mavs/groundstation.svg"));
            break;
        case MAV_TYPE_AIRSHIP:
            symbolButton->setIcon(QIcon(":files/images/mavs/airship.svg"));
            break;
        case MAV_TYPE_FREE_BALLOON:
            symbolButton->setIcon(QIcon(":files/images/mavs/free-balloon.svg"));
            break;
        case MAV_TYPE_ROCKET:
            symbolButton->setIcon(QIcon(":files/images/mavs/rocket.svg"));
            break;
        case MAV_TYPE_GROUND_ROVER:
            symbolButton->setIcon(QIcon(":files/images/mavs/ground-rover.svg"));
            break;
        case MAV_TYPE_SURFACE_BOAT:
            symbolButton->setIcon(QIcon(":files/images/mavs/surface-boat.svg"));
            break;
        case MAV_TYPE_SUBMARINE:
            symbolButton->setIcon(QIcon(":files/images/mavs/submarine.svg"));
            break;
        case MAV_TYPE_HEXAROTOR:
            symbolButton->setIcon(QIcon(":files/images/mavs/hexarotor.svg"));
            break;
        case MAV_TYPE_OCTOROTOR:
            symbolButton->setIcon(QIcon(":files/images/mavs/octorotor.svg"));
            break;
        case MAV_TYPE_TRICOPTER:
            symbolButton->setIcon(QIcon(":files/images/mavs/tricopter.svg"));
            break;
        case MAV_TYPE_FLAPPING_WING:
            symbolButton->setIcon(QIcon(":files/images/mavs/flapping-wing.svg"));
            break;
        case MAV_TYPE_KITE:
            symbolButton->setIcon(QIcon(":files/images/mavs/kite.svg"));
482 483
            break;
        default:
484
            symbolButton->setIcon(QIcon(":/files/images/mavs/unknown.svg"));
485 486 487 488
            break;
        }
}

LM's avatar
LM committed
489 490 491 492 493
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
494
    if (lastSystemMessage != text) changed = true;
lm's avatar
lm committed
495
    lastSystemMessage = text;
496
    lastSystemMessageTimeMs = QGC::groundTimeMilliseconds();
LM's avatar
LM committed
497 498
}

499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
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());
    }
}

void QGCToolBar::removeLink(LinkInterface* link)
{
    if (link == currentLink) {
        currentLink = NULL;
        // XXX magic number
        if (LinkManager::instance()->getLinks().count() > 2) {
            currentLink = LinkManager::instance()->getLinks().last();
            updateLinkState(currentLink->isConnected());
        } else {
            connectButton->setText(tr("New Link"));
        }
    }
}

void QGCToolBar::updateLinkState(bool connected)
{
525
    Q_UNUSED(connected);
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
    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);
    }
}

542 543
void QGCToolBar::connectLink(bool connect)
{
544 545
    // No serial port yet present
    // XXX magic number
546 547 548 549 550 551 552 553 554 555
    if (connect && LinkManager::instance()->getLinks().count() < 3)
    {
        MainWindow::instance()->addLink();
    } else if (connect) {
        LinkManager::instance()->getLinks().last()->connect();
    } else if (!connect && LinkManager::instance()->getLinks().count() > 2) {
        LinkManager::instance()->getLinks().last()->disconnect();
    }
}

556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571

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

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

572 573
void QGCToolBar::clearStatusString()
{
Lorenz Meier's avatar
Lorenz Meier committed
574 575 576 577 578
    if (toolBarMessageLabel->text().length() > 0)
    {
        lastSystemMessage = "";
        changed = true;
    }
579 580
}

581 582
QGCToolBar::~QGCToolBar()
{
583
    storeSettings();
584
}