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.

132 lines
2.6 KiB
C++

#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()
{
}
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<QByteArray> sendData = QSharedPointer<QByteArray>(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();//<2F><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
if (m_recvData.size() > 0)
{
if (m_recvData.startsWith("CA"))
{
int index = m_recvData.indexOf("#");
QByteArray b = m_recvData.left(index + 1);
// <20><><EFBFBD>ݰ<EFBFBD>
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)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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());
}