EmbHMI/machine/lotmachine.cpp

291 lines
7.2 KiB
C++
Raw Normal View History

2024-02-06 06:27:07 +00:00
#include "lotmachine.h"
#include <QTime>
#include <QApplication>
LotMachine::LotMachine(QObject *parent) :
QObject(parent),
m_pTcpThread(NULL),
m_pTcpClient(NULL),
m_pComThread(NULL),
m_pComPort(NULL),
m_startComm(0)
{
m_receiveBuff.clear();
m_keyBuff.clear();
m_reFlag = 0;
m_connected = 0;
}
LotMachine::~LotMachine()
{
if (m_startComm != 0)
{
if(m_connectMode == USE_TCP_COMM)
{
m_pTcpThread->quit();
m_pTcpThread->wait();
}
else if(m_connectMode == USE_SERIAL_COMM)
{
m_pComThread->quit();
m_pComThread->wait();
}
}
if(m_connectMode == USE_TCP_COMM)
{
if(m_pTcpThread != NULL)
{
delete m_pTcpThread;
}
}
else if(m_connectMode == USE_SERIAL_COMM)
{
if(m_pComThread != NULL)
{
delete m_pComThread;
}
}
}
//初始化通讯连接方式
void LotMachine::initConnectMode(s16 val)
{
m_connectMode = val;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpThread = new QThread();
m_pTcpClient = new GatewayTcpClient();
}
else if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComThread = new QThread();
m_pComPort = new ComPort();
connect(m_pComPort, SIGNAL(siSerialPortOpenState(int)), this, SLOT(slotIfOpenSerialPort(int)) );
}
}
void LotMachine::setConfigFileName(QString configfilename)
{
m_configFileName = configfilename;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpClient->setConfigFileName(m_configFileName);
}
}
//设置串口名称
void LotMachine::setComportName(QString portName)
{
if(m_pComPort == NULL)
{
return;
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->setComPortName(portName);
}
}
QString LotMachine::getConfigFileName()
{
return m_configFileName;
}
int LotMachine::startCommunication()
{
if (m_startComm == 0)
{
// qDebug() << "Machine " << QThread::currentThread();
if(m_connectMode == USE_TCP_COMM)//网口
{
if (m_configFileName.isEmpty())
{
qDebug() << "mast call SetConfigFileName first ";
}
m_pTcpClient->moveToThread(m_pTcpThread); // 移动对象到线程中
// connect(qApp, SIGNAL(finished()), m_pTcpThread, SLOT(finished()));
connect(m_pTcpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) );
connect(m_pTcpThread, SIGNAL(finished()), m_pTcpClient, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pTcpClient, SIGNAL(siConnectSta(int)),
this, SLOT(slotConnectSta(int)), Qt::AutoConnection); // 连接状态改变
connect(m_pTcpClient, SIGNAL(siConnectErr(QString)),
this, SLOT(slotConnectErr(QString)), Qt::AutoConnection); // 接收到通讯错误
connect(m_pTcpClient, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::AutoConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pTcpClient, SLOT(slotSendData(QByteArray)), Qt::AutoConnection); // 发送数据的槽
m_pTcpThread->start(); // 启动线程
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->moveToThread(m_pComThread);
connect(m_pComThread, SIGNAL(started()), m_pComPort, SLOT(initComm()) );
connect(m_pComThread, SIGNAL(finished()), m_pComPort, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pComPort, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::QueuedConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pComPort, SLOT(slotSendData(QByteArray)), Qt::QueuedConnection); // 发送数据的槽
m_pComThread->start(); // 启动线程
}
m_startComm = 1;
}
return m_startComm;
}
// 连接状态改变的槽函数
void LotMachine::slotConnectSta(int sta)
{
// qDebug() << "SlotConnectSta" << sta;
if(m_connected != sta)
{
m_connected = sta;
if(m_connected == 3)//已连接
{
emit siConnectToMqtt();
}
}
}
// 接收到通讯错误槽函数
void LotMachine::slotConnectErr(QString errinfo)
{
if(errinfo.length() <= 0){}
//qDebug() << "SlotConnectErr" << errinfo;
}
// 接收到数据的槽函数
void LotMachine::slotReceiveData(QByteArray dat)
{
m_receiveBuff.append(dat);
int size = m_receiveBuff.length();
QString str = m_receiveBuff;
if(str == "success")
{
m_receiveBuff.remove(0, size);
return;
}
//QString rackNumStr = getJsonValue("device");//机架号
QString bootCmd = getJsonValue("data","boot");//执行命令
if(bootCmd.length() > 0)
{
emit siRunLotDataAction(bootCmd);
}
m_receiveBuff.remove(0, size);
}
//串口是否打开
void LotMachine::slotIfOpenSerialPort(int val)
{
if(val != 0)
{
if(m_connectMode == USE_SERIAL_COMM)
{
m_connected = 3;//串口已打开
}
}
}
//获取键值对属性值
QString LotMachine::getJsonValue(QString name1, QString name2)
{
QString rstr;
rstr.clear();
if(name1.length() <= 0 && name2.length() <= 0)
{
return rstr;
}
//QString str = "{\"device\":\"xiuhuaji133\",\"data\":{\"boot\":9}}";
QString str = m_receiveBuff;
QStringList vallist;
if(str.indexOf(",") == -1)
{
return rstr;
}
else
{
vallist = str.split(",", QString::SkipEmptyParts);
}
if(name2.length() <= 0)
{
if(vallist.size() >= 1)
{
QStringList vallist1;
if(QString(vallist[0]).indexOf(":") == -1)
{
return rstr;
}
else
{
vallist1 = QString(vallist[0]).split(":", QString::SkipEmptyParts);
}
if(QString(vallist1[0]).indexOf(name1) == -1)
{
return rstr;
}
else
{
rstr = QString(vallist1[1]).remove("\"");
}
}
}
else
{
if(vallist.size() >= 2)
{
QStringList vallist1;
if(QString(vallist[1]).indexOf(":") == -1)
{
return rstr;
}
else
{
vallist1 = QString(vallist[1]).split(":", QString::SkipEmptyParts);
}
for(int i = 0; i < vallist1.size(); i++)
{
if(QString(vallist1[i]).indexOf(name2) != -1)
{
if(i+1 < vallist1.size())
{
rstr = QString(vallist1[i+1]).remove("\"").remove("}");
}
}
}
}
}
return rstr;
}
//发送物联数据到网关
void LotMachine::sendLotDataToGateway(QString str)
{
QByteArray dat;
dat.clear();
dat = str.toLatin1();
emit(siSendData(dat));
}