Browse Source

Fix ability to write bytes to link

QGC4.4
DonLakeFlyer 4 years ago committed by Don Gagne
parent
commit
130dadab97
  1. 53
      src/comm/TCPLink.cc
  2. 14
      src/comm/TCPLink.h

53
src/comm/TCPLink.cc

@ -18,11 +18,6 @@ @@ -18,11 +18,6 @@
#include <QHostInfo>
#include <QSignalSpy>
/// @file
/// @brief TCP link type for SITL support
///
/// @author Don Gagne <don@thegagnes.com>
TCPLink::TCPLink(SharedLinkConfigurationPtr& config)
: LinkInterface(config)
, _tcpConfig(qobject_cast<TCPConfiguration*>(config.get()))
@ -30,22 +25,11 @@ TCPLink::TCPLink(SharedLinkConfigurationPtr& config) @@ -30,22 +25,11 @@ TCPLink::TCPLink(SharedLinkConfigurationPtr& config)
, _socketIsConnected(false)
{
Q_ASSERT(_tcpConfig);
moveToThread(this);
}
TCPLink::~TCPLink()
{
disconnect();
// Tell the thread to exit
quit();
// Wait for it to exit
wait();
}
void TCPLink::run()
{
_hardwareConnect();
exec();
}
#ifdef TCPLINK_READWRITE_DEBUG
@ -84,7 +68,7 @@ void TCPLink::_writeBytes(const QByteArray data) @@ -84,7 +68,7 @@ void TCPLink::_writeBytes(const QByteArray data)
}
}
void TCPLink::readBytes()
void TCPLink::_readBytes()
{
if (_socket) {
qint64 byteCount = _socket->bytesAvailable();
@ -103,14 +87,11 @@ void TCPLink::readBytes() @@ -103,14 +87,11 @@ void TCPLink::readBytes()
void TCPLink::disconnect(void)
{
quit();
wait();
if (_socket) {
// This prevents stale signal from calling the link after it has been deleted
QObject::disconnect(_socket, &QTcpSocket::readyRead, this, &TCPLink::readBytes);
QObject::disconnect(_socket, &QIODevice::readyRead, this, &TCPLink::_readBytes);
_socketIsConnected = false;
_socket->disconnectFromHost(); // Disconnect tcp
_socket->waitForDisconnected();
_socket->deleteLater(); // Make sure delete happens on correct thread
_socket = nullptr;
emit disconnected();
@ -119,29 +100,25 @@ void TCPLink::disconnect(void) @@ -119,29 +100,25 @@ void TCPLink::disconnect(void)
bool TCPLink::_connect(void)
{
if (isRunning())
{
quit();
wait();
if (_socket) {
qWarning() << "connect called while already connected";
return true;
}
start(HighPriority);
return true;
return _hardwareConnect();
}
bool TCPLink::_hardwareConnect()
{
Q_ASSERT(_socket == nullptr);
_socket = new QTcpSocket();
QObject::connect(_socket, &QIODevice::readyRead, this, &TCPLink::_readBytes);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
QSignalSpy errorSpy(_socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error));
#else
QSignalSpy errorSpy(_socket, &QAbstractSocket::errorOccurred);
#endif
_socket->connectToHost(_tcpConfig->address(), _tcpConfig->port());
QObject::connect(_socket, &QTcpSocket::readyRead, this, &TCPLink::readBytes);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
QObject::connect(_socket,static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error),
this, &TCPLink::_socketError);
@ -149,6 +126,8 @@ bool TCPLink::_hardwareConnect() @@ -149,6 +126,8 @@ bool TCPLink::_hardwareConnect()
QObject::connect(_socket, &QAbstractSocket::errorOccurred, this, &TCPLink::_socketError);
#endif
_socket->connectToHost(_tcpConfig->address(), _tcpConfig->port());
// Give the socket a second to connect to the other side otherwise error out
if (!_socket->waitForConnected(1000))
{
@ -182,18 +161,6 @@ bool TCPLink::isConnected() const @@ -182,18 +161,6 @@ bool TCPLink::isConnected() const
return _socketIsConnected;
}
void TCPLink::waitForBytesWritten(int msecs)
{
Q_ASSERT(_socket);
_socket->waitForBytesWritten(msecs);
}
void TCPLink::waitForReadyRead(int msecs)
{
Q_ASSERT(_socket);
_socket->waitForReadyRead(msecs);
}
//--------------------------------------------------------------------------
//-- TCPConfiguration

14
src/comm/TCPLink.h

@ -81,24 +81,14 @@ public: @@ -81,24 +81,14 @@ public:
bool isConnected(void) const override;
void disconnect (void) override;
public slots:
void waitForBytesWritten(int msecs);
void waitForReadyRead (int msecs);
protected slots:
private slots:
void _socketError (QAbstractSocket::SocketError socketError);
void readBytes (void);
protected:
// QThread overrides
void run(void) override;
void _readBytes (void);
private slots:
// LinkInterface overrides
void _writeBytes(const QByteArray data) override;
private:
// LinkInterface overrides
bool _connect(void) override;

Loading…
Cancel
Save