276 lines
11 KiB
C++
276 lines
11 KiB
C++
#include <imgSaveThreadManager.h>
|
|
#include <appCore.hpp>
|
|
#include <appConfig.h>
|
|
#include <lightSource.hpp>
|
|
#include <cameraManager.h>
|
|
#include <manualDetThread.h>
|
|
#include <triggerManager.h>
|
|
#include <qthread.h>
|
|
#include <simpleSiemensTcp.hpp>
|
|
#include <back/hearbeatThread.h>
|
|
#include <summaryData.hpp>
|
|
#include <hardwareMonitor.hpp>
|
|
class detProcess : public QThread
|
|
{
|
|
public:
|
|
detProcess()
|
|
{
|
|
_threadManager.initialization(this);
|
|
_manualDetThread.initialization(this);
|
|
_cameraManager.initialization();
|
|
_triggerManager.initialization(this);
|
|
detProcessCallbackRegister();
|
|
|
|
}
|
|
bool waitrForInitResult(serviceModule* ptr)
|
|
{
|
|
int timecnt = 0;
|
|
while (timecnt <= 100)
|
|
{
|
|
if (ptr->status != NotInit)
|
|
break;
|
|
QThread::msleep(100);
|
|
timecnt++;
|
|
}
|
|
if (timecnt > 100)
|
|
return false;
|
|
if (ptr->status == InitFailure)
|
|
return false;
|
|
return true;
|
|
}
|
|
detDataManager _detDataManager;//检测中的数据 不需要初始化
|
|
imgSaveThreadManager _imgSaveThreadManager;//存图线程 不需要初始化
|
|
detThreadManager _threadManager;//异步检测线程 不需要初始化
|
|
|
|
handleAiModelManager _handleAiModelManager;//模型
|
|
cameraManager _cameraManager;//相机
|
|
lightSourceManager _lightSourceManager;//光源
|
|
|
|
triggerManager _triggerManager;//触发器
|
|
manualDetThread _manualDetThread;//手动触发线程
|
|
heartbeatThread* _heartbeatThread;//心跳线程
|
|
summaryData* _summaryData;// 汇总数据
|
|
autoDelete* autoDeleteThread;
|
|
hardwareMonitor _hardwareMonitor;//硬件监控 CPU 内存
|
|
//相机
|
|
camera* _2dCamera = nullptr, *_3dCamera = nullptr;
|
|
//初始化
|
|
void run()
|
|
{
|
|
_cameraManager.start();
|
|
_handleAiModelManager.start();
|
|
_lightSourceManager.start();
|
|
_triggerManager.start();
|
|
QThread::msleep(1000);
|
|
// _heartbeatThread = new heartbeatThread(&_triggerManager, _core._appConfig._triggerStruct.heartCmd);
|
|
autoDeleteThread =
|
|
new autoDelete({ _core._appConfig.oriImgSavePath,_core._appConfig .resImgSavePath},
|
|
autoDelete::sizeOverOrDayBefore, 3600);
|
|
_summaryData = new summaryData(&_triggerManager);
|
|
bool res1 = waitrForInitResult(&_cameraManager);
|
|
bool res2 = waitrForInitResult(&_handleAiModelManager);
|
|
bool res3 = waitrForInitResult(&_triggerManager);
|
|
std::cout << "_cameraManager-initReuslt-->" << std::to_string(res1) << "\n"
|
|
<< "_handleAiModelManager-initReuslt-->" << std::to_string(res2) << "\n"
|
|
<< "_triggerManager-initReuslt-->" << std::to_string(res3) << "\n" << std::endl;
|
|
if (res1 == true && res2 == true && res3 == true)
|
|
{
|
|
emit _core._qtFunc.sendInitFinished(InitOK);
|
|
_2dCamera = _cameraManager.getCamera("Camera1");//查找相机
|
|
if (_2dCamera == nullptr)
|
|
std::cout << "camera ->> Camera1 not found" << std::endl;
|
|
_3dCamera = _cameraManager.getCamera("174108");//查找相机
|
|
if (_3dCamera == nullptr)
|
|
{
|
|
_3dCamera = _cameraManager.getCamera("174113");//查找相机2
|
|
if (_3dCamera == nullptr)
|
|
std::cout << "camera ->> 3dCamera not found" << std::endl;
|
|
}
|
|
}
|
|
else
|
|
emit _core._qtFunc.sendInitFinished(InitFailure);
|
|
}
|
|
//注册回调
|
|
void detProcessCallbackRegister()
|
|
{
|
|
_triggerManager.registerCallback(9401, 1, [this](QByteArray& byteArray) {_2dTrigger(byteArray); }, "2D检测启动");
|
|
_triggerManager.registerCallback(9451, 1, [this](QByteArray& byteArray) {_3dTrigger(byteArray); }, "3D检测启动");
|
|
|
|
_threadManager.registerCallback([this](std::shared_ptr<detData>data) {detectionResultHandle(data); });
|
|
}
|
|
|
|
|
|
//9401 1 2D触发
|
|
void _2dTrigger(QByteArray& byteArray)
|
|
{
|
|
_core;
|
|
int snPos = 9420;
|
|
_triggerManager.sendFinsMsg("write_DM9401_0");//触发信号清零
|
|
_triggerManager.sendFinsMsg("write_DM9402_1");//开始检测信号
|
|
_triggerManager.sendFinsMsg("write_DM9405_-100");//开始检测信号
|
|
/////////数据初始化////////
|
|
std::string sn = readSnFromQByteArray(byteArray, snPos, false, true, -1);
|
|
std::shared_ptr <detData> data = _detDataManager.insertDetData("Camera2D", sn, 0,0);
|
|
data->oriShowIndex = 0;//图片显示位置
|
|
data->resShowIndex = 0;//图片显示位置
|
|
data->triggerPtr = &_triggerManager;//设置fins指针
|
|
data->_summaryData = _summaryData;//设置汇总数据指针
|
|
data->imgAmountMin = 1;//最小图片数量
|
|
data->algoThreadIndex = 0;//算法索引
|
|
qDebug() << "[ Station 10 ] " << QString::fromUtf8("2D-1第一次拍照开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);;
|
|
////////拍照////////////////
|
|
if (_2dCamera != nullptr)
|
|
_2dCamera->captureImage(data);//拍照
|
|
|
|
//data->oriImgs.push_back(cv::imread("D:\\952-11\\testSet\\2D\\20240906-114917.jpg", -1));
|
|
data->imgSaveFileParameter.push_back(sn);//设置部分文件名
|
|
data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr);//设置部分文件名
|
|
_threadManager.addTask(data);//添加任务
|
|
}
|
|
|
|
//9451 1 3D触发
|
|
void _3dTrigger(QByteArray& byteArray)
|
|
{
|
|
int snPos = 9480;
|
|
_triggerManager.sendFinsMsg("write_DM9451_0");//触发信号清零
|
|
_triggerManager.sendFinsMsg("write_DM9452_1");//开始检测信号
|
|
_core._appConfig.__952BiaoDingSwitchData.mutex.lock();
|
|
double mode = _core._appConfig.__952BiaoDingSwitchData.modeIn;
|
|
_core._appConfig.__952BiaoDingSwitchData.mutex.unlock();
|
|
|
|
/////////数据初始化////////
|
|
std::string sn = readSnFromQByteArray(byteArray, snPos, false, true, -1);
|
|
//sn = "123";
|
|
std::shared_ptr <detData> data = _detDataManager.insertDetData("Camera3D", sn, 0, 0);
|
|
data->oriShowIndex = 1;//图片显示位置
|
|
data->resShowIndex = 1;//图片显示位置
|
|
data->triggerPtr = &_triggerManager;//设置fins指针
|
|
data->_summaryData = _summaryData;//设置汇总数据指针
|
|
data->imgAmountMin = 2;//最小图片数量
|
|
if(mode == 0)//一般模式
|
|
data->algoThreadIndex = 1;//算法索引
|
|
else if (mode == 1)//标定模式
|
|
data->algoThreadIndex = 2;//算法索引
|
|
qDebug() << "[ Station 10 ] " << QString::fromUtf8("3D-1第一次拍照开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);;
|
|
////////拍照////////////////
|
|
data->oriFormatVec = { "bmp", "tiff" };
|
|
if (_3dCamera != nullptr)
|
|
_3dCamera->captureImage(data);//拍照
|
|
|
|
//data->oriImgs.push_back(cv::imread("D:\\952-11\\testSet\\3D\\2\\3D-_time11-27-1045210.tiff", -1));
|
|
//data->oriImgs.push_back(cv::imread("D:\\952-11\\testSet\\3D\\2\\3D-_time11-27-1045210.tiff", -1));
|
|
data->imgSaveFileParameter.push_back(sn);//设置部分文件名
|
|
data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr);//设置部分文件名
|
|
|
|
_threadManager.addTask(data);//添加任务
|
|
}
|
|
|
|
//检测结果处理
|
|
void detectionResultHandle(std::shared_ptr<detData>data)
|
|
{
|
|
//ct计算以及发送到界面
|
|
auto totalCt = std::chrono::duration_cast<std::chrono::milliseconds>(data->algoEndTime - data->algoStartTime);
|
|
qDebug() << QString::fromStdString(data->cameraKeyName) << "CT<<<" << totalCt.count() << "MS";
|
|
data->sqlVec.push_back({ "SN",data->SNcode });
|
|
//发送图片
|
|
if (data->resultImgs.size() > 0)
|
|
{
|
|
int cnt = 0;
|
|
for (auto showMat : data->resultImgs)
|
|
{
|
|
//打包发送
|
|
QPixmap pixmap = cvMatToQPixMap(showMat);
|
|
showImgPack* pack = new showImgPack();
|
|
pack->img = pixmap;
|
|
pack->type = imgWidgetRes;
|
|
pack->index = data->resShowIndex + cnt;
|
|
emit _core._qtFunc.sendPixmapImageWidget(pack);
|
|
|
|
//historyPack _historyPack;
|
|
//_historyPack.img = pixmap;
|
|
//_historyPack.filePath = std::shared_ptr<std::string>(new std::string);
|
|
//data->resImgSavePath.push_back(_historyPack.filePath);
|
|
//_historyPack.text.push_back(data->SNcode);
|
|
//_historyPack.text.push_back("CT:"+std::to_string(totalCt.count())+"ms");
|
|
//emit _core._qtFunc.addHistoryDataSignal((data->aiDetOK == true && data->halconOK == true), _historyPack);
|
|
cnt++;
|
|
pixmap = QPixmap();
|
|
}
|
|
}
|
|
|
|
|
|
data->sqlVec.push_back({ "totalCt",std::to_string(totalCt.count())+"ms"});
|
|
emit _core._qtFunc.addCtData(data->algoThreadIndex, totalCt.count());
|
|
//SQL
|
|
std::vector<sqlData> sqlDatas;
|
|
for (auto sqlData : data->sqlVec)
|
|
sqlDatas.push_back({ sqlData.first, sqlData.second });
|
|
_core._appConfig._sqlManager.addData(data->SNcode, sqlDatas);
|
|
|
|
//写入plc
|
|
for (auto writeBackStr : data->writeBackData)
|
|
_triggerManager.sendFinsMsg(writeBackStr);
|
|
|
|
//储存结果图
|
|
std::async(std::launch::async, &imgSaveThreadManager::saveRes, &_imgSaveThreadManager, data);
|
|
|
|
//删除 不再持有
|
|
detDataManager* dManager = data->dManager;
|
|
data->dManager->deleteDetData(data->timeCode);
|
|
}
|
|
|
|
QString snHex(QString sn)
|
|
{
|
|
QString resultStr = "";
|
|
for (int i = 0; i < sn.size() - 1; i = i + 2)
|
|
{
|
|
resultStr = resultStr + sn.at(i + 1) + sn.at(i);
|
|
}
|
|
return resultStr;
|
|
}
|
|
std::string readSnFromQByteArray(QByteArray plcByte, int dmPos,
|
|
bool highLowConversion, bool clearAfterRead, int Size)
|
|
{
|
|
int triggerPos = (dmPos - _core._appConfig._triggerStruct.startPos) * 2;
|
|
if (triggerPos < 0)
|
|
{
|
|
std::cout << "Read SN error,trigger is DM:" << dmPos << ",but read start at DM:" << _core._appConfig._triggerStruct.startPos << endl;
|
|
return "snErrorsnError" + getCurrentDateTime();
|
|
}
|
|
QString str;
|
|
if (plcByte.at(triggerPos + 1) == 0 && plcByte.at(triggerPos) == 0)
|
|
return "snErrorsnError" + getCurrentDateTime();
|
|
int snCount = 0;
|
|
if (highLowConversion == true)
|
|
{
|
|
while (plcByte.at(snCount + triggerPos) != 0 || plcByte.at(snCount + triggerPos + 1) != 0)
|
|
{
|
|
|
|
if (plcByte.at(snCount + triggerPos) != 0)
|
|
str += QChar(plcByte.at(snCount + triggerPos));
|
|
snCount++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (plcByte.at(snCount + triggerPos) != 0 || plcByte.at(snCount + triggerPos + 1) != 0)
|
|
{
|
|
|
|
if (plcByte.at(snCount + triggerPos + 1) != 0)
|
|
str += QChar(plcByte.at(snCount + triggerPos + 1));
|
|
if (plcByte.at(snCount + triggerPos) != 0)
|
|
str += QChar(plcByte.at(snCount + triggerPos));
|
|
snCount += 2;
|
|
}
|
|
}
|
|
if (str.size() < Size && Size != -1)
|
|
return "snErrorsnError" + getCurrentDateTime();
|
|
//if (clearAfterRead == true)
|
|
// //for(int i=0;i< snCount;i++)
|
|
// bridge.back.sendFinsMsg(
|
|
//QString::fromStdString("writeALL_DM" + to_string(dmPos) + "_" + to_string(snCount) + "_0"));
|
|
return str.toStdString();
|
|
}
|
|
public slots:
|
|
};
|
|
#pragma once |