Newer
Older
/*=====================================================================
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/// @file
/// @brief TCP link type for SITL support
///
/// @author Don Gagne <don@thegagnes.com>
#ifndef TCPLINK_H
#define TCPLINK_H
#include <QString>
#include <QList>
#include <QMap>
#include <QMutex>
#include <QHostAddress>
#include <LinkInterface.h>
Bryant Mairs
committed
#include "QGCConfig.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
#define QGC_TCP_PORT 5760
class TCPConfiguration : public LinkConfiguration
{
Q_PROPERTY(quint16 port READ port WRITE setPort NOTIFY portChanged)
Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)
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
/*!
* @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();
signals:
void portChanged();
void hostChanged();
private:
QHostAddress _address;
quint16 _port;
};
friend class TCPLinkUnitTest;
friend class TCPConfiguration;
friend class LinkManager;
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);
void writeBytes(const char* data, qint64 length);
void waitForBytesWritten(int msecs);
void waitForReadyRead(int msecs);
protected slots:
void _socketError(QAbstractSocket::SocketError socketError);
// From LinkInterface
virtual void readBytes(void);
// From LinkInterface->QThread
virtual void run(void);
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
TCPLink(TCPConfiguration* config);
~TCPLink();
virtual bool _connect(void);
bool _hardwareConnect();
void _restartConnection();
void _writeDebugBytes(const char *data, qint16 size);
TCPConfiguration* _config;
QTcpSocket* _socket;
bool _socketIsConnected;
quint64 _bitsSentTotal;
quint64 _bitsSentCurrent;
quint64 _bitsSentMax;
quint64 _bitsReceivedTotal;
quint64 _bitsReceivedCurrent;
quint64 _bitsReceivedMax;
quint64 _connectionStartTime;
QMutex _statisticsMutex;