QGCParamWidget.cc 20.3 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
{
    // Expand visual tree
    tree->expandItem(tree->topLevelItem(0));
lm's avatar
lm committed
207 208
}

209

tstellanova's avatar
tstellanova committed
210 211
void QGCParamWidget::updateParameterDisplay(int componentId, QString parameterName, QVariant value)
{
212

213 214 215
//    QString ptrStr;
//    ptrStr.sprintf("%8p", this);
//    qDebug() <<  "QGCParamWidget " << ptrStr << " got param" <<  parameterName;
216

217
    // Reference to item in tree
218
    QTreeWidgetItem* parameterItem = NULL;
pixhawk's avatar
pixhawk committed
219 220

    // Get component
221 222
    if (!componentItems->contains(componentId)) {
        QString componentName = tr("Component #%1").arg(componentId);
tstellanova's avatar
tstellanova committed
223
        addComponentItem(componentId, componentName);
pixhawk's avatar
pixhawk committed
224
    }
225

tstellanova's avatar
tstellanova committed
226 227 228
    //TODO this should be bubbling up from the model, not vice-versa, right?
//    // Replace value in data model
//    paramDataModel->handleParameterUpdate(componentId,parameterName,value);
229 230


pixhawk's avatar
pixhawk committed
231 232
    QString splitToken = "_";
    // Check if auto-grouping can work
lm's avatar
lm committed
233 234
    if (parameterName.contains(splitToken))
    {
pixhawk's avatar
pixhawk committed
235
        QString parent = parameterName.section(splitToken, 0, 0, QString::SectionSkipEmpty);
236
        QMap<QString, QTreeWidgetItem*>* compParamGroups = paramGroups.value(componentId);
237 238
        if (!compParamGroups->contains(parent))
        {
pixhawk's avatar
pixhawk committed
239 240 241 242 243
            // Insert group item
            QStringList glist;
            glist.append(parent);
            QTreeWidgetItem* item = new QTreeWidgetItem(glist);
            compParamGroups->insert(parent, item);
244
            componentItems->value(componentId)->addChild(item);
245
        }
246 247 248 249

        // Append child to group
        bool found = false;
        QTreeWidgetItem* parentItem = compParamGroups->value(parent);
250
        for (int i = 0; i < parentItem->childCount(); i++) {
251 252
            QTreeWidgetItem* child = parentItem->child(i);
            QString key = child->data(0, Qt::DisplayRole).toString();
tstellanova's avatar
tstellanova committed
253
            if (key == parameterName)  {
254 255
                //qDebug() << "UPDATED CHILD";
                parameterItem = child;
tstellanova's avatar
tstellanova committed
256
                if (value.type() == QVariant::Char) {
257 258
                    parameterItem->setData(1, Qt::DisplayRole, value.toUInt());
                }
tstellanova's avatar
tstellanova committed
259
                else {
260 261
                    parameterItem->setData(1, Qt::DisplayRole, value);
                }
262 263 264 265
                found = true;
            }
        }

tstellanova's avatar
tstellanova committed
266
        if (!found) {
267 268 269
            // Insert parameter into map
            QStringList plist;
            plist.append(parameterName);
270
            // CREATE PARAMETER ITEM
271
            parameterItem = new QTreeWidgetItem(plist);
272
            // CONFIGURE PARAMETER ITEM
tstellanova's avatar
tstellanova committed
273
            if (value.type() == QVariant::Char) {
274 275
                parameterItem->setData(1, Qt::DisplayRole, value.toUInt());
            }
tstellanova's avatar
tstellanova committed
276
            else {
277 278
                parameterItem->setData(1, Qt::DisplayRole, value);
            }
279 280

            compParamGroups->value(parent)->addChild(parameterItem);
lm's avatar
lm committed
281
            parameterItem->setFlags(parameterItem->flags() | Qt::ItemIsEditable);
282
        }
lm's avatar
lm committed
283
    }
tstellanova's avatar
tstellanova committed
284
    else  {
pixhawk's avatar
pixhawk committed
285
        bool found = false;
286
        QTreeWidgetItem* parent = componentItems->value(componentId);
tstellanova's avatar
tstellanova committed
287
        for (int i = 0; i < parent->childCount(); i++) {
pixhawk's avatar
pixhawk committed
288 289
            QTreeWidgetItem* child = parent->child(i);
            QString key = child->data(0, Qt::DisplayRole).toString();
tstellanova's avatar
tstellanova committed
290
            if (key == parameterName) {
pixhawk's avatar
pixhawk committed
291
                //qDebug() << "UPDATED CHILD";
292 293
                parameterItem = child;
                parameterItem->setData(1, Qt::DisplayRole, value);
pixhawk's avatar
pixhawk committed
294 295 296 297
                found = true;
            }
        }

tstellanova's avatar
tstellanova committed
298
        if (!found) {
299 300 301
            // Insert parameter into map
            QStringList plist;
            plist.append(parameterName);
302
            // CREATE PARAMETER ITEM
303
            parameterItem = new QTreeWidgetItem(plist);
304
            // CONFIGURE PARAMETER ITEM
305
            parameterItem->setData(1, Qt::DisplayRole, value);
306

307
            componentItems->value(componentId)->addChild(parameterItem);
lm's avatar
lm committed
308
            parameterItem->setFlags(parameterItem->flags() | Qt::ItemIsEditable);
pixhawk's avatar
pixhawk committed
309
        }
310
        //tree->expandAll();
311
    }
312
    // Reset background color
313
    parameterItem->setBackground(0, Qt::NoBrush);
314
    parameterItem->setBackground(1, Qt::NoBrush);
lm's avatar
lm committed
315
    // Add tooltip
316
    QString paramDesc = paramDataModel->getParamDescription(parameterName);
317
    QString tooltipFormat;
318
    if (paramDataModel->isParamDefaultKnown(parameterName)) {
319
        tooltipFormat = tr("Default: %1, %2");
320 321
        double paramDefValue = paramDataModel->getParamDefault(parameterName);
        tooltipFormat = tooltipFormat.arg(paramDefValue).arg(paramDesc);
322
    }
323 324
    else {
        tooltipFormat = paramDesc;
325 326 327
    }
    parameterItem->setToolTip(0, tooltipFormat);
    parameterItem->setToolTip(1, tooltipFormat);
lm's avatar
lm committed
328

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

pixhawk's avatar
pixhawk committed
331 332
}

