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/QLoggingCategory>
5#include <QtCore/QMutex>
6#include <QtCore/QMutexLocker>
7#include <QtCore/QStringList>
8#include <QtQmlIntegration/QtQmlIntegration>
9
10#include <limits>
11
12#include "LinkConfiguration.h"
13#include "LinkInterface.h"
14#ifndef QGC_NO_SERIAL_LINK
15 #include "QGCSerialPortInfo.h"
16#endif
17
18Q_DECLARE_LOGGING_CATEGORY(LinkManagerLog)
19Q_DECLARE_LOGGING_CATEGORY(LinkManagerVerboseLog)
20
22class LogReplayLink;
23class MAVLinkProtocol;
25class QTimer;
26class SerialLink;
28class UdpIODevice;
29
34class LinkManager : public QObject
35{
36 Q_OBJECT
37 QML_ELEMENT
38 QML_UNCREATABLE("")
39 Q_MOC_INCLUDE("QmlObjectListModel.h")
40 Q_MOC_INCLUDE("LogReplayLink.h")
41 Q_PROPERTY(bool isBluetoothAvailable READ isBluetoothAvailable NOTIFY isBluetoothAvailableChanged)
42 Q_PROPERTY(QmlObjectListModel *linkConfigurations READ _qmlLinkConfigurations CONSTANT)
43 Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT)
44 Q_PROPERTY(bool mavlinkSupportForwardingEnabled READ mavlinkSupportForwardingEnabled NOTIFY mavlinkSupportForwardingEnabledChanged)
45
46public:
47 explicit LinkManager(QObject *parent = nullptr);
49
50 static LinkManager *instance();
51
52 void init();
53
55 Q_INVOKABLE LinkConfiguration *createConfiguration(int type, const QString &name);
56 Q_INVOKABLE LinkConfiguration *startConfigurationEditing(LinkConfiguration *config);
57 Q_INVOKABLE void cancelConfigurationEditing(LinkConfiguration *config) const { delete config; }
58 Q_INVOKABLE void endConfigurationEditing(LinkConfiguration *config, LinkConfiguration *editedConfig);
59 Q_INVOKABLE void endCreateConfiguration(LinkConfiguration *config);
60 Q_INVOKABLE void removeConfiguration(LinkConfiguration *config);
62 Q_INVOKABLE void createConnectedLink(const LinkConfiguration *config);
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
72 void loadLinkConfigurationList();
73 void saveLinkConfigurationList();
74
77 void setConnectionsSuspended(const QString &reason) { _connectionsSuspended = true; _connectionsSuspendedReason = reason; }
78
80 void setConnectionsAllowed() { _connectionsSuspended = false; }
81
83 bool createConnectedLink(SharedLinkConfigurationPtr &config);
84
86 SharedLinkInterfacePtr mavlinkForwardingLink();
87
89 SharedLinkInterfacePtr mavlinkForwardingSupportLink();
90
92 void resetMavlinkSigning();
93
94 void disconnectAll();
95
98 uint8_t allocateMavlinkChannel();
99 void freeMavlinkChannel(uint8_t channel);
100
103 SharedLinkInterfacePtr sharedLinkInterfacePointerForLink(const LinkInterface *link);
104
105 bool containsLink(const LinkInterface *link);
106
107 SharedLinkConfigurationPtr addConfiguration(LinkConfiguration *config);
108
109 void startAutoConnectedLinks();
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 _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 _createDynamicForwardLink(const char *linkName, const QString &hostName);
134#ifdef QGC_ZEROCONF_ENABLED
135 void _addZeroConfAutoConnectLink();
136#endif
137
138 QTimer *_portListTimer = nullptr;
139 QmlObjectListModel *_qmlConfigurations = nullptr;
140 AutoConnectSettings *_autoConnectSettings = nullptr;
141
142 bool _configUpdateSuspended = false;
143 bool _configurationsLoaded = false;
144 bool _connectionsSuspended = false;
145 bool _mavlinkSupportForwardingEnabled = false;
146 uint32_t _mavlinkChannelsUsedBitMask = 1;
147 QString _connectionsSuspendedReason;
148
149 QMutex _linksMutex;
150 QList<SharedLinkInterfacePtr> _rgLinks;
151 QList<SharedLinkConfigurationPtr> _rgLinkConfigs;
152
153 static constexpr const char *_defaultUDPLinkName = "UDP Link (AutoConnect)";
154 static constexpr const char *_mavlinkForwardingLinkName = "MAVLink Forwarding Link";
155 static constexpr const char *_mavlinkForwardingSupportLinkName = "MAVLink Support Forwarding Link";
156
157 static constexpr int _autoconnectUpdateTimerMSecs = 1000;
158#ifdef Q_OS_WIN
159 // Have to manually let the bootloader go by on Windows to get a working connect
160 static constexpr int _autoconnectConnectDelayMSecs = 6000;
161#else
162 static constexpr int _autoconnectConnectDelayMSecs = 1000;
163#endif
164
165#ifndef QGC_NO_SERIAL_LINK
166private:
167 Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT)
168 Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged)
169 Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged)
170
171public:
172 static QStringList serialBaudRates();
173 QStringList serialPortStrings();
174 QStringList serialPorts();
175
176signals:
179
180private:
181 bool _isSerialPortConnected();
182 void _updateSerialPorts();
183 bool _allowAutoConnectToBoard(QGCSerialPortInfo::BoardType_t boardType) const;
184 void _addSerialAutoConnectLink();
185 bool _portAlreadyConnected(const QString &portName);
186 void _filterCompositePorts(QList<QGCSerialPortInfo> &portList);
187
188 UdpIODevice *_nmeaSocket = nullptr;
189 QMap<QString, int> _autoconnectPortWaitList;
190 QList<SerialLink*> _activeLinkCheckList;
191 QStringList _commPortList;
192 QStringList _commPortDisplayList;
193 QString _autoConnectRTKPort;
194 QString _nmeaDeviceName;
195 uint32_t _nmeaBaud = 0;
196 QSerialPort *_nmeaPort = nullptr;
197#endif // QGC_NO_SERIAL_LINK
198};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
std::shared_ptr< LinkInterface > SharedLinkInterfacePtr
Error error
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:35
void commPortStringsChanged()
void isBluetoothAvailableChanged()
void commPortsChanged()
void mavlinkSupportForwardingEnabledChanged()
Provides functions to access serial ports.
Definition qserialport.h:17