From 42351ee00b3f18561e363765a869cce803ceda1e Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 9 Dec 2014 17:03:50 -0800 Subject: [PATCH] Restructure LinkManager/MAVLinkProtocol --- src/QGCApplication.cc | 4 +- src/comm/LinkInterface.h | 5 -- src/comm/LinkManager.cc | 102 +++++++++----------------- src/comm/LinkManager.h | 87 +++++++++++----------- src/comm/MAVLinkProtocol.cc | 25 +++++-- src/comm/MAVLinkProtocol.h | 14 +++- src/comm/MAVLinkSimulationLink.cc | 4 +- src/comm/SerialLink.cc | 3 - src/comm/TCPLink.cc | 2 - src/comm/UDPLink.cc | 2 - src/qgcunittest/LinkManagerTest.cc | 8 +- src/qgcunittest/MainWindowTest.cc | 3 +- src/qgcunittest/MavlinkLogTest.cc | 3 +- src/qgcunittest/MockLink.cc | 2 - src/qgcunittest/TCPLinkTest.cc | 21 ++---- src/qgcunittest/TCPLinkTest.h | 2 - src/qgcunittest/UnitTest.cc | 2 + src/uas/QGCUASFileManager.cc | 2 +- src/uas/UAS.cc | 2 +- src/uas/UASParameterCommsMgr.cc | 2 +- src/ui/CommConfigurationWindow.cc | 39 +++++----- src/ui/CommConfigurationWindow.h | 8 +- src/ui/DebugConsole.cc | 18 ++++- src/ui/DebugConsole.h | 9 ++- src/ui/MAVLinkSettingsWidget.cc | 2 +- src/ui/MainWindow.cc | 63 ++++++---------- src/ui/MainWindow.h | 11 +-- src/ui/OpalLinkConfigurationWindow.cc | 15 +++- src/ui/OpalLinkConfigurationWindow.h | 8 +- src/ui/QGCToolBar.cc | 32 +++++--- src/ui/QGCToolBar.h | 10 ++- src/ui/SerialConfigurationWindow.cc | 4 - src/ui/SettingsDialog.cc | 11 +-- src/ui/uas/UASListWidget.cc | 8 +- 34 files changed, 249 insertions(+), 284 deletions(-) diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 9f576bea9..62482c249 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -281,11 +281,11 @@ bool QGCApplication::_initForNormalAppBoot(void) // to make sure that all components are initialized when the // first messages arrive udpLink = new UDPLink(QHostAddress::Any, 14550); - LinkManager::instance()->add(udpLink); + LinkManager::instance()->addLink(udpLink); } else { // We want to have a default serial link available for "quick" connecting. SerialLink *slink = new SerialLink(); - LinkManager::instance()->add(slink); + LinkManager::instance()->addLink(slink); } #ifdef QGC_RTLAB_ENABLED diff --git a/src/comm/LinkInterface.h b/src/comm/LinkInterface.h index 71ce3ddf0..c69746ede 100644 --- a/src/comm/LinkInterface.h +++ b/src/comm/LinkInterface.h @@ -186,11 +186,6 @@ signals: **/ void disconnected(); - /** - * @brief This signal is emitted instantly when the link status changes - **/ - void connected(bool connected); - /** * @brief This signal is emitted if the human readable name of this link changes */ diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index bb59d7c69..dd0cefcb2 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -43,7 +43,7 @@ LinkManager* LinkManager::_instance = NULL; LinkManager* LinkManager::instance(void) { if(_instance == 0) { - _instance = new LinkManager(qgcApp()); + new LinkManager(qgcApp()); Q_CHECK_PTR(_instance); } @@ -65,10 +65,14 @@ void LinkManager::deleteInstance(void) **/ LinkManager::LinkManager(QObject* parent, bool registerSingleton) : QGCSingleton(parent, registerSingleton), - _connectionsSuspended(false) + _connectionsSuspended(false), + _mavlink(NULL) { - _links = QList(); - _protocolLinks = QMap(); + Q_ASSERT(_instance == NULL); + _instance = this; + + _mavlink = new MAVLinkProtocol; + Q_CHECK_PTR(_mavlink); } LinkManager::~LinkManager() @@ -80,69 +84,39 @@ LinkManager::~LinkManager() deleteLink(link); } _links.clear(); + + // Clear out the queue so disconnects make it all the way through threads + qgcApp()->processEvents(QEventLoop::ExcludeUserInputEvents); + + delete _mavlink; } -void LinkManager::add(LinkInterface* link) +void LinkManager::addLink(LinkInterface* link) { Q_ASSERT(link); // Take ownership for delete link->_ownedByLinkManager = true; - _dataMutex.lock(); + _linkListMutex.lock(); if (!_links.contains(link)) { _links.append(link); - _dataMutex.unlock(); + _linkListMutex.unlock(); emit newLink(link); } else { - _dataMutex.unlock(); + _linkListMutex.unlock(); } -} - -void LinkManager::addProtocol(LinkInterface* link, ProtocolInterface* protocol) -{ - Q_ASSERT(link); - Q_ASSERT(protocol); - // Connect link to protocol - // the protocol will receive new bytes from the link - _dataMutex.lock(); - QList linkList = _protocolLinks.values(protocol); - - // If protocol has not been added before (list length == 0) - // OR if link has not been added to protocol, add - if (!linkList.contains(link)) - { - // Protocol is new, add - connect(link, SIGNAL(bytesReceived(LinkInterface*, QByteArray)), protocol, SLOT(receiveBytes(LinkInterface*, QByteArray))); - // Add status - connect(link, SIGNAL(connected(bool)), protocol, SLOT(linkStatusChanged(bool))); - // Store the connection information in the protocol links map - _protocolLinks.insertMulti(protocol, link); - _dataMutex.unlock(); - // Make sure the protocol clears its metadata for this link. - protocol->resetMetadataForLink(link); - } else { - _dataMutex.unlock(); + // MainWindow may be around when doing things like running unit tests + if (MainWindow::instance()) { + connect(link, SIGNAL(communicationError(QString,QString)), MainWindow::instance(), SLOT(showCriticalMessage(QString,QString)), Qt::QueuedConnection); } - //qDebug() << __FILE__ << __LINE__ << "ADDED LINK TO PROTOCOL" << link->getName() << protocol->getName() << "NEW SIZE OF LINK LIST:" << _protocolLinks.size(); -} - -QList LinkManager::getLinksForProtocol(ProtocolInterface* protocol) -{ - _dataMutex.lock(); - QList links = _protocolLinks.values(protocol); - _dataMutex.unlock(); - return links; -} - -ProtocolInterface* LinkManager::getProtocolForLink(LinkInterface* link) -{ - _dataMutex.lock(); - ProtocolInterface* protocol = _protocolLinks.key(link); - _dataMutex.unlock(); - return protocol; + + connect(link, &LinkInterface::bytesReceived, _mavlink, &MAVLinkProtocol::receiveBytes); + connect(link, &LinkInterface::connected, _mavlink, &MAVLinkProtocol::linkConnected); + connect(link, &LinkInterface::disconnected, _mavlink, &MAVLinkProtocol::linkDisconnected); + _mavlink->resetMetadataForLink(link); } bool LinkManager::connectAll() @@ -153,14 +127,14 @@ bool LinkManager::connectAll() bool allConnected = true; - _dataMutex.lock(); + _linkListMutex.lock(); foreach (LinkInterface* link, _links) { Q_ASSERT(link); if (!link->_connect()) { allConnected = false; } } - _dataMutex.unlock(); + _linkListMutex.unlock(); return allConnected; } @@ -169,7 +143,7 @@ bool LinkManager::disconnectAll() { bool allDisconnected = true; - _dataMutex.lock(); + _linkListMutex.lock(); foreach (LinkInterface* link, _links) { Q_ASSERT(link); @@ -177,7 +151,7 @@ bool LinkManager::disconnectAll() allDisconnected = false; } } - _dataMutex.unlock(); + _linkListMutex.unlock(); return allDisconnected; } @@ -203,19 +177,13 @@ void LinkManager::deleteLink(LinkInterface* link) { Q_ASSERT(link); - _dataMutex.lock(); + _linkListMutex.lock(); Q_ASSERT(_links.contains(link)); _links.removeOne(link); Q_ASSERT(!_links.contains(link)); - // Remove link from protocol map - QList protocols = _protocolLinks.keys(link); - foreach (ProtocolInterface* proto, protocols) { - _protocolLinks.remove(proto, link); - } - - _dataMutex.unlock(); + _linkListMutex.unlock(); // Emit removal of link emit linkDeleted(link); @@ -230,15 +198,15 @@ void LinkManager::deleteLink(LinkInterface* link) */ const QList LinkManager::getLinks() { - _dataMutex.lock(); + _linkListMutex.lock(); QList ret(_links); - _dataMutex.unlock(); + _linkListMutex.unlock(); return ret; } const QList LinkManager::getSerialLinks() { - _dataMutex.lock(); + _linkListMutex.lock(); QList s; foreach (LinkInterface* link, _links) @@ -250,7 +218,7 @@ const QList LinkManager::getSerialLinks() if (serialLink) s.append(serialLink); } - _dataMutex.unlock(); + _linkListMutex.unlock(); return s; } diff --git a/src/comm/LinkManager.h b/src/comm/LinkManager.h index c27834cec..b19f507d7 100644 --- a/src/comm/LinkManager.h +++ b/src/comm/LinkManager.h @@ -21,13 +21,8 @@ This file is part of the PIXHAWK project ======================================================================*/ -/** - * @file - * @brief Manage communication links - * - * @author Lorenz Meier - * - */ +/// @file +/// @author Lorenz Meier #ifndef _LINKMANAGER_H_ #define _LINKMANAGER_H_ @@ -41,15 +36,16 @@ This file is part of the PIXHAWK project #include "SerialLink.h" #include "ProtocolInterface.h" #include "QGCSingleton.h" +#include "MAVLinkProtocol.h" class LinkManagerTest; -/** - * The Link Manager organizes the physical Links. It can manage arbitrary - * links and takes care of connecting them as well assigning the correct - * protocol instance to transport the link data into the application. - * - **/ +/// Manage communication links +/// +/// The Link Manager organizes the physical Links. It can manage arbitrary +/// links and takes care of connecting them as well assigning the correct +/// protocol instance to transport the link data into the application. + class LinkManager : public QGCSingleton { Q_OBJECT @@ -62,65 +58,64 @@ public: ~LinkManager(); - QList getLinksForProtocol(ProtocolInterface* protocol); - - ProtocolInterface* getProtocolForLink(LinkInterface* link); - - /** @brief Get a list of all links */ + /// Returns list of all links const QList getLinks(); - /** @brief Get a list of all serial links */ + // Returns list of all serial links const QList getSerialLinks(); - /** @brief Get a list of all protocols */ - const QList getProtocols() { - return _protocolLinks.uniqueKeys(); - } - - /// @brief Sets the lag to suspend the all new connections + /// Sets the flag to suspend the all new connections /// @param reason User visible reason to suspend connections void setConnectionsSuspended(QString reason); - /// @brief Sets the flag to allow new connections to be made + /// Sets the flag to allow new connections to be made void setConnectionsAllowed(void) { _connectionsSuspended = false; } - /// @brief Deletes the specified link. Will disconnect if connected. + /// Adds the link to the LinkManager. LinkManager takes ownership of this object. To delete + /// it, call LinkManager::deleteLink. + void addLink(LinkInterface* link); + + /// Deletes the specified link. Will disconnect if connected. void deleteLink(LinkInterface* link); - -public slots: - /// @brief Adds the link to the LinkManager. LinkManager takes ownership of this object. To delete - // it, call LinkManager::deleteLink. - void add(LinkInterface* link); - void addProtocol(LinkInterface* link, ProtocolInterface* protocol); - + /// Re-connects all existing links bool connectAll(); - bool connectLink(LinkInterface* link); - + + /// Disconnects all existing links bool disconnectAll(); + + /// Connect the specified link + bool connectLink(LinkInterface* link); + + /// Disconnect the specified link bool disconnectLink(LinkInterface* link); - + + /// Returns the one mavlink protocol object in the system + MAVLinkProtocol* mavlink(void) { return _mavlink; } + signals: void newLink(LinkInterface* link); void linkDeleted(LinkInterface* link); private: - /// @brief All access to LinkManager is through LinkManager::instance + /// All access to LinkManager is through LinkManager::instance LinkManager(QObject* parent = NULL, bool registerSingleton = true); - // LinkManager unit test is allowed to new LinkManager objects + /// LinkManager unit test is allowed to new LinkManager objects friend class LinkManagerTest; - static LinkManager* _instance; + bool _connectionsSuspendedMsg(void); - QList _links; - QMultiMap _protocolLinks; - QMutex _dataMutex; + static LinkManager* _instance; /// LinkManager singleton - bool _connectionsSuspendedMsg(void); + QList _links; ///< List of available links + QMutex _linkListMutex; ///< Mutex for thread safe access to _links list + + + bool _connectionsSuspended; ///< true: all new connections should not be allowed + QString _connectionsSuspendedReason; ///< User visible reason for suspension - bool _connectionsSuspended; ///< true: all new connections should not be allowed - QString _connectionsSuspendedReason; ///< User visible reason for suspension + MAVLinkProtocol* _mavlink; ///< The one and only mavlink protocol }; #endif diff --git a/src/comm/MAVLinkProtocol.cc b/src/comm/MAVLinkProtocol.cc index 71e3aa80a..f30424415 100644 --- a/src/comm/MAVLinkProtocol.cc +++ b/src/comm/MAVLinkProtocol.cc @@ -179,14 +179,25 @@ void MAVLinkProtocol::resetMetadataForLink(const LinkInterface *link) currLossCounter[linkId] = 0; } -void MAVLinkProtocol::linkStatusChanged(bool connected) +void MAVLinkProtocol::linkConnected(void) { LinkInterface* link = qobject_cast(QObject::sender()); + Q_ASSERT(link); - if (link == NULL) { - Q_ASSERT(false); - return; - } + _linkStatusChanged(link, true); +} + +void MAVLinkProtocol::linkDisconnected(void) +{ + LinkInterface* link = qobject_cast(QObject::sender()); + Q_ASSERT(link); + + _linkStatusChanged(link, false); +} + +void MAVLinkProtocol::_linkStatusChanged(LinkInterface* link, bool connected) +{ + Q_ASSERT(link); if (connected) { Q_ASSERT(!_connectedLinks.contains(link)); @@ -441,7 +452,7 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) if (m_multiplexingEnabled) { // Get all links connected to this unit - QList links = LinkManager::instance()->getLinksForProtocol(this); + QList links = LinkManager::instance()->getLinks(); // Emit message on all links that are currently connected foreach (LinkInterface* currLink, links) @@ -486,7 +497,7 @@ int MAVLinkProtocol::getComponentId() void MAVLinkProtocol::sendMessage(mavlink_message_t message) { // Get all links connected to this unit - QList links = LinkManager::instance()->getLinksForProtocol(this); + QList links = LinkManager::instance()->getLinks(); // Emit message on all links that are currently connected QList::iterator i; diff --git a/src/comm/MAVLinkProtocol.h b/src/comm/MAVLinkProtocol.h index 04da4a693..f379296d4 100644 --- a/src/comm/MAVLinkProtocol.h +++ b/src/comm/MAVLinkProtocol.h @@ -38,7 +38,6 @@ This file is part of the QGROUNDCONTROL project #include #include -#include "ProtocolInterface.h" #include "LinkInterface.h" #include "QGCMAVLink.h" #include "QGC.h" @@ -51,10 +50,10 @@ This file is part of the QGROUNDCONTROL project * for more information, please see the official website. * @ref http://pixhawk.ethz.ch/software/mavlink/ **/ -class MAVLinkProtocol : public ProtocolInterface +class MAVLinkProtocol : public QThread { Q_OBJECT - + public: MAVLinkProtocol(); ~MAVLinkProtocol(); @@ -143,7 +142,10 @@ public: public slots: /** @brief Receive bytes from a communication interface */ void receiveBytes(LinkInterface* link, QByteArray b); - void linkStatusChanged(bool connected); + + void linkConnected(void); + void linkDisconnected(void); + /** @brief Send MAVLink message through serial interface */ void sendMessage(mavlink_message_t message); /** @brief Send MAVLink message */ @@ -257,6 +259,9 @@ signals: void actionGuardChanged(bool enabled); /** @brief Emitted if actiion request timeout changed */ void actionRetransmissionTimeoutChanged(int ms); + /** @brief Update the packet loss from one system */ + void receiveLossChanged(int uasId, float loss); + /** * @brief Emitted if a new radio status packet received * @@ -275,6 +280,7 @@ signals: void saveTempFlightDataLog(QString tempLogfile); private: + void _linkStatusChanged(LinkInterface* link, bool connected); bool _closeLogFile(void); void _startLogging(void); void _stopLogging(void); diff --git a/src/comm/MAVLinkSimulationLink.cc b/src/comm/MAVLinkSimulationLink.cc index a30292549..040382376 100644 --- a/src/comm/MAVLinkSimulationLink.cc +++ b/src/comm/MAVLinkSimulationLink.cc @@ -106,7 +106,7 @@ MAVLinkSimulationLink::MAVLinkSimulationLink(QString readFile, QString writeFile srand(QTime::currentTime().msec()); maxTimeNoise = 0; this->id = getNextLinkId(); - LinkManager::instance()->add(this); + LinkManager::instance()->addLink(this); } MAVLinkSimulationLink::~MAVLinkSimulationLink() @@ -802,7 +802,6 @@ bool MAVLinkSimulationLink::_disconnect(void) _isConnected = false; emit disconnected(); - emit connected(false); //exit(); } @@ -820,7 +819,6 @@ bool MAVLinkSimulationLink::_connect(void) { _isConnected = true; emit connected(); - emit connected(true); start(LowPriority); MAVLinkSimulationMAV* mav1 = new MAVLinkSimulationMAV(this, 1, 37.480391, -122.282883); diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index bdba9b9c3..dd8bdaeb7 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -240,7 +240,6 @@ void SerialLink::run() m_port = NULL; emit disconnected(); - emit connected(false); } QGC::SLEEP::msleep(500); @@ -340,7 +339,6 @@ void SerialLink::run() m_port = NULL; emit disconnected(); - emit connected(false); } } @@ -503,7 +501,6 @@ bool SerialLink::hardwareConnect(QString &type) emit communicationUpdate(getName(),"Opened port!"); emit connected(); - emit connected(true); qDebug() << "CONNECTING LINK: " << __FILE__ << __LINE__ << "type:" << type << "with settings" << m_port->portName() << getBaudRate() << getDataBits() << getParityType() << getStopBits(); diff --git a/src/comm/TCPLink.cc b/src/comm/TCPLink.cc index 972f2f4d6..f4af6d52d 100644 --- a/src/comm/TCPLink.cc +++ b/src/comm/TCPLink.cc @@ -191,7 +191,6 @@ bool TCPLink::_disconnect(void) _socket = NULL; emit disconnected(); - emit connected(false); } return true; @@ -241,7 +240,6 @@ bool TCPLink::_hardwareConnect(void) } _socketIsConnected = true; - emit connected(true); emit connected(); return true; diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index 7af36edc0..852f73a14 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -287,7 +287,6 @@ bool UDPLink::_disconnect(void) connectState = false; emit disconnected(); - emit connected(false); return !connectState; } @@ -352,7 +351,6 @@ bool UDPLink::hardwareConnect(void) //QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readBytes())); - emit connected(connectState); if (connectState) { emit connected(); } diff --git a/src/qgcunittest/LinkManagerTest.cc b/src/qgcunittest/LinkManagerTest.cc index 21f5f9fee..f75f8c2b2 100644 --- a/src/qgcunittest/LinkManagerTest.cc +++ b/src/qgcunittest/LinkManagerTest.cc @@ -85,7 +85,7 @@ void LinkManagerTest::_add_test(void) Q_ASSERT(_linkMgr->getLinks().count() == 0); MockLink* link = new MockLink(); - _linkMgr->add(link); + _linkMgr->addLink(link); QList links = _linkMgr->getLinks(); QCOMPARE(links.count(), 1); @@ -98,7 +98,7 @@ void LinkManagerTest::_delete_test(void) Q_ASSERT(_linkMgr->getLinks().count() == 0); MockLink* link = new MockLink(); - _linkMgr->add(link); + _linkMgr->addLink(link); _linkMgr->deleteLink(link); QCOMPARE(_linkMgr->getLinks().count(), 0); @@ -111,7 +111,7 @@ void LinkManagerTest::_addSignals_test(void) Q_ASSERT(_multiSpy->checkNoSignals() == true); MockLink* link = new MockLink(); - _linkMgr->add(link); + _linkMgr->addLink(link); QCOMPARE(_multiSpy->checkOnlySignalByMask(newLinkSignalMask), true); QSignalSpy* spy = _multiSpy->getSpyByIndex(newLinkSignalIndex); @@ -132,7 +132,7 @@ void LinkManagerTest::_deleteSignals_test(void) Q_ASSERT(_multiSpy->checkNoSignals() == true); MockLink* link = new MockLink(); - _linkMgr->add(link); + _linkMgr->addLink(link); _multiSpy->clearAllSignals(); _linkMgr->deleteLink(link); diff --git a/src/qgcunittest/MainWindowTest.cc b/src/qgcunittest/MainWindowTest.cc index 408e95d87..04b09a37f 100644 --- a/src/qgcunittest/MainWindowTest.cc +++ b/src/qgcunittest/MainWindowTest.cc @@ -76,8 +76,7 @@ void MainWindowTest::_connectWindowClose_test(void) MockLink* link = new MockLink(); Q_CHECK_PTR(link); - // FIXME: LinkManager/MainWindow needs to be re-architected so that you don't have to addLink to MainWindow to get things to work - _mainWindow->addLink(link); + LinkManager::instance()->addLink(link); linkMgr->connectLink(link); QTest::qWait(5000); // Give enough time for UI to settle and heartbeats to go through diff --git a/src/qgcunittest/MavlinkLogTest.cc b/src/qgcunittest/MavlinkLogTest.cc index eac1c1512..9d6f79d1c 100644 --- a/src/qgcunittest/MavlinkLogTest.cc +++ b/src/qgcunittest/MavlinkLogTest.cc @@ -147,8 +147,7 @@ void MavlinkLogTest::_connectLog_test(void) MockLink* link = new MockLink(); Q_CHECK_PTR(link); - // FIXME: LinkManager/MainWindow needs to be re-architected so that you don't have to addLink to MainWindow to get things to work - mainWindow->addLink(link); + LinkManager::instance()->addLink(link); linkMgr->connectLink(link); QTest::qWait(5000); // Give enough time for UI to settle and heartbeats to go through diff --git a/src/qgcunittest/MockLink.cc b/src/qgcunittest/MockLink.cc index 73fefbbba..5d0ae0191 100644 --- a/src/qgcunittest/MockLink.cc +++ b/src/qgcunittest/MockLink.cc @@ -104,7 +104,6 @@ bool MockLink::_connect(void) _connected = true; start(); emit connected(); - emit connected(true); } return true; @@ -116,7 +115,6 @@ bool MockLink::_disconnect(void) _connected = false; exit(); emit disconnected(); - emit connected(false); } return true; diff --git a/src/qgcunittest/TCPLinkTest.cc b/src/qgcunittest/TCPLinkTest.cc index 0dfa99000..6126f9c0a 100644 --- a/src/qgcunittest/TCPLinkTest.cc +++ b/src/qgcunittest/TCPLinkTest.cc @@ -56,7 +56,6 @@ void TCPLinkUnitTest::init(void) _rgSignals[bytesReceivedSignalIndex] = SIGNAL(bytesReceived(LinkInterface*, QByteArray)); _rgSignals[connectedSignalIndex] = SIGNAL(connected(void)); _rgSignals[disconnectedSignalIndex] = SIGNAL(disconnected(void)); - _rgSignals[connected2SignalIndex] = SIGNAL(connected(bool)); _rgSignals[nameChangedSignalIndex] = SIGNAL(nameChanged(QString)); _rgSignals[communicationErrorSignalIndex] = SIGNAL(communicationError(const QString&, const QString&)); _rgSignals[communicationUpdateSignalIndex] = SIGNAL(communicationUpdate(const QString&, const QString&)); @@ -157,11 +156,9 @@ void TCPLinkUnitTest::_connectSucceed_test(void) // Connect to the server QCOMPARE(_link->_connect(), true); - // Make sure we get the two different connected signals + // Make sure we get the connected signals QCOMPARE(_multiSpy->waitForSignalByIndex(connectedSignalIndex, 10000), true); - QCOMPARE(_multiSpy->checkOnlySignalByMask(connectedSignalMask | connected2SignalMask), true); - QList arguments = _multiSpy->getSpyByIndex(connected2SignalIndex)->takeFirst(); - QCOMPARE(arguments.at(0).toBool(), true); + QCOMPARE(_multiSpy->checkOnlySignalByMask(connectedSignalMask), true); _multiSpy->clearAllSignals(); // Test link->server data path @@ -186,7 +183,7 @@ void TCPLinkUnitTest::_connectSucceed_test(void) QCOMPARE(_multiSpy->checkOnlySignalByMask(bytesReceivedSignalMask), true); // Read the data and make sure it matches - arguments = _multiSpy->getSpyByIndex(bytesReceivedSignalIndex)->takeFirst(); + QList arguments = _multiSpy->getSpyByIndex(bytesReceivedSignalIndex)->takeFirst(); QVERIFY(arguments.at(1).toByteArray() == bytesOut); _multiSpy->clearAllSignals(); @@ -194,11 +191,9 @@ void TCPLinkUnitTest::_connectSucceed_test(void) // Disconnect the link _link->_disconnect(); - // Make sure we get the disconnected signals on link side + // Make sure we get the disconnected signal on link side QCOMPARE(_multiSpy->waitForSignalByIndex(disconnectedSignalIndex, 1000), true); - QCOMPARE(_multiSpy->checkOnlySignalByMask(disconnectedSignalMask | connected2SignalMask), true); - arguments = _multiSpy->getSpyByIndex(connected2SignalIndex)->takeFirst(); - QCOMPARE(arguments.at(0).toBool(), false); + QCOMPARE(_multiSpy->checkOnlySignalByMask(disconnectedSignalMask), true); _multiSpy->clearAllSignals(); // Try to connect again to make sure everything was cleaned up correctly from previous connection @@ -206,11 +201,9 @@ void TCPLinkUnitTest::_connectSucceed_test(void) // Connect to the server QCOMPARE(_link->_connect(), true); - // Make sure we get the two different connected signals + // Make sure we get the connected signal QCOMPARE(_multiSpy->waitForSignalByIndex(connectedSignalIndex, 1000), true); - QCOMPARE(_multiSpy->checkOnlySignalByMask(connectedSignalMask | connected2SignalMask), true); - arguments = _multiSpy->getSpyByIndex(connected2SignalIndex)->takeFirst(); - QCOMPARE(arguments.at(0).toBool(), true); + QCOMPARE(_multiSpy->checkOnlySignalByMask(connectedSignalMask), true); _multiSpy->clearAllSignals(); server->quit(); diff --git a/src/qgcunittest/TCPLinkTest.h b/src/qgcunittest/TCPLinkTest.h index 5680abf57..e007e3274 100644 --- a/src/qgcunittest/TCPLinkTest.h +++ b/src/qgcunittest/TCPLinkTest.h @@ -58,7 +58,6 @@ private: bytesReceivedSignalIndex = 0, connectedSignalIndex, disconnectedSignalIndex, - connected2SignalIndex, nameChangedSignalIndex, communicationErrorSignalIndex, communicationUpdateSignalIndex, @@ -70,7 +69,6 @@ private: bytesReceivedSignalMask = 1 << bytesReceivedSignalIndex, connectedSignalMask = 1 << connectedSignalIndex, disconnectedSignalMask = 1 << disconnectedSignalIndex, - connected2SignalMask = 1 << connected2SignalIndex, nameChangedSignalMask = 1 << nameChangedSignalIndex, communicationErrorSignalMask = 1 << communicationErrorSignalIndex, communicationUpdateSignalMask = 1 << communicationUpdateSignalIndex, diff --git a/src/qgcunittest/UnitTest.cc b/src/qgcunittest/UnitTest.cc index 6df2a069e..f0d25008c 100644 --- a/src/qgcunittest/UnitTest.cc +++ b/src/qgcunittest/UnitTest.cc @@ -135,6 +135,8 @@ void UnitTest::cleanup(void) QEXPECT_FAIL("", "Expecting failure due internal testing", Continue); } QCOMPARE(_missedFileDialogCount, 0); + + qgcApp()->destroySingletonsForUnitTest(); } void UnitTest::setExpectedMessageBox(QMessageBox::StandardButton response) diff --git a/src/uas/QGCUASFileManager.cc b/src/uas/QGCUASFileManager.cc index ed459d236..0889981b7 100644 --- a/src/uas/QGCUASFileManager.cc +++ b/src/uas/QGCUASFileManager.cc @@ -481,7 +481,7 @@ void QGCUASFileManager::_sendRequest(Request* request) request->hdr.seqNumber = _lastOutgoingSeqNumber; if (_systemIdQGC == 0) { - _systemIdQGC = MainWindow::instance()->getMAVLink()->getSystemId(); + _systemIdQGC = LinkManager::instance()->mavlink()->getSystemId(); } Q_ASSERT(_mav); diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 29a618e0e..b94c2a3fe 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -1765,7 +1765,7 @@ void UAS::sendMessage(mavlink_message_t message) void UAS::forwardMessage(mavlink_message_t message) { // Emit message on all links that are currently connected - QListlink_list = LinkManager::instance()->getLinksForProtocol(mavlink); + QListlink_list = LinkManager::instance()->getLinks(); foreach(LinkInterface* link, link_list) { diff --git a/src/uas/UASParameterCommsMgr.cc b/src/uas/UASParameterCommsMgr.cc index ea5aff996..e41a7b57e 100644 --- a/src/uas/UASParameterCommsMgr.cc +++ b/src/uas/UASParameterCommsMgr.cc @@ -71,7 +71,7 @@ void UASParameterCommsMgr::loadParamCommsSettings() void UASParameterCommsMgr::_sendParamRequestListMsg(void) { - MAVLinkProtocol* mavlink = MainWindow::instance()->getMAVLink(); + MAVLinkProtocol* mavlink = LinkManager::instance()->mavlink(); Q_ASSERT(mavlink); mavlink_message_t msg; diff --git a/src/ui/CommConfigurationWindow.cc b/src/ui/CommConfigurationWindow.cc index 09779611c..aac445c9e 100644 --- a/src/ui/CommConfigurationWindow.cc +++ b/src/ui/CommConfigurationWindow.cc @@ -60,7 +60,7 @@ This file is part of the QGROUNDCONTROL project #include "LinkManager.h" #include "MainWindow.h" -CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, ProtocolInterface* protocol, QWidget *parent) : QDialog(parent) +CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, QWidget *parent) : QDialog(parent) { this->link = link; @@ -112,7 +112,6 @@ CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, ProtocolIn // Create configuration action for this link // Connect the current UAS action = new QAction(QIcon(":/files/images/devices/network-wireless.svg"), "", this); - LinkManager::instance()->add(link); action->setData(link->getId()); action->setEnabled(true); action->setVisible(true); @@ -127,12 +126,11 @@ CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, ProtocolIn connect(ui.closeButton, SIGNAL(clicked()), this->window(), SLOT(close())); connect(ui.deleteButton, SIGNAL(clicked()), this, SLOT(remove())); - connect(this->link, SIGNAL(connected(bool)), this, SLOT(connectionState(bool))); - + connect(link, &LinkInterface::connected, this, &CommConfigurationWindow::_linkConnected); + connect(link, &LinkInterface::disconnected, this, &CommConfigurationWindow::_linkDisconnected); // Fill in the current data if(this->link->isConnected()) ui.connectButton->setChecked(true); - //connect(this->link, SIGNAL(connected(bool)), ui.connectButton, SLOT(setChecked(bool))); if(this->link->isConnected()) { ui.connectionStatusLabel->setText(tr("Connected")); @@ -226,14 +224,10 @@ CommConfigurationWindow::CommConfigurationWindow(LinkInterface* link, ProtocolIn connect(ui.linkType,SIGNAL(currentIndexChanged(int)),this,SLOT(linkCurrentIndexChanged(int))); // Open details pane for MAVLink if necessary - MAVLinkProtocol* mavlink = dynamic_cast(protocol); - if (mavlink != 0) { - QWidget* conf = new MAVLinkSettingsWidget(mavlink, this); - ui.protocolScrollArea->setWidget(conf); - ui.protocolGroupBox->setTitle(protocol->getName()+" (Global Settings)"); - } else { - qDebug() << "Protocol is NOT MAVLink, can't open configuration window"; - } + MAVLinkProtocol* mavlink = LinkManager::instance()->mavlink(); + QWidget* conf = new MAVLinkSettingsWidget(mavlink, this); + ui.protocolScrollArea->setWidget(conf); + ui.protocolGroupBox->setTitle(mavlink->getName()+" (Global Settings)"); // Open details for UDP link if necessary // TODO @@ -288,7 +282,6 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) { UDPLink *udp = new UDPLink(); tmpLink = udp; - MainWindow::instance()->addLink(tmpLink); break; } @@ -296,7 +289,6 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) { TCPLink *tcp = new TCPLink(); tmpLink = tcp; - MainWindow::instance()->addLink(tmpLink); break; } @@ -305,7 +297,6 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) { OpalLink* opal = new OpalLink(); tmpLink = opal; - MainWindow::instance()->addLink(tmpLink); break; } #endif // QGC_RTLAB_ENABLED @@ -315,7 +306,6 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) { MockLink* mock = new MockLink; tmpLink = mock; - MainWindow::instance()->addLink(tmpLink); break; } #endif @@ -325,10 +315,13 @@ void CommConfigurationWindow::setLinkType(qgc_link_t linktype) { SerialLink *serial = new SerialLink(); tmpLink = serial; - MainWindow::instance()->addLink(tmpLink); break; } } + + if (tmpLink) { + LinkManager::instance()->addLink(tmpLink); + } // trigger new window const int32_t& linkIndex(LinkManager::instance()->getLinks().indexOf(tmpLink)); @@ -385,7 +378,15 @@ void CommConfigurationWindow::remove() this->deleteLater(); } -void CommConfigurationWindow::connectionState(bool connect) +void CommConfigurationWindow::_linkConnected(void) { + _connectionState(true); +} + +void CommConfigurationWindow::_linkDisconnected(void) { + _connectionState(false); +} + +void CommConfigurationWindow::_connectionState(bool connect) { ui.connectButton->setChecked(connect); if(connect) { diff --git a/src/ui/CommConfigurationWindow.h b/src/ui/CommConfigurationWindow.h index acb8e101a..f786b5183 100644 --- a/src/ui/CommConfigurationWindow.h +++ b/src/ui/CommConfigurationWindow.h @@ -73,7 +73,7 @@ class CommConfigurationWindow : public QDialog Q_OBJECT public: - CommConfigurationWindow(LinkInterface* link, ProtocolInterface* protocol, QWidget *parent = 0); + CommConfigurationWindow(LinkInterface* link, QWidget *parent = 0); ~CommConfigurationWindow(); QAction* getAction(); @@ -86,12 +86,16 @@ public slots: /** @brief Set the protocol for this link */ void setProtocol(int protocol); void setConnection(); - void connectionState(bool connect); void setLinkName(QString name); /** @brief Disconnects the associated link, removes it from all menus and closes the window. */ void remove(); +private slots: + void _linkConnected(void); + void _linkDisconnected(void); + private: + void _connectionState(bool connect); Ui::commSettings ui; LinkInterface* link; diff --git a/src/ui/DebugConsole.cc b/src/ui/DebugConsole.cc index d362966cc..ad8b37b50 100644 --- a/src/ui/DebugConsole.cc +++ b/src/ui/DebugConsole.cc @@ -217,7 +217,7 @@ void DebugConsole::linkSelected(int linkId) if (currLink) { disconnect(currLink, SIGNAL(bytesReceived(LinkInterface*,QByteArray)), this, SLOT(receiveBytes(LinkInterface*, QByteArray))); - disconnect(currLink, SIGNAL(connected(bool)), this, SLOT(setConnectionState(bool))); + disconnect(currLink, &LinkInterface::connected, this, &DebugConsole::_linkConnected); disconnect(currLink,SIGNAL(communicationUpdate(QString,QString)),this,SLOT(linkStatusUpdate(QString,QString))); snapShotTimer.stop(); } @@ -229,9 +229,9 @@ void DebugConsole::linkSelected(int linkId) if (linkId != -1) { currLink = links[linkId]; connect(currLink, SIGNAL(bytesReceived(LinkInterface*,QByteArray)), this, SLOT(receiveBytes(LinkInterface*, QByteArray))); - connect(currLink, SIGNAL(connected(bool)), this, SLOT(setConnectionState(bool))); + disconnect(currLink, &LinkInterface::connected, this, &DebugConsole::_linkConnected); connect(currLink,SIGNAL(communicationUpdate(QString,QString)),this,SLOT(linkStatusUpdate(QString,QString))); - setConnectionState(currLink->isConnected()); + _setConnectionState(currLink->isConnected()); snapShotTimer.start(); } } @@ -761,10 +761,20 @@ void DebugConsole::hold(bool hold) } } +void DebugConsole::_linkConnected(void) +{ + _setConnectionState(true); +} + +void DebugConsole::_linkDisconnected(void) +{ + _setConnectionState(false); +} + /** * Sets the connection state the widget shows to this state */ -void DebugConsole::setConnectionState(bool connected) +void DebugConsole::_setConnectionState(bool connected) { if(connected) { m_ui->connectButton->setText(tr("Disconn.")); diff --git a/src/ui/DebugConsole.h b/src/ui/DebugConsole.h index 0cd4592d1..6fcadf94e 100644 --- a/src/ui/DebugConsole.h +++ b/src/ui/DebugConsole.h @@ -81,8 +81,6 @@ public slots: void MAVLINKfilterEnabled(bool filter); /** @brief Freeze input, do not store new incoming data */ void hold(bool hold); - /** @brief Set connection state of the current link */ - void setConnectionState(bool); /** @brief Handle the connect button */ void handleConnectButton(); /** @brief Enable auto-freeze mode if traffic intensity is too high to display */ @@ -144,8 +142,15 @@ protected: QStringList commandHistory; QString currCommand; int commandIndex; + +private slots: + void _linkConnected(void); + void _linkDisconnected(void); private: + /** @brief Set connection state of the current link */ + void _setConnectionState(bool); + Ui::DebugConsole *m_ui; }; diff --git a/src/ui/MAVLinkSettingsWidget.cc b/src/ui/MAVLinkSettingsWidget.cc index af377ff7c..0921eb002 100644 --- a/src/ui/MAVLinkSettingsWidget.cc +++ b/src/ui/MAVLinkSettingsWidget.cc @@ -142,7 +142,7 @@ void MAVLinkSettingsWidget::enableDroneOS(bool enable) // Delete from all lists first UDPLink* firstUdp = NULL; - QList links = LinkManager::instance()->getLinksForProtocol(protocol); + QList links = LinkManager::instance()->getLinks(); foreach (LinkInterface* link, links) { UDPLink* udp = dynamic_cast(link); diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 9be412641..b6df46f28 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -112,7 +112,6 @@ void MainWindow::deleteInstance(void) MainWindow::MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE mode) : currentView(VIEW_FLIGHT), currentStyle(QGC_MAINWINDOW_STYLE_DARK), - mavlink(new MAVLinkProtocol()), centerStackActionGroup(new QActionGroup(this)), autoReconnect(false), simulationLink(NULL), @@ -131,8 +130,8 @@ MainWindow::MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE this->setAttribute(Qt::WA_DeleteOnClose); connect(menuActionHelper, SIGNAL(needToShowDockWidget(QString,bool)),SLOT(showDockWidget(QString,bool))); - connect(mavlink, SIGNAL(protocolStatusMessage(const QString&, const QString&)), this, SLOT(showCriticalMessage(const QString&, const QString&))); - connect(mavlink, SIGNAL(saveTempFlightDataLog(QString)), this, SLOT(_saveTempFlightDataLog(QString))); + connect(LinkManager::instance()->mavlink(), SIGNAL(protocolStatusMessage(const QString&, const QString&)), this, SLOT(showCriticalMessage(const QString&, const QString&))); + connect(LinkManager::instance()->mavlink(), SIGNAL(saveTempFlightDataLog(QString)), this, SLOT(_saveTempFlightDataLog(QString))); loadSettings(); @@ -242,11 +241,11 @@ MainWindow::MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE QList links = LinkManager::instance()->getLinks(); foreach(LinkInterface* link, links) { - this->addLink(link); + _addLinkMenu(link); } - connect(LinkManager::instance(), SIGNAL(newLink(LinkInterface*)), this, SLOT(addLink(LinkInterface*))); - + connect(LinkManager::instance(), &LinkManager::newLink, this, &MainWindow::_addLinkMenu); + // Connect user interface devices emit initStatusChanged(tr("Initializing joystick interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); joystick = new JoystickInput(); @@ -274,8 +273,7 @@ MainWindow::MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE SerialLink* link = new SerialLink(); // Add to registry - linkMgr->add(link); - linkMgr->addProtocol(link, mavlink); + linkMgr->addLink(link); linkMgr->connectLink(link); } @@ -365,11 +363,6 @@ MainWindow::MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE MainWindow::~MainWindow() { - if (mavlink) - { - delete mavlink; - mavlink = NULL; - } if (simulationLink) { delete simulationLink; @@ -496,12 +489,12 @@ void MainWindow::buildCustomWidget() void MainWindow::buildCommonWidgets() { // Add generic MAVLink decoder - mavlinkDecoder = new MAVLinkDecoder(mavlink, this); + mavlinkDecoder = new MAVLinkDecoder(LinkManager::instance()->mavlink(), this); connect(mavlinkDecoder, SIGNAL(valueChanged(int,QString,QString,QVariant,quint64)), this, SIGNAL(valueChanged(int,QString,QString,QVariant,quint64))); // Log player - logPlayer = new QGCMAVLinkLogPlayer(mavlink, statusBar()); + logPlayer = new QGCMAVLinkLogPlayer(LinkManager::instance()->mavlink(), statusBar()); statusBar()->addPermanentWidget(logPlayer); // Initialize all of the views, if they haven't been already, and add their central widgets @@ -588,7 +581,7 @@ void MainWindow::buildCommonWidgets() createDockWidget(simView, new PrimaryFlightDisplay(this), tr("Primary Flight Display"), "PRIMARY_FLIGHT_DISPLAY_DOCKWIDGET", VIEW_SIMULATION, Qt::RightDockWidgetArea); // Add dock widgets for the engineering view - createDockWidget(engineeringView, new QGCMAVLinkInspector(mavlink, this), tr("MAVLink Inspector"), "MAVLINK_INSPECTOR_DOCKWIDGET", VIEW_ENGINEER, Qt::RightDockWidgetArea); + createDockWidget(engineeringView, new QGCMAVLinkInspector(LinkManager::instance()->mavlink(), this), tr("MAVLink Inspector"), "MAVLINK_INSPECTOR_DOCKWIDGET", VIEW_ENGINEER, Qt::RightDockWidgetArea); createDockWidget(engineeringView, new ParameterInterface(this), tr("Onboard Parameters"), "PARAMETER_INTERFACE_DOCKWIDGET", VIEW_ENGINEER, Qt::RightDockWidgetArea); createDockWidget(engineeringView, new QGCUASFileViewMulti(this), tr("Onboard Files"), "FILE_VIEW_DOCKWIDGET", VIEW_ENGINEER, Qt::RightDockWidgetArea); createDockWidget(engineeringView, new HUD(320, 240, this), tr("Video Downlink"), "HEAD_UP_DISPLAY_DOCKWIDGET", VIEW_ENGINEER, Qt::RightDockWidgetArea); @@ -669,7 +662,7 @@ void MainWindow::loadDockWidget(const QString& name) } else if (name == "MAVLINK_INSPECTOR_DOCKWIDGET") { - createDockWidget(centerStack->currentWidget(),new QGCMAVLinkInspector(mavlink,this),tr("MAVLink Inspector"),"MAVLINK_INSPECTOR_DOCKWIDGET",currentView,Qt::RightDockWidgetArea); + createDockWidget(centerStack->currentWidget(),new QGCMAVLinkInspector(LinkManager::instance()->mavlink(),this),tr("MAVLink Inspector"),"MAVLINK_INSPECTOR_DOCKWIDGET",currentView,Qt::RightDockWidgetArea); } else if (name == "PARAMETER_INTERFACE_DOCKWIDGET") { @@ -800,7 +793,6 @@ void MainWindow::closeEvent(QCloseEvent *event) storeViewState(); storeSettings(); - mavlink->storeSettings(); UASManager::instance()->storeSettings(); event->accept(); } @@ -812,7 +804,7 @@ void MainWindow::connectCommonWidgets() { if (infoDockWidget && infoDockWidget->widget()) { - connect(mavlink, SIGNAL(receiveLossChanged(int, float)), + connect(LinkManager::instance()->mavlink(), SIGNAL(receiveLossChanged(int, float)), infoDockWidget->widget(), SLOT(updateSendLoss(int, float))); } } @@ -1290,13 +1282,13 @@ void MainWindow::showSettings() settings.exec(); } +// FIXME: Where is this called from LinkInterface* MainWindow::addLink() { SerialLink* link = new SerialLink(); // TODO This should be only done in the dialog itself - LinkManager::instance()->add(link); - LinkManager::instance()->addProtocol(link, mavlink); + LinkManager::instance()->addLink(link); // Go fishing for this link's configuration window QList actions = ui.menuNetwork->actions(); @@ -1339,41 +1331,29 @@ bool MainWindow::configLink(LinkInterface *link) return found; } -void MainWindow::addLink(LinkInterface *link) +void MainWindow::_addLinkMenu(LinkInterface *link) { - // IMPORTANT! KEEP THESE TWO LINES - // THEY MAKE SURE THE LINK IS PROPERLY REGISTERED - // BEFORE LINKING THE UI AGAINST IT - // Register (does nothing if already registered) - LinkManager::instance()->add(link); - LinkManager::instance()->addProtocol(link, mavlink); - // Go fishing for this link's configuration window QList actions = ui.menuNetwork->actions(); - bool found(false); + bool alreadyAdded = false; 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) - { - found = true; + foreach (QAction* act, actions) { + if (act->data().toInt() == linkID) { + alreadyAdded = true; + break; } } - if (!found) - { - CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this); + if (!alreadyAdded) { + CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, this); commsWidgetList.append(commWidget); connect(commWidget,SIGNAL(destroyed(QObject*)),this,SLOT(commsWidgetDestroyed(QObject*))); QAction* action = commWidget->getAction(); ui.menuNetwork->addAction(action); - - // Error handling - connect(link, SIGNAL(communicationError(QString,QString)), this, SLOT(showCriticalMessage(QString,QString)), Qt::QueuedConnection); } } @@ -1750,6 +1730,7 @@ bool MainWindow::dockWidgetTitleBarsEnabled() const return menuActionHelper->dockWidgetTitleBarsEnabled(); } +/// @brief Save the specified Flight Data Log void MainWindow::_saveTempFlightDataLog(QString tempLogfile) { QString saveFilename = QGCFileDialog::getSaveFileName(this, diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index df2a12982..6e2bc9e2e 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -46,7 +46,6 @@ This file is part of the QGROUNDCONTROL project #include "WaypointList.h" #include "CameraView.h" #include "UASListWidget.h" -#include "MAVLinkProtocol.h" #include "MAVLinkSimulationLink.h" #include "submainwindow.h" #include "input/JoystickInput.h" @@ -175,7 +174,6 @@ public slots: void showSettings(); /** @brief Add a communication link */ LinkInterface* addLink(); - void addLink(LinkInterface* link); bool configLink(LinkInterface *link); /** @brief Simulate a link */ void simulateLink(bool simulate); @@ -293,11 +291,6 @@ public: return logPlayer; } - MAVLinkProtocol* getMAVLink() - { - return mavlink; - } - protected: typedef enum _VIEW_SECTIONS @@ -360,8 +353,6 @@ protected: void loadSettings(); void storeSettings(); - // TODO Should be moved elsewhere, as the protocol does not belong to the UI - QPointer mavlink; LinkInterface* udpLink; @@ -461,8 +452,8 @@ protected: CUSTOM_MODE customMode; private slots: - /// @brief Save the specified Flight Data Log void _saveTempFlightDataLog(QString tempLogfile); + void _addLinkMenu(LinkInterface* link); private: /// Constructor is private since all creation should be through MainWindow::_create diff --git a/src/ui/OpalLinkConfigurationWindow.cc b/src/ui/OpalLinkConfigurationWindow.cc index 4278413d6..5788fbede 100644 --- a/src/ui/OpalLinkConfigurationWindow.cc +++ b/src/ui/OpalLinkConfigurationWindow.cc @@ -14,11 +14,22 @@ OpalLinkConfigurationWindow::OpalLinkConfigurationWindow(OpalLink* link, ui.opalInstIDSpinBox->setValue(this->link->getOpalInstID()); connect(ui.opalInstIDSpinBox, SIGNAL(valueChanged(int)), link, SLOT(setOpalInstID(int))); - connect(link, SIGNAL(connected(bool)), this, SLOT(allowSettingsAccess(bool))); + connect(link, &LinkInterface::connected, this, OpalLinkConfigurationWindow::_linkConnected); + connect(link, &LinkInterface::disconnected, this, OpalLinkConfigurationWindow::_linkDisConnected); this->show(); } -void OpalLinkConfigurationWindow::allowSettingsAccess(bool enabled) +void OpalLinkConfigurationWindow::_linkConnected(void) +{ + _allowSettingsAccess(true); +} + +void OpalLinkConfigurationWindow::_linkConnected(void) +{ + _allowSettingsAccess(false); +} + +void OpalLinkConfigurationWindow::_allowSettingsAccess(bool enabled) { ui.paramFileButton->setEnabled(enabled); ui.servoConfigFileButton->setEnabled(enabled); diff --git a/src/ui/OpalLinkConfigurationWindow.h b/src/ui/OpalLinkConfigurationWindow.h index 10dea86d7..f29433086 100644 --- a/src/ui/OpalLinkConfigurationWindow.h +++ b/src/ui/OpalLinkConfigurationWindow.h @@ -15,11 +15,13 @@ public: explicit OpalLinkConfigurationWindow(OpalLink* link, QWidget *parent = 0, Qt::WindowFlags flags = Qt::Sheet); signals: -public slots: - - void allowSettingsAccess(bool enabled); +private slots: + void _linkConnected(void); + void _linkDisconnected(void); private: + void _allowSettingsAccess(bool enabled); + Ui::OpalLinkSettings ui; OpalLink* link; }; diff --git a/src/ui/QGCToolBar.cc b/src/ui/QGCToolBar.cc index 1ea2c814a..fc35034f2 100644 --- a/src/ui/QGCToolBar.cc +++ b/src/ui/QGCToolBar.cc @@ -661,8 +661,8 @@ void QGCToolBar::addLink(LinkInterface* link) toolBarBaudAction->setVisible(true); currentLink = link; - connect(currentLink, SIGNAL(connected(bool)), this, SLOT(updateLinkState(bool))); - updateLinkState(link->isConnected()); + connect(currentLink, &LinkInterface::connected, this, &QGCToolBar::_linkConnected); + _updateLinkState(link->isConnected()); qDebug() << "ADD LINK"; @@ -683,7 +683,7 @@ void QGCToolBar::removeLink(LinkInterface* link) // Update GUI according to scan result if (currentLink) { - updateLinkState(currentLink->isConnected()); + _updateLinkState(currentLink->isConnected()); } else { connectButton->setText(tr("New Serial Link")); portComboBox->hide(); @@ -740,7 +740,17 @@ void QGCToolBar::updateComboBox() } } -void QGCToolBar::updateLinkState(bool connected) +void QGCToolBar::_linkConnected(void) +{ + _updateLinkState(true); +} + +void QGCToolBar::_linkDisconnected(void) +{ + _updateLinkState(false); +} + +void QGCToolBar::_updateLinkState(bool connected) { Q_UNUSED(connected); if (currentLink && currentLink->isConnected() && portComboBox->isVisible()) @@ -767,32 +777,32 @@ void QGCToolBar::updateLinkState(bool connected) } } -void QGCToolBar::connectLink(bool connect) +void QGCToolBar::connectLink(bool connectLink) { LinkManager* linkMgr = LinkManager::instance(); Q_ASSERT(linkMgr); // No serial port yet present - if (connect && linkMgr->getSerialLinks().count() == 0) { + if (connectLink && linkMgr->getSerialLinks().count() == 0) { MainWindow::instance()->addLink(); currentLink = linkMgr->getLinks().last(); - } else if (connect) { + } else if (connectLink) { SerialLink *link = qobject_cast(currentLink); if (link) { link->setPortName(portComboBox->itemData(portComboBox->currentIndex()).toString().trimmed()); int baud = baudcomboBox->currentText().toInt(); link->setBaudRate(baud); - QObject::connect(link, SIGNAL(connected(bool)), this, SLOT(updateLinkState(bool))); + connect(link, &LinkInterface::connected, this, &QGCToolBar::_linkConnected); linkMgr->connectLink(link); } - } else if (!connect && currentLink) { + } else if (!connectLink && currentLink) { linkMgr->disconnectLink(currentLink); - QObject::disconnect(currentLink, SIGNAL(connected(bool)), this, SLOT(updateLinkState(bool))); + disconnect(currentLink, &LinkInterface::connected, this, &QGCToolBar::_linkConnected); } if (currentLink) { - updateLinkState(currentLink->isConnected()); + _updateLinkState(currentLink->isConnected()); } } diff --git a/src/ui/QGCToolBar.h b/src/ui/QGCToolBar.h index e4d04836e..024f01a88 100644 --- a/src/ui/QGCToolBar.h +++ b/src/ui/QGCToolBar.h @@ -52,8 +52,6 @@ public slots: void addLink(LinkInterface* link); /** @brief Remove link which is currently handled */ void removeLink(LinkInterface* link); - /** @brief Update the link state */ - void updateLinkState(bool connected); /** @brief Set the system state */ void updateState(UASInterface* system, QString name, QString description); /** @brief Set the system mode */ @@ -146,6 +144,14 @@ protected: QAction* firstAction; QToolButton *advancedButton; QButtonGroup *group; + +private slots: + void _linkConnected(void); + void _linkDisconnected(void); + +private: + /** @brief Update the link state */ + void _updateLinkState(bool connected); }; #endif // QGCTOOLBAR_H diff --git a/src/ui/SerialConfigurationWindow.cc b/src/ui/SerialConfigurationWindow.cc index ad928597d..8acbaa95a 100644 --- a/src/ui/SerialConfigurationWindow.cc +++ b/src/ui/SerialConfigurationWindow.cc @@ -137,10 +137,6 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge ui.advCheckBox->setChecked(false); ui.advGroupBox->setVisible(false); - //connect(this->link, SIGNAL(connected(bool)), this, SLOT()); - //ui.portName->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); - //ui.baudRate->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); - switch(this->link->getParityType()) { case 0: ui.parNone->setChecked(true); diff --git a/src/ui/SettingsDialog.cc b/src/ui/SettingsDialog.cc index 27fbfed86..328a6d89d 100644 --- a/src/ui/SettingsDialog.cc +++ b/src/ui/SettingsDialog.cc @@ -52,15 +52,8 @@ _ui(new Ui::SettingsDialog) // Add the joystick settings pane _ui->tabWidget->addTab(new JoystickWidget(joystick, this), "Controllers"); - // Add all protocols - QList protocols = LinkManager::instance()->getProtocols(); - foreach (ProtocolInterface* protocol, protocols) { - MAVLinkProtocol* mavlink = dynamic_cast(protocol); - if (mavlink) { - MAVLinkSettingsWidget* msettings = new MAVLinkSettingsWidget(mavlink, this); - _ui->tabWidget->addTab(msettings, "MAVLink"); - } - } + MAVLinkSettingsWidget* msettings = new MAVLinkSettingsWidget(LinkManager::instance()->mavlink(), this); + _ui->tabWidget->addTab(msettings, "MAVLink"); this->window()->setWindowTitle(tr("QGroundControl Settings")); diff --git a/src/ui/uas/UASListWidget.cc b/src/ui/uas/UASListWidget.cc index c1017ec7d..87a3b14a3 100644 --- a/src/ui/uas/UASListWidget.cc +++ b/src/ui/uas/UASListWidget.cc @@ -124,20 +124,20 @@ void UASListWidget::updateStatus() if (!link) continue; - ProtocolInterface* p = LinkManager::instance()->getProtocolForLink(link); + MAVLinkProtocol* mavlink = LinkManager::instance()->mavlink(); // Build the tooltip out of the protocol parsing data: received, dropped, and parsing errors. QString displayString(""); int c; - if ((c = p->getReceivedPacketCount(link)) != -1) + if ((c = mavlink->getReceivedPacketCount(link)) != -1) { displayString += QString(tr("
Received: %2")).arg(QString::number(c)); } - if ((c = p->getDroppedPacketCount(link)) != -1) + if ((c = mavlink->getDroppedPacketCount(link)) != -1) { displayString += QString(tr("
Dropped: %2")).arg(QString::number(c)); } - if ((c = p->getParsingErrorCount(link)) != -1) + if ((c = mavlink->getParsingErrorCount(link)) != -1) { displayString += QString(tr("
Errors: %2")).arg(QString::number(c)); } -- 2.22.0