QGCParamWidget.cc 17.8 KB
Newer Older
1 2 3 4
/*=====================================================================

QGroundControl Open Source Ground Control Station

pixhawk's avatar
pixhawk committed
5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

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/>.

======================================================================*/
/**
 * @file
 *   @brief Implementation of class QGCParamWidget
 *   @author Lorenz Meier <mail@qgroundcontrol.org>
 */
Lorenz Meier's avatar
Lorenz Meier committed
28 29
#include <cmath>
#include <float.h>
tstellanova's avatar
tstellanova committed
30 31
#include <QApplication>
#include <QDebug>
32
#include <QFile>
tstellanova's avatar
tstellanova committed
33 34 35
#include <QFileDialog>
#include <QGridLayout>

36
#include <QList>
37
#include <QMessageBox>
tstellanova's avatar
tstellanova committed
38 39 40
#include <QPushButton>
#include <QSettings>
#include <QTime>
pixhawk's avatar
pixhawk committed
41

Lorenz Meier's avatar
Lorenz Meier committed
42
#include "MainWindow.h"
43
#include "QGC.h"
tstellanova's avatar
tstellanova committed
44 45 46
#include "QGCParamWidget.h"
#include "UASInterface.h"
#include "UASParameterCommsMgr.h"
pixhawk's avatar
pixhawk committed
47

48 49 50 51
/**
 * @param uas MAV to set the parameters on
 * @param parent Parent widget
 */
pixhawk's avatar
pixhawk committed
52
QGCParamWidget::QGCParamWidget(UASInterface* uas, QWidget *parent) :
53
    QGCUASParamManager(uas, parent),
54
    componentItems(new QMap<int, QTreeWidgetItem*>())
