QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
UDPLink.h
Go to the documentation of this file.
1#pragma once
2
3#include "LinkConfiguration.h"
4#include "LinkInterface.h"
5
6#include <QtCore/QByteArray>
7#include <QtCore/QList>
8#include <QtCore/QMutex>
9#include <QtCore/QString>
10#include <QtNetwork/QHostAddress>
11
12#include <atomic>
13
14class QUdpSocket;
15class QThread;
16
17/*===========================================================================*/
18
20{
21 UDPClient(const QHostAddress &addr, quint16 portNum)
22 : address(addr)
23 , port(portNum)
24 {}
25
26 UDPClient(const QString &host, const QHostAddress &addr, quint16 portNum)
27 : hostname(host)
28 , address(addr)
29 , port(portNum)
30 {}
31
32 explicit UDPClient(const UDPClient *other)
33 : hostname(other->hostname)
34 , address(other->address)
35 , port(other->port)
36 {}
37
38 bool operator==(const UDPClient &other) const
39 {
40 return ((address == other.address) && (port == other.port));
41 }
42
44 {
45 hostname = other.hostname;
46 address = other.address;
47 port = other.port;
48
49 return *this;
50 }
51
52 QString hostname;
53 QHostAddress address;
54 quint16 port = 0;
55};
56
57/*===========================================================================*/
58
60{
61 Q_OBJECT
62
63 Q_PROPERTY(QStringList hostList READ hostList NOTIFY hostListChanged)
64 Q_PROPERTY(quint16 localPort READ localPort WRITE setLocalPort NOTIFY localPortChanged)
65
66public:
67 explicit UDPConfiguration(const QString &name, QObject *parent = nullptr);
68 explicit UDPConfiguration(const UDPConfiguration *source, QObject *parent = nullptr);
69 virtual ~UDPConfiguration();
70
71 Q_INVOKABLE void addHost(const QString &host);
72 Q_INVOKABLE void addHost(const QString &host, quint16 port);
73 Q_INVOKABLE void removeHost(const QString &host);
74 Q_INVOKABLE void removeHost(const QString &host, quint16 port);
75
76 LinkType type() const override { return LinkConfiguration::TypeUdp; }
77 void copyFrom(const LinkConfiguration *source) override;
78 void loadSettings(QSettings &settings, const QString &root) override;
79 void saveSettings(QSettings &settings, const QString &root) const override;
80 QString settingsURL() const override { return QStringLiteral("UdpSettings.qml"); }
81 QString settingsTitle() const override { return tr("UDP Link Settings"); }
82
83 QStringList hostList() const { return _hostList; }
84 QList<std::shared_ptr<UDPClient>> targetHosts() const { return _targetHosts; }
85
87 QStringList resolveHosts() const;
88
90 bool requireResolvedHosts() const { return _requireResolvedHosts; }
91
92 void setRequireResolvedHosts(bool require) { _requireResolvedHosts = require; }
93
94 quint16 localPort() const { return _localPort; }
95 void setLocalPort(quint16 port) { if (port != _localPort) { _localPort = port; emit localPortChanged(); } }
96
97signals:
100
101private:
102 void _updateHostList();
103
104 static QString _getIpAddress(const QString &address);
105
106 QStringList _hostList;
107 QList<std::shared_ptr<UDPClient>> _targetHosts;
108 quint16 _localPort = 0;
109 bool _requireResolvedHosts = true;
110};
111
112/*===========================================================================*/
113
114class UDPWorker : public QObject
115{
116 Q_OBJECT
117
118public:
119 explicit UDPWorker(const UDPConfiguration *config, QObject *parent = nullptr);
120 virtual ~UDPWorker();
121
122 bool isConnected() const;
123
124public slots:
125 void setupSocket();
126 void connectLink();
127 void disconnectLink();
128 void writeData(const QByteArray &data);
129
130signals:
131 void connected();
133 void errorOccurred(const QString &errorString);
134 void dataReceived(const QByteArray &data);
135 void dataSent(const QByteArray &data);
136
137private slots:
138 void _onSocketConnected();
139 void _onSocketDisconnected();
140 void _onSocketReadyRead();
141 void _onSocketBytesWritten(qint64 bytes);
142 void _onSocketErrorOccurred(QAbstractSocket::SocketError socketError);
143
144private:
145 const UDPConfiguration *_udpConfig = nullptr;
146 QUdpSocket *_socket = nullptr;
147 QMutex _sessionTargetsMutex;
148 QList<std::shared_ptr<UDPClient>> _sessionTargets;
149 std::atomic<bool> _isConnected{false};
150 bool _errorEmitted = false;
151 QSet<QHostAddress> _localAddresses;
152
153 static const QHostAddress _multicastGroup;
154};
155
156/*===========================================================================*/
157
158class UDPLink : public LinkInterface
159{
160 Q_OBJECT
161
162public:
163 explicit UDPLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
164 virtual ~UDPLink();
165
166 bool isConnected() const override;
167 void disconnect() override;
168 bool isSecureConnection() const override;
169
170protected:
171 bool _connect() override;
172
173private slots:
174 void _writeBytes(const QByteArray &data) override;
175 void _onConnected();
176 void _onDisconnected();
177 void _onErrorOccurred(const QString &errorString);
178 void _onDataReceived(const QByteArray &data);
179 void _onDataSent(const QByteArray &data);
180
181private:
182 const UDPConfiguration *_udpConfig = nullptr;
183 UDPWorker *_worker = nullptr;
184 QThread *_workerThread = nullptr;
185 std::atomic<bool> _disconnectedEmitted{false};
186};
Config config
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
QString errorString
Interface holding link specific settings.
QString name() const
The link interface defines the interface for all links used to communicate with the ground station ap...
void saveSettings(QSettings &settings, const QString &root) const override
Definition UDPLink.cc:110
QStringList resolveHosts() const
Returns the hostnames that failed to resolve.
Definition UDPLink.cc:220
QList< std::shared_ptr< UDPClient > > targetHosts() const
Definition UDPLink.h:84
void localPortChanged()
quint16 localPort() const
Definition UDPLink.h:94
QStringList hostList() const
Definition UDPLink.h:83
QString settingsTitle() const override
Settings Title, Pure virtual method providing the Title for the (QML) settings dialog.
Definition UDPLink.h:81
Q_INVOKABLE void removeHost(const QString &host)
Definition UDPLink.cc:165
void hostListChanged()
void setLocalPort(quint16 port)
Definition UDPLink.h:95
Q_INVOKABLE void addHost(const QString &host)
Definition UDPLink.cc:129
virtual ~UDPConfiguration()
Definition UDPLink.cc:59
LinkType type() const override
Definition UDPLink.h:76
void copyFrom(const LinkConfiguration *source) override
Definition UDPLink.cc:66
void loadSettings(QSettings &settings, const QString &root) override
Definition UDPLink.cc:89
void setRequireResolvedHosts(bool require)
Definition UDPLink.h:92
bool requireResolvedHosts() const
When false, connect proceeds (listening) even if a target host fails to resolve.
Definition UDPLink.h:90
QString settingsURL() const override
Settings URL, Pure virtual method providing the URL for the (QML) settings dialog.
Definition UDPLink.h:80
void dataReceived(const QByteArray &data)
void disconnected()
bool isConnected() const
Definition UDPLink.cc:280
void dataSent(const QByteArray &data)
void errorOccurred(const QString &errorString)
void writeData(const QByteArray &data)
Definition UDPLink.cc:383
void setupSocket()
Definition UDPLink.cc:286
virtual ~UDPWorker()
Definition UDPLink.cc:273
void connected()
void connectLink()
Definition UDPLink.cc:325
void disconnectLink()
Definition UDPLink.cc:368
UDPClient(const QString &host, const QHostAddress &addr, quint16 portNum)
Definition UDPLink.h:26
quint16 port
Definition UDPLink.h:54
UDPClient(const QHostAddress &addr, quint16 portNum)
Definition UDPLink.h:21
QHostAddress address
Definition UDPLink.h:53
UDPClient(const UDPClient *other)
Definition UDPLink.h:32
bool operator==(const UDPClient &other) const
Definition UDPLink.h:38
UDPClient & operator=(const UDPClient &other)
Definition UDPLink.h:43
QString hostname
Definition UDPLink.h:52