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 <QtCore/QList>
4#include <QtCore/QMutex>
5#include <QtCore/QMutexLocker>
6#include <QtCore/QStringList>
7#include <QtQmlIntegration/QtQmlIntegration>
8
9#include <limits>
10
11#include "LinkConfiguration.h"
12#include "LinkInterface.h"
13#ifndef QGC_NO_SERIAL_LINK
14 #include "QGCSerialPortInfo.h"
15#endif
16
18class LogReplayLink;
19class MAVLinkProtocol;
21class QTimer;
22class SerialLink;
24class UdpIODevice;
25
31class LinkManager : public QObject
32{
33 Q_OBJECT
34 QML_ELEMENT
35 QML_UNCREATABLE("")
36 Q_MOC_INCLUDE("QmlObjectListModel.h")
37 Q_MOC_INCLUDE("LogReplayLink.h")
39 Q_PROPERTY(QmlObjectListModel *linkConfigurations READ _qmlLinkConfigurations CONSTANT)
40 Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT)
42
43 friend class LinkManagerTest;
44
45public:
46 explicit LinkManager(QObject *parent = nullptr);
47 ~LinkManager();
48
49 static LinkManager *instance();
50
51 void init();
52
54 Q_INVOKABLE LinkConfiguration *createConfiguration(int type, const QString &name);
56 Q_INVOKABLE void cancelConfigurationEditing(LinkConfiguration *config) const { delete config; }
57 Q_INVOKABLE void endConfigurationEditing(LinkConfiguration *config, LinkConfiguration *editedConfig);
61 Q_INVOKABLE void createConnectedLink(const LinkConfiguration *config);
62 Q_INVOKABLE void disconnectLink(LinkInterface *link);
65 Q_INVOKABLE void createMavlinkForwardingSupportLink();
67 Q_INVOKABLE void shutdown();
68 Q_INVOKABLE LogReplayLink *startLogReplay(const QString &logFile);
69
70 QList<SharedLinkInterfacePtr> links();
71 QStringList linkTypeStrings() const;
72 bool mavlinkSupportForwardingEnabled() const { return _mavlinkSupportForwardingEnabled; }
73
76
79 void setConnectionsSuspended(const QString &reason) { _connectionsSuspended = true; _connectionsSuspendedReason = reason; }
80
82 void setConnectionsAllowed() { _connectionsSuspended = false; }
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
109
110 static bool isBluetoothAvailable();
111
112 static bool isLinkUSBDirect(const LinkInterface *link);
113
114 static constexpr uint8_t invalidMavlinkChannel() { return std::numeric_limits<uint8_t>::max(); }
115
116signals:
119
120private slots:
121 void _linkConnected();
122 void _linkDisconnected();
123 void _communicationError(const QString &title, const QString &error);
124
125private:
126 QmlObjectListModel *_qmlLinkConfigurations();
128 bool _connectionsSuspendedMsg() const;
129 void _updateAutoConnectLinks();
130 void _removeConfiguration(const LinkConfiguration *config);
131 void _addUDPAutoConnectLink();
132 void _addMAVLinkForwardingLink();
133 void _reconnectAutoConnectLinks();
134 void _createDynamicForwardLink(const char *linkName, const QString &hostName);
135
136 QTimer *_portListTimer = nullptr;
137 QmlObjectListModel *_qmlConfigurations = nullptr;
138 AutoConnectSettings *_autoConnectSettings = nullptr;
139
140 bool _configUpdateSuspended = false;
141 bool _configurationsLoaded = false;
142 bool _connectionsSuspended = false;
143 bool _mavlinkSupportForwardingEnabled = false;
144 uint32_t _mavlinkChannelsUsedBitMask = 1;
145 QString _connectionsSuspendedReason;
146
147 QMutex _linksMutex;
148 QList<SharedLinkInterfacePtr> _rgLinks;
149 QList<SharedLinkConfigurationPtr> _rgLinkConfigs;
150
151 static constexpr const char *_defaultUDPLinkName = "UDP Link (AutoConnect)";
152 static constexpr const char *_mavlinkForwardingLinkName = "MAVLink Forwarding Link";
153 static constexpr const char *_mavlinkForwardingSupportLinkName = "MAVLink Support Forwarding Link";
154
155 static constexpr int _autoconnectUpdateTimerMSecs = 1000;
156#ifdef Q_OS_WIN
157 // Have to manually let the bootloader go by on Windows to get a working connect
158 static constexpr int _autoconnectConnectDelayMSecs = 6000;
159#else
160 static constexpr int _autoconnectConnectDelayMSecs = 1000;
161#endif
162
163#ifndef QGC_NO_SERIAL_LINK
164private:
165 Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT)
166 Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged)
167 Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged)
168
169public:
170 static QStringList serialBaudRates();
171 QStringList serialPortStrings();
172 QStringList serialPorts();
173
174signals:
177
178private:
179 bool _isSerialPortConnected();
180 void _updateSerialPorts();
181 bool _allowAutoConnectToBoard(QGCSerialPortInfo::BoardType_t boardType) const;
182 void _addSerialAutoConnectLink();
183 bool _portAlreadyConnected(const QString &portName);
184 void _filterCompositePorts(QList<QGCSerialPortInfo> &portList);
185
186 QMap<QString, int> _autoconnectPortWaitList;
187 QList<SerialLink*> _activeLinkCheckList;
188 QStringList _commPortList;
189 QStringList _commPortDisplayList;
190 QString _autoConnectRTKPort;
191 QString _nmeaDeviceName;
192 uint32_t _nmeaBaud = 0;
193 QSerialPort *_nmeaPort = nullptr;
194#endif // QGC_NO_SERIAL_LINK
195
196 // NMEA UDP is network-only; available regardless of QGC_NO_SERIAL_LINK.
197 UdpIODevice *_nmeaSocket = nullptr;
198};
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:32
void commPortStringsChanged()
Q_INVOKABLE void createConnectedLink(const LinkConfiguration *config)
This should only be used by Qml code.
SharedLinkInterfacePtr sharedLinkInterfacePointerForLink(const LinkInterface *link)
QStringList serialPorts()
Q_INVOKABLE void endConfigurationEditing(LinkConfiguration *config, LinkConfiguration *editedConfig)
Q_INVOKABLE void cancelConfigurationEditing(LinkConfiguration *config) const
Definition LinkManager.h:56
SharedLinkConfigurationPtr addConfiguration(LinkConfiguration *config)
QStringList linkTypeStrings() const
void isBluetoothAvailableChanged()
void loadLinkConfigurationList()
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:82
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:43
QList< SharedLinkInterfacePtr > links()
static constexpr uint8_t invalidMavlinkChannel()
void setConnectionsSuspended(const QString &reason)
Definition LinkManager.h:79
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:72
MAVLink micro air vehicle protocol reference implementation.
Provides functions to access serial ports.
Definition qserialport.h:17
UdpIODevice provides a QIODevice interface over a QUdpSocket in server mode.
Definition UdpIODevice.h:11