Files
2023-05-05 18:40:48 +08:00

144 lines
3.9 KiB
C++

#include "gd_plc.h"
GD_PLC::GD_PLC(QObject *parent , QString exePath) :
QObject(parent),exePath(exePath)
{
my_thread = new QThread();
ClearSocket = NULL;
ClearSocket = new QTcpSocket();//分配空间,指定父对象
IsPLCConnectedSuccess = false;
IsWorking = false;
IsFirstRec=true;
connect(ClearSocket, SIGNAL(readyRead()), //接受来自组件的信息
this, SLOT(HandleDate()));
connect(this, SIGNAL(ThreadSignal_TCP_Connect()), //TCP连接
this, SLOT(ThreadSlots_TCP_Connect()));
connect(this, SIGNAL(ThreadSignal_TCP_SendDate(QString )), //TCP连接
this, SLOT(SendDate(QString )));
this->moveToThread(my_thread);
ClearSocket->moveToThread(my_thread);
my_thread->start(); //启动线程
//QProcess::startDetached("C:/Users/Clear/Desktop/clear_hik_cam_win/build-clear_hik_cam_win-Desktop_Qt_5_14_2_MinGW_64_bit-Release/release/clear_hik_cam_win.exe",QStringList());
QStringList strList = exePath.split("/");
strList.removeLast();
QString workingDirectory = strList.join("/");
QProcess::startDetached(exePath,QStringList(),workingDirectory);
emit ThreadSignal_TCP_Connect();
}
GD_PLC::~GD_PLC()
{
ClearSocket->disconnectFromHost();
ClearSocket->close();//这里释放连接,前面connect的时候会建立连接
}
void GD_PLC::HandleDate()
{
QString data = ClearSocket->readAll();
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(data.toUtf8(),&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError)) return;
QJsonObject jsonObject = document.object();
if(data.contains("IsPLCConnectedSuccess"))//状态信息
{
if(IsFirstRec)//第一次收到信息
{
IsFirstRec = false;
this->CommonFunction(4);//隐藏UI
UpdateStatus(IsPLCConnectedSuccess,IsWorking);//向主线程更新状态
}
if((IsPLCConnectedSuccess!=jsonObject["IsPLCConnectedSuccess"].toBool()) ||
(IsWorking!=jsonObject["IsWorking"].toBool()) )
//状态信息有变动
{
IsPLCConnectedSuccess = jsonObject["IsPLCConnectedSuccess"].toBool();
IsWorking = jsonObject["IsWorking"].toBool();
UpdateStatus(IsPLCConnectedSuccess,IsWorking);//向主线程更新状态
}
}
else if(data.contains("key_point_cmd"))//VLP关键点
{
QString cmd = jsonObject["key_point_cmd"].toString();
emit key_point_cmd(cmd);
}
else if(data.contains("plc_task_state"))//PLC 运行任务状态
{
QString state = jsonObject["plc_task_state"].toString();
emit Log("PLC",state);
if(state.contains("finished"))
{
emit plc_task_state("finished");
}
}
}
void GD_PLC::SendDate(QString date)
{
mutex.lock();
QByteArray SendBytes =date.toLatin1();
ClearSocket->write(SendBytes);
mutex.unlock();
}
void GD_PLC::CommonFunction(int FunctionCode)// 4隐藏 5显示 6重启组件
{
QString CMD;
switch (FunctionCode)
{
// case 1:
// CMD = "{ \"Connet\":true }";break;
// case 2:
// CMD = "{ \"Connet\":false }";break;
// case 3:
// CMD = "{ \"Calibrate\":true }";break;
case 4:
CMD = "{\"UI\":\"hide\"}";
IsHide =true;
break;
case 5:
CMD = "{\"UI\":\"show\"}";
IsHide =false;
break;
case 6:
CMD = "{\"UI\":\"reboot\"}";break;
default :
break;
}
if(ClearSocket->isOpen())
{
emit ThreadSignal_TCP_SendDate(CMD);
}
}
void GD_PLC::Run_CMD(int cmd)//-1 停止 1-运行 0-无操作
{
QString CMD ="{\"Run\":" ;
CMD = CMD + QString::number(cmd);
CMD = CMD +"}";
emit ThreadSignal_TCP_SendDate(CMD);
}