pixhawk's avatar
pixhawk committed
55
{
lm's avatar
lm committed
56

pixhawk's avatar
pixhawk committed
57 58
    // Create tree widget
    tree = new QTreeWidget(this);
lm's avatar
lm committed
59
    statusLabel = new QLabel();
lm's avatar
lm committed
60
    statusLabel->setAutoFillBackground(true);
61
    tree->setColumnWidth(70, 30);
pixhawk's avatar
pixhawk committed
62 63

    // Set tree widget as widget onto this component
64
    QGridLayout* horizontalLayout;
pixhawk's avatar
pixhawk committed
65
    //form->setAutoFillBackground(false);
66
    horizontalLayout = new QGridLayout(this);
67 68
    horizontalLayout->setHorizontalSpacing(6);
    horizontalLayout->setVerticalSpacing(6);
pixhawk's avatar
pixhawk committed
69
    horizontalLayout->setMargin(0);
70 71
    horizontalLayout->setSizeConstraint(QLayout::SetMinimumSize);
    //horizontalLayout->setSizeConstraint( QLayout::SetFixedSize );
pixhawk's avatar
pixhawk committed
72

lm's avatar
lm committed
73
    // Parameter tree
74
    horizontalLayout->addWidget(tree, 0, 0, 1, 3);
lm's avatar
lm committed
75 76

    // Status line
lm's avatar
lm committed
77
    statusLabel->setText(tr("Click refresh to download parameters"));
lm's avatar
lm committed
78 79 80 81
    horizontalLayout->addWidget(statusLabel, 1, 0, 1, 3);


    // BUTTONS
Jessica's avatar
Jessica committed
82
    QPushButton* refreshButton = new QPushButton(tr("Get"));
83 84
    refreshButton->setToolTip(tr("Load parameters currently in non-permanent memory of aircraft."));
    refreshButton->setWhatsThis(tr("Load parameters currently in non-permanent memory of aircraft."));
85
    connect(refreshButton, SIGNAL(clicked()), this, SLOT(requestAllParamsUpdate()));
lm's avatar
lm committed
86
    horizontalLayout->addWidget(refreshButton, 2, 0);
87

Jessica's avatar
Jessica committed
88
    QPushButton* setButton = new QPushButton(tr("Set"));
89 90
    setButton->setToolTip(tr("Set current parameters in non-permanent onboard memory"));
    setButton->setWhatsThis(tr("Set current parameters in non-permanent onboard memory"));
91
    connect(setButton, SIGNAL(clicked()), this, SLOT(setParameters()));
lm's avatar
lm committed
92
    horizontalLayout->addWidget(setButton, 2, 1);
93

94
    QPushButton* writeButton = new QPushButton(tr("Write (ROM)"));
95 96
    writeButton->setToolTip(tr("Copy current parameters in non-permanent memory of the aircraft to permanent memory. Transmit your parameters first to write these."));
    writeButton->setWhatsThis(tr("Copy current parameters in non-permanent memory of the aircraft to permanent memory. Transmit your parameters first to write these."));
97
    connect(writeButton, SIGNAL(clicked()), this, SLOT(writeParameters()));
lm's avatar
lm committed
98
    horizontalLayout->addWidget(writeButton, 2, 2);
99

100
    QPushButton* loadFileButton = new QPushButton(tr("Load File"));
101 102
    loadFileButton->setToolTip(tr("Load parameters from a file on this computer in the view. To write them to the aircraft, use transmit after loading them."));
    loadFileButton->setWhatsThis(tr("Load parameters from a file on this computer in the view. To write them to the aircraft, use transmit after loading them."));
103
    connect(loadFileButton, SIGNAL(clicked()), this, SLOT(loadParametersFromFile()));
lm's avatar
lm committed
104
    horizontalLayout->addWidget(loadFileButton, 3, 0);
105 106

    QPushButton* saveFileButton = new QPushButton(tr("Save File"));
107 108
    saveFileButton->setToolTip(tr("Save parameters in this view to a file on this computer."));
    saveFileButton->setWhatsThis(tr("Save parameters in this view to a file on this computer."));
109
    connect(saveFileButton, SIGNAL(clicked()), this, SLOT(saveParametersToFile()));
lm's avatar
lm committed
110 111 112 113 114 115 116
    horizontalLayout->addWidget(saveFileButton, 3, 1);

    QPushButton* readButton = new QPushButton(tr("Read (ROM)"));
    readButton->setToolTip(tr("Copy parameters from permanent memory to non-permanent current memory of aircraft. DOES NOT update the parameters in this view, click refresh after copying them to get them."));
    readButton->setWhatsThis(tr("Copy parameters from permanent memory to non-permanent current memory of aircraft. DOES NOT update the parameters in this view, click refresh after copying them to get them."));
    connect(readButton, SIGNAL(clicked()), this, SLOT(readParameters()));
    horizontalLayout->addWidget(readButton, 3, 2);
117

118 119 120 121 122 123
    // Set correct vertical scaling
    horizontalLayout->setRowStretch(0, 100);
    horizontalLayout->setRowStretch(1, 10);
    horizontalLayout->setRowStretch(2, 10);
    horizontalLayout->setRowStretch(3, 10);

124
    // Set layout
pixhawk's avatar
pixhawk committed
125 126 127 128 129 130 131 132
    this->setLayout(horizontalLayout);

    // Set header
    QStringList headerItems;
    headerItems.append("Parameter");
    headerItems.append("Value");
    tree->setHeaderLabels(headerItems);
    tree->setColumnCount(2);
133
    tree->setExpandsOnDoubleClick(true);
134 135

    // Connect signals/slots
tstellanova's avatar
tstellanova committed
136 137 138 139
//    connect(this, SIGNAL(parameterChanged(int,QString,QVariant)),
//            mav, SLOT(setParameter(int,QString,QVariant)));
    connect(tree, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
            this, SLOT(parameterItemChanged(QTreeWidgetItem*,int)));
lm's avatar
lm committed
140

tstellanova's avatar
tstellanova committed
141 142
//    // New parameters from UAS
//    connect(uas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)), this, SLOT(receivedParameterUpdate(int,int,int,int,QString,QVariant)));
143

tstellanova's avatar
tstellanova committed
144

tstellanova's avatar
tstellanova committed
145
//    connect(&retransmissionTimer, SIGNAL(timeout()), this, SLOT(retransmissionGuardTick()));
tstellanova's avatar
tstellanova committed
146 147 148
//    connect(this, SIGNAL(requestParameter(int,QString)), uas, SLOT(requestParameter(int,QString)));
//    connect(this, SIGNAL(requestParameter(int,int)), uas, SLOT(requestParameter(int,int)));

tstellanova's avatar
tstellanova committed
149 150 151 152 153 154 155 156

    connect(paramDataModel, SIGNAL(parameterUpdated(int, QString , QVariant )),
            this, SLOT(handleParameterUpdate(int,QString,QVariant)));

    // Listen for param list reload finished
    connect(paramCommsMgr, SIGNAL(parameterListUpToDate()),
            this, SLOT(handleParameterListUpToDate()));

157 158 159
    connect(paramCommsMgr, SIGNAL(parameterStatusMsgUpdated(QString,int)),
            this, SLOT(handleParamStatusMsgUpdate(QString , int )));

160
    // Get parameters
tstellanova's avatar
tstellanova committed
161
    if (uas) {
162
        requestAllParamsUpdate();
tstellanova's avatar
tstellanova committed
163
    }
pixhawk's avatar
pixhawk committed
164 165
}

