QGCCommConfiguration.cc 4.37 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
#include <QPushButton>

#include "SerialLink.h"
#include "SerialConfigurationWindow.h"
#include "QGCUDPLinkConfiguration.h"
#include "QGCCommConfiguration.h"
#include "ui_QGCCommConfiguration.h"

QGCCommConfiguration::QGCCommConfiguration(QWidget *parent, LinkConfiguration *config) :
    QDialog(parent),
    _ui(new Ui::QGCCommConfiguration)
{
    _ui->setupUi(this);
    // Add link types
    _config = config;
    _ui->typeCombo->addItem(tr("Select Type"),  LinkConfiguration::TypeLast);
    _ui->typeCombo->addItem(tr("Serial"),       LinkConfiguration::TypeSerial);
    _ui->typeCombo->addItem(tr("UDP"),          LinkConfiguration::TypeUdp);
#ifdef UNITTEST_BUILD
    _ui->typeCombo->addItem(tr("Mock"),         LinkConfiguration::TypeMock);
#endif

#if 0
    _ui->typeCombo->addItem(tr("TCP"),          LinkConfiguration::TypeTcp);

#ifdef QGC_RTLAB_ENABLED
    _ui->typeCombo->addItem(tr("Opal-RT Link"), LinkConfiguration::TypeOpal);
#endif
#ifdef QGC_XBEE_ENABLED
    _ui->typeCombo->addItem(tr("Xbee API"),     LinkConfiguration::TypeXbee);
#endif
#endif

    _ui->typeCombo->setEditable(false);
    if(config && !config->name().isEmpty()) {
        _ui->nameEdit->setText(config->name());
    } else {
        _ui->nameEdit->setText(tr("Unnamed"));
    }
    if(!config) {
        setWindowTitle(tr("Add New Communication Link"));
    } else {
        setWindowTitle(tr("Edit Communication Link"));
        _loadTypeConfigWidget(config->type());
        _ui->typeCombo->setEnabled(false);
    }
    _updateUI();
}

QGCCommConfiguration::~QGCCommConfiguration()
{
    delete _ui;
}

void QGCCommConfiguration::on_typeCombo_currentIndexChanged(int index)
{
    int type = _ui->typeCombo->itemData(index).toInt();
    _changeLinkType(type);
}

void QGCCommConfiguration::_changeLinkType(int type)
{
    //-- Do we need to change anything?
    if(type == LinkConfiguration::TypeLast || (_config && _config->type() == type)) {
        return;
    }
    // Switching connection type. Delete old config.
    delete _config;
    // Create new config instance
    QString name = _ui->nameEdit->text();
    if(name.isEmpty()) {
        name = tr("Untitled");
        _ui->nameEdit->setText(name);
    }
    _config = LinkConfiguration::createSettings(type, name);
    Q_ASSERT(_config != NULL);
    _loadTypeConfigWidget(type);
    _updateUI();
}

void QGCCommConfiguration::_loadTypeConfigWidget(int type)
{
    Q_ASSERT(_config != NULL);
    switch(type) {
        case LinkConfiguration::TypeSerial: {
            QWidget* conf = new SerialConfigurationWindow((SerialConfiguration*)_config, this);
            _ui->linkScrollArea->setWidget(conf);
            _ui->linkGroupBox->setTitle(tr("Serial Link"));
            _ui->typeCombo->setCurrentIndex(_ui->typeCombo->findData(LinkConfiguration::TypeSerial));
        }
        break;
        case LinkConfiguration::TypeUdp: {
            QWidget* conf = new QGCUDPLinkConfiguration((UDPConfiguration*)_config, this);
            _ui->linkScrollArea->setWidget(conf);
            _ui->linkGroupBox->setTitle(tr("UDP Link"));
            _ui->typeCombo->setCurrentIndex(_ui->typeCombo->findData(LinkConfiguration::TypeUdp));
        }
        break;
99
#ifdef UNITTEST_BUILD
100 101 102 103 104 105
        case LinkConfiguration::TypeMock: {
            _ui->linkScrollArea->setWidget(NULL);
            _ui->linkGroupBox->setTitle(tr("Mock Link"));
            _ui->typeCombo->setCurrentIndex(_ui->typeCombo->findData(LinkConfiguration::TypeMock));
        }
        break;
106
#endif
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
        // Cannot be the case, but in case it gets here, we cannot continue.
        default:
            reject();
            break;
    }
    // Remove "Select Type" once something is selected
    int idx = _ui->typeCombo->findData(LinkConfiguration::TypeLast);
    if(idx >= 0) {
        _ui->typeCombo->removeItem(idx);
    }
}

void QGCCommConfiguration::_updateUI()
{
    bool enableOK = false;
    if(_config) {
        if(!_ui->nameEdit->text().isEmpty()) {
            enableOK = true;
        }
    }
    QPushButton* ok = _ui->buttonBox->button(QDialogButtonBox::Ok);
    Q_ASSERT(ok != NULL);
    ok->setEnabled(enableOK);
}

void QGCCommConfiguration::on_buttonBox_accepted()
{
    if(_config) {
        _config->setName(_ui->nameEdit->text());
    }
    accept();
}

void QGCCommConfiguration::on_buttonBox_rejected()
{
    reject();
}

void QGCCommConfiguration::on_nameEdit_textEdited(const QString &arg1)
{
    Q_UNUSED(arg1);
    _updateUI();
}