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 setAutoConnect(bool autoc = true) override;
78 void copyFrom(const LinkConfiguration *source) override;
79 void loadSettings(QSettings &settings, const QString &root) override;
80 void saveSettings(QSettings &settings, const QString &root) const override;
81 QString settingsURL() const override { return QStringLiteral("UdpSettings.qml"); }
82 QString settingsTitle() const override { return tr("UDP Link Settings"); }
83
84 QStringList hostList() const { return _hostList; }
85 QList<std::shared_ptr<UDPClient>> targetHosts() const { return _targetHosts; }
86 void resolveHosts() const;
87 quint16 localPort() const { return _localPort; }
88 void setLocalPort(quint16 port) { if (port != _localPort) { _localPort = port; emit localPortChanged(); } }
89
90signals:
93
94private:
95 void _updateHostList();
96
97 static QString _getIpAddress(const QString &address);
98
99 QStringList _hostList;
100 QList<std::shared_ptr<UDPClient>> _targetHosts;
101 quint16 _localPort = 0;
102};
103
104/*===========================================================================*/
105
106class UDPWorker : public QObject
107{
108 Q_OBJECT
109
110public:
111 explicit UDPWorker(const UDPConfiguration *config, QObject *parent = nullptr);
112 virtual ~UDPWorker();
113
114 bool isConnected() const;
115
116public slots:
117 void setupSocket();
118 void connectLink();
119 void disconnectLink();
120 void writeData(const QByteArray &data);
121
122signals:
123 void connected();
125 void errorOccurred(const QString &errorString);
126 void dataReceived(const QByteArray &data);
127 void dataSent(const QByteArray &data);
128
129private slots:
130 void _onSocketConnected();
131 void _onSocketDisconnected();
132 void _onSocketReadyRead();
133 void _onSocketBytesWritten(qint64 bytes);
134 void _onSocketErrorOccurred(QAbstractSocket::SocketError socketError);
135
136private:
137 const UDPConfiguration *_udpConfig = nullptr;
138 QUdpSocket *_socket = nullptr;
139 QMutex _sessionTargetsMutex;
140 QList<std::shared_ptr<UDPClient>> _sessionTargets;
141 bool _isConnected = false;
142 bool _errorEmitted = false;
143 QSet<QHostAddress> _localAddresses;
144
145 static const QHostAddress _multicastGroup;
146};
147
148/*===========================================================================*/
149
150class UDPLink : public LinkInterface
151{
152 Q_OBJECT
153
154public:
155 explicit UDPLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
156 virtual ~UDPLink();
157
158 bool isConnected() const override;
159 void disconnect() override;
160 bool isSecureConnection() const override;
161
162protected:
163 bool _connect() override;
164
165private slots:
166 void _writeBytes(const QByteArray &data) override;
167 void _onConnected();
168 void _onDisconnected();
169 void _onErrorOccurred(const QString &errorString);
170 void _onDataReceived(const QByteArray &data);
171 void _onDataSent(const QByteArray &data);
172
173private:
174 const UDPConfiguration *_udpConfig = nullptr;
175 UDPWorker *_worker = nullptr;
176 QThread *_workerThread = nullptr;
177 std::atomic<bool> _disconnectedEmitted{false};
178};
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:126
QList< std::shared_ptr< UDPClient > > targetHosts() const
Definition UDPLink.h:85
void localPortChanged()
quint16 localPort() const
Definition UDPLink.h:87
QStringList hostList() const
Definition UDPLink.h:84
QString settingsTitle() const override
Settings Title, Pure virtual method providing the Title for the (QML) settings dialog.
Definition UDPLink.h:82
Q_INVOKABLE void removeHost(const QString &host)
Definition UDPLink.cc:183
void hostListChanged()
void setAutoConnect(bool autoc=true) override
Set if this is this an Auto Connect configuration.
Definition UDPLink.cc:66
void setLocalPort(quint16 port)
Definition UDPLink.h:88
Q_INVOKABLE void addHost(const QString &host)
Definition UDPLink.cc:145
void resolveHosts() const
Definition UDPLink.cc:238
virtual ~UDPConfiguration()
Definition UDPLink.cc:59
LinkType type() const override
Definition UDPLink.h:76
void copyFrom(const LinkConfiguration *source) override
Definition UDPLink.cc:87
void loadSettings(QSettings &settings, const QString &root) override
Definition UDPLink.cc:105
QString settingsURL() const override
Settings URL, Pure virtual method providing the URL for the (QML) settings dialog.
Definition UDPLink.h:81
void dataReceived(const QByteArray &data)
void disconnected()
bool isConnected() const
Definition UDPLink.cc:294
void dataSent(const QByteArray &data)
void errorOccurred(const QString &errorString)
void writeData(const QByteArray &data)
Definition UDPLink.cc:390
void setupSocket()
Definition UDPLink.cc:299
virtual ~UDPWorker()
Definition UDPLink.cc:287
void connected()
void connectLink()
Definition UDPLink.cc:338
void disconnectLink()
Definition UDPLink.cc:375
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