From 5652f3913f507b919b3c32a882a1f6674f3fc07d Mon Sep 17 00:00:00 2001 From: oberion Date: Sun, 18 Sep 2011 11:21:04 +0200 Subject: [PATCH] Changed UDP link --- src/QGCCore.cc | 1 + src/comm/UDPLink.cc | 72 +++++++++++++++++++++++-------- src/comm/UDPLink.h | 7 ++- src/ui/CommConfigurationWindow.cc | 10 +++-- src/ui/MainWindow.cc | 8 ++-- 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/QGCCore.cc b/src/QGCCore.cc index ca6bf0c9a..754fcb7d2 100644 --- a/src/QGCCore.cc +++ b/src/QGCCore.cc @@ -145,6 +145,7 @@ QGCCore::QGCCore(int &argc, char* argv[]) : QApplication(argc, argv) // to make sure that all components are initialized when the // first messages arrive UDPLink* udpLink = new UDPLink(QHostAddress::Any, 14550); + MainWindow::instance()->addLink(udpLink); // Listen on Multicast-Address 239.255.77.77, Port 14550 //QHostAddress * multicast_udp = new QHostAddress("239.255.77.77"); //UDPLink* udpLink = new UDPLink(*multicast_udp, 14550); diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index 978b3946f..0d17c0f61 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -40,19 +40,22 @@ This file is part of the QGROUNDCONTROL project //#include UDPLink::UDPLink(QHostAddress host, quint16 port) + : socket(NULL) { this->host = host; this->port = port; this->connectState = false; // Set unique ID and add link to the list of links this->id = getNextLinkId(); - this->name = tr("UDP Link (port:%1)").arg(14550); - LinkManager::instance()->add(this); + this->name = tr("UDP Link (port:%1)").arg(this->port); + emit nameChanged(this->name); + // LinkManager::instance()->add(this); } UDPLink::~UDPLink() { disconnect(); + this->deleteLater(); } /** @@ -61,23 +64,39 @@ UDPLink::~UDPLink() **/ void UDPLink::run() { -// forever -// { -// QGC::SLEEP::msleep(5000); -// } - exec(); + exec(); } -void UDPLink::setAddress(QString address) +void UDPLink::setAddress(QHostAddress host) { - Q_UNUSED(address); + bool reconnect(false); + if(this->isConnected()) + { + disconnect(); + reconnect = true; + } + this->host = host; + if(reconnect) + { + connect(); + } } void UDPLink::setPort(int port) { + bool reconnect(false); + if(this->isConnected()) + { + disconnect(); + reconnect = true; + } this->port = port; - disconnect(); - connect(); + this->name = tr("UDP Link (port:%1)").arg(this->port); + emit nameChanged(this->name); + if(reconnect) + { + connect(); + } } /** @@ -104,9 +123,11 @@ void UDPLink::addHost(const QString& host) } } hosts.append(address); + this->setAddress(address); //qDebug() << "Address:" << address.toString(); // Set port according to user input ports.append(host.split(":").last().toInt()); + this->setPort(host.split(":").last().toInt()); } } else @@ -245,8 +266,14 @@ qint64 UDPLink::bytesAvailable() **/ bool UDPLink::disconnect() { - delete socket; - socket = NULL; + this->quit(); + this->wait(); + + if(socket) + { + delete socket; + socket = NULL; + } connectState = false; @@ -262,7 +289,19 @@ bool UDPLink::disconnect() **/ bool UDPLink::connect() { - socket = new QUdpSocket(this); + if(this->isRunning()) + { + this->quit(); + this->wait(); + } + this->hardwareConnect(); + start(HighPriority); + return true; +} + +bool UDPLink::hardwareConnect(void) +{ + socket = new QUdpSocket(); //Check if we are using a multicast-address // bool multicast = false; @@ -309,11 +348,10 @@ bool UDPLink::connect() emit connected(); connectionStartTime = QGC::groundTimeUsecs()/1000; } - - start(HighPriority); - return connectState; + return connectState; } + /** * @brief Check if connection is active. * diff --git a/src/comm/UDPLink.h b/src/comm/UDPLink.h index b5e83bb3a..41f1158f2 100644 --- a/src/comm/UDPLink.h +++ b/src/comm/UDPLink.h @@ -87,7 +87,7 @@ public: int getId(); public slots: - void setAddress(QString address); + void setAddress(QHostAddress host); void setPort(int port); /** @brief Add a new host to broadcast messages to */ void addHost(const QString& host); @@ -128,8 +128,11 @@ protected: void setName(QString name); +private: + bool hardwareConnect(void); + signals: - // Signals are defined by LinkInterface + //Signals are defined by LinkInterface }; diff --git a/src/ui/CommConfigurationWindow.cc b/src/ui/CommConfigurationWindow.cc index 0941d175d..7ee388066 100644 --- a/src/ui/CommConfigurationWindow.cc +++ b/src/ui/CommConfigurationWindow.cc @@ -232,14 +232,14 @@ void CommConfigurationWindow::setLinkType(int linktype) break; } #endif // XBEELINK -/* case 1: + case 1: { UDPLink *udp = new UDPLink(); tmpLink = udp; MainWindow::instance()->addLink(tmpLink); break; } - */ + #ifdef OPAL_RT case 3: { @@ -261,11 +261,13 @@ void CommConfigurationWindow::setLinkType(int linktype) } } // trigger new window + + const int32_t& linkIndex(LinkManager::instance()->getLinks().indexOf(tmpLink)); + const int32_t& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); + QList actions = MainWindow::instance()->listLinkMenuActions(); foreach (QAction* act, actions) { - const int& linkIndex(LinkManager::instance()->getLinks().indexOf(tmpLink)); - const int& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); if (act->data().toInt() == linkID) { act->trigger(); diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index a609fbe8f..391ba0e3e 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -1492,8 +1492,8 @@ void MainWindow::addLink() // Go fishing for this link's configuration window QList actions = ui.menuNetwork->actions(); - const int& linkIndex(LinkManager::instance()->getLinks().indexOf(link)); - const int& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); + const int32_t& linkIndex(LinkManager::instance()->getLinks().indexOf(link)); + const int32_t& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); foreach (QAction* act, actions) { if (act->data().toInt() == linkID) { // LinkManager::instance()->getLinks().indexOf(link) @@ -1517,8 +1517,8 @@ void MainWindow::addLink(LinkInterface *link) bool found(false); - const int& linkIndex(LinkManager::instance()->getLinks().indexOf(link)); - const int& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); + const int32_t& linkIndex(LinkManager::instance()->getLinks().indexOf(link)); + const int32_t& linkID(LinkManager::instance()->getLinks()[linkIndex]->getId()); foreach (QAction* act, actions) { if (act->data().toInt() == linkID) { // LinkManager::instance()->getLinks().indexOf(link) -- 2.22.0