QGCLinkConfiguration.cc 9.92 KB
Newer Older
1 2 3 4
/*=====================================================================

QGroundControl Open Source Ground Control Station

5
(c) 2009, 2015 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 28 29 30 31 32 33 34 35 36 37 38 39 40

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 QGCLinkConfiguration
 *   @author Gus Grubba <mavlink@grubba.com>
 */

#include "SettingsDialog.h"
#include "QGCLinkConfiguration.h"
#include "ui_QGCLinkConfiguration.h"
#include "QGCCommConfiguration.h"
#include "QGCMessageBox.h"

QGCLinkConfiguration::QGCLinkConfiguration(QWidget *parent) :
    QWidget(parent),
    _ui(new Ui::QGCLinkConfiguration)
{
    // Stop automatic link updates while this UI is up
41
    qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(true);
42 43 44 45 46 47 48 49 50 51 52 53 54
    _ui->setupUi(this);
    _viewModel = new LinkViewModel;
    _ui->linkView->setModel(_viewModel);
    _ui->connectLinkButton->setEnabled(false);
    _ui->delLinkButton->setEnabled(false);
    _ui->editLinkButton->setEnabled(false);
}

QGCLinkConfiguration::~QGCLinkConfiguration()
{
    if(_viewModel) delete _viewModel;
    if(_ui) delete _ui;
    // Resume automatic link updates
55
    qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(false);
56 57 58 59 60
}

void QGCLinkConfiguration::on_delLinkButton_clicked()
{
    QModelIndex index = _ui->linkView->currentIndex();
dogmaphobic's avatar
dogmaphobic committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74
    if(index.row() >= 0) {
        LinkConfiguration* config = _viewModel->getConfiguration(index.row());
        if(config) {
            // Ask user if they are sure
            QMessageBox::StandardButton button = QGCMessageBox::question(
                tr("Delete Link Configuration"),
                tr("Are you sure you want to delete %1?\nDeleting a configuration will also disconnect it if connected.").arg(config->name()),
                QMessageBox::Yes | QMessageBox::Cancel,
                QMessageBox::Cancel);
            if (button == QMessageBox::Yes) {
                // Get link attached to this configuration (if any)
                LinkInterface* iface = config->getLink();
                if(iface) {
                    // Disconnect it (if connected)
75
                    qgcApp()->toolbox()->linkManager()->disconnectLink(iface);
dogmaphobic's avatar
dogmaphobic committed
76 77 78
                }
                _viewModel->beginChange();
                // Remove configuration
79
                qgcApp()->toolbox()->linkManager()->removeLinkConfiguration(config);
dogmaphobic's avatar
dogmaphobic committed
80
                // Save list
81
                qgcApp()->toolbox()->linkManager()->saveLinkConfigurationList();
dogmaphobic's avatar
dogmaphobic committed
82
                _viewModel->endChange();
83 84 85
            }
        }
    }
dogmaphobic's avatar
dogmaphobic committed
86
    _updateButtons();
87 88
}

dogmaphobic's avatar
dogmaphobic committed
89
void QGCLinkConfiguration::on_linkView_clicked(const QModelIndex&)
90
{
dogmaphobic's avatar
dogmaphobic committed
91
    _updateButtons();
92 93 94 95 96
}

