Newer
Older
/*=====================================================================
(c) 2009, 2015 PIXHAWK PROJECT <http://pixhawk.ethz.ch>
PIXHAWK is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
PIXHAWK is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/// @file
/// @author Lorenz Meier <mavteam@student.ethz.ch>
#ifndef _LINKMANAGER_H_
#define _LINKMANAGER_H_
#include <QList>
dogmaphobic
committed
#include "LinkConfiguration.h"
dogmaphobic
committed
// Links
dogmaphobic
committed
#include "UDPLink.h"
dogmaphobic
committed
#include "MockLink.h"
dogmaphobic
committed
/// 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.
{
dogmaphobic
committed
/// Unit Test has access to private constructor/destructor
friend class LinkManagerTest;
dogmaphobic
committed
LinkManager(QGCApplication* app);
~LinkManager();
dogmaphobic
committed
/*!
Add a new link configuration setting to the list
@param[in] link An instance of the link setting.
*/
void addLinkConfiguration(LinkConfiguration* link);
/*!
Removes (and deletes) an existing link configuration setting from the list
@param[in] link An instance of the link setting.
*/
void removeLinkConfiguration(LinkConfiguration* link);
/// Load list of link configurations from disk
void loadLinkConfigurationList();
/// Save list of link configurations from disk
void saveLinkConfigurationList();
/// Get a list of the configured links. This is the list of configured links that can be used by QGC.
const QList<LinkConfiguration*> getLinkConfigurationList();
/// Suspend automatic confguration updates (during link maintenance for instance)
void suspendConfigurationUpdates(bool suspend);
const QList<SerialLink*> getSerialLinks();
/// Sets the flag to suspend the all new connections
/// @param reason User visible reason to suspend connections
void setConnectionsSuspended(QString reason);
dogmaphobic
committed
/// Sets the flag to allow new connections to be made
void setConnectionsAllowed(void) { _connectionsSuspended = false; }
dogmaphobic
committed
/// Creates, connects (and adds) a link based on the given configuration instance.
LinkInterface* createConnectedLink(LinkConfiguration* config);
dogmaphobic
committed
/// Creates, connects (and adds) a link based on the given configuration name.
LinkInterface* createConnectedLink(const QString& name);
dogmaphobic
committed
/// Returns true if the link manager is holding this link
bool containsLink(LinkInterface* link);
/// Returns the QSharedPointer for this link. You must use SharedLinkInterface if you are going to
/// keep references to a link in a thread other than the main ui thread.
SharedLinkInterface& sharedPointerForLink(LinkInterface* link);
dogmaphobic
committed
dogmaphobic
committed
dogmaphobic
committed
/// Connect the specified link
bool connectLink(LinkInterface* link);
dogmaphobic
committed
/// Returns true if there are any connected links
bool anyConnectedLinks(void);
// The following APIs are public but should not be called in normal use. The are mainly exposed
// here for unit test code.
void _deleteLink(LinkInterface* link);
void _addLink(LinkInterface* link);
dogmaphobic
committed
// Override from QGCTool
virtual void setToolbox(QGCToolbox *toolbox);
void linkDeleted(LinkInterface* link);
void linkConnected(LinkInterface* link);
void linkDisconnected(LinkInterface* link);
dogmaphobic
committed
void linkConfigurationChanged();
private slots:
void _linkConnected(void);
void _linkDisconnected(void);
dogmaphobic
committed
virtual void _shutdown(void);
bool _connectionsSuspendedMsg(void);
dogmaphobic
committed
void _updateConfigurationList(void);
dogmaphobic
committed
SerialConfiguration* _findSerialConfiguration(const QString& portName);
dogmaphobic
committed
QList<LinkConfiguration*> _linkConfigurations; ///< List of configured links
/// List of available links kept as QSharedPointers. We use QSharedPointer since
/// there are other objects that maintain copies of these links in other threads.
/// The reference counting allows for orderly deletion.
QList<SharedLinkInterface> _links;
dogmaphobic
committed
QMutex _linkListMutex; ///< Mutex for thread safe access to _links list
bool _configUpdateSuspended; ///< true: stop updating configuration list
bool _configurationsLoaded; ///< true: Link configurations have been loaded
bool _connectionsSuspended; ///< true: all new connections should not be allowed
QString _connectionsSuspendedReason; ///< User visible reason for suspension
dogmaphobic
committed
QTimer _portListTimer;
uint32_t _mavlinkChannelsUsedBitMask;
SharedLinkInterface _nullSharedLink;
MAVLinkProtocol* _mavlinkProtocol;