tstellanova's avatar
tstellanova committed
166

167 168


169 170


lm's avatar
lm committed
171

tstellanova's avatar
tstellanova committed
172
void QGCParamWidget::addComponentItem( int compId, QString compName)
pixhawk's avatar
pixhawk committed
173
{
tstellanova's avatar
tstellanova committed
174
    if (componentItems->contains(compId)) {
pixhawk's avatar
pixhawk committed
175
        // Update existing
tstellanova's avatar
tstellanova committed
176
        componentItems->value(compId)->setData(0, Qt::DisplayRole, QString("%1 (#%2)").arg(compName).arg(compId));
177
        //components->value(component)->setData(1, Qt::DisplayRole, QString::number(component));
tstellanova's avatar
tstellanova committed
178
        componentItems->value(compId)->setFirstColumnSpanned(true);
179
    } else {
pixhawk's avatar
pixhawk committed
180
        // Add new
tstellanova's avatar
tstellanova committed
181
        QStringList list(QString("%1 (#%2)").arg(compName).arg(compId));
pixhawk's avatar
pixhawk committed
182
        QTreeWidgetItem* comp = new QTreeWidgetItem(list);
lm's avatar
lm committed
183
        comp->setFirstColumnSpanned(true);
tstellanova's avatar
tstellanova committed
184
        componentItems->insert(compId, comp);
pixhawk's avatar
pixhawk committed
185
        // Create grouping and update maps
tstellanova's avatar
tstellanova committed
186
        paramGroups.insert(compId, new QMap<QString, QTreeWidgetItem*>());
pixhawk's avatar
pixhawk committed
187 188 189
        tree->addTopLevelItem(comp);
        tree->update();
    }
190

tstellanova's avatar
tstellanova committed
191 192
    //TODO it seems unlikely that the UI would know about a component before the data model...
    paramDataModel->addComponent(compId);
193

pixhawk's avatar
pixhawk committed
194 195
}

tstellanova's avatar
tstellanova committed
196

tstellanova's avatar
tstellanova committed
197
void QGCParamWidget::handleParameterUpdate(int componentId, const QString& paramName, QVariant value)
lm's avatar
lm committed
198
{
tstellanova's avatar
tstellanova committed
199 200
    updateParameterDisplay(componentId, paramName, value);
}
201

202

tstellanova's avatar
tstellanova committed
203
void QGCParamWidget::handleParameterListUpToDate()
tstellanova's avatar
tstellanova committed
204
{
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
    tree->collapseAll();

    //rewrite the component item tree after receiving the full list
    QMap<int, QMap<QString, QVariant>*>::iterator i;
    QMap<int, QMap<QString, QVariant>*>* onboardParams = paramDataModel->getOnboardParameters();

    for (i = onboardParams->begin(); i != onboardParams->end(); ++i) {
        int compId = i.key();
        QMap<QString, QVariant>* paramPairs = onboardParams->value(compId);
        QMap<QString, QVariant>::iterator j;
        for (j = paramPairs->begin(); j != paramPairs->end(); j++) {
            updateParameterDisplay(compId, j.key(),j.value());
        }
    }

tstellanova's avatar
tstellanova committed
220 221
    // Expand visual tree
    tree->expandItem(tree->topLevelItem(0));
lm's avatar
lm committed
222 223
}