void QGCLinkConfiguration::on_connectLinkButton_clicked()
{
    QModelIndex index = _ui->linkView->currentIndex();
dogmaphobic's avatar
dogmaphobic committed
97 98 99 100
    if(index.row() >= 0) {
        LinkConfiguration* config = _viewModel->getConfiguration(index.row());
        if(config) {
            LinkInterface* link = config->getLink();
101
            if(link) {
dogmaphobic's avatar
dogmaphobic committed
102 103
                // Disconnect Link
                if (link->isConnected()) {
104
                    qgcApp()->toolbox()->linkManager()->disconnectLink(link);
dogmaphobic's avatar
dogmaphobic committed
105 106
                }
            } else {
107
                LinkInterface* link = qgcApp()->toolbox()->linkManager()->createConnectedLink(config);
dogmaphobic's avatar
dogmaphobic committed
108 109 110 111 112 113 114 115 116 117
                if(link) {
                    // Now go hunting for the parent so we can shut this down
                    QWidget* pQw = parentWidget();
                    while(pQw) {
                        SettingsDialog* pDlg = dynamic_cast<SettingsDialog*>(pQw);
                        if(pDlg) {
                            pDlg->accept();
                            break;
                        }
                        pQw = pQw->parentWidget();
118 119 120 121 122
                    }
                }
            }
        }
    }
dogmaphobic's avatar
dogmaphobic committed
123
    _updateButtons();
124 125 126 127 128 129 130 131
}

void QGCLinkConfiguration::on_editLinkButton_clicked()
{
    QModelIndex index = _ui->linkView->currentIndex();
    _editLink(index.row());
}

132 133 134 135 136 137
void QGCLinkConfiguration::_fixUnnamed(LinkConfiguration* config)
{
    Q_ASSERT(config != NULL);
    //-- Check for "Unnamed"
    if (config->name() == tr("Unnamed")) {
        switch(config->type()) {
dogmaphobic's avatar
dogmaphobic committed
138
#ifndef __ios__
139 140 141 142 143
            case LinkConfiguration::TypeSerial: {
                QString tname = dynamic_cast<SerialConfiguration*>(config)->portName();
#ifdef Q_OS_WIN32
                tname.replace("\\\\.\\", "");
#else
144
                tname.replace("/dev/cu.", "");
145 146 147
                tname.replace("/dev/", "");
#endif
                config->setName(QString("Serial Device on %1").arg(tname));
148
                break;
149
                }
dogmaphobic's avatar
dogmaphobic committed
150
#endif
151 152 153 154 155 156 157 158 159 160 161 162
            case LinkConfiguration::TypeUdp:
                config->setName(
                    QString("UDP Link on Port %1").arg(dynamic_cast<UDPConfiguration*>(config)->localPort()));
                break;
            case LinkConfiguration::TypeTcp: {
                    TCPConfiguration* tconfig = dynamic_cast<TCPConfiguration*>(config);
                    if(tconfig) {
                        config->setName(
                            QString("TCP Link %1:%2").arg(tconfig->address().toString()).arg((int)tconfig->port()));
                    }
                }
                break;
Don Gagne's avatar
Don Gagne committed
163 164 165 166 167 168 169
            case LinkConfiguration::TypeLogReplay: {
                LogReplayLinkConfiguration* tconfig = dynamic_cast<LogReplayLinkConfiguration*>(config);
                if(tconfig) {
                    config->setName(QString("Log Replay %1").arg(tconfig->logFilenameShort()));
                }
            }
                break;
170
#ifdef QT_DEBUG
171 172 173 174 175 176 177 178 179
            case LinkConfiguration::TypeMock:
                config->setName(
                    QString("Mock Link"));
                break;
#endif
        }
    }
}

180 181 182 183 184 185 186
void QGCLinkConfiguration::on_addLinkButton_clicked()
{
    QGCCommConfiguration* commDialog = new QGCCommConfiguration(this);
    if(commDialog->exec() == QDialog::Accepted) {
        // Save changes (if any)
        LinkConfiguration* config = commDialog->getConfig();
        if(config) {
187
            _fixUnnamed(config);
188
            _viewModel->beginChange();
189 190
            qgcApp()->toolbox()->linkManager()->addLinkConfiguration(commDialog->getConfig());
            qgcApp()->toolbox()->linkManager()->saveLinkConfigurationList();
191 192 193
            _viewModel->endChange();
        }
    }
dogmaphobic's avatar
dogmaphobic committed
194
    _updateButtons();
195 196 197 198 199 200 201 202 203
}