lm's avatar
lm committed
333

334

335
void QGCParamWidget::parameterItemChanged(QTreeWidgetItem* current, int column)
lm's avatar
lm committed
336
{
337
    if (current && column > 0) {
338
        QTreeWidgetItem* parent = current->parent();
339
        while (parent->parent() != NULL) {
340 341 342
            parent = parent->parent();
        }
        // Parent is now top-level component
343
        int componentId = componentItems->key(parent);
344

345 346 347 348 349 350 351 352 353
        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
354

355
        bool changed = paramDataModel->addPendingIfParameterChanged(componentId,key,value);
356

357 358 359 360 361 362
        // 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
363
            //paramDataModel->setOnboardParameterWithType(componentId,key,value);
364
        }
365

366 367 368
    }
}

369 370


371
void QGCParamWidget::saveParametersToFile()
372
{
373
    if (!mav) return;
374 375
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "./parameters.txt", tr("Parameter File (*.txt)"));
    QFile file(fileName);
376
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
377 378 379
        return;
    }

380 381
    QTextStream outstream(&file);
    paramDataModel->writeOnboardParametersToStream(outstream,mav->getUASName());
382 383 384
    file.close();
}

385 386

void QGCParamWidget::loadParametersFromFile()
387
{
388
    if (!mav) return;
389 390 391 392 393 394
    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);
395
    paramDataModel->readUpdateParametersFromStream(in);
396
    file.close();
lm's avatar
lm committed
397 398
}

tstellanova's avatar
tstellanova committed
399
void QGCParamWidget::setParameterStatusMsg(const QString& msg)
400
{
tstellanova's avatar
tstellanova committed
401 402 403
    statusLabel->setText(msg);
}

404
void QGCParamWidget::requestAllParamsUpdate()
tstellanova's avatar
tstellanova committed
405 406 407
{
    if (!mav) {
        return;
408
    }
tstellanova's avatar
tstellanova committed
409 410 411 412 413

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

    requestParameterList();
414 415
}

lm's avatar
lm committed
416

tstellanova's avatar
tstellanova committed
417 418 419 420 421 422

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

426
/**
tstellanova's avatar
tstellanova committed
427 428
 * Write the current onboard parameters from RAM into
 * permanent storage, e.g. EEPROM or harddisk
429
 */
