From 6ddbf115e9d5f02499761a40dccefa8ad00b13bb Mon Sep 17 00:00:00 2001 From: rankun Date: Mon, 5 Nov 2018 18:31:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0devicesocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/devicesocket.cpp | 33 +++++++++++++++++++++++++++++++++ src/devicesocket.h | 16 +++++++++++++++- src/frames.h | 1 + 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/devicesocket.cpp b/src/devicesocket.cpp index 1c2f1bf..5fc85df 100644 --- a/src/devicesocket.cpp +++ b/src/devicesocket.cpp @@ -1,6 +1,39 @@ #include "devicesocket.h" DeviceSocket::DeviceSocket(QObject *parent) : QTcpSocket(parent) +{ + connect(this, &DeviceSocket::readyRead, this, &DeviceSocket::onReadyRead); +} + +DeviceSocket::~DeviceSocket() { } + +qint32 DeviceSocket::recvData(quint8 *buf, qint32 bufSize) +{ + QMutexLocker locker(&m_mutex); + + m_buffer = buf; + m_bufferSize = bufSize; + // post event + while (!m_recvData) { + m_recvDataCond.wait(&m_mutex); + } + return m_dataSize; +} + +void DeviceSocket::onReadyRead() +{ + QMutexLocker locker(&m_mutex); + if (m_buffer && 0 < bytesAvailable()) { + // recv data + qint64 readSize = qMin(bytesAvailable(), (qint64)m_bufferSize); + m_dataSize = read((char*)m_buffer, readSize); + + m_buffer = Q_NULLPTR; + m_bufferSize = 0; + m_recvData = true; + m_recvDataCond.wakeOne(); + } +} diff --git a/src/devicesocket.h b/src/devicesocket.h index 44f231f..d698a78 100644 --- a/src/devicesocket.h +++ b/src/devicesocket.h @@ -2,16 +2,30 @@ #define DEVICESOCKET_H #include +#include +#include class DeviceSocket : public QTcpSocket { Q_OBJECT public: explicit DeviceSocket(QObject *parent = nullptr); + virtual ~DeviceSocket(); + + qint32 recvData(quint8* buf, qint32 bufSize); signals: -public slots: +protected slots: + void onReadyRead(); + +private: + QMutex m_mutex; + QWaitCondition m_recvDataCond; + bool m_recvData = false; + quint8* m_buffer = Q_NULLPTR; + qint32 m_bufferSize = 0; + qint32 m_dataSize = 0; }; #endif // DEVICESOCKET_H diff --git a/src/frames.h b/src/frames.h index 6200926..fcb528b 100644 --- a/src/frames.h +++ b/src/frames.h @@ -1,5 +1,6 @@ #ifndef FRAMES_H #define FRAMES_H + #include #include