224

tstellanova's avatar
tstellanova committed
225 226
void QGCParamWidget::updateParameterDisplay(int componentId, QString parameterName, QVariant value)
{
227

228 229 230
//    QString ptrStr;
//    ptrStr.sprintf("%8p", this);
//    qDebug() <<  "QGCParamWidget " << ptrStr << " got param" <<  parameterName;
231

232
    // Reference to item in tree
233
    QTreeWidgetItem* parameterItem = NULL;
pixhawk's avatar
pixhawk committed
234 235

    // Get component
236 237
    if (!componentItems->contains(componentId)) {
        QString componentName = tr("Component #%1").arg(componentId);
tstellanova's avatar
tstellanova committed
238
        addComponentItem(componentId, componentName);
pixhawk's avatar
pixhawk committed
239
    }
240

tstellanova's avatar
tstellanova committed
241 242 243
    //TODO this should be bubbling up from the model, not vice-versa, right?
//    // Replace value in data model
//    paramDataModel->handleParameterUpdate(componentId,parameterName,value);
244 245


pixhawk's avatar
pixhawk committed
246 247
    QString splitToken = "_";
    // Check if auto-grouping can work
lm's avatar
lm committed
248 249
    if (parameterName.contains(splitToken))
    {
pixhawk's avatar
pixhawk committed
250
        QString parent = parameterName.section(splitToken, 0, 0, QString::SectionSkipEmpty);
251
        QMap<QString, QTreeWidgetItem*>* compParamGroups = paramGroups.value(componentId);
252 253
        if (!compParamGroups->contains(parent))
        {
pixhawk's avatar
pixhawk committed
254 255 256 257 258
            // Insert group item
            QStringList glist;
            glist.append(parent);
            QTreeWidgetItem* item = new QTreeWidgetItem(glist);
            compParamGroups->insert(parent, item);
259
            componentItems->value(componentId)->addChild(item);
260
        }
261 262 263 264

        // Append child to group
        bool found = false;
        QTreeWidgetItem* parentItem = compParamGroups->value(parent);
265
        for (int i = 0; i < parentItem->childCount(); i++) {
266 267
            QTreeWidgetItem* child = parentItem->child(i);
            QString key = child->data(0, Qt::DisplayRole).toString();
tstellanova's avatar
tstellanova committed
268
            if (key == parameterName)  {
269 270
                //qDebug() << "UPDATED CHILD";
                parameterItem = child;
tstellanova's avatar
tstellanova committed
271
                if (value.type() == QVariant::Char) {
272 273
                    parameterItem->setData(1, Qt::DisplayRole, value.toUInt());
                }
tstellanova's avatar
tstellanova committed
274
                else {
275 276
                    parameterItem->setData(1, Qt::DisplayRole, value);
                }
277 278 279 280
                found = true;
            }
        }

tstellanova's avatar
tstellanova committed
281
        if (!found) {
282 283 284
            // Insert parameter into map
            QStringList plist;
            plist.append(parameterName);
285
            // CREATE PARAMETER ITEM
286
            parameterItem = new QTreeWidgetItem(plist);
287
            // CONFIGURE PARAMETER ITEM
tstellanova's avatar
tstellanova committed
288
            if (value.type() == QVariant::Char) {
289 290
                parameterItem->setData(1, Qt::DisplayRole, value.toUInt());
            }
tstellanova's avatar
tstellanova committed
291
            else {
292 293
                parameterItem->setData(1, Qt::DisplayRole, value);
            }
294 295

            compParamGroups->value(parent)->addChild(parameterItem);
lm's avatar
lm committed
296
            parameterItem->setFlags(parameterItem->flags() | Qt::ItemIsEditable);
297
        }
lm's avatar
lm committed
298
    }
tstellanova's avatar
tstellanova committed
299
    else  {
pixhawk's avatar
pixhawk committed
300
        bool found = false;
301
        QTreeWidgetItem* parent = componentItems->value(componentId);
tstellanova's avatar
tstellanova committed
302
        for (int i = 0; i < parent->childCount(); i++) {
pixhawk's avatar
pixhawk committed
303 304
            QTreeWidgetItem* child = parent->child(i);
            QString key = child->data(0, Qt::DisplayRole).toString();
tstellanova's avatar
tstellanova committed
305
            if (key == parameterName) {
pixhawk's avatar
pixhawk committed
306
                //qDebug() << "UPDATED CHILD";
307 308
                parameterItem = child;
                parameterItem->setData(1, Qt::DisplayRole, value);
pixhawk's avatar
pixhawk committed
309 310 311 312
                found = true;
            }
        }

tstellanova's avatar
tstellanova committed
313
        if (!found) {
314 315 316
            // Insert parameter into map
            QStringList plist;
            plist.append(parameterName);
317
            // CREATE PARAMETER ITEM
318
            parameterItem = new QTreeWidgetItem(plist);
319
            // CONFIGURE PARAMETER ITEM
320
            parameterItem->setData(1, Qt::DisplayRole, value);
321

322
            componentItems->value(componentId)->addChild(parameterItem);
lm's avatar
lm committed
323
            parameterItem->setFlags(parameterItem->flags() | Qt::ItemIsEditable);
pixhawk's avatar
pixhawk committed
324
        }
325
        //tree->expandAll();
326
    }
327
    // Reset background color
328
    parameterItem->setBackground(0, Qt::NoBrush);
329
    parameterItem->setBackground(1, Qt::NoBrush);
lm's avatar
lm committed
330
    // Add tooltip
331
    QString paramDesc = paramDataModel->getParamDescription(parameterName);
332
    QString tooltipFormat;
333
    if (paramDataModel->isParamDefaultKnown(parameterName)) {
334
        tooltipFormat = tr("Default: %1, %2");
335 336
        double paramDefValue = paramDataModel->getParamDefault(parameterName);
        tooltipFormat = tooltipFormat.arg(paramDefValue).arg(paramDesc);
337
    }
338 339
    else {
        tooltipFormat = paramDesc;
340 341 342
    }
    parameterItem->setToolTip(0, tooltipFormat);
    parameterItem->setToolTip(1, tooltipFormat);
lm's avatar
lm committed
343

tstellanova's avatar
tstellanova committed
344
    //paramDataModel->handleParameterUpdate(componentId,parameterName,value);
345

pixhawk's avatar
pixhawk committed
346 347
}