tstellanova's avatar
tstellanova committed
430
void QGCParamWidget::writeParameters()
431
{
tstellanova's avatar
tstellanova committed
432 433 434 435 436
    int changedParamCount = 0;

    QMap<int, QMap<QString, QVariant>*>::iterator i;
    QMap<int, QMap<QString, QVariant>*> changedValues = paramDataModel->getPendingParameters();

tstellanova's avatar
tstellanova committed
437
    for (i = changedValues.begin(); i != changedValues.end() , (0 == changedParamCount);  ++i) {
tstellanova's avatar
tstellanova committed
438
        // Iterate through the parameters of the component
tstellanova's avatar
tstellanova committed
439 440
        QMap<QString, QVariant>* compPending = i.value();
        changedParamCount += compPending->count();
tstellanova's avatar
tstellanova committed
441
    }
442

tstellanova's avatar
tstellanova committed
443
    if (changedParamCount > 0) {
tstellanova's avatar
tstellanova committed
444 445 446 447
        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
448 449
    else {
        paramCommsMgr->writeParamsToPersistentStorage();
tstellanova's avatar
tstellanova committed
450 451
    }
}
452

453 454 455 456 457
/**
 * @param component the subsystem which has the parameter
 * @param parameterName name of the parameter, as delivered by the system
 * @param value value of the parameter
 */
tstellanova's avatar
tstellanova committed
458 459
//void QGCParamWidget::setParameter(int component, QString parameterName, QVariant value)
//{
460

tstellanova's avatar
tstellanova committed
461 462 463
//    if (parameterName.isEmpty()) {
//        return;
//    }
464

tstellanova's avatar
tstellanova committed
465
//    double dblValue = value.toDouble();
466

tstellanova's avatar
tstellanova committed
467 468 469 470 471 472 473 474 475 476 477 478 479 480
//    if (paramDataModel->isValueLessThanParamMin(parameterName,dblValue)) {
//        statusLabel->setText(tr("REJ. %1, %2 < min").arg(parameterName).arg(dblValue));
//        return;
//    }
//    if (paramDataModel->isValueGreaterThanParamMax(parameterName,dblValue)) {
//        statusLabel->setText(tr("REJ. %1, %2 > max").arg(parameterName).arg(dblValue));
//        return;
//    }
//    QVariant onboardVal;
//    paramDataModel->getOnboardParameterValue(component,parameterName,onboardVal);
//    if (onboardVal == value) {
//        statusLabel->setText(tr("REJ. %1 already %2").arg(parameterName).arg(dblValue));
//        return;
//    }
481

tstellanova's avatar
tstellanova committed
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
//    //int paramType = (int)onboardParameters.value(component)->value(parameterName).type();
//    int paramType = (int)value.type();
//    switch (paramType)
//    {
//    case QVariant::Char:
//    {
//        QVariant fixedValue(QChar((unsigned char)value.toInt()));
//        emit parameterChanged(component, parameterName, fixedValue);
//        //qDebug() << "PARAM WIDGET SENT:" << fixedValue;
//    }
//        break;
//    case QVariant::Int:
//    {
//        QVariant fixedValue(value.toInt());
//        emit parameterChanged(component, parameterName, fixedValue);
//        //qDebug() << "PARAM WIDGET SENT:" << fixedValue;
//    }
//        break;
//    case QVariant::UInt:
//    {
//        QVariant fixedValue(value.toUInt());
//        emit parameterChanged(component, parameterName, fixedValue);
//        //qDebug() << "PARAM WIDGET SENT:" << fixedValue;
//    }
//        break;
//    case QMetaType::Float:
//    {
//        QVariant fixedValue(value.toFloat());
//        emit parameterChanged(component, parameterName, fixedValue);
//        //qDebug() << "PARAM WIDGET SENT:" << fixedValue;
//    }
//        break;
//    default:
//        qCritical() << "ABORTED PARAM SEND, NO VALID QVARIANT TYPE";
//        return;
//    }
lm's avatar
lm committed
518

tstellanova's avatar
tstellanova committed
519 520 521 522 523 524
//    // Wait for parameter to be written back
//    // mark it therefore as missing
//    if (!transmissionMissingWriteAckPackets.contains(component))
//    {
//        transmissionMissingWriteAckPackets.insert(component, new QMap<QString, QVariant>());
//    }
lm's avatar
lm committed
525

tstellanova's avatar
tstellanova committed
526 527
//    // Insert it in missing write ACK list
//    transmissionMissingWriteAckPackets.value(component)->insert(parameterName, value);
Lorenz Meier's avatar
Lorenz Meier committed
528

tstellanova's avatar
tstellanova committed
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
//    // Set timeouts
//    if (transmissionActive)
//    {
//        transmissionTimeout += rewriteTimeout;
//    }
//    else
//    {
//        quint64 newTransmissionTimeout = QGC::groundTimeMilliseconds() + rewriteTimeout;
//        if (newTransmissionTimeout > transmissionTimeout)
//        {
//            transmissionTimeout = newTransmissionTimeout;
//        }
//        transmissionActive = true;
//    }

//    // Enable guard / reset timeouts
//    paramCommsMgr->setRetransmissionGuardEnabled(true); //TODO
//}
547

548 549
void QGCParamWidget::readParameters()
{
550
    if (!mav) return;
551
    mav->readParametersFromStorage();
552 553
}

554 555 556
/**
 * Clear all data in the parameter widget
 */
pixhawk's avatar
pixhawk committed
557 558 559
void QGCParamWidget::clear()
{
    tree->clear();
560
    componentItems->clear();
pixhawk's avatar
pixhawk committed
561
}
tstellanova's avatar
tstellanova committed
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578

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);

}