void QGCLinkConfiguration::on_linkView_doubleClicked(const QModelIndex &index)
{
    _editLink(index.row());
}

void QGCLinkConfiguration::_editLink(int row)
{
dogmaphobic's avatar
dogmaphobic committed
204 205 206 207 208 209 210 211 212 213 214 215
    if(row >= 0) {
        LinkConfiguration* config = _viewModel->getConfiguration(row);
        if(config) {
            LinkConfiguration* tmpConfig = LinkConfiguration::duplicateSettings(config);
            QGCCommConfiguration* commDialog = new QGCCommConfiguration(this, tmpConfig);
            if(commDialog->exec() == QDialog::Accepted) {
                // Save changes (if any)
                if(commDialog->getConfig()) {
                    _fixUnnamed(tmpConfig);
                    _viewModel->beginChange();
                    config->copyFrom(tmpConfig);
                    // Save it
216
                    qgcApp()->toolbox()->linkManager()->saveLinkConfigurationList();
dogmaphobic's avatar
dogmaphobic committed
217 218 219 220
                    _viewModel->endChange();
                    // Tell link about changes (if any)
                    config->updateSettings();
                }
221
            }
dogmaphobic's avatar
dogmaphobic committed
222 223 224
            // Discard temporary duplicate
            if(commDialog->getConfig())
                delete commDialog->getConfig();
225 226
        }
    }
dogmaphobic's avatar
dogmaphobic committed
227 228 229 230 231 232 233 234
    _updateButtons();
}

void QGCLinkConfiguration::_updateButtons()
{
    LinkConfiguration* config = NULL;
    QModelIndex index = _ui->linkView->currentIndex();
    bool enabled = (index.row() >= 0);
235
    bool deleteEnabled = true;
dogmaphobic's avatar
dogmaphobic committed
236 237 238
    if(enabled) {
        config = _viewModel->getConfiguration(index.row());
        if(config) {
239 240 241 242
            // Can't delete a dynamic link
            if(config->isDynamic()) {
                deleteEnabled = false;
            }
dogmaphobic's avatar
dogmaphobic committed
243 244 245 246 247 248 249 250 251
            LinkInterface* link = config->getLink();
            if(link) {
                _ui->connectLinkButton->setText("Disconnect");
            } else {
                _ui->connectLinkButton->setText("Connect");
            }
        }
    }
    _ui->connectLinkButton->setEnabled(enabled);
252
    _ui->delLinkButton->setEnabled(config != NULL && deleteEnabled);
dogmaphobic's avatar
dogmaphobic committed
253
    _ui->editLinkButton->setEnabled(config != NULL);
254 255 256 257 258 259 260 261 262 263
}

LinkViewModel::LinkViewModel(QObject *parent) : QAbstractListModel(parent)
{
    Q_UNUSED(parent);
}

int LinkViewModel::rowCount( const QModelIndex & parent) const
{
    Q_UNUSED(parent);
264
    QList<LinkConfiguration*> cfgList = qgcApp()->toolbox()->linkManager()->getLinkConfigurationList();
265 266 267 268 269 270
    int count = cfgList.count();
    return count;
}

QVariant LinkViewModel::data( const QModelIndex & index, int role) const
{
271
    QList<LinkConfiguration*> cfgList = qgcApp()->toolbox()->linkManager()->getLinkConfigurationList();
272 273 274 275 276 277 278 279 280
    if (role == Qt::DisplayRole && index.row() < cfgList.count()) {
        QString name(cfgList.at(index.row())->name());
        return name;
    }
    return QVariant();
}

LinkConfiguration* LinkViewModel::getConfiguration(int row)
{
281
    QList<LinkConfiguration*> cfgList = qgcApp()->toolbox()->linkManager()->getLinkConfigurationList();
282 283 284 285 286 287
    if(row < cfgList.count()) {
        return cfgList.at(row);
    }
    return NULL;
}