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 explicit UDPClient(const UDPClient *other)
27 : address(other->address)
28 , port(other->port)
29 {}
30
31 bool operator==(const UDPClient &other) const
32 {
33 return ((address == other.address) && (port == other.port));
34 }
35
37 {
38 address = other.address;
39 port = other.port;
40
41 return *this;
42 }
43
44 QHostAddress address;
45 quint16 port = 0;
46};
47
48/*===========================================================================*/
49
51{
52 Q_OBJECT
53
54 Q_PROPERTY(QStringList hostList READ hostList NOTIFY hostListChanged)
55 Q_PROPERTY(quint16 localPort READ localPort WRITE setLocalPort NOTIFY localPortChanged)
56
57public:
58 explicit UDPConfiguration(const QString &name, QObject *parent = nullptr);
59 explicit UDPConfiguration(const UDPConfiguration *source, QObject *parent = nullptr);
60 virtual ~UDPConfiguration();
61
62 Q_INVOKABLE void addHost(const QString &host);
63 Q_INVOKABLE void addHost(const QString &host, quint16 port);
64 Q_INVOKABLE void removeHost(const QString &host);
65 Q_INVOKABLE void removeHost(const QString &host, quint16 port);
66
67 LinkType type() const override { return LinkConfiguration::TypeUdp; }
68 void setAutoConnect(bool autoc = true) override;
69 void copyFrom(const LinkConfiguration *source) override;
70 void loadSettings(QSettings &settings, const QString &root) override;
71 void saveSettings(QSettings &settings, const QString &root) const override;
72 QString settingsURL() const override { return QStringLiteral("UdpSettings.qml"); }
73 QString settingsTitle() const override { return tr("UDP Link Settings"); }
74
75 QStringList hostList() const { return _hostList; }
76 QList<std::shared_ptr<UDPClient>> targetHosts() const { return _targetHosts; }
77 quint16 localPort() const { return _localPort; }
78 void setLocalPort(quint16 port) { if (port != _localPort) { _localPort = port; emit localPortChanged(); } }
79
80signals:
83
84private:
85 void _updateHostList();
86
87 static QString _getIpAddress(const QString &address);
88
89 QStringList _hostList;
90 QList<std::shared_ptr<UDPClient>> _targetHosts;
91 quint16 _localPort = 0;
92};
93
94/*===========================================================================*/
95
96class UDPWorker : public QObject
97{
98 Q_OBJECT
99
100public:
101 explicit UDPWorker(const UDPConfiguration *config, QObject *parent = nullptr);
102 virtual ~UDPWorker();
103
104 bool isConnected() const;
105
106public slots:
107 void setupSocket();
108 void connectLink();
109 void disconnectLink();
110 void writeData(const QByteArray &data);
111
112signals:
113 void connected();
115 void errorOccurred(const QString &errorString);
116 void dataReceived(const QByteArray &data);
117 void dataSent(const QByteArray &data);
118
119private slots:
120 void _onSocketConnected();
121 void _onSocketDisconnected();
122 void _onSocketReadyRead();
123 void _onSocketBytesWritten(qint64 bytes);
124 void _onSocketErrorOccurred(QAbstractSocket::SocketError socketError);
125
126private:
127 const UDPConfiguration *_udpConfig = nullptr;
128 QUdpSocket *_socket = nullptr;
129 QMutex _sessionTargetsMutex;
130 QList<std::shared_ptr<UDPClient>> _sessionTargets;
131 bool _isConnected = false;
132 bool _errorEmitted = false;
133 QSet<QHostAddress> _localAddresses;
134
135 static const QHostAddress _multicastGroup;
136};
137
138/*===========================================================================*/
139
140class UDPLink : public LinkInterface
141{
142 Q_OBJECT
143
144public:
145 explicit UDPLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
146 virtual ~UDPLink();
147
148 bool isConnected() const override;
149 void disconnect() override;
150 bool isSecureConnection() const override;
151
152protected:
153 bool _connect() override;
154
155private slots:
156 void _writeBytes(const QByteArray &data) override;
157 void _onConnected();
158 void _onDisconnected();
159 void _onErrorOccurred(const QString &errorString);
160 void _onDataReceived(const QByteArray &data);
161 void _onDataSent(const QByteArray &data);
162
163private:
164 const UDPConfiguration *_udpConfig = nullptr;
165 UDPWorker *_worker = nullptr;
166 QThread *_workerThread = nullptr;
167 std::atomic<bool> _disconnectedEmitted{false};
168};
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:114
QList< std::shared_ptr< UDPClient > > targetHosts() const
Definition UDPLink.h:76
void localPortChanged()
quint16 localPort() const
Definition UDPLink.h:77
QStringList hostList() const
Definition UDPLink.h:75
QString settingsTitle() const override
Settings Title, Pure virtual method providing the Title for the (QML) settings dialog.
Definition UDPLink.h:73
Q_INVOKABLE void removeHost(const QString &host)
Definition UDPLink.cc:165
void hostListChanged()
void setAutoConnect(bool autoc=true) override
Set if this is this an Auto Connect configuration.
Definition UDPLink.cc:55
void setLocalPort(quint16 port)
Definition UDPLink.h:78
Q_INVOKABLE void addHost(const QString &host)
Definition UDPLink.cc:132
virtual ~UDPConfiguration()
Definition UDPLink.cc:48
LinkType type() const override
Definition UDPLink.h:67
void copyFrom(const LinkConfiguration *source) override
Definition UDPLink.cc:76
void loadSettings(QSettings &settings, const QString &root) override
Definition UDPLink.cc:93
QString settingsURL() const override
Settings URL, Pure virtual method providing the URL for the (QML) settings dialog.
Definition UDPLink.h:72
void dataReceived(const QByteArray &data)
void disconnected()
bool isConnected() const
Definition UDPLink.cc:270
void dataSent(const QByteArray &data)
void errorOccurred(const QString &errorString)
void writeData(const QByteArray &data)
Definition UDPLink.cc:364
void setupSocket()
Definition UDPLink.cc:275
virtual ~UDPWorker()
Definition UDPLink.cc:263
void connected()
void connectLink()
Definition UDPLink.cc:314
void disconnectLink()
Definition UDPLink.cc:349
quint16 port
Definition UDPLink.h:45
UDPClient(const QHostAddress &addr, quint16 portNum)
Definition UDPLink.h:21
QHostAddress address
Definition UDPLink.h:44
UDPClient(const UDPClient *other)
Definition UDPLink.h:26
bool operator==(const UDPClient &other) const
Definition UDPLink.h:31
UDPClient & operator=(const UDPClient &other)
Definition UDPLink.h:36