diff --git a/src/QGCCore.cc b/src/QGCCore.cc index ca6bf0c9af2014a1c7ea6413005845c2b1eca77a..754fcb7d2b3ce9f015eff901f8d5994bc52d95ff 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 978b3946f743e2d6b83844b4ccde3159742534d3..0d17c0f612b7217fc9cdb376b3179d2fcf2f1f06 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 b5e83bb3a5478db9fb00b344375aea2bd67f9650..41f1158f24f296b499ad96f89057120282662e65 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 0941d175ddf1af744c0278b397342d86d75e22b8..7ee3880667c9f0e60ffca7867e5fba970e91a439 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 a609fbe8f33a7b63e658feefdecbc172107d32ea..391ba0e3ec42a47fc5797ec64397a10405714546 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)