lm's avatar
lm committed
348

349

350
void QGCParamWidget::parameterItemChanged(QTreeWidgetItem* current, int column)
lm's avatar
lm committed
351
{
352
    if (current && column > 0) {
353
        QTreeWidgetItem* parent = current->parent();
354
        while (parent->parent() != NULL) {
355 356 357
            parent = parent->parent();
        }
        // Parent is now top-level component
358
        int componentId = componentItems->key(parent);
359

360 361 362 363 364 365 366 367 368
        QString key = current->data(0, Qt::DisplayRole).toString();
        QVariant value = current->data(1, Qt::DisplayRole);
        // Set parameter on changed list to be transmitted to MAV
        QPalette pal = statusLabel->palette();
        pal.setColor(backgroundRole(), QGC::colorOrange);
        statusLabel->setPalette(pal);
        statusLabel->setText(tr("Transmit pend. %1:%2: %3").arg(componentId).arg(key).arg(value.toFloat(), 5, 'f', 1, QChar(' ')));
        //qDebug() << "PARAM CHANGED: COMP:" << key << "KEY:" << str << "VALUE:" << value;
        // Changed values list
369

370
        bool changed = paramDataModel->addPendingIfParameterChanged(componentId,key,value);
371

372 373 374 375 376 377
        // If the value was numerically changed, display it differently
        if (changed) {
            current->setBackground(0, QBrush(QColor(QGC::colorOrange)));
            current->setBackground(1, QBrush(QColor(QGC::colorOrange)));

            //TODO this seems incorrect-- we're pre-updating the onboard value before we've received confirmation
378
            //paramDataModel->setOnboardParameterWithType(componentId,key,value);
379
        }
380

381 382 383
    }
}

384 385


386
void QGCParamWidget::saveParametersToFile()
387
{
388
    if (!mav) return;
389 390
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "./parameters.txt", tr("Parameter File (*.txt)"));
    QFile file(fileName);
