QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
LinkManager.h
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <limits>
5#include <memory>
6
7#include <QtCore/QList>
8#include <QtCore/QMutex>
9#include <QtCore/QMutexLocker>
10#include <QtCore/QStringList>
11#include <QtQmlIntegration/QtQmlIntegration>
12
13#include "LinkConfiguration.h"
14#include "LinkInterface.h"
15
17class LogReplayLink;
18class MAVLinkProtocol;
20class QTimer;
23
29class LinkManager : public QObject
30{
31 Q_OBJECT
32 QML_ELEMENT
33 QML_UNCREATABLE("")
34 Q_MOC_INCLUDE("QmlObjectListModel.h")
35 Q_MOC_INCLUDE("LogReplayLink.h")
37 Q_PROPERTY(QmlObjectListModel *linkConfigurations READ _qmlLinkConfigurations CONSTANT)
38 Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT)
40
41 friend class LinkManagerTest;
42
43public:
44 explicit LinkManager(QObject *parent = nullptr);
45 ~LinkManager();
46
47 static LinkManager *instance();
48
49 void init();
50
52 Q_INVOKABLE LinkConfiguration *createConfiguration(int type, const QString &name);
54 Q_INVOKABLE void cancelConfigurationEditing(LinkConfiguration *config) const { delete config; }
55 Q_INVOKABLE void endConfigurationEditing(LinkConfiguration *config, LinkConfiguration *editedConfig);
59 Q_INVOKABLE void createConnectedLink(const LinkConfiguration *config);
60 Q_INVOKABLE void disconnectLink(LinkInterface *link);
63 Q_INVOKABLE void createMavlinkForwardingSupportLink();
65 Q_INVOKABLE void shutdown();
66 Q_INVOKABLE LogReplayLink *startLogReplay(const QString &logFile);
67
68 QList<SharedLinkInterfacePtr> links();
69 QStringList linkTypeStrings() const;
70 bool mavlinkSupportForwardingEnabled() const { return _mavlinkSupportForwardingEnabled; }
71
74
77 void setConnectionsSuspended(const QString &reason) { _connectionsSuspended = true; _connectionsSuspendedReason = reason; }
78
80 void setConnectionsAllowed() { _connectionsSuspended = false; }
81
82 bool connectionsSuspended() const { return _connectionsSuspended; }
83
86
89
92
93 void disconnectAll();
94
97 uint8_t allocateMavlinkChannel();
98 void freeMavlinkChannel(uint8_t channel);
99
103
104 bool containsLink(const LinkInterface *link);
105
107 bool containsConfiguration(const QString& name) const;
108
110
111 static bool isBluetoothAvailable();
112
113 static bool isLinkUSBDirect(const LinkInterface *link);
114
115 static constexpr uint8_t invalidMavlinkChannel() { return std::numeric_limits<uint8_t>::max(); }
116
117signals:
120
121private slots:
122 void _linkConnected();
123 void _linkDisconnected();
124 void _communicationError(const QString &title, const QString &error);
125
126private:
127 QmlObjectListModel *_qmlLinkConfigurations();
129 bool _connectionsSuspendedMsg() const;
130 void _updateAutoConnectLinks();
131 void _removeConfiguration(const LinkConfiguration *config);
132 void _addUDPAutoConnectLink();
133 void _addMAVLinkForwardingLink();
134 void _reconnectAutoConnectLinks();
136 void _retryDynamicUdpLink(const QString& name, const std::function<void(UDPConfiguration&)>& configure);
137 SharedLinkConfigurationPtr _findDynamicUdpConfiguration(const QString& name) const;
138
139 QTimer *_portListTimer = nullptr;
140 QmlObjectListModel *_qmlConfigurations = nullptr;
141 AutoConnectSettings *_autoConnectSettings = nullptr;
142
143 bool _configUpdateSuspended = false;
144 bool _configurationsLoaded = false;
145 bool _connectionsSuspended = false;
146 bool _mavlinkSupportForwardingEnabled = false;
147 uint32_t _mavlinkChannelsUsedBitMask = 1;
148 QString _connectionsSuspendedReason;
149
150 QMutex _linksMutex;
151 QList<SharedLinkInterfacePtr> _rgLinks;
152 QList<SharedLinkConfigurationPtr> _rgLinkConfigs;
153
154 static constexpr const char *_defaultUDPLinkName = "UDP Link (AutoConnect)";
155 static constexpr const char *_mavlinkForwardingLinkName = "MAVLink Forwarding Link";
156 static constexpr const char *_mavlinkForwardingSupportLinkName = "MAVLink Support Forwarding Link";
157
158 static constexpr int _autoconnectUpdateTimerMSecs = 1000;
159#ifndef QGC_NO_SERIAL_LINK
160private:
161 Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT)
162 Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged)
163 Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged)
164
165public:
166 static QStringList serialBaudRates();
167 QStringList serialPortStrings();
168 QStringList serialPorts();
169
170signals:
173
174private:
175 void _updateSerialPorts();
176 std::unique_ptr<SerialAutoConnect> _serialAutoConnect;
177 QStringList _commPortList;
178 QStringList _commPortDisplayList;
179#endif // QGC_NO_SERIAL_LINK
180};
Config config
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
std::shared_ptr< LinkInterface > SharedLinkInterfacePtr
Error error
Auto connect settings.
Interface holding link specific settings.
The link interface defines the interface for all links used to communicate with the ground station ap...
Manage communication links The Link Manager organizes the physical Links. It can manage arbitrary lin...
Definition LinkManager.h:30
void commPortStringsChanged()
Q_INVOKABLE void createConnectedLink(const LinkConfiguration *config)
This should only be used by Qml code.
SharedLinkInterfacePtr sharedLinkInterfacePointerForLink(const LinkInterface *link)
QStringList serialPorts()
bool containsConfiguration(const QString &name) const
Q_INVOKABLE void endConfigurationEditing(LinkConfiguration *config, LinkConfiguration *editedConfig)
Q_INVOKABLE void cancelConfigurationEditing(LinkConfiguration *config) const
Definition LinkManager.h:54
SharedLinkConfigurationPtr addConfiguration(LinkConfiguration *config)
QStringList linkTypeStrings() const
void isBluetoothAvailableChanged()
void loadLinkConfigurationList()
bool connectionsSuspended() const
Definition LinkManager.h:82
static bool isLinkUSBDirect(const LinkInterface *link)
uint8_t allocateMavlinkChannel()
Q_INVOKABLE void createMavlinkForwardingSupportLink()
Q_INVOKABLE LinkConfiguration * createConfiguration(int type, const QString &name)
Create/Edit Link Configuration.
void startAutoConnectedLinks()
Q_INVOKABLE void endCreateConfiguration(LinkConfiguration *config)
void setConnectionsAllowed()
Sets the flag to allow new connections to be made.
Definition LinkManager.h:80
Q_INVOKABLE void shutdown()
Called to signal app shutdown. Disconnects all links while turning off auto-connect.
static LinkManager * instance()
void freeMavlinkChannel(uint8_t channel)
Q_INVOKABLE void removeConfiguration(LinkConfiguration *config)
friend class LinkManagerTest
Definition LinkManager.h:41
QList< SharedLinkInterfacePtr > links()
static constexpr uint8_t invalidMavlinkChannel()
void setConnectionsSuspended(const QString &reason)
Definition LinkManager.h:77
void disconnectAll()
Q_INVOKABLE LogReplayLink * startLogReplay(const QString &logFile)
void commPortsChanged()
QStringList serialPortStrings()
Q_INVOKABLE void disconnectLink(LinkInterface *link)
static QStringList serialBaudRates()
SharedLinkInterfacePtr mavlinkForwardingSupportLink()
Returns pointer to the mavlink support forwarding link, or nullptr if it does not exist.
Q_INVOKABLE void disconnectLinkConfiguration(LinkConfiguration *config)
Stop a link and suppress auto-reconnect, working whether or not a live link currently exists.
Q_INVOKABLE LinkConfiguration * startConfigurationEditing(LinkConfiguration *config)
bool containsLink(const LinkInterface *link)
SharedLinkInterfacePtr mavlinkForwardingLink()
Returns pointer to the mavlink forwarding link, or nullptr if it does not exist.
static bool isBluetoothAvailable()
void saveLinkConfigurationList()
void mavlinkSupportForwardingEnabledChanged()
bool mavlinkSupportForwardingEnabled() const
Definition LinkManager.h:70
MAVLink micro air vehicle protocol reference implementation.
Application-thread MAVLink serial discovery. LinkManager owns creation and live links.