QGCParamWidget.cc 7.05 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 26 27 28 29 30 31
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009, 2010 QGROUNDCONTROL/PIXHAWK PROJECT
<http://www.qgroundcontrol.org>
<http://pixhawk.ethz.ch>

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

32 33
#include <QGridLayout>
#include <QPushButton>
pixhawk's avatar
pixhawk committed
34 35 36 37 38

#include "QGCParamWidget.h"
#include "UASInterface.h"
#include <QDebug>

39 40 41 42
/**
 * @param uas MAV to set the parameters on
 * @param parent Parent widget
 */
pixhawk's avatar
pixhawk committed
43
QGCParamWidget::QGCParamWidget(UASInterface* uas, QWidget *parent) :
44 45 46
        QWidget(parent),
        mav(uas),
        components(new QMap<int, QTreeWidgetItem*>())
pixhawk's avatar
pixhawk committed
47 48 49
{
    // Create tree widget
    tree = new QTreeWidget(this);
50
    tree->setColumnWidth(0, 150);
pixhawk's avatar
pixhawk committed
51 52

    // Set tree widget as widget onto this component
53
    QGridLayout* horizontalLayout;
pixhawk's avatar
pixhawk committed
54
    //form->setAutoFillBackground(false);
55 56
    horizontalLayout = new QGridLayout(this);
    horizontalLayout->setSpacing(6);
pixhawk's avatar
pixhawk committed
57 58 59
    horizontalLayout->setMargin(0);
    horizontalLayout->setSizeConstraint(QLayout::SetMinimumSize);

60 61 62 63 64 65 66 67 68 69 70 71 72 73
    horizontalLayout->addWidget(tree, 0, 0, 1, 3);
    QPushButton* readButton = new QPushButton(tr("Read"));
    connect(readButton, SIGNAL(clicked()), this, SLOT(requestParameterList()));
    horizontalLayout->addWidget(readButton, 1, 0);

    QPushButton* setButton = new QPushButton(tr("Set (RAM)"));
    connect(setButton, SIGNAL(clicked()), this, SLOT(setParameters()));
    horizontalLayout->addWidget(setButton, 1, 1);

    QPushButton* writeButton = new QPushButton(tr("Write (Disk)"));
    connect(writeButton, SIGNAL(clicked()), this, SLOT(writeParameters()));
    horizontalLayout->addWidget(writeButton, 1, 2);

    // Set layout
pixhawk's avatar
pixhawk committed
74 75 76 77 78 79 80 81
    this->setLayout(horizontalLayout);

    // Set header
    QStringList headerItems;
    headerItems.append("Parameter");
    headerItems.append("Value");
    tree->setHeaderLabels(headerItems);
    tree->setColumnCount(2);
82 83 84

    // Connect signals/slots
    connect(this, SIGNAL(parameterChanged(int,QString,float)), mav, SLOT(setParameter(int,QString,float)));
lm's avatar
lm committed
85 86
    connect(tree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(parameterItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));

87 88
    // New parameters from UAS
    connect(uas, SIGNAL(parameterChanged(int,int,QString,float)), this, SLOT(addParameter(int,int,QString,float)));
pixhawk's avatar
pixhawk committed
89 90
}

91 92 93 94
/**
 * @return The MAV of this widget. Unless the MAV object has been destroyed, this
 *         pointer is never zero.
 */
pixhawk's avatar
pixhawk committed
95 96 97 98 99 100 101 102 103 104 105
UASInterface* QGCParamWidget::getUAS()
{
    return mav;
}

/**
 *
 * @param uas System which has the component
 * @param component id of the component
 * @param componentName human friendly name of the component
 */
106
void QGCParamWidget::addComponent(int uas, int component, QString componentName)
pixhawk's avatar
pixhawk committed
107
{
108
    Q_UNUSED(uas);
pixhawk's avatar
pixhawk committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122
    QStringList list;
    list.append(componentName);
    list.append(QString::number(component));
    QTreeWidgetItem* comp = new QTreeWidgetItem(list);
    bool updated = false;
    if (components->contains(component)) updated = true;
    components->insert(component, comp);
    if (!updated)
    {
        tree->addTopLevelItem(comp);
        tree->update();
    }
}