391
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
392 393 394
        return;
    }

395 396
    QTextStream outstream(&file);
    paramDataModel->writeOnboardParametersToStream(outstream,mav->getUASName());
397 398 399
    file.close();
}

400 401

void QGCParamWidget::loadParametersFromFile()
402
{
403
    if (!mav) return;
404 405 406 407 408 409
    QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"), ".", tr("Parameter file (*.txt)"));
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QTextStream in(&file);
410
    paramDataModel->readUpdateParametersFromStream(in);
411
    file.close();
lm's avatar
lm committed
412 413
}

tstellanova's avatar
tstellanova committed
414
void QGCParamWidget::setParameterStatusMsg(const QString& msg)
415
{
tstellanova's avatar
tstellanova committed
416 417 418
    statusLabel->setText(msg);
}

419
void QGCParamWidget::requestAllParamsUpdate()
tstellanova's avatar
tstellanova committed
420 421 422
{
    if (!mav) {
        return;
423
    }
tstellanova's avatar
tstellanova committed
424 425 426 427 428

    // Clear view and request param list
    clear();

    requestParameterList();
429 430
}

lm's avatar
lm committed
431

tstellanova's avatar
tstellanova committed
432 433 434 435 436 437

/**
 * Set all parameter in the parameter tree on the MAV
 */
void QGCParamWidget::setParameters()
{
tstellanova's avatar
tstellanova committed
438
    paramCommsMgr->sendPendingParameters();
439 440
}

441
/**
tstellanova's avatar
tstellanova committed
442 443
 * Write the current onboard parameters from RAM into
 * permanent storage, e.g. EEPROM or harddisk
444
 */
tstellanova's avatar
tstellanova committed
445
void QGCParamWidget::writeParameters()
446
{
tstellanova's avatar
tstellanova committed
447 448 449
    int changedParamCount = 0;

    QMap<int, QMap<QString, QVariant>*>::iterator i;
450
    QMap<int, QMap<QString, QVariant>*>* changedValues = paramDataModel->getPendingParameters();
tstellanova's avatar
tstellanova committed
451

452
    for (i = changedValues->begin(); (i != changedValues->end()) && (0 == changedParamCount);  ++i) {
tstellanova's avatar
tstellanova committed
453
        // Iterate through the parameters of the component
tstellanova's avatar
tstellanova committed
454 455
        QMap<QString, QVariant>* compPending = i.value();
        changedParamCount += compPending->count();
tstellanova's avatar
tstellanova committed
456
    }
457

tstellanova's avatar
tstellanova committed
458
    if (changedParamCount > 0) {
tstellanova's avatar
tstellanova committed
459 460 461 462
        QMessageBox msgBox;
        msgBox.setText(tr("There are locally changed parameters. Please transmit them first (<TRANSMIT>) or update them with the onboard values (<REFRESH>) before storing onboard from RAM to ROM."));
        msgBox.exec();
    }
tstellanova's avatar
tstellanova committed
463 464
    else {
        paramCommsMgr->writeParamsToPersistentStorage();
tstellanova's avatar
tstellanova committed
465 466
    }
}
467

468

469 470
void QGCParamWidget::readParameters()
{
471
    if (!mav) return;
472
    mav->readParametersFromStorage();
473 474
}

475 476 477
/**
 * Clear all data in the parameter widget
 */
pixhawk's avatar
pixhawk committed
478 479 480
void QGCParamWidget::clear()
{
    tree->clear();
481
    componentItems->clear();
pixhawk's avatar
pixhawk committed
482
}
tstellanova's avatar
tstellanova committed
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499

void QGCParamWidget::handleParamStatusMsgUpdate(QString msg, int level)
{
    QColor bgColor = QGC::colorGreen;
    if ((int)UASParameterCommsMgr::ParamCommsStatusLevel_Warning == level) {
        bgColor = QGC::colorOrange;
    }
    else if ((int)UASParameterCommsMgr::ParamCommsStatusLevel_Error == level) {
        bgColor =  QGC::colorRed;
    }

    QPalette pal = statusLabel->palette();
    pal.setColor(backgroundRole(), bgColor);
    statusLabel->setPalette(pal);
    statusLabel->setText(msg);

}