SerialConfigurationWindow.cc 8.18 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10 11 12 13
    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.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15 16 17 18 19
    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
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21 22 23 24 25

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

/**
 * @file
lm's avatar
lm committed
26
 *   @brief Implementation of SerialConfigurationWindow
pixhawk's avatar
pixhawk committed
27 28 29 30 31 32 33 34 35
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#include <QDebug>

#include <SerialConfigurationWindow.h>
#include <SerialLinkInterface.h>
#include <QDir>
36
#include <QSettings>
pixhawk's avatar
pixhawk committed
37 38 39
#include <QFileInfoList>

SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidget *parent, Qt::WindowFlags flags) : QWidget(parent, flags),
40
    userConfigured(false)
pixhawk's avatar
pixhawk committed
41 42 43
{
    SerialLinkInterface* serialLink = dynamic_cast<SerialLinkInterface*>(link);

44 45
    if(serialLink != 0)
    {
46
        serialLink->loadSettings();
pixhawk's avatar
pixhawk committed
47 48 49 50 51 52 53 54 55 56
        this->link = serialLink;

        // Setup the user interface according to link type
        ui.setupUi(this);

        // Create action to open this menu
        // Create configuration action for this link
        // Connect the current UAS
        action = new QAction(QIcon(":/images/devices/network-wireless.svg"), "", link);
        setLinkName(link->getName());
57 58 59

        setupPortList();

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
        // Set up baud rates
        ui.baudRate->clear();
        ui.baudRate->addItem("50", 50);
        ui.baudRate->addItem("70", 70);
        ui.baudRate->addItem("110", 110);
        ui.baudRate->addItem("134", 134);
        ui.baudRate->addItem("150", 150);
        ui.baudRate->addItem("200", 200);
        ui.baudRate->addItem("300", 300);
        ui.baudRate->addItem("600", 600);
        ui.baudRate->addItem("1200", 1200);
        ui.baudRate->addItem("1800", 1800);
        ui.baudRate->addItem("2400", 2400);
        ui.baudRate->addItem("4800", 4800);
        ui.baudRate->addItem("9600", 9600);
#ifdef Q_OS_WIN
        ui.baudRate->addItem("14400", 14400);
#endif
        ui.baudRate->addItem("19200", 19200);
LM's avatar
LM committed
79
        ui.baudRate->addItem("38400", 38400);
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
#ifdef Q_OS_WIN
        ui.baudRate->addItem("56000", 56000);
#endif
        ui.baudRate->addItem("57600", 57600);
#ifdef Q_OS_WIN
        ui.baudRate->addItem("76800", 76800);
#endif
        ui.baudRate->addItem("115200", 115200);
#ifdef Q_OS_WIN
        ui.baudRate->addItem("128000", 128000);
        ui.baudRate->addItem("230400", 230400);
        ui.baudRate->addItem("256000", 256000);
        ui.baudRate->addItem("460800", 460800);
#endif
        ui.baudRate->addItem("921600", 921600);

pixhawk's avatar
pixhawk committed
96 97 98 99 100 101 102 103
        connect(action, SIGNAL(triggered()), this, SLOT(configureCommunication()));

        // Make sure that a change in the link name will be reflected in the UI
        connect(link, SIGNAL(nameChanged(QString)), this, SLOT(setLinkName(QString)));

        // Connect the individual user interface inputs
        connect(ui.portName, SIGNAL(editTextChanged(QString)), this, SLOT(setPortName(QString)));
        connect(ui.portName, SIGNAL(currentIndexChanged(QString)), this, SLOT(setPortName(QString)));
104
        connect(ui.baudRate, SIGNAL(activated(QString)), this->link, SLOT(setBaudRateString(QString)));
pixhawk's avatar
pixhawk committed
105
        connect(ui.flowControlCheckBox, SIGNAL(toggled(bool)), this, SLOT(enableFlowControl(bool)));
lm's avatar
lm committed
106 107 108
        connect(ui.parNone, SIGNAL(toggled(bool)), this, SLOT(setParityNone(bool)));
        connect(ui.parOdd, SIGNAL(toggled(bool)), this, SLOT(setParityOdd(bool)));
        connect(ui.parEven, SIGNAL(toggled(bool)), this, SLOT(setParityEven(bool)));
109 110
        connect(ui.dataBitsSpinBox, SIGNAL(valueChanged(int)), this->link, SLOT(setDataBits(int)));
        connect(ui.stopBitsSpinBox, SIGNAL(valueChanged(int)), this->link, SLOT(setStopBits(int)));
pixhawk's avatar
pixhawk committed
111 112 113 114 115

        //connect(this->link, SIGNAL(connected(bool)), this, SLOT());
        ui.portName->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow);
        ui.baudRate->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow);

116
        switch(this->link->getParityType()) {
pixhawk's avatar
pixhawk committed
117 118 119 120 121 122 123 124 125 126 127
        case 0:
            ui.parNone->setChecked(true);
            break;
        case 1:
            ui.parOdd->setChecked(true);
            break;
        case 2:
            ui.parEven->setChecked(true);
            break;
        default:
            // Enforce default: no parity in link
lm's avatar
lm committed
128
            setParityNone(true);
pixhawk's avatar
pixhawk committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
            ui.parNone->setChecked(true);
            break;
        }

        switch(this->link->getFlowType()) {
        case 0:
            ui.flowControlCheckBox->setChecked(false);
            break;
        case 1:
            ui.flowControlCheckBox->setChecked(true);
            break;
        default:
            ui.flowControlCheckBox->setChecked(false);
            enableFlowControl(false);
        }

145
        ui.baudRate->setCurrentIndex(ui.baudRate->findText(QString("%1").arg(this->link->getBaudRate())));
pixhawk's avatar
pixhawk committed
146

147 148
        ui.dataBitsSpinBox->setValue(this->link->getDataBits());
        ui.stopBitsSpinBox->setValue(this->link->getStopBits());
pixhawk's avatar
pixhawk committed
149 150 151 152 153 154 155

        portCheckTimer = new QTimer(this);
        portCheckTimer->setInterval(1000);
        connect(portCheckTimer, SIGNAL(timeout()), this, SLOT(setupPortList()));

        // Display the widget
        this->window()->setWindowTitle(tr("Serial Communication Settings"));
156 157 158
    }
    else
    {
pixhawk's avatar
pixhawk committed
159 160 161 162
        qDebug() << "Link is NOT a serial link, can't open configuration window";
    }
}

163 164
SerialConfigurationWindow::~SerialConfigurationWindow()
{
pixhawk's avatar
pixhawk committed
165 166 167 168 169

}

void SerialConfigurationWindow::showEvent(QShowEvent* event)
{
170 171
    Q_UNUSED(event);
    portCheckTimer->start();
pixhawk's avatar
pixhawk committed
172 173 174 175
}

void SerialConfigurationWindow::hideEvent(QHideEvent* event)
{
176 177
    Q_UNUSED(event);
    portCheckTimer->stop();
pixhawk's avatar
pixhawk committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
}

QAction* SerialConfigurationWindow::getAction()
{
    return action;
}

void SerialConfigurationWindow::configureCommunication()
{
    QString selected = ui.portName->currentText();
    setupPortList();
    ui.portName->setEditText(selected);
    this->show();
}

void SerialConfigurationWindow::setupPortList()
{
195
    if (!link) return;
pixhawk's avatar
pixhawk committed
196

197 198 199 200
    if (!userConfigured)
    {
        ui.portName->clear();
        ui.portName->clearEditText();
pixhawk's avatar
pixhawk committed
201 202
    }
    // Get the ports available on this system
203
    QVector<QString>* ports = link->getCurrentPorts();
pixhawk's avatar
pixhawk committed
204 205

    // Add the ports in reverse order, because we prepend them to the list
206 207
    for (int i = ports->size() - 1; i >= 0; --i)
    {
pixhawk's avatar
pixhawk committed
208
        // Prepend newly found port to the list
209 210 211 212
        if (ui.portName->findText(ports->at(i)) == -1)
        {
            ui.portName->insertItem(0, ports->at(i));
            if (!userConfigured) ui.portName->setEditText(ports->at(i));
pixhawk's avatar
pixhawk committed
213 214 215 216
        }
    }


217
    ui.portName->setEditText(this->link->getPortName());
pixhawk's avatar
pixhawk committed
218 219 220 221
}

void SerialConfigurationWindow::enableFlowControl(bool flow)
{
222 223
    if(flow)
    {
pixhawk's avatar
pixhawk committed
224
        link->setFlowType(1);
225 226 227
    }
    else
    {
pixhawk's avatar
pixhawk committed
228 229 230 231
        link->setFlowType(0);
    }
}

lm's avatar
lm committed
232
void SerialConfigurationWindow::setParityNone(bool accept)
pixhawk's avatar
pixhawk committed
233
{
lm's avatar
lm committed
234
    if (accept) link->setParityType(0);
pixhawk's avatar
pixhawk committed
235 236
}

lm's avatar
lm committed
237
void SerialConfigurationWindow::setParityOdd(bool accept)
pixhawk's avatar
pixhawk committed
238
{
lm's avatar
lm committed
239
    if (accept) link->setParityType(1);
pixhawk's avatar
pixhawk committed
240 241
}

lm's avatar
lm committed
242
void SerialConfigurationWindow::setParityEven(bool accept)
pixhawk's avatar
pixhawk committed
243
{
lm's avatar
lm committed
244
    if (accept) link->setParityType(2);
pixhawk's avatar
pixhawk committed
245 246 247 248
}

void SerialConfigurationWindow::setPortName(QString port)
{
249
#ifdef Q_OS_WIN
pixhawk's avatar
pixhawk committed
250
    port = port.split("-").first();
251
#endif
pixhawk's avatar
pixhawk committed
252 253
    port = port.remove(" ");

254
    if (this->link->getPortName() != port) {
pixhawk's avatar
pixhawk committed
255 256 257 258 259 260 261
        link->setPortName(port);
    }
    userConfigured = true;
}

void SerialConfigurationWindow::setLinkName(QString name)
{
lm's avatar
lm committed
262 263
    Q_UNUSED(name);
    // FIXME
pixhawk's avatar
pixhawk committed
264 265 266 267 268
    action->setText(tr("Configure ") + link->getName());
    action->setStatusTip(tr("Configure ") + link->getName());
    setWindowTitle(tr("Configuration of ") + link->getName());
}