123 124 125 126 127 128
/**
 * @param uas System which has the component
 * @param component id of the component
 * @param parameterName human friendly name of the parameter
 */
void QGCParamWidget::addParameter(int uas, int component, QString parameterName, float value)
pixhawk's avatar
pixhawk committed
129
{
130
    Q_UNUSED(uas);
pixhawk's avatar
pixhawk committed
131 132 133 134 135 136 137 138 139 140
    // Insert parameter into map
    //tree->appendParam(component, parameterName, value);
    QStringList plist;
    plist.append(parameterName);
    plist.append(QString::number(value));
    QTreeWidgetItem* item = new QTreeWidgetItem(plist);

    // Get component
    if (!components->contains(component))
    {
141
        addComponent(uas, component, "Component #" + QString::number(component));
pixhawk's avatar
pixhawk committed
142 143
    }
    components->value(component)->addChild(item);
144 145 146
    item->setFlags(item->flags() | Qt::ItemIsEditable);
    //connect(item, SIGNAL())
    tree->expandAll();
pixhawk's avatar
pixhawk committed
147 148 149
    tree->update();
}

150 151 152 153
/**
 * Send a request to deliver the list of onboard parameters
 * to the MAV.
 */
154 155
void QGCParamWidget::requestParameterList()
{
lm's avatar
lm committed
156
    // Clear view and request param list
157
    clear();
lm's avatar
lm committed
158
    mav->requestParameters();
159 160
}

lm's avatar
lm committed
161 162 163 164 165 166 167 168 169
void QGCParamWidget::parameterItemChanged(QTreeWidgetItem* prev, QTreeWidgetItem* curr)
{
    int key;
    if (!changedValues->contains(key))
    {

    }
}

170 171 172 173 174 175 176
/**
 * @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
 */
void QGCParamWidget::setParameter(int component, QString parameterName, float value)
{
177
    emit parameterChanged(component, parameterName, value);
178 179
}

180 181 182
/**
 * Set all parameter in the parameter tree on the MAV
 */
183 184 185 186
void QGCParamWidget::setParameters()
{
    //mav->setParameter(component, parameterName, value);
    // Iterate through all components, through all parameters and emit them
lm's avatar
lm committed
187 188
    QMap<int, QTreeWidgetItem*>::iterator i;
    // Iterate through all components / subsystems
189 190
    for (i = components->begin(); i != components->end(); ++i)
    {
lm's avatar
lm committed
191
        // Get all parameters of this component
192
        int compid = i.key();
lm's avatar
lm committed
193 194 195 196 197 198 199
        QTreeWidgetItem* item = i.value();
        for (int j = 0; j < item->childCount(); ++j)
        {
            QTreeWidgetItem* param = item->child(j);
            // First column is name, second column value
            bool ok = true;
            QString key = param->data(0, Qt::DisplayRole).toString();
200
            float value = param->data(1, Qt::DisplayRole).toDouble(&ok);
lm's avatar
lm committed
201 202 203 204 205 206 207 208 209 210 211 212
            // Send parameter to MAV
            if (ok)
            {
                emit parameterChanged(compid, key, value);
                qDebug() << "KEY:" << key << "VALUE:" << value;
            }
            else
            {
                qDebug() << __FILE__ << __LINE__ << "CONVERSION ERROR!";
            }
        }
    }
213 214
    clear();
    //mav->requestParameters();
lm's avatar
lm committed
215
    qDebug() << __FILE__ << __LINE__ << "SETTING ALL PARAMETERS";
216 217
}

218 219 220 221
/**
 * Write the current onboard parameters from RAM into
 * permanent storage, e.g. EEPROM or harddisk
 */
222 223 224 225 226
void QGCParamWidget::writeParameters()
{
    mav->writeParameters();
}

227 228 229
/**
 * Clear all data in the parameter widget
 */
pixhawk's avatar
pixhawk committed
230 231 232
void QGCParamWidget::clear()
{
    tree->clear();
lm's avatar
lm committed
233
    components->clear();
pixhawk's avatar
pixhawk committed
234
}