Files
gcs-nf/dlink/dlink.cpp
T

299 lines
8.2 KiB
C++
Raw Permalink Normal View History

#include "dlink.h"
#include <string.h>
#include "QDateTime"
DLink::DLink(QObject *parent) : QObject(parent)
{
qDebug() << "Dlink " << QThread::currentThreadId();
2020-04-03 09:39:31 +08:00
//采用插件导入的方式(plugin)
2020-03-23 18:39:05 +08:00
2020-04-03 09:39:31 +08:00
//mavlink协议节点
mavlinknode = new MavLinkNode();//不允许带参数,因为这是单独的线程
//在当前线程运行
2020-04-03 09:39:31 +08:00
connect(mavlinknode,SIGNAL(SendMessageTo(quint8,quint8*,quint16)),
this,SLOT(SendMessageTo(quint8,quint8*,quint16)),Qt::BlockingQueuedConnection);//采用直连的方式,因为是多线程
2020-08-04 10:34:48 +08:00
//在当前线程运行
2020-07-01 18:22:49 +08:00
connect(mavlinknode,SIGNAL(showMessage(QString,int)),
this,SIGNAL(showMessage(QString,int)),Qt::DirectConnection);
//在当前线程运行
connect(this,SIGNAL(recieveMessage(quint32,QByteArray)),
mavlinknode,SLOT(setbuff(quint32,QByteArray)),Qt::DirectConnection);
2020-07-01 18:22:49 +08:00
2020-08-05 22:39:33 +08:00
mavlinknode->start();
2020-04-03 09:39:31 +08:00
//其他协议节点。。。
}
DLink::~DLink()
{
stopPort();
mavlinknode->stop();
delete mavlinknode;
}
int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
2020-08-04 23:18:58 +08:00
{
//让这个函数在其他线程运行
2020-08-19 14:12:36 +08:00
/*
QString num;
for (int i = 0; i < len; ++i) {
num.append(QString::number(msg[i],16).toUpper());
num.append(" ");
}
qDebug() << num;
2020-08-19 14:12:36 +08:00
*/
2020-08-06 23:03:10 +08:00
//Q_UNUSED(ch);
2020-08-06 23:03:10 +08:00
//更加ch选择
if (DLink::Clientsock)
{
foreach(Node node,clientSockets)
{
qint64 flag = DLink::Clientsock->writeDatagram((const char *)msg,len,node.addr, node.port);
if(flag != -1)
{
qDebug() << "Client Send Msg";
}
}
}
2020-08-12 22:12:44 +08:00
if (DLink::serialPort)
{
qint64 flag = DLink::serialPort->write((const char *)msg,len);
if(flag != -1)
{
qDebug() << "serialPort Send Msg";
}
}
2020-08-06 21:58:42 +08:00
return 0;
}
//这个函数就在本线程内运行
2020-06-15 18:24:22 +08:00
bool DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity parity)
{
2020-06-15 18:24:22 +08:00
qWarning() << port
2020-08-06 21:58:42 +08:00
<< baudrate
<< parity;
2020-06-15 18:24:22 +08:00
bool isSuccess = false;
2020-04-03 09:39:31 +08:00
if (serialPort)//多串口接入
{
serialPort->close();
delete serialPort;
}
2020-08-04 23:18:58 +08:00
serialPort = new QSerialPort(this);
serialPort->setPortName(port);
if (serialPort->open(QIODevice::ReadWrite))
{
serialPort->setBaudRate(baudrate);
serialPort->setParity(parity);
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
2020-08-04 10:34:48 +08:00
DLink::serialPort->write("serial connet ok",16);
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readPendingDatagramsSerialPort()));//本线程内调用
isSuccess = true;
2020-08-04 10:34:48 +08:00
2020-07-01 18:22:49 +08:00
emit showMessage(tr("Serial Port Open Success"));
qWarning() << "Serial Port Open Success";
}
else
{
2020-06-15 18:24:22 +08:00
isSuccess = false;
2020-07-01 18:22:49 +08:00
emit showMessage(tr("Serial Port Open Fail"));
qWarning() << "Serial Port Open Fail";
delete serialPort;
serialPort = nullptr;
}
2020-06-15 18:24:22 +08:00
return isSuccess;
}
bool DLink::statesPort()
{
if(serialPort)
{
return (serialPort != nullptr)?(true):(false);
}
}
void DLink::stopPort()
{
if(serialPort)
{
emit showMessage(tr("Serial Port close"));
if(serialPort->isOpen())
{
serialPort->close();
}
delete serialPort;
serialPort = nullptr;
}
}
2020-05-19 19:02:32 +08:00
void DLink::connectSignal(QVariant m_state,
QVariant m_usrName,QVariant m_Type,
QVariant m_Param1,QVariant m_Param2,
QVariant m_Param3,QVariant m_Param4,
QVariant m_Param5)
{
if(m_state.toBool() == true)
{
2020-06-15 18:24:22 +08:00
if(m_Type.toString() == "SerialPort")
2020-05-19 19:02:32 +08:00
{
QSerialPort::Parity parity;
2020-06-15 18:24:22 +08:00
if(m_Param4.toString() == "NONE")
2020-05-19 19:02:32 +08:00
{
parity = QSerialPort::Parity::NoParity;
}
2020-06-15 18:24:22 +08:00
if(m_Param4.toString() == "ODD")
2020-05-19 19:02:32 +08:00
{
parity = QSerialPort::Parity::OddParity;
}
2020-06-15 18:24:22 +08:00
if(m_Param4.toString() == "EVEN")
2020-05-19 19:02:32 +08:00
{
parity = QSerialPort::Parity::EvenParity;
}
qWarning() << m_Type << m_Param1 << m_Param2.toString().toInt() << parity;
2020-06-15 18:24:22 +08:00
2020-08-05 22:39:33 +08:00
if(setupPort(m_Param1.toString(),m_Param2.toString().toInt(),parity))
2020-06-15 18:24:22 +08:00
{
emit PortConnected(true,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
}
else
{
emit PortConnected(false,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
}
2020-05-19 19:02:32 +08:00
}
2020-06-15 18:24:22 +08:00
else if(m_Type.toString() == "UDP")
2020-05-19 19:02:32 +08:00
{
2020-06-18 18:13:25 +08:00
//qDebug() << m_Type << m_Param1 << m_Param2 << m_Param4;
if(setupClient(QHostAddress(m_Param1.toString()),m_Param2.toString().toInt(),QHostAddress(m_Param3.toString()),m_Param4.toString().toInt()))
2020-06-15 18:24:22 +08:00
{
emit PortConnected(true,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
}
else
{
emit PortConnected(false,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
}
}
}
else
{
qWarning() << "disconnect";
2020-06-15 18:24:22 +08:00
if(m_Type.toString() == "SerialPort")
{
stopPort();
emit PortConnected(false,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
}
else if(m_Type.toString() == "UDP")
{
emit PortConnected(false,m_usrName,m_Type,m_Param1,m_Param2,m_Param3,m_Param4,m_Param5);
2020-05-19 19:02:32 +08:00
}
}
}
bool DLink::setupClient(const QHostAddress &local_addr,int local_port,const QHostAddress &remote_addr,int remote_port)
{
2020-08-08 14:35:57 +08:00
if(Clientsock)
{
2020-10-13 21:15:35 +08:00
Clientsock->disconnect();
2020-08-08 14:35:57 +08:00
delete Clientsock;
Clientsock = nullptr;
}
2020-06-15 18:24:22 +08:00
bool isSuccess = false;
Clientsock = new QUdpSocket(this);
2020-10-13 21:15:35 +08:00
if (Clientsock->bind(QHostAddress::AnyIPv4, local_port, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint))
{
2020-08-08 21:07:33 +08:00
Clientsock->joinMulticastGroup(remote_addr);
2020-10-13 21:15:35 +08:00
Clientsock->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*8);
Clientsock->setSocketOption(QAbstractSocket::MulticastTtlOption, 3);
2020-08-08 21:07:33 +08:00
if(Clientsock->open(QIODevice::ReadWrite))
2020-08-08 14:35:57 +08:00
//if(Clientsock->joinMulticastGroup(remote_addr))
{
connect(Clientsock, SIGNAL(readyRead()),
this, SLOT(readPendingDatagramsClient()));
2020-08-08 14:35:57 +08:00
Node node;
node.sock = Clientsock;
node.addr = remote_addr;
node.port = remote_port;
clientSockets.append(node);
qWarning() << "UdpSocket open:"
<< remote_addr
<< local_port
<< remote_port;
2020-06-15 18:24:22 +08:00
isSuccess = true;
2020-07-01 18:22:49 +08:00
emit showMessage(tr("UdpSocket open"));
}
else
{
2020-08-19 14:12:36 +08:00
Clientsock->leaveMulticastGroup(remote_addr);
Clientsock->close();
2020-06-15 18:24:22 +08:00
isSuccess = false;
qWarning() << "sock not open";
2020-08-20 17:48:09 +08:00
delete Clientsock;
}
}
else
{
2020-06-15 18:24:22 +08:00
isSuccess = false;
2020-08-19 14:12:36 +08:00
Clientsock->leaveMulticastGroup(remote_addr);
Clientsock->close();
qWarning("sock is not binded.");
delete Clientsock;
}
2020-06-15 18:24:22 +08:00
return isSuccess;
}
void DLink::readPendingDatagramsSerialPort(void)
{
2020-08-19 14:12:36 +08:00
if(serialPort)
{
QByteArray datagram = serialPort->readAll();
emit recieveMessage(SourceType::s_port,datagram);
}
}
void DLink::readPendingDatagramsClient(void)
{
//轮番查询
2020-08-20 17:48:09 +08:00
if(Clientsock)
2020-08-19 14:12:36 +08:00
{
2020-08-20 17:48:09 +08:00
while (Clientsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(Clientsock->pendingDatagramSize());
Clientsock->readDatagram(datagram.data(), datagram.size());
2020-08-19 14:12:36 +08:00
2020-08-20 17:48:09 +08:00
emit recieveMessage(SourceType::c_sock,datagram);
2020-08-19 14:12:36 +08:00
}
}
}
2020-08-11 16:48:15 +08:00