#include "QPLCDevice.h" QPLCDevice::QPLCDevice(QObject *parent) : QObject(parent) { TaskFunc_Bool func2 = std::bind(&QPLCDevice::onRunTask, this); m_pTask = new lpThread(func2); m_pTask->setPriority(QThread::HighestPriority); m_pTask->StartThread(); } QPLCDevice::~QPLCDevice() { if (m_pTask) { m_pTask->EndThread(); delete m_pTask; m_pTask = nullptr; } } void QPLCDevice::onInitDevice() { if (!m_rawTcpServer) { m_rawTcpServer = new lptkRawTcpServer(); connect(m_rawTcpServer, &lptkRawTcpServer::client_status_changed, this, &QPLCDevice::on_serv_status_changed); RecvDataFunc func = std::bind(&QPLCDevice::onRecvFunc, this, std::placeholders::_1); m_rawTcpServer->setRecvCallFunc(func); } } void QPLCDevice::onStartServer(int port) { if (m_rawTcpServer) { m_rawTcpServer->server_begin("*", port); } } void QPLCDevice::onStopServer() { if (m_rawTcpServer) { m_rawTcpServer->server_end(); } } void QPLCDevice::onRecvFunc(QByteArray data) { mMtLock.lock(); m_recvData.append(data); mMtLock.unlock(); } void QPLCDevice::sendByteData(QByteArray byteData) { QSharedPointer sendData = QSharedPointer(new QByteArray); sendData->append(byteData); if (m_rawTcpServer) { m_rawTcpServer->broadcast_send_data(sendData); } } Q_SLOT void QPLCDevice::on_serv_status_changed(int id, ServerStatus status) { switch (status) { case TCPSERVER_ON_CLIENT_CONNECTED: //connected_sess_list_.insert(id); break; case TCPSERVER_ON_CLIENT_DISCONNECTED: //connected_sess_list_.remove(id); break; default: break; } } bool QPLCDevice::onRunTask() { mMtLock.lock();//数据解析 if (m_recvData.size() > 0) { if (m_recvData.startsWith("CA")) { int index = m_recvData.indexOf("#"); QByteArray b = m_recvData.left(index + 1); // 数据包 onParaster(b); m_recvData.remove(0, index + 1); } else { m_recvData.remove(0, 1); } } mMtLock.unlock(); return true; } void QPLCDevice::onParaster(QByteArray recvData) { QString strPack = QString(recvData); QStringList lst = strPack.split(";"); if (lst.size() >= 4) { QString header = lst[0]; QString cmd = lst[1]; QString data = lst[2]; QString trailer = lst[3]; if (cmd.toInt() == 1)//相机触发 { emit sgTrigerCam(data.toInt()); } else if (cmd.toInt() == 2) { onSendHeartBit(); } } } void QPLCDevice::onSendValueRlt(const ValueResult& rlt) { QString sdata = QString("CA;3;%1;%2;%3;%4;#").arg(rlt.strModel).arg(rlt.angle).arg(rlt.center.x()).arg(rlt.center.y()); sendByteData(sdata.toLatin1()); } void QPLCDevice::onSendHeartBit() { QString sdata = QString("CA;2;1;#"); sendByteData(sdata.toLatin1()); } void QPLCDevice::onAckTrigerCam() { QString sdata = QString("CA;1;1;#"); sendByteData(sdata.toLatin1()); }