diff --git a/qgcunittest.pro b/qgcunittest.pro index 308ce32dc84423a9cdfd85bed225b2bd8ab109a0..b8b8a5d564e2a318327f50c45d160f652e402aa2 100644 --- a/qgcunittest.pro +++ b/qgcunittest.pro @@ -200,6 +200,7 @@ FORMS += src/ui/MainWindow.ui \ src/ui/QGCMAVLinkLogPlayer.ui \ src/ui/QGCWaypointListMulti.ui \ src/ui/QGCUDPLinkConfiguration.ui \ + src/ui/QGCTCPLinkConfiguration.ui \ src/ui/QGCSettingsWidget.ui \ src/ui/UASControlParameters.ui \ src/ui/map/QGCMapTool.ui \ @@ -323,6 +324,7 @@ HEADERS += src/MG.h \ src/uas/QGCMAVLinkUASFactory.h \ src/ui/QGCWaypointListMulti.h \ src/ui/QGCUDPLinkConfiguration.h \ + src/ui/QGCTCPLinkConfiguration.h \ src/ui/QGCSettingsWidget.h \ src/ui/uas/UASControlParameters.h \ src/uas/QGCUASParamManager.h \ @@ -490,6 +492,7 @@ SOURCES += src/QGCCore.cc \ src/uas/QGCMAVLinkUASFactory.cc \ src/ui/QGCWaypointListMulti.cc \ src/ui/QGCUDPLinkConfiguration.cc \ + src/ui/QGCTCPLinkConfiguration.cc \ src/ui/QGCSettingsWidget.cc \ src/ui/uas/UASControlParameters.cpp \ src/uas/QGCUASParamManager.cc \ diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index b34aefbb2e138c9fb7e2c50c041eb957033c054d..3f48dc0f24f79ea010624249b3d1fcc023294fae 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -227,6 +227,7 @@ FORMS += src/ui/MainWindow.ui \ src/ui/QGCMAVLinkLogPlayer.ui \ src/ui/QGCWaypointListMulti.ui \ src/ui/QGCUDPLinkConfiguration.ui \ + src/ui/QGCTCPLinkConfiguration.ui \ src/ui/QGCSettingsWidget.ui \ src/ui/UASControlParameters.ui \ src/ui/map/QGCMapTool.ui \ @@ -408,6 +409,7 @@ HEADERS += src/MG.h \ src/uas/QGCMAVLinkUASFactory.h \ src/ui/QGCWaypointListMulti.h \ src/ui/QGCUDPLinkConfiguration.h \ + src/ui/QGCTCPLinkConfiguration.h \ src/ui/QGCSettingsWidget.h \ src/ui/uas/UASControlParameters.h \ src/uas/QGCUASParamManager.h \ @@ -634,6 +636,7 @@ SOURCES += src/main.cc \ src/uas/QGCMAVLinkUASFactory.cc \ src/ui/QGCWaypointListMulti.cc \ src/ui/QGCUDPLinkConfiguration.cc \ + src/ui/QGCTCPLinkConfiguration.cc \ src/ui/QGCSettingsWidget.cc \ src/ui/uas/UASControlParameters.cpp \ src/uas/QGCUASParamManager.cc \ diff --git a/src/comm/TCPLink.cc b/src/comm/TCPLink.cc index c1c2d01ade820034fa621e378ad936cb45ff4816..f56ef84d3892df20241db3eeb7fc24d7b87bedf6 100644 --- a/src/comm/TCPLink.cc +++ b/src/comm/TCPLink.cc @@ -37,24 +37,20 @@ #include "LinkManager.h" #include "QGC.h" #include -//#include -TCPLink::TCPLink(QHostAddress host, quint16 port) -: socket(NULL) +TCPLink::TCPLink(QHostAddress hostAddress, quint16 socketPort) : + host(hostAddress), + port(socketPort), + socket(NULL), + socketIsConnected(false) + { - // FIXFIX: host and port and hard-wired - this->host = "127.0.0.1"; - this->port = 5760; - - this->socketIsConnected = false; - // Set unique ID and add link to the list of links this->id = getNextLinkId(); - // FIXFIX: What about host name? this->name = tr("TCP Link (port:%1)").arg(this->port); emit nameChanged(this->name); - qDebug() << "TCP Created " << name; + qDebug() << "TCP Created " << this->name; } TCPLink::~TCPLink() @@ -63,25 +59,26 @@ TCPLink::~TCPLink() this->deleteLater(); } -/** - * @brief Runs the thread - * - **/ void TCPLink::run() { exec(); } +void TCPLink::setAddress(const QString &text) +{ + setAddress(QHostAddress(text)); +} + void TCPLink::setAddress(QHostAddress host) { bool reconnect(false); - if(this->isConnected()) + if (this->isConnected()) { disconnect(); reconnect = true; } this->host = host; - if(reconnect) + if (reconnect) { connect(); } @@ -104,10 +101,9 @@ void TCPLink::setPort(int port) } } -void TCPLink::writeBytes(const char* data, qint64 size) +#ifdef TCPLINK_READWRITE_DEBUG +void TCPLink::writeDebugBytes(const char *data, qint16 size) { - //#define TCPLINK_DEBUG -#ifdef TCPLINK_DEBUG QString bytes; QString ascii; for (int i=0; iwrite(data, size); } @@ -148,17 +151,10 @@ void TCPLink::readBytes() socket->read(buffer.data(), buffer.size()); emit bytesReceived(this, buffer); - - // // Echo data for debugging purposes - // std::cerr << __FILE__ << __LINE__ << "Received datagram:" << std::endl; - // int i; - // for (i=0; idisconnect(); - socketIsConnected = false; - } + socket->disconnect(); + socketIsConnected = false; delete socket; socket = NULL; } @@ -220,17 +214,25 @@ bool TCPLink::hardwareConnect(void) socket->connectToHost(host, port); QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readBytes())); - //QObject::connect(socket, SIGNAL(connected()), this, SLOT(socketConnected())); - socketIsConnected = true; + QObject::connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); + + // Give the socket a second to connect to the other side otherwise error out + if (!socket->waitForConnected(1000)) + { + emit communicationError(getName(), "connection failed"); + return false; + } + socketIsConnected = true; connectionStartTime = QGC::groundTimeUsecs()/1000; - + emit connected(true); + return true; } -void TCPLink::socketConnected() +void TCPLink::socketError(QAbstractSocket::SocketError socketError) { - socketIsConnected = true; + emit communicationError(getName(), "Error on socket: " + socket->errorString()); } /** diff --git a/src/comm/TCPLink.h b/src/comm/TCPLink.h index c2d639fb910e18ca81b2bd8cc53f3592535aa143..6c6131d6f4d3bdc85d2d190746e55ad1e39e6927 100644 --- a/src/comm/TCPLink.h +++ b/src/comm/TCPLink.h @@ -40,12 +40,14 @@ #include #include +//#define TCPLINK_READWRITE_DEBUG // Use to debug data reads/writes + class TCPLink : public LinkInterface { Q_OBJECT public: - TCPLink(QHostAddress host = QHostAddress::Any, quint16 port = 14550); + TCPLink(QHostAddress hostAddress = QHostAddress::LocalHost, quint16 socketPort = 5760); ~TCPLink(); void requestReset() { } @@ -55,6 +57,9 @@ public: int getPort() const { return port; } + QHostAddress getHostAddress() const { + return host; + } QString getName() const; int getBaudRate() const; @@ -88,7 +93,9 @@ public slots: void writeBytes(const char* data, qint64 length); bool connect(); bool disconnect(); - void socketConnected(); + void socketError(QAbstractSocket::SocketError socketError); + void setAddress(const QString &text); + protected: QString name; @@ -112,6 +119,9 @@ protected: private: bool hardwareConnect(void); +#ifdef TCPLINK_READWRITE_DEBUG + void writeDebugBytes(const char *data, qint16 size); +#endif signals: //Signals are defined by LinkInterface diff --git a/src/ui/CommConfigurationWindow.cc b/src/ui/CommConfigurationWindow.cc index 96894ed1d2c5395638b83030735b592ebe75a465..5da03235691c3a64da884ff50ed0ee5702c664d5 100644 --- a/src/ui/CommConfigurationWindow.cc +++ b/src/ui/CommConfigurationWindow.cc @@ -53,6 +53,7 @@ This file is part of the QGROUNDCONTROL project #include "MAVLinkProtocol.h" #include "MAVLinkSettingsWidget.h" #include "QGCUDPLinkConfiguration.h" +#include "QGCTCPLinkConfiguration.h" #include "LinkManager.h" #include "MainWindow.h" @@ -152,6 +153,8 @@ CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, ProtocolIn } TCPLink* tcp = dynamic_cast(link); if (tcp != 0) { + QWidget* conf = new QGCTCPLinkConfiguration(tcp, this); + ui.linkScrollArea->setWidget(conf); ui.linkGroupBox->setTitle(tr("TCP Link")); ui.linkType->setCurrentIndex(ui.linkType->findData(QGC_LINK_TCP)); } @@ -264,12 +267,12 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) } case QGC_LINK_TCP: - { + { TCPLink *tcp = new TCPLink(); tmpLink = tcp; MainWindow::instance()->addLink(tmpLink); break; - } + } #ifdef OPAL_RT case QGC_LINK_OPAL: diff --git a/src/ui/QGCTCPLinkConfiguration.cc b/src/ui/QGCTCPLinkConfiguration.cc new file mode 100644 index 0000000000000000000000000000000000000000..364631ad3dc1cbea24f25901a04630572dca4fcb --- /dev/null +++ b/src/ui/QGCTCPLinkConfiguration.cc @@ -0,0 +1,35 @@ +#include + +#include "QGCTCPLinkConfiguration.h" +#include "ui_QGCTCPLinkConfiguration.h" + +QGCTCPLinkConfiguration::QGCTCPLinkConfiguration(TCPLink* link, QWidget *parent) : + QWidget(parent), + link(link), + ui(new Ui::QGCTCPLinkConfiguration) +{ + ui->setupUi(this); + uint16_t port = link->getPort(); + ui->portSpinBox->setValue(port); + QString addr = link->getHostAddress().toString(); + ui->hostAddressLineEdit->setText(addr); + connect(ui->portSpinBox, SIGNAL(valueChanged(int)), link, SLOT(setPort(int))); + connect(ui->hostAddressLineEdit, SIGNAL(textChanged (const QString &)), link, SLOT(setAddress(const QString &))); +} + +QGCTCPLinkConfiguration::~QGCTCPLinkConfiguration() +{ + delete ui; +} + +void QGCTCPLinkConfiguration::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} \ No newline at end of file diff --git a/src/ui/QGCTCPLinkConfiguration.h b/src/ui/QGCTCPLinkConfiguration.h new file mode 100644 index 0000000000000000000000000000000000000000..0d8eb33ad7e8d07862dd57400a0ba443f47a9a54 --- /dev/null +++ b/src/ui/QGCTCPLinkConfiguration.h @@ -0,0 +1,32 @@ +#ifndef QGCTCPLINKCONFIGURATION_H +#define QGCTCPLINKCONFIGURATION_H + +#include + +#include "TCPLink.h" + +namespace Ui +{ +class QGCTCPLinkConfiguration; +} + +class QGCTCPLinkConfiguration : public QWidget +{ + Q_OBJECT + +public: + explicit QGCTCPLinkConfiguration(TCPLink* link, QWidget *parent = 0); + ~QGCTCPLinkConfiguration(); + +public slots: + +protected: + void changeEvent(QEvent *e); + + TCPLink* link; ///< TCP link instance this widget configures + +private: + Ui::QGCTCPLinkConfiguration *ui; +}; + +#endif // QGCTCPLINKCONFIGURATION_H diff --git a/src/ui/QGCTCPLinkConfiguration.ui b/src/ui/QGCTCPLinkConfiguration.ui new file mode 100644 index 0000000000000000000000000000000000000000..416e587970589d09aed7aba76722040fce971440 --- /dev/null +++ b/src/ui/QGCTCPLinkConfiguration.ui @@ -0,0 +1,51 @@ + + + QGCTCPLinkConfiguration + + + + 0 + 0 + 400 + 300 + + + + Form + + + + QFormLayout::FieldsStayAtSizeHint + + + + + TCP Port + + + + + + + 3000 + + + 100000 + + + + + + + Host Address + + + + + + + + + + +