forked from mavlink/qgroundcontrol
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTCPLink.h
190 lines (151 loc) · 4.96 KB
/
TCPLink.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
/// @file
/// @brief TCP link type for SITL support
///
/// @author Don Gagne <[email protected]>
#ifndef TCPLINK_H
#define TCPLINK_H
#include <QString>
#include <QList>
#include <QMap>
#include <QMutex>
#include <QHostAddress>
#include <LinkInterface.h>
#include "QGCConfig.h"
#include "LinkManager.h"
// Even though QAbstractSocket::SocketError is used in a signal by Qt, Qt doesn't declare it as a meta type.
// This in turn causes debug output to be kicked out about not being able to queue the signal. We declare it
// as a meta type to silence that.
#include <QMetaType>
#include <QTcpSocket>
//#define TCPLINK_READWRITE_DEBUG // Use to debug data reads/writes
class TCPLinkTest;
#define QGC_TCP_PORT 5760
class TCPConfiguration : public LinkConfiguration
{
Q_OBJECT
public:
Q_PROPERTY(quint16 port READ port WRITE setPort NOTIFY portChanged)
Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)
/*!
* @brief Regular constructor
*
* @param[in] name Configuration (user friendly) name
*/
TCPConfiguration(const QString& name);
/*!
* @brief Copy contructor
*
* When manipulating data, you create a copy of the configuration, edit it
* and then transfer its content to the original (using copyFrom() below). Use this
* contructor to create an editable copy.
*
* @param[in] source Original configuration
*/
TCPConfiguration(TCPConfiguration* source);
/*!
* @brief The TCP port
*
* @return Port number
*/
quint16 port () { return _port; }
/*!
* @brief Set the TCP port
*
* @param[in] port Port number
*/
void setPort (quint16 port);
/*!
* @brief The host address
*
* @return Host address
*/
const QHostAddress& address () { return _address; }
const QString host () { return _address.toString(); }
/*!
* @brief Set the host address
*
* @param[in] address Host address
*/
void setAddress (const QHostAddress& address);
void setHost (const QString host);
/// From LinkConfiguration
LinkType type () { return LinkConfiguration::TypeTcp; }
void copyFrom (LinkConfiguration* source);
void loadSettings (QSettings& settings, const QString& root);
void saveSettings (QSettings& settings, const QString& root);
void updateSettings ();
QString settingsURL () { return "TcpSettings.qml"; }
signals:
void portChanged();
void hostChanged();
private:
QHostAddress _address;
quint16 _port;
};
class TCPLink : public LinkInterface
{
Q_OBJECT
friend class TCPLinkTest;
friend class TCPConfiguration;
friend class LinkManager;
public:
QTcpSocket* getSocket(void) { return _socket; }
void signalBytesWritten(void);
// LinkInterface methods
virtual QString getName(void) const;
virtual bool isConnected(void) const;
virtual void requestReset(void) {};
// Extensive statistics for scientific purposes
qint64 getConnectionSpeed() const;
qint64 getCurrentInDataRate() const;
qint64 getCurrentOutDataRate() const;
// These are left unimplemented in order to cause linker errors which indicate incorrect usage of
// connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager.
bool connect(void);
bool disconnect(void);
private slots:
// From LinkInterface
void _writeBytes(const QByteArray data);
public slots:
void waitForBytesWritten(int msecs);
void waitForReadyRead(int msecs);
protected slots:
void _socketError(QAbstractSocket::SocketError socketError);
// From LinkInterface
virtual void readBytes(void);
protected:
// From LinkInterface->QThread
virtual void run(void);
private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
TCPLink(SharedLinkConfigurationPointer& config);
~TCPLink();
// From LinkInterface
virtual bool _connect(void);
virtual void _disconnect(void);
bool _hardwareConnect();
void _restartConnection();
#ifdef TCPLINK_READWRITE_DEBUG
void _writeDebugBytes(const QByteArray data);
#endif
TCPConfiguration* _tcpConfig;
QTcpSocket* _socket;
bool _socketIsConnected;
quint64 _bitsSentTotal;
quint64 _bitsSentCurrent;
quint64 _bitsSentMax;
quint64 _bitsReceivedTotal;
quint64 _bitsReceivedCurrent;
quint64 _bitsReceivedMax;
quint64 _connectionStartTime;
QMutex _statisticsMutex;
};
#endif // TCPLINK_H