TCPLink.h 3.64 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 This file is part of the QGROUNDCONTROL project
 
 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/>.
 
 ======================================================================*/

24 25 26 27
/// @file
///     @brief TCP link type for SITL support
///
///     @author Don Gagne <don@thegagnes.com>
Don Gagne's avatar
Don Gagne committed
28 29 30 31 32 33 34 35 36 37 38 39

#ifndef TCPLINK_H
#define TCPLINK_H

#include <QString>
#include <QList>
#include <QMap>
#include <QMutex>
#include <QHostAddress>
#include <LinkInterface.h>
#include <configuration.h>

40 41 42 43 44 45 46
// 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>
Q_DECLARE_METATYPE(QAbstractSocket::SocketError)

Don Gagne's avatar
Don Gagne committed
47 48
//#define TCPLINK_READWRITE_DEBUG   // Use to debug data reads/writes

Don Gagne's avatar
Don Gagne committed
49 50 51 52 53
class TCPLink : public LinkInterface
{
    Q_OBJECT
    
public:
Don Gagne's avatar
Don Gagne committed
54
    TCPLink(QHostAddress hostAddress = QHostAddress::LocalHost, quint16 socketPort = 5760);
Don Gagne's avatar
Don Gagne committed
55 56
    ~TCPLink();
    
57
    void setHostAddress(QHostAddress hostAddress);
Don Gagne's avatar
Don Gagne committed
58
    
59 60 61
    QHostAddress getHostAddress(void) const { return _hostAddress; }
    quint16 getPort(void) const { return _port; }
    QTcpSocket* getSocket(void) { return _socket; }
Don Gagne's avatar
Don Gagne committed
62
    
63 64
    void signalBytesWritten(void);

65 66 67 68 69 70 71 72
    // LinkInterface methods
    virtual int     getId(void) const;
    virtual QString getName(void) const;
    virtual bool    isConnected(void) const;
    virtual bool    connect(void);
    virtual bool    disconnect(void);
    virtual qint64  bytesAvailable(void);
    virtual void    requestReset(void) {};
73 74 75 76 77

    // Extensive statistics for scientific purposes
    qint64 getConnectionSpeed() const;
    qint64 getCurrentInDataRate() const;
    qint64 getCurrentOutDataRate() const;
Don Gagne's avatar
Don Gagne committed
78 79
    
public slots:
80 81
    void setHostAddress(const QString& hostAddress);
    void setPort(int port);
Don Gagne's avatar
Don Gagne committed
82
    
83 84
    // From LinkInterface
    virtual void writeBytes(const char* data, qint64 length);
85 86 87
    
    void waitForBytesWritten(int msecs);
    void waitForReadyRead(int msecs);
88 89 90 91 92 93 94

protected slots:
    void _socketError(QAbstractSocket::SocketError socketError);

    // From LinkInterface
    virtual void readBytes(void);

Don Gagne's avatar
Don Gagne committed
95
protected:
96 97
    // From LinkInterface->QThread
    virtual void run(void);
98
    
Don Gagne's avatar
Don Gagne committed
99
private:
100 101
    void _resetName(void);
	bool _hardwareConnect(void);
Don Gagne's avatar
Don Gagne committed
102
#ifdef TCPLINK_READWRITE_DEBUG
103
    void _writeDebugBytes(const char *data, qint16 size);
Don Gagne's avatar
Don Gagne committed
104
#endif
105 106 107 108 109 110 111

    QString         _name;
    QHostAddress    _hostAddress;
    quint16         _port;
    int             _linkId;
    QTcpSocket*     _socket;
    bool            _socketIsConnected;
Don Gagne's avatar
Don Gagne committed
112
    
113 114 115 116 117 118 119 120
    quint64 _bitsSentTotal;
    quint64 _bitsSentCurrent;
    quint64 _bitsSentMax;
    quint64 _bitsReceivedTotal;
    quint64 _bitsReceivedCurrent;
    quint64 _bitsReceivedMax;
    quint64 _connectionStartTime;
    QMutex  _statisticsMutex;
Don Gagne's avatar
Don Gagne committed
121 122 123
};

#endif // TCPLINK_H