You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
5.5 KiB
C++
245 lines
5.5 KiB
C++
#include "communications.h"
|
|
#include <QObject>
|
|
#include <QThread>
|
|
#include <QSerialPort>
|
|
#include <QTcpSocket>
|
|
#include <QUdpSocket>
|
|
#include <QHostAddress>
|
|
#include <QMutex>
|
|
#include <QDebug>
|
|
|
|
void CommunicationBase::run()
|
|
{
|
|
while(1){
|
|
processFrameData();
|
|
|
|
forwardMutex.lock();
|
|
int size =forwardByteArrayList.count();
|
|
forwardMutex.unlock();
|
|
|
|
if(size >0){
|
|
forwardMutex.lock();
|
|
QByteArray byteArray =forwardByteArrayList.at(0);
|
|
forwardByteArrayList.removeAt(0);
|
|
forwardMutex.unlock();
|
|
|
|
forwardMsg(byteArray);
|
|
}
|
|
|
|
uploadMutex.lock();
|
|
size =uploadByteArrayList.count();
|
|
uploadMutex.unlock();
|
|
|
|
if(size >0){
|
|
uploadMutex.lock();
|
|
QByteArray byteArray =uploadByteArrayList.at(0);
|
|
uploadByteArrayList.removeAt(0);
|
|
uploadMutex.unlock();
|
|
|
|
uploadServerMsg(byteArray);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CommunicationBase::forwardMsgSlot(const QByteArray& byteArray)
|
|
{
|
|
forwardMutex.lock();
|
|
forwardByteArrayList.append(byteArray);
|
|
forwardMutex.unlock();
|
|
}
|
|
|
|
void CommunicationBase::uploadServerMsgSlot(const QByteArray& byteArray)
|
|
{
|
|
uploadMutex.lock();
|
|
uploadByteArrayList.append(byteArray);
|
|
uploadMutex.unlock();
|
|
}
|
|
|
|
void CommunicationBase::restart()
|
|
{
|
|
close();
|
|
open();
|
|
}
|
|
|
|
CommunicationSerialPort::CommunicationSerialPort(const QString &name,
|
|
QSerialPort::BaudRate baud,
|
|
QObject *parent)
|
|
: CommunicationBase(parent)
|
|
{
|
|
portName =name;
|
|
m_baud =baud;
|
|
|
|
m_serialPort =NULL;
|
|
}
|
|
|
|
CommunicationSerialPort::~CommunicationSerialPort()
|
|
{
|
|
close();
|
|
}
|
|
|
|
bool CommunicationSerialPort::open()
|
|
{
|
|
bool result = true;
|
|
|
|
m_serialPort = new QSerialPort(portName);
|
|
m_serialPort->setBaudRate(m_baud);
|
|
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//FLOW_OFF//
|
|
m_serialPort->setParity(QSerialPort::EvenParity);
|
|
m_serialPort->setDataBits(QSerialPort::Data8);
|
|
m_serialPort->setStopBits(QSerialPort::OneStop);
|
|
|
|
if(!m_serialPort->isOpen()){
|
|
result = m_serialPort->open(QIODevice::ReadWrite);
|
|
m_serialPort->setTextModeEnabled(false);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
QSerialPort *CommunicationSerialPort::getSerialPort(){
|
|
return m_serialPort;
|
|
}
|
|
void CommunicationSerialPort::close()
|
|
{
|
|
if(m_serialPort !=NULL){
|
|
if(m_serialPort->isOpen()){
|
|
m_serialPort->close();
|
|
}
|
|
|
|
delete m_serialPort;
|
|
m_serialPort =NULL;
|
|
}
|
|
}
|
|
|
|
bool CommunicationSerialPort::send(const QByteArray& byteArray)
|
|
{
|
|
m_serialPort->write(byteArray);
|
|
return true;
|
|
}
|
|
|
|
QByteArray CommunicationSerialPort::readAll(){
|
|
QByteArray data = m_serialPort->readAll();
|
|
return data;
|
|
}
|
|
void CommunicationSerialPort::modify(const QString &name, QSerialPort::BaudRate baud)
|
|
{
|
|
portName =name;
|
|
m_baud =baud;
|
|
}
|
|
|
|
|
|
CommunicationTcpSocket::CommunicationTcpSocket(const QString &hostIpAddress,
|
|
quint16 port,
|
|
QObject *parent)
|
|
: CommunicationBase(parent)
|
|
{
|
|
m_tcpSocket = NULL;
|
|
|
|
peekAddress =QHostAddress(hostIpAddress);
|
|
peekPort =port;
|
|
}
|
|
|
|
CommunicationTcpSocket::~CommunicationTcpSocket()
|
|
{
|
|
close();
|
|
}
|
|
|
|
bool CommunicationTcpSocket::open()
|
|
{
|
|
QDEBUG(objectName());
|
|
|
|
if(m_tcpSocket ==NULL){
|
|
m_tcpSocket = new QTcpSocket();
|
|
m_tcpSocket->bind(QHostAddress::Any);
|
|
}
|
|
m_tcpSocket->connectToHost(peekAddress, peekPort);
|
|
m_tcpSocket->waitForConnected();
|
|
|
|
connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(received()));
|
|
connect(m_tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
|
|
|
m_tcpSocket->write(objectName().toLocal8Bit());
|
|
m_tcpSocket->flush();
|
|
|
|
return m_tcpSocket->isValid();
|
|
}
|
|
|
|
void CommunicationTcpSocket::close()
|
|
{
|
|
if(m_tcpSocket !=NULL){
|
|
disconnect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(received()));
|
|
disconnect(m_tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
|
m_tcpSocket->disconnectFromHost();
|
|
|
|
delete m_tcpSocket;
|
|
m_tcpSocket = NULL;
|
|
}
|
|
}
|
|
|
|
bool CommunicationTcpSocket::send(const QByteArray& byteArray)
|
|
{
|
|
m_tcpSocket->write(byteArray);
|
|
}
|
|
|
|
void CommunicationTcpSocket::modify(const QString &hostIpAddress, quint16 port)
|
|
{
|
|
peekAddress =QHostAddress(hostIpAddress);
|
|
peekPort =port;
|
|
}
|
|
|
|
void CommunicationTcpSocket::received()
|
|
{
|
|
QByteArray byteArray =m_tcpSocket->readAll();
|
|
QDEBUG(objectName() <<byteArray);
|
|
|
|
rcvByteArray.append(byteArray);
|
|
}
|
|
|
|
void CommunicationTcpSocket::disconnected()
|
|
{
|
|
restart();
|
|
}
|
|
|
|
CommunicationUdpSocket::CommunicationUdpSocket(const QString &hostIpAddress,
|
|
quint16 port,
|
|
QObject *parent)
|
|
: CommunicationBase(parent)
|
|
{
|
|
m_udpSocket = NULL;
|
|
|
|
peekAddress =QHostAddress(hostIpAddress);
|
|
peekPort =port;
|
|
}
|
|
|
|
CommunicationUdpSocket::~CommunicationUdpSocket()
|
|
{
|
|
close();
|
|
}
|
|
|
|
bool CommunicationUdpSocket::open()
|
|
{
|
|
if(m_udpSocket ==NULL){
|
|
m_udpSocket = new QUdpSocket();
|
|
m_udpSocket->bind(QHostAddress::Any);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void CommunicationUdpSocket::close()
|
|
{
|
|
if(m_udpSocket !=NULL){
|
|
delete m_udpSocket;
|
|
m_udpSocket = NULL;
|
|
}
|
|
}
|
|
|
|
bool CommunicationUdpSocket::send(const QByteArray&)
|
|
{
|
|
|
|
}
|
|
|
|
void CommunicationUdpSocket::modify(const QString &hostIpAddress, quint16 port)
|
|
{
|
|
peekAddress =QHostAddress(hostIpAddress);
|
|
peekPort =port;
|
|
}
|