diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a51ad8..30dea2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ if(ON) set(Qt5_DIR ${ENVPATH}/qt5/lib/cmake/Qt5) set(QT_DIR ${Qt5_DIR}) - set(qtlist "Core" "Widgets" "Network" "Gui" "PrintSupport" "Concurrent" "SerialPort""Sql" "Qml" "Quick" "QuickControls2") + set(qtlist "Core" "Widgets" "Network" "Gui" "PrintSupport" "Concurrent" "SerialPort""Sql" "Quick" "QuickControls2") find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Quick QuickControls2 QuickLayouts REQUIRED) message("QT_Version :" Qt${QT_VERSION_MAJOR}) @@ -230,3 +230,15 @@ add_compile_options("$<$:/utf-8>") string(TIMESTAMP RUN_TIME) message( " project end : " ${RUN_TIME}) +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) +configure_file( + ${CMAKE_SOURCE_DIR}/git_version.h.in + ${CMAKE_BINARY_DIR}/git_version.h + @ONLY +) + diff --git a/git_version.h.in b/git_version.h.in new file mode 100644 index 0000000..76a8ef3 --- /dev/null +++ b/git_version.h.in @@ -0,0 +1,4 @@ +#ifndef GIT_VERSION_H +#define GIT_VERSION_H +#define GIT_COMMIT_HASH "@GIT_COMMIT_HASH@" +#endif \ No newline at end of file diff --git a/include/interface.h b/include/interface.h index d922d54..127a8f2 100644 --- a/include/interface.h +++ b/include/interface.h @@ -5,7 +5,7 @@ class IBackend { public: virtual ~IBackend() = default; virtual void test() = 0; - virtual void init(qtFuncBridge*) = 0; + virtual void init(qtFuncBridge*,nlohmann::json& json) = 0; virtual void cleanup() = 0; }; diff --git a/include/qtBridge.h b/include/qtBridge.h index 4a54071..0f7d4f4 100644 --- a/include/qtBridge.h +++ b/include/qtBridge.h @@ -40,6 +40,8 @@ signals: // 汇总数据 void summaryData_addData(QString window, double data); + + /////////////////////////////////////////////// // 切换界面 void switchMainStakedWidget(int index); @@ -59,5 +61,7 @@ signals: // 警告日志 void loadingWindow_appendWarningLog(QString text); void loadingWindow_clearWarningLog(); + ////////////////////////////////////////////////////////////// + void reInitConfig(); }; #pragma once \ No newline at end of file diff --git a/src/Core/back/backStruct.h b/src/Core/back/backStruct.h index 9c66a70..9f43d14 100644 --- a/src/Core/back/backStruct.h +++ b/src/Core/back/backStruct.h @@ -24,12 +24,11 @@ struct correctionStruct typedef struct { QString m_stationKy; QString key; // 相机名称 - QString moduleName; // 模块名称 + QString dllPath; // 模块名称 QString task_thread_index = "-1";// 存储当前算法属于那个任务线程 QByteArray m_initByte; // 传递初始化参数 subModuleBase* module_ptr = nullptr; // 存储模块指针 ReleaseFunction destory_ptr; // 释放 - QString triggerMode; cameraStruct _cameraStruct;//外部传入数据 bool init = false; }cameraModule; diff --git a/src/Core/back/cameraManager.cpp b/src/Core/back/cameraManager.cpp index 68b740c..4f42333 100644 --- a/src/Core/back/cameraManager.cpp +++ b/src/Core/back/cameraManager.cpp @@ -32,6 +32,7 @@ camera::camera(cameraModule cameraModulePtrIn, int indexIn,qtFuncBridge* bridgeI { bridge = bridgeIn; cameraModulePtr = cameraModulePtrIn; + _cameraStruct = cameraModulePtr._cameraStruct; cameraName = cameraModulePtr.key; index = indexIn; lastUpdateTime.start(); @@ -74,7 +75,7 @@ void camera::run() } else{ showLost++; - qDebug() << cameraModulePtr.moduleName << "Lost show"; + qDebug() << cameraModulePtr.dllPath << "Lost show"; } data->oriImgMutex.unlock(); mutex.unlock(); @@ -107,15 +108,15 @@ void cameraManager::run() return; #pragma region 加载相机dll for (auto val = 0; val < _cameraStructs.size(); val++){ + _cameraStructs[val].index = val; QString camera_key = QString::fromStdString(_cameraStructs[val].connectionName); - QString moduleName = QString::fromStdString(_cameraStructs[val].moduleName);// 相机模块名 - QString triggerMode = QString::fromStdString(_cameraStructs[val].triggerMode);// 相机模块名 + QString dllPath = QString::fromStdString(_cameraStructs[val].dllPath);// 相机模块名 QVector surfaceVec; QByteArray init_Byte; // 加载相机模块 if (!loadModule(_cameraStructs[val])) { - qCritical() << "[Error] " << " moduleName:" << moduleName << " load camera module failed! "; + qCritical() << "[Error] " << " dllPath:" << dllPath << " load camera module failed! "; return; } } @@ -127,7 +128,7 @@ void cameraManager::run() for (auto i = 0; i < camerasVec.size(); i++){ cameraModule& m_module = camerasVec[i]; - QString moduleName = m_module.moduleName; + QString dllPath = m_module.dllPath; QString key = m_module.key; //传递初始化参数 QByteArray initByte = m_module.m_initByte; @@ -172,7 +173,7 @@ void cameraManager::run() QByteArray errorStr("getStatus"); m_module.module_ptr->readData(vec_mat, errorStr); initReuslt = false; - qCritical() << "[Error] " << " moduleName:" << m_module.moduleName << " initParas failed!"; + qCritical() << "[Error] " << " moduleName:" << m_module.dllPath << " initParas failed!"; emit bridge->loadingWindow_appendLog("相机" + m_module.key + "初始化失败->"+ errorStr,"red"); } } @@ -190,16 +191,15 @@ bool cameraManager::loadModule(cameraStruct _cameraStruct) try { QString keyName = QString::fromStdString(_cameraStruct.connectionName); - QString moduleName = QString::fromStdString(_cameraStruct.moduleName);// 相机模块名 - QString triggerMode = QString::fromStdString(_cameraStruct.triggerMode);// 相机模块名 - QString module_path = "./" + moduleName; + QString dllPath = QString::fromStdString(_cameraStruct.dllPath);// 相机模块名 + QString module_path = "./" + dllPath; qDebug() << "[INFO] " << " module_path:" << module_path; /////// 自动拷贝重用dll - while (m_usedDllPath[module_path] == true) { + if (m_usedDllPath[module_path] == true) { //命名格式: 模块名+1/2/3... - QString originalPath = "./" + moduleName; - module_path = "./" + moduleName + "-1"; + QString originalPath = "./" + dllPath; + module_path = "./" + dllPath + "-"+QString::number(_cameraStruct.index); if (QFile::exists(module_path + ".dll")) { QFile::remove(module_path + ".dll"); } @@ -216,7 +216,7 @@ bool cameraManager::loadModule(cameraStruct _cameraStruct) { qDebug() << "[Error] " << " Loaded error:" << m_lib->errorString(); - bridge->loadingWindow_appendLog("加载相机模块" + moduleName + "失败->" + m_lib->errorString(), "red"); + bridge->loadingWindow_appendLog("加载相机模块" + dllPath + "失败->" + m_lib->errorString(), "red"); return false; } @@ -227,8 +227,7 @@ bool cameraManager::loadModule(cameraStruct _cameraStruct) cameraModule m_module; m_module.key = keyName; //m_module.m_initByte = initByte; - m_module.moduleName = moduleName; - m_module.triggerMode = triggerMode; + m_module.dllPath = dllPath; m_module.module_ptr = createFun(); m_module.destory_ptr = releaseFun; m_module._cameraStruct = _cameraStruct; diff --git a/src/Core/back/cameraManager.h b/src/Core/back/cameraManager.h index de826f0..26d9cfe 100644 --- a/src/Core/back/cameraManager.h +++ b/src/Core/back/cameraManager.h @@ -23,6 +23,8 @@ public: QTime lastUpdateTime; QString cameraName; int imgShowCnt = 0; + cameraModule cameraModulePtr; + cameraStruct _cameraStruct; camera(cameraModule cameraModulePtrIn, int indexIn, qtFuncBridge* bridgeIn); ~camera() { @@ -104,11 +106,9 @@ private: if (!cameraModulePtr.module_ptr->readData(camera_mat, task_name)) qCritical() << "[Error] " << "set exposure error!"; } - int index = 0; int timeout = 5000; QMutex mutex; - cameraModule cameraModulePtr; QQueueimgQueue; QQueue>requestQueue; bool runFlag = true; @@ -127,16 +127,16 @@ public: cameraStruct _cameraStruct; _cameraStruct.key = data["key"]; _cameraStruct.connectionName = data["connectionName"]; - _cameraStruct.serialNum = data["serialNum"]; - _cameraStruct.triggerMode = data["triggerMode"]; - _cameraStruct.moduleName = data["moduleName"]; - for (auto& imageShow : data["imageShow"]) + _cameraStruct.dllPath = data["dllPath"]; + _cameraStruct.oriSaveFormat = data["oriSaveFormat"]; + for (auto& imageShow : data["oriImageShow"]) { QString str = QString::fromStdString(imageShow); QStringList l = str.split("#"); if (l.size() < 2) { qDebug() << "Imagehsow 格式错误,例:窗口名#类型名"; + std::cout << "Imagehsow 格式错误,例:窗口名#类型名" < #include #include -//#include +#include #include #include @@ -14,6 +14,7 @@ class detData; class detDataManager; class triggerManager; using resultHandleCallback = std::function)>; +using algoEvaluateCallback = std::function,handleAiModelManager*)>; class detData { public: @@ -22,66 +23,17 @@ public: std::chrono::steady_clock::time_point startTime = std::chrono::high_resolution_clock::now(); std::chrono::steady_clock::time_point getImageTime; std::chrono::steady_clock::time_point algoStartTime; - std::chrono::steady_clock::time_point halconEndTime; - std::chrono::steady_clock::time_point handleAiEndTime; std::chrono::steady_clock::time_point algoEndTime; //参数 - std::string cameraKeyName; - QString algoThreadName; - std::string cameraNameStr; - double camera1Width = 0, camera1Height = 0; - int cameraIndex = -1; //是第几次拍照 - - int algoThreadIndex = -1; - - std::vector > resImgSavePath; - std::string snErrorsnError = std::string("snErrNoSn"); - std::vector writeBackData; - void writeBack(QString type, int pos, QString value) - { - writeBackData.push_back(QString("write_%1_%2_%3").arg(type).arg(QString::number(pos)).arg(value)); - } - //结果 - bool aiDetOK = true; bool halconOK = true; - int aiNgCount = 0, aiOkCount = 0, halconOkCount = 0, halconNgCount = 0; - - //存图相关 - QMutex resultMutex;//结果图锁 - std::vector resultImgs;//结果图 - std::vector segOriginImgs;//seg检测原图,共用结果图锁 - std::vector> clsOriginImgs;//cls检测原图,共用结果图锁 - - QMutex oriImgMutex;//原图锁 - std::vector oriImgs;//原图 - std::vector oriFormatVec;//原图格式 如果数量不一致直接全存bmp - std::vectorimgSaveFileParameter;//命名规则 str1_str2... 第一个参数已默认为相机名,在构造函数 //结果图展示预设 std::vector< showImgPack*>resultImgShowSet; //需要存入的SQL数据 std::vector> sqlVec; - void registerResultHandleCallback(resultHandleCallback func){ - _resultHandleCallback = func; - } - detData(std::string IN_cameraKeyName){ - cameraKeyName = IN_cameraKeyName; - imgSaveFileParameter.push_back(cameraKeyName); - } - ~detData(){ - for (auto& img : oriImgs) - img.release(); - for (auto& img : resultImgs) - img.release(); - for (auto& img : segOriginImgs) - img.release(); - for (auto& img : clsOriginImgs) - img.second.release(); - } - #pragma region 基础函数 static unsigned long long getTimeCode() { auto now = std::chrono::high_resolution_clock::now(); @@ -101,12 +53,46 @@ public: int imgAmountMin = 1;//最小取图数量 const unsigned long long timeCode = getTimeCode();//根据时间和随机数生成的值,唯一 std::string SNcode;//SN条码 + std::string cameraKeyName;//相机名 std::map resultData;//结果数据 triggerManager* triggerPtr = nullptr;//触发器指针 一般为plc模块指针 #pragma endregion +#pragma region 存图相关 + QMutex resultMutex;//结果图锁 + std::vector resultImgs;//结果图容器 + std::vector segOriginImgs;//seg检测原图容器 + std::vector> clsOriginImgs;//cls检测原图容器 -//private: + QMutex oriImgMutex;//原图锁 + std::vector oriImgs;//原图容器 + std::vector oriFormat;//原图格式 如果数量不一致直接全存bmp + std::vector imgSaveNameParameter;//命名规则 str1_str2... 第一个参数已默认为相机名,在构造函数 +#pragma endregion +#pragma region 检测相关回调函数 resultHandleCallback _resultHandleCallback; + void registerResultHandleCallback(resultHandleCallback func) { + _resultHandleCallback = func; + } + algoEvaluateCallback _algoEvaluateCallback; + void registerAlgoEvaluateCallback(algoEvaluateCallback func) { + _algoEvaluateCallback = func; + } +#pragma endregion + + detData(std::string IN_cameraKeyName) { + cameraKeyName = IN_cameraKeyName; + imgSaveNameParameter.push_back(cameraKeyName); + } + ~detData() { + for (auto& img : oriImgs) + img.release(); + for (auto& img : resultImgs) + img.release(); + for (auto& img : segOriginImgs) + img.release(); + for (auto& img : clsOriginImgs) + img.second.release(); + } }; class detDataManager { @@ -121,7 +107,8 @@ public: std::shared_ptr insertDetData( QString IN_cameraKeyName, std::string IN_SN,int imgAmountMin, - resultHandleCallback resultSolver){ + resultHandleCallback resultSolver, + algoEvaluateCallback _algoEvaluateCallback){ QMutexLocker locker(&dataMutex); std::shared_ptr dataPtr(new detData(IN_cameraKeyName.toStdString())); @@ -129,6 +116,7 @@ public: dataPtr->triggerPtr = _triggerManager; dataPtr->SNcode = IN_SN; dataPtr->registerResultHandleCallback(resultSolver); + dataPtr->registerAlgoEvaluateCallback(_algoEvaluateCallback); dataPtr->imgAmountMin = imgAmountMin; dataPtr->dManager = this; map.insert({ dataPtr->timeCode,dataPtr }); diff --git a/src/Core/back/imgSaveThreadManager.h b/src/Core/back/imgSaveThreadManager.h index a4acbb6..2478182 100644 --- a/src/Core/back/imgSaveThreadManager.h +++ b/src/Core/back/imgSaveThreadManager.h @@ -101,8 +101,7 @@ public: path = pathIn; } imgSaveThread saveThread; - std::string genDirName(std::shared_ptr data, imgSaveThreadType type) - { + std::string genDirName(std::shared_ptr data, imgSaveThreadType type) { //sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data->SNcode);//查找之前的数据 //获取关键数据 std::string imgSaveDirStr = path;//所有图片的路径 sample "D://CCD" @@ -115,7 +114,7 @@ public: switch (type) { case oriImg: - imgTypeDirStr = "Yuantu"; + imgTypeDirStr = "Ori"; break; case resImg: imgTypeDirStr = "Result"; @@ -127,13 +126,6 @@ public: imgTypeDirStr = "error"; } - //dateDirStr hourDirStr - //if (sqlRes.rowDatas.size() > 0 && sqlRes.rowDatas[0][0].value != "")//数据存在 - //{ - // dateDirStr = sqlRes.tableName; - // hourDirStr = sqlRes.rowDatas[0][0].value + "H"; - //} - //else//数据不存在 新建数据 { QDateTime currentDateTime = QDateTime::currentDateTime(); dateDirStr = currentDateTime.toString("yyyy-MM-dd").toStdString(); @@ -152,19 +144,19 @@ public: hourDirStr + "/" + detailNameStr + "/"); } - std::vector genFileNmaes(std::shared_ptr data, imgSaveThreadType type) + std::vector genFileNames(std::shared_ptr data, imgSaveThreadType type, std::string format = "") { std::vector resultFileNames; std::string fileName; - for (auto str : data->imgSaveFileParameter) + for (auto str : data->imgSaveNameParameter) fileName += str + "_"; switch (type) { case oriImg: for (int i = 0; i < data->oriImgs.size(); i++) { - if (i < data->oriFormatVec.size() ) - resultFileNames.push_back(fileName + getCurrentDateTime() + "_Count" + std::to_string(i) + "." + data->oriFormatVec[i]); + if (i < data->oriFormat.size() ) + resultFileNames.push_back(fileName + getCurrentDateTime() + "_Count" + std::to_string(i) + "." + data->oriFormat[i]); else resultFileNames.push_back(fileName + getCurrentDateTime() + "_Count" + std::to_string(i) + ".bmp"); } @@ -205,7 +197,7 @@ public: { std::string fileSavePath = genDirName(data, oriImg);//获取文件夹名 createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建 - std::vectorfileNames = genFileNmaes(data, oriImg); + std::vectorfileNames = genFileNames(data, oriImg); for (int index = 0; index < fileNames.size(); index++) saveThread.addData(fileSavePath+fileNames[index], data->oriImgs[index]); int queueSize = saveThread.queueSize(); @@ -217,30 +209,28 @@ public: std::string fileSavePath = genDirName(data, resImg);//获取文件夹名 createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建 //结果图保存 - std::vectorresFileNames = genFileNmaes(data, resImg); + std::vectorresFileNames = genFileNames(data, resImg); for (int index = 0; index < resFileNames.size(); index++) { saveThread.addData(fileSavePath + resFileNames[index], data->resultImgs[index], imgSaveThread::priority); - if (data->resImgSavePath.size() > index) - *data->resImgSavePath[index] = fileSavePath + resFileNames[index]; } //seg std::string segAndClsPath = fileSavePath + "detImgs//" + getCurrentDateTime() + "//"; - std::vectorsegFileNames = genFileNmaes(data, segImg); + std::vectorsegFileNames = genFileNames(data, segImg); if (segFileNames.size() > 0) createDirectoryIfNotExists(segAndClsPath);//不存在此文件夹则创建 for (int index = 0; index < segFileNames.size(); index++) saveThread.addData(segAndClsPath + segFileNames[index], data->segOriginImgs[index]); //cls - std::vectorclsFileNames = genFileNmaes(data, clsImg); + std::vectorclsFileNames = genFileNames(data, clsImg); for (int index = 0; index < clsFileNames.size(); index++) saveThread.addData(segAndClsPath + clsFileNames[index], data->clsOriginImgs[index].second); //额外储存NG文件夹 std::string additionalSaveNgImgPath = genDirName(data, additionalSaveNgImg); - std::vectoradditionalSaveNgImgNames = genFileNmaes(data, additionalSaveNgImg); + std::vectoradditionalSaveNgImgNames = genFileNames(data, additionalSaveNgImg); if (additionalSaveNgImgNames.size() > 0) createDirectoryIfNotExists(additionalSaveNgImgPath);//不存在此文件夹则创建 int additionalSaveNgImgNamesIndex = 0; diff --git a/src/Core/back/triggerManager.cpp b/src/Core/back/triggerManager.cpp index d7658e4..ff6e967 100644 --- a/src/Core/back/triggerManager.cpp +++ b/src/Core/back/triggerManager.cpp @@ -22,9 +22,7 @@ triggerManager::triggerManager(detProcess* _detProcessIn, qtFuncBridge* bridgeIn triggerFileName = QString::fromStdString(triggerJson["moduleName"]); IpAndPort = QString::fromStdString(triggerJson["initStr"]); - sleepTime = triggerJson["sleepTime"]; readNum = triggerJson["readNum"]; - writeType = triggerJson["writeType"]; heartBeatCmd = QString::fromStdString(triggerJson["heartBeatCmd"]); } void triggerManager::run() @@ -72,8 +70,7 @@ bool triggerManager::connectHost() destory_finstcp = releaseFun; QByteArray initByte = QByteArray::fromStdString - ("sleeptime_"+std::to_string(sleepTime) - + "_readnum_" + std::to_string(readNum) + ("sleeptime_20_readnum_" + std::to_string(readNum) + "_writetype_" + writeType); trigger->writeData(vec_mat, QByteArray(IpAndPort.toUtf8())); emit bridge->loadingWindow_appendLog(triggerFileName + "连接到" + IpAndPort,QColor("white")); diff --git a/src/Core/back/triggerManager.h b/src/Core/back/triggerManager.h index 7158538..d9b7627 100644 --- a/src/Core/back/triggerManager.h +++ b/src/Core/back/triggerManager.h @@ -137,11 +137,11 @@ public: } //useage {"D9200_1","D9201_1"} - bool writeShort(std::vector write_byte) { + bool writeShort(std::vector write_byte) { if (trigger == nullptr) return false; for (auto& byteArray : write_byte) { - QByteArray array("write_short_" + byteArray); + QByteArray array = QByteArray::fromStdString("write_short_" + byteArray); if (!trigger->writeData(vec_mat, array) && trigger != nullptr) { qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << array; return false; @@ -152,11 +152,11 @@ public: } //useage {"D9200_1","D9201_1"} - bool writeFloat(std::vector write_byte) { + bool writeFloat(std::vector write_byte) { if (trigger == nullptr) return false; for (auto& byteArray : write_byte) { - QByteArray array("write_float_" + byteArray); + QByteArray array = QByteArray::fromStdString("write_float_" + byteArray); if (!trigger->writeData(vec_mat, array) && trigger != nullptr) { qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << array; return false; diff --git a/src/Core/backendInterface.cpp b/src/Core/backendInterface.cpp index bf87dac..66a3fdf 100644 --- a/src/Core/backendInterface.cpp +++ b/src/Core/backendInterface.cpp @@ -1,18 +1,18 @@ #include "interface.h" #include #include +#include #include class Backend : public IBackend { public: //appCore _core; void test() override { std::cout << "Hello from Backend!" << std::endl; } - void init(qtFuncBridge* bridgeIn) override { + void init(qtFuncBridge* bridgeIn, nlohmann::json& json) override { if (initOnce == false) { cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR); _detProcess = new detProcess(); } - nlohmann::json json = readJsonFromPath("./config/backend.json"); bridge = bridgeIn; emit bridge->loadingWindow_appendLog(u8"核心加载成功,正在初始化",QColor("white")); _detProcess->initConfig(json, bridgeIn); diff --git a/src/Core/detProcess.hpp b/src/Core/detProcess.hpp index 26524d9..2685383 100644 --- a/src/Core/detProcess.hpp +++ b/src/Core/detProcess.hpp @@ -18,7 +18,7 @@ public: handleAiModelManager _handleAiModelManager;// 模型管理器 detThreadManager* _threadManager; cameraManager* _cameraManager; - + bool initOnce = false; detProcess(){ //_threadManager.initialization(this); //_manualDetThread.initialization(this); @@ -27,13 +27,19 @@ public: } void initConfig(nlohmann::json& jsonIn, qtFuncBridge* bridgeIn) { - bridge = bridgeIn; - json = jsonIn; - _imgSaveThreadManager = new imgSaveThreadManager(jsonIn["imgSavePath"]); + + _imgSaveThreadManager = new imgSaveThreadManager(jsonIn["imgSaveBasePath"]); _cameraManager = new cameraManager(jsonIn, bridgeIn); _triggerManager = new triggerManager(this, bridgeIn, jsonIn["Triggers"]); _threadManager = new detThreadManager(this, bridgeIn); _detDataManager = new detDataManager(_triggerManager); + if (initOnce == false) { + initOnce = true; + bridge = bridgeIn; + json = jsonIn; + connect(bridgeIn, &qtFuncBridge::reInitConfig, this, [=]() {reinitConfig(); }); + } + } bool waitrForInitResult(serviceModule* ptr, int overtimeS = 999999) { @@ -52,6 +58,19 @@ public: return true; } + // 重新初始化配置 + void reinitConfig() { + // 1. 释放已有资源 + if (_imgSaveThreadManager) { delete _imgSaveThreadManager; _imgSaveThreadManager = nullptr; } + if (_cameraManager) { delete _cameraManager; _cameraManager = nullptr; } + if (_triggerManager) { delete _triggerManager; _triggerManager = nullptr; } + if (_threadManager) { delete _threadManager; _threadManager = nullptr; } + if (_detDataManager) { delete _detDataManager; _detDataManager = nullptr; } + // 2. 重新初始化 + initConfig(json, bridge); + this->start(); + } + // 相机管理器 // lightSourceManager _lightSourceManager; // 光源管理器 SQLiteDB* dataBase; @@ -84,6 +103,7 @@ public: _triggerManager, _detDataManager, _threadManager, + json["missionSettings"], dataBase, bridge ); _threadManager->registerResultHandleCallback( @@ -91,10 +111,10 @@ public: detectionResultHandle(data); }); - _threadManager->registerProcessAlgoCallback( - [this](std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { - return _missionLoader._misson->processAlgo(data, _handleAiModelManager); - }); + //_threadManager->registerProcessAlgoCallback( + // [this](std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { + // return _missionLoader._misson->processAlgo(data, _handleAiModelManager); + // }); emit bridge->loginResult(InitOK); } @@ -108,17 +128,13 @@ public: // 通用的检测结果处理 void detectionResultHandle(std::shared_ptr data) { // 计算处理总耗时(CT) - auto totalCt = std::chrono::duration_cast(data->algoEndTime - data->algoStartTime); - qDebug() << QString::fromStdString(data->cameraKeyName) << "CT<<<" << totalCt.count() << "MS"; - std::cout << "CT<<<" << totalCt.count() << "MS" << std::endl; + auto totalCt = std::chrono::duration_cast(data->algoEndTime - data->algoStartTime).count(); + qDebug() << QString::fromStdString(data->cameraKeyName) << "CT<<<" << totalCt << "MS"; + std::cout << "CT->" << totalCt << "ms" << std::endl; // 将耗时数据保存入数据库或日志(伪代码) // data->sqlVec.push_back({ "SN", data->SNcode }); // data->sqlVec.push_back({ "totalCt", std::to_string(totalCt.count()) + "ms" }); - // 发回PLC数据 - for (auto writeBackStr : data->writeBackData) - _triggerManager->sendFinsMsg(writeBackStr); - // 异步保存检测图像 std::async(std::launch::async, &imgSaveThreadManager::saveRes, _imgSaveThreadManager, data); diff --git a/src/core/back/detThreadManager.cpp b/src/core/back/detThreadManager.cpp index fe32d99..35c3f6b 100644 --- a/src/core/back/detThreadManager.cpp +++ b/src/core/back/detThreadManager.cpp @@ -8,8 +8,7 @@ ////////////THREAD//Manager//////////////////////// -detThreadManager::detThreadManager(detProcess* _appCore, qtFuncBridge* bridgeIn) -{ +detThreadManager::detThreadManager(detProcess* _appCore, qtFuncBridge* bridgeIn){ bridge = bridgeIn; _imgSaveThreadManager = _appCore->_imgSaveThreadManager; _triggerManager = _appCore->_triggerManager; @@ -17,9 +16,24 @@ detThreadManager::detThreadManager(detProcess* _appCore, qtFuncBridge* bridgeIn) initFlag = true; this->start(); } - -void detThreadManager::process() -{ +bool algoEvaluate(std::shared_ptr data, handleAiModelManager* model) { + bool result = false; + try { + data->algoStartTime = std::chrono::steady_clock::now(); + result = data->_algoEvaluateCallback(data, model); + data->algoEndTime = std::chrono::steady_clock::now(); + } + catch (const std::exception& e) { + qDebug() << "[algoEvaluate] SN" << QString::fromStdString(data->SNcode) <<"exception:" << e.what(); + std::cout << "[algoEvaluate] SN< " << data->SNcode << " >exception:" << e.what() <SNcode << " >unknown exception:" << std::endl; + } + return result; +} +void detThreadManager::process(){ #pragma region 检查队列是否有新的数据 queueMutex.lock(); @@ -34,7 +48,7 @@ void detThreadManager::process() if (ptr->oriImgs.size() >= ptr->imgAmountMin) { std::async(std::launch::async, &imgSaveThreadManager::saveOri,_imgSaveThreadManager, ptr); - algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, _processAlgoCallback, ptr,_handleAiModelManager))); + algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, algoEvaluate ,ptr, _handleAiModelManager))); processData.push_back(ptr); it = waitImgData.erase(it); } diff --git a/src/core/back/detThreadManager.h b/src/core/back/detThreadManager.h index 9599a78..f091d43 100644 --- a/src/core/back/detThreadManager.h +++ b/src/core/back/detThreadManager.h @@ -79,13 +79,9 @@ public: void registerResultHandleCallback(resultHandleCallback func){ resultHandleCallbacks.push_back(func); } - void registerProcessAlgoCallback(processAlgoCallback func){ - _processAlgoCallback = func; - } private: qtFuncBridge* bridge; std::vector< resultHandleCallback>resultHandleCallbacks; - processAlgoCallback _processAlgoCallback; handleAiModelManager* _handleAiModelManager; triggerManager* _triggerManager; imgSaveThreadManager* _imgSaveThreadManager; diff --git a/src/core/back/missonBase.hpp b/src/core/back/missonBase.hpp index 3d93936..bb5a896 100644 --- a/src/core/back/missonBase.hpp +++ b/src/core/back/missonBase.hpp @@ -11,6 +11,7 @@ public: triggerManager* _triggerManagerPtr, detDataManager* _detDataManagerPtr, detThreadManager* _threadManagerPtr, + nlohmann::json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { return true; }; diff --git a/src/core/struct.h b/src/core/struct.h index d80a954..ca6b252 100644 --- a/src/core/struct.h +++ b/src/core/struct.h @@ -210,11 +210,12 @@ struct triggerStruct int startPos; }; struct cameraStruct{ + int index; std::string key; std::string connectionName;//per Sec std::string serialNum; - std::string triggerMode; - std::string moduleName; + std::string dllPath; + std::vector oriSaveFormat; std::vector>imageShowList; }; diff --git a/src/launcher/CMakeLists.txt b/src/launcher/CMakeLists.txt index a6ba99b..762ff31 100644 --- a/src/launcher/CMakeLists.txt +++ b/src/launcher/CMakeLists.txt @@ -57,6 +57,7 @@ FILE(GLOB_RECURSE APP_UI_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.ui") INCLUDE_DIRECTORIES(${CMAEK_CURRENT_BINARY_DIR}) set(RESOURCES_DIR ${CMAKE_SOURCE_DIR}"/resources/resources.qrc") set(WIN_RC_DIR ${CMAKE_SOURCE_DIR}"/resources/ff.rc") +include_directories(${CMAKE_BINARY_DIR}) if(ANDROID) add_library(${CURRENT_FOLDER} SHARED ${APP_HEADERPP_FILES} diff --git a/src/launcher/GUI/basic/cachePool.hpp b/src/launcher/GUI/basic/cachePool.hpp deleted file mode 100644 index ebbe653..0000000 --- a/src/launcher/GUI/basic/cachePool.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include -#include - -template -class LRUCache { -public: - LRUCache(size_t capacity) : capacity_(capacity) { - assert(capacity > 0); - } - - std::shared_ptr get(const Key& key) { - auto it = cache_.find(key); - if (it == cache_.end()) { - std::shared_ptr ptr(new Value()); - put(key, ptr); - return ptr; - } - touch(it); - return it->second.first; - } -private: - void put(const Key& key, const std::shared_ptr& value) { - auto it = cache_.find(key); - if (it != cache_.end()) { - touch(it); - it->second.first = value; - } - else { - if (cache_.size() == capacity_) { - cache_.erase(usage_.back()); - usage_.pop_back(); - } - usage_.push_front(key); - cache_[key] = { value, usage_.begin() }; - } - } - typedef typename std::list::iterator ListIt; - std::unordered_map, ListIt>> cache_; - std::list usage_; - size_t capacity_; - - void touch(typename std::unordered_map, ListIt>>::iterator it) { - usage_.erase(it->second.second); - usage_.push_front(it->first); - it->second.second = usage_.begin(); - } -}; - - -#pragma once \ No newline at end of file diff --git a/src/launcher/GUI/front/loadingWidget.h b/src/launcher/GUI/front/loadingWidget.h index 9b8aa8e..0c95b4a 100644 --- a/src/launcher/GUI/front/loadingWidget.h +++ b/src/launcher/GUI/front/loadingWidget.h @@ -8,6 +8,7 @@ #include #include #include +#include class MainWindow; class loadingWidget : public QWidget { public: @@ -20,14 +21,16 @@ public: fancyButtonText* manualBtn = new fancyButtonText(180, 50, "离线模式", "离线模式"); QGridLayout* glayout = new QGridLayout(this); QVBoxLayout* vlayout = new QVBoxLayout(this); - loadingWidget() + loadingWidget(qtFuncBridge* bridgeIn) { + bridge = bridgeIn; glayout->setAlignment(Qt::AlignCenter); connect(retryBtn, &QPushButton::clicked, [=]() { retryBtn->setDisabled(true); manualBtn->setDisabled(true); start(); + emit bridge->reInitConfig(); }); } void start() @@ -168,5 +171,6 @@ protected: private: QPixmap screenshot_; QMutex mutex; + qtFuncBridge* bridge; }; #pragma once \ No newline at end of file diff --git a/src/launcher/GUI/front/pages/configSettingWidget.h b/src/launcher/GUI/front/pages/configSettingWidget.h index 2f4ff24..a3ed452 100644 --- a/src/launcher/GUI/front/pages/configSettingWidget.h +++ b/src/launcher/GUI/front/pages/configSettingWidget.h @@ -1,4 +1,4 @@ - #include +#include #include #include #include @@ -17,7 +17,7 @@ #include #include #include - +#include "git_version.h" /**************格式****************/ //... //{ @@ -81,6 +81,7 @@ public: QPalette palette; palette.setColor(QPalette::WindowText, Qt::white); QFont font("微软雅黑", 24, QFont::Bold); + QFont font2("微软雅黑", 8, QFont::Bold); stackedWidgets = new QStackedWidget(); stackedWidgets->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -95,13 +96,25 @@ public: Layout->setContentsMargins(0, 0, 0, 0); Layout->setAlignment(Qt::AlignLeft|Qt::AlignTop); - Title = new QLabel(u8"配置文件"); + QHBoxLayout* titleLayout = new QHBoxLayout(); + Title = new QLabel(u8"设置"); Title->setFont(font); Title->setPalette(palette); Title->setAlignment(Qt::AlignLeft); - Layout->addWidget(Title); - btnLayout = new QHBoxLayout(); + QLabel* versionShow = new QLabel(); + versionShow = new QLabel(QString(u8"当前版本:v%1 提交版本%2").arg(QString::fromStdString(softwareVersion)).arg(GIT_COMMIT_HASH)); + versionShow->setFont(font2); + versionShow->setPalette(palette); + versionShow->setAlignment(Qt::AlignLeft|Qt::AlignBottom); + + + titleLayout->addWidget(Title); + titleLayout->addWidget(versionShow); + titleLayout->setAlignment(Qt::AlignBottom); + Layout->addLayout(titleLayout); + + /*btnLayout = new QHBoxLayout(); btnLayout->setContentsMargins(0, 0, 0, 0); btnLayout->setAlignment(Qt::AlignLeft); @@ -115,7 +128,7 @@ public: addConfigWidget(u8"模型设置",""); btns[0]->pressed(); - Layout->addWidget(stackedWidgets); + Layout->addWidget(stackedWidgets);*/ } //格式检查 bool formatPolicyCompare(formatPolicy _formatPolicy,QString compareStr,QString& textOut,QString &colorOut) @@ -420,7 +433,7 @@ public: protected: void resizeEvent(QResizeEvent* event) override { Q_UNUSED(event); - QTimer::singleShot(0, this, &configSettingWidget::updateLayout); + //QTimer::singleShot(0, this, &configSettingWidget::updateLayout); } private: diff --git a/src/launcher/GUI/mainwindow.cpp b/src/launcher/GUI/mainwindow.cpp index 6eebe75..42dabfa 100644 --- a/src/launcher/GUI/mainwindow.cpp +++ b/src/launcher/GUI/mainwindow.cpp @@ -1,7 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include -#include #include #include #include @@ -9,11 +8,12 @@ #include #include #include -int topBarHeight = 35; +const int topBarHeight = 35; MainWindow::MainWindow(appConfig* configIn, qtFuncBridge*bridgeIn) : ui(new Ui::MainWindow), bridge(bridgeIn), - config(configIn) + config(configIn), + _loadingWidget(bridgeIn) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint); // 设置无边框的样式 @@ -187,12 +187,11 @@ void MainWindow::leftBarInit() "border: 0px solid red;" // 显式设置边框 "border-radius: 0px;" // 设置边框半径为0,确保没有圆角 "}")); - QVBoxLayout* layout = new QVBoxLayout(leftBarWidget); - layout->setContentsMargins(0, 0, 0, 0); + QVBoxLayout* leftBarLayout = new QVBoxLayout(leftBarWidget); + leftBarLayout->setContentsMargins(0, 0, 0, 0); mainLayout2->addWidget(leftBarWidget); - leftBarWidget->setFixedHeight(9999); leftBarWidget->setFixedWidth(defaultWidth); - layout->setAlignment(Qt::AlignTop); + leftBarLayout->setAlignment(Qt::AlignTop); //主页面 _displayWidget = new displayWidget(config); @@ -201,9 +200,9 @@ void MainWindow::leftBarInit() //生产数据页面 registerPageBar(":/icon/icon/summary_data.png", u8"生产数据", &_SummuaryDataPage); - //配置页面 - _configSettingWidget = new configSettingWidget(); - //registerPageBar(":/icon/icon/setting.png", u8"配置设置", _configSettingWidget); + //日志页面 + _logWidget = new logWidget(); + registerPageBar(":/icon/icon/config.png", u8"日志", _logWidget); //手动检测 _manualDetWidget = new manualDetWidget(); @@ -213,26 +212,26 @@ void MainWindow::leftBarInit() _historyWidget = new historyWidget(); //registerPageBar(":/icon/icon/history.png", u8"历史图片", _historyWidget); - //日志页面 - _logWidget = new logWidget(); - //registerPageBar(":/icon/icon/config.png", u8"日志", _historyWidget); - //SQL _sqlControlWidget = new sqlControlWidget(); //registerPageBar(":/icon/icon/sql.png", u8"SQL可视化", _sqlControlWidget); //PLUGIN //registerPageBar(":/icon/icon/sql.png", u8"SQL可视化", _pluginManagerWidget); + // + //配置页面 + _configSettingWidget = new configSettingWidget(); + registerPageBar(":/icon/icon/setting.png", u8"配置设置", _configSettingWidget); - - for (int index = 0; index < pageBtns.size(); index++) - { - layout->addWidget(pageBtns[index]); - connect(pageBtns[index], &QPushButton::clicked, [=]() - { - switchStackWidget(index); + for (int index = 0; index < pageBtns.size(); index++) { + if(index == pageBtns.size() -1) + leftBarLayout->addStretch(); + leftBarLayout->addWidget(pageBtns[index]); + connect(pageBtns[index], &QPushButton::clicked, [=]() { + switchStackWidget(index); }); } + pageBtns[0]->click(); QObject::connect(_displayWidget, &displayWidget::changeStackWidget, this, &MainWindow::switchStackWidget); QObject::connect(_displayWidget, &displayWidget::historyClickSignal, _historyWidget, &historyWidget::widgetJumpWithPath); diff --git a/src/launcher/GUI/mainwindow.h b/src/launcher/GUI/mainwindow.h index b7a2d7b..2b573e1 100644 --- a/src/launcher/GUI/mainwindow.h +++ b/src/launcher/GUI/mainwindow.h @@ -113,6 +113,7 @@ private: pageDescription); pageWidgets.addWidget(page); pageBtns.push_back(toMainBtn); + //如果报错请检查Qwidget是否有效 } #pragma endregion public slots: @@ -281,7 +282,6 @@ public slots: _SummuaryDataPage.addData(window, data); } signals: - void reInitSignal(); void loginSignal(initStatus result); void recvPixmapImageWidgetSignal(showImgPack*); void signal_summaryData_addData(QString window, double data); diff --git a/src/launcher/GUI/uiModule/uiModule_imageView.h b/src/launcher/GUI/uiModule/uiModule_imageView.h index e1a019c..50c9e5e 100644 --- a/src/launcher/GUI/uiModule/uiModule_imageView.h +++ b/src/launcher/GUI/uiModule/uiModule_imageView.h @@ -138,8 +138,7 @@ protected: deleteAllRect(); if (width != 0 && height != 0) { - double scaleRate = std::max(width == 0 ? 1.0 : rect().width() / width, - height == 0 ? 1.0 : rect().height() / height); + double scaleRate = getMax(width == 0 ? 1.0 : rect().width() / width,height == 0 ? 1.0 : rect().height() / height); scale(scaleRate, scaleRate); centerOn(startPos + QPointF(width / 2, height / 2)); } diff --git a/src/launcher/appConfig/appConfig.cpp b/src/launcher/appConfig/appConfig.cpp index ad37631..65f026e 100644 --- a/src/launcher/appConfig/appConfig.cpp +++ b/src/launcher/appConfig/appConfig.cpp @@ -2,77 +2,31 @@ #include void appConfig::parsingSettingJson() { - try - { - settingJson = readJsonFromPath("./config/setting.json"); - softwareTile = settingJson["softwareTile"]; - imgSavePath = settingJson["imgSavePath"]; - oriImgSavePath = settingJson["oriImgSavePath"]; - resImgSavePath = settingJson["resImgSavePath"]; - handleAiModelPath = settingJson["handleAiModelPath"]; - - //TRIGGER JSON - //auto triggerJson = globalJson["Triggers"]; - //_triggerStruct.key = triggerJson["key"]; - //_triggerStruct.sleepTime = triggerJson["sleepTime"]; - //_triggerStruct.initStr = triggerJson["initStr"]; - //_triggerStruct.heartCmd = triggerJson["heartBeatCmd"]; - //_triggerStruct.readAllCmd = triggerJson["readAllCmd"]; - //_triggerStruct.moduleName = triggerJson["moduleName"]; - //_triggerStruct.readNum = triggerJson["readNum"]; - //_triggerStruct.writeType = triggerJson["writeType"]; - - - // //CAMERA JSON - //auto cameraJson = settingJson["CameraSetting"]; - //for (auto data : cameraJson) - //{ - // cameraStruct _cameraStruct; - // _cameraStruct.key = data["key"]; - // _cameraStruct.connectionName = data["connectionName"]; - // _cameraStruct.serialNum = data["serialNum"]; - // _cameraStruct.triggerMode = data["triggerMode"]; - // _cameraStruct.moduleName = data["moduleName"]; - // for (auto& imageShow : data["imageShow"]) - // { - // QString str = QString::fromStdString(imageShow); - // QStringList l = str.split("#"); - // if (l.size() < 2) - // { - // qDebug() << "Imagehsow 格式错误,例:窗口名#类型名"; - // continue; - // } - // _cameraStruct.imageShowList.push_back(std::make_pair(l[0], l[1])); - // } - // _cameraStructs.push_back(_cameraStruct); - //} - - // //SQL - // auto sqlJson = globalJson["SQL"]; - // for (auto data = sqlJson["initData"].begin(); data != sqlJson["initData"].end(); data++) - // { - // _sqlConfigStruct.datas.insert(std::make_pair(data.key(), data.value())); - // } - - //viewer - auto viewerData = settingJson["ImageView"]; - for (auto data = viewerData.begin(); data != viewerData.end(); data++) - { - viewerStruct v; - v.name = data.key(); - v.xPos = data.value()["xPos"]; - v.yPos = data.value()["yPos"]; - v.viewers.assign(data.value()["viewer"].begin(), data.value()["viewer"].end()); - viewDatas.push_back(v); - } - // //startPos - // int f = _triggerStruct.readAllCmd.find_first_of("read_byte_D"); - // int last_ = _triggerStruct.readAllCmd.find_last_of("_"); - // _triggerStruct.startPos = std::stoi(_triggerStruct.readAllCmd.substr(f + 11, last_ - f - 11)); + originJson = readJsonFromPath("./config/setting.json"); + jsonVersion = originJson["main"]["jsonVersion"]; + if(jsonVersion != "1.0.0"){ + std::cout << "Json version mismatch, please update the config file." << std::endl; + std::cout << "Json版本不匹配,请检查json配置文件" << std::endl; + exit(1); } - catch (...) + objectSelect = originJson["main"]["objectSelect"]; + loginPassWord = originJson["main"]["loginPassWord"]; + + settingJson = originJson[objectSelect]; + softwareTile = settingJson["softwareTile"]; + imgSavePath = settingJson["backend"]["imgSaveBasePath"]; + //viewer + auto viewerData = settingJson["ImageView"]; + for (auto data = viewerData.begin(); data != viewerData.end(); data++) { - std::cout << "jsonLoadError" << std::endl; + viewerStruct v; + v.name = data.key(); + v.xPos = data.value()["xPos"]; + v.yPos = data.value()["yPos"]; + v.viewers.assign(data.value()["viewer"].begin(), data.value()["viewer"].end()); + viewDatas.push_back(v); } + + } diff --git a/src/launcher/appConfig/appConfig.h b/src/launcher/appConfig/appConfig.h index 22cccbc..126ea29 100644 --- a/src/launcher/appConfig/appConfig.h +++ b/src/launcher/appConfig/appConfig.h @@ -14,11 +14,7 @@ public: nlohmann::json settingJson; std::string softwareTile;//软件标题 - std::string imgSavePath;//原图存储路径 - std::string oriImgSavePath;//原图存储路径 - std::string resImgSavePath;//结果图存储路径 - std::string handleAiModelPath;//模型路径 @@ -30,5 +26,10 @@ public: //std::vectorproductDatas; std::vector< viewerStruct>viewDatas; //appExternalConfig _appExternalConfig; +private: + nlohmann::json originJson; + std::string jsonVersion; + std::string objectSelect; + std::string loginPassWord; }; #pragma once \ No newline at end of file diff --git a/src/launcher/global.h b/src/launcher/global.h index e0ed49f..ccf9512 100644 --- a/src/launcher/global.h +++ b/src/launcher/global.h @@ -8,6 +8,7 @@ #include #include #pragma execution_character_set("utf-8") +const std::string softwareVersion = "2.0.0"; #define sColor_Blue "51, 56, 69" #define sColor_BlueWithWhite "64, 68, 81" #define sColor_BlueWithBlack "46, 50, 52" @@ -29,7 +30,7 @@ struct viewerStruct { std::string name; - int xPos, yPos; + int xPos, yPos,width,height; std::vectorviewers; }; diff --git a/src/launcher/main.cpp b/src/launcher/main.cpp index d5cd81b..8590fe6 100644 --- a/src/launcher/main.cpp +++ b/src/launcher/main.cpp @@ -9,7 +9,6 @@ #include #include #include - #include #include @@ -101,19 +100,22 @@ bool checkResourceExists(const QString& resourcePath) { } } -class backEnd { +class backEnd{ + public: IBackend* backend = nullptr; HMODULE hDll; - bool loadCore(qtFuncBridge* bridge) { + bool loadCore(qtFuncBridge* bridgeIn,nlohmann::json& jsonIn) { + bridge = bridgeIn; + json = jsonIn; hDll = LoadLibrary("core.dll"); if (!hDll) { std::cerr << "Failed to load DLL!" << std::endl; return false; } - CreateBackendFunc CreateBackend = (CreateBackendFunc)GetProcAddress(hDll, "CreateBackend"); - ReleaseBackendFunc ReleaseBackend = (ReleaseBackendFunc)GetProcAddress(hDll, "ReleaseBackend"); + CreateBackend = (CreateBackendFunc)GetProcAddress(hDll, "CreateBackend"); + ReleaseBackend = (ReleaseBackendFunc)GetProcAddress(hDll, "ReleaseBackend"); if (CreateBackend && ReleaseBackend) { backend = CreateBackend(); @@ -122,19 +124,21 @@ public: std::cerr << "Failed to get function pointers!" << std::endl; return false; } - backend->init(bridge); + backend->init(bridgeIn,jsonIn); return true; } void releaseCore() { backend->cleanup(); + ReleaseBackend(backend); delete backend; backend = nullptr; - ReleaseBackend(backend); FreeLibrary(hDll); } - void reload() { - - } +private: + qtFuncBridge* bridge; + nlohmann::json json; + CreateBackendFunc CreateBackend; + ReleaseBackendFunc ReleaseBackend; }; void connectSignalAndSlot(appCore* _core, MainWindow* _MainWindow, qtFuncBridge* bridge) { QObject::connect(&_core->_logService._logToQtWidget, &logToQtWidget::stdLogSignal, @@ -143,7 +147,7 @@ void connectSignalAndSlot(appCore* _core, MainWindow* _MainWindow, qtFuncBridge* _MainWindow->_logWidget, &logWidget::recvQtLogMsg); QObject::connect(&_core->_logService._logToQtWidget, &logToQtWidget::mainWindowStdLogSignal, _MainWindow->_displayWidget, &displayWidget::recvMainWindowStdLogMsg); - + //BackEnd To Front //等待界面 QObject::connect(bridge, &qtFuncBridge::loadingWindow_appendLog, @@ -221,12 +225,9 @@ int main(int argc, char* argv[]) // restartAsAdmin(); // exit(0); //} -#if HIDE_CONSOLE HWND hWnd = GetConsoleWindow(); - if (hWnd) { - ShowWindow(hWnd, SW_HIDE); - }// 隐藏控制台窗口 -#endif + ShowWindow(hWnd, SW_SHOW); + appCore _core; qtFuncBridge bridge; // 创建 C++ 对象 //检测是否已运行 @@ -245,11 +246,15 @@ int main(int argc, char* argv[]) QApplication a(argc, argv); MainWindow w(&_core._appConfig,&bridge); - connectSignalAndSlot(&_core, &w,&bridge); // 连接信号和槽 + connectSignalAndSlot(&_core, &w, &bridge); // 连接信号和槽 w.show(); backEnd backend; // 创建后端对象 - backend.loadCore(&bridge); // 加载核心功能 - + backend.loadCore(&bridge, _core._appConfig.settingJson["backend"]); // 加载核心功能 +#if HIDE_CONSOLE + if (hWnd) { + ShowWindow(hWnd, SW_HIDE); + }// 隐藏控制台窗口 +#endif return a.exec(); } \ No newline at end of file diff --git a/src/mission/952_15_H_25D/952_15_H_25D.h b/src/mission/952_15_H_25D/952_15_H_25D.h index 2b2133f..8d61fd1 100644 --- a/src/mission/952_15_H_25D/952_15_H_25D.h +++ b/src/mission/952_15_H_25D/952_15_H_25D.h @@ -23,6 +23,7 @@ public: triggerManager* _triggerManagerPtr, detDataManager* _detDataManagerPtr, detThreadManager* _threadManagerPtr, + nlohmann::json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { bridge = bridgeIn; _cameraManager = _cameraManagerPtr; @@ -61,9 +62,8 @@ public: _detDataManager->insertDetData("2.5D-H-1",sn, 3, ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - })); + }), processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; ////////拍照//////////////// @@ -91,13 +91,12 @@ public: _detDataManager->insertDetData("2.5D-H-2", sn, 3, [this](std::shared_ptr data) { HouDuan12ResultHandle(data); - }); + }, processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道2 SN:" << sn << "检测开始" << std::endl; _25DCamera_2->captureImage(data); - data->imgSaveFileParameter.push_back(sn); + data->imgSaveNameParameter.push_back(sn); //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); if (houduan2SecondTime == false) data->resultImgShowSet.push_back(new showImgPack("后段2-1", "结果图")); @@ -199,7 +198,7 @@ public: std::cout << "通道2 SN:" << sn << " 获取结果"<" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString() << std::endl; _summaryData.remove(sn); } - bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) + static bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { try { diff --git a/src/mission/952_15_Q_25D/952_15_H_25D.h b/src/mission/952_15_Q_25D/952_15_H_25D.h index 2b2133f..ff97390 100644 --- a/src/mission/952_15_Q_25D/952_15_H_25D.h +++ b/src/mission/952_15_Q_25D/952_15_H_25D.h @@ -61,9 +61,8 @@ public: _detDataManager->insertDetData("2.5D-H-1",sn, 3, ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - })); + }), processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; ////////拍照//////////////// @@ -91,13 +90,12 @@ public: _detDataManager->insertDetData("2.5D-H-2", sn, 3, [this](std::shared_ptr data) { HouDuan12ResultHandle(data); - }); + }, processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道2 SN:" << sn << "检测开始" << std::endl; _25DCamera_2->captureImage(data); - data->imgSaveFileParameter.push_back(sn); + data->imgSaveNameParameter.push_back(sn); //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); if (houduan2SecondTime == false) data->resultImgShowSet.push_back(new showImgPack("后段2-1", "结果图")); @@ -199,7 +197,7 @@ public: std::cout << "通道2 SN:" << sn << " 获取结果"<" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString() << std::endl; _summaryData.remove(sn); } - bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) + static bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { try { diff --git a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h index d41797c..0b13c44 100644 --- a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h +++ b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h @@ -7,51 +7,6 @@ #include //#include <952HouDuan/EVE_952_15_H_Algo.hpp> -#define _952_15_Q_2D3D_channel_switch 0 //通道切换 - -#if _952_15_Q_2D3D_channel_switch == 0 -const std::string _2D_P_Camera_Name = "2D-P-1 (24488341)"; -const std::string _2D_N_Camera_Name = "2D-N-1 (24488402)"; -const std::string _3D_1_Camera_Name = "162762"; - -const int _2D_P_triggerPos = 8010; -const std::vector _2D_P_triggerReply = { "D8010_0", "D8011_1", "D8012_1" }; -const int _2D_P_snPos = 8200; -const QString _2D_P_viewName = "通道1-2D正极"; - -const int _2D_N_triggerPos = 8020; -const std::vector _2D_N_triggerReply = { "D8020_0", "D8021_1", "D8022_1" }; -const int _2D_N_snPos = 8300; -const QString _2D_N_viewName = "通道1-2D负极"; - -const int _3D_triggerPos = 8030; -const std::vector _3D_triggerReply = { "D8030_0","D8031_1","D8032_1" }; -const int _3D_snPos = 8400; -const QString _3D_P_viewName = "通道1-3D"; - -const int _summary_triggerPos = 8040; -#elif _952_15_Q_2D3D_channel_switch == 1 -const std::string _2D_P_Camera_Name = "2D-P-2 (24488342)"; -const std::string _2D_N_Camera_Name = "2D-N-2 (24488458)"; -const std::string _3D_1_Camera_Name = "156112"; - -const int _2D_P_triggerPos = 8060; -const std::vector _2D_P_triggerReply = { "D8060_0", "D8061_1", "D8062_1" }; -const int _2D_P_snPos = 8700; -const QString _2D_P_viewName = "通道2-2D正极"; - -const int _2D_N_triggerPos = 8070; -const std::vector _2D_N_triggerReply = { "D8070_0", "D8071_1", "D8072_1" }; -const int _2D_N_snPos = 8800; -const QString _2D_N_viewName = "通道2-2D负极"; - -const int _3D_triggerPos = 8080; -const std::vector _3D_triggerReply = { "D8080_0","D8081_1","D8082_1" }; -const int _3D_snPos = 8900; -const QString _3D_P_viewName = "通道2-3D"; - -const int _summary_triggerPos = 8090; -#endif struct _952_15_Q_2D3D_1_summaryData { QString _2D_P_Result = "-1"; @@ -60,18 +15,42 @@ struct _952_15_Q_2D3D_1_summaryData }; class _952_15_Q_2D3D_1 : public mission { public: +#pragma region 由外部输入的参数 + std::string _2D_P_Camera_Name; + std::string _2D_N_Camera_Name; + std::string _3D_1_Camera_Name; + + int _2D_P_triggerPos; + std::vector _2D_P_triggerReply; + int _2D_P_snPos; + QString _2D_P_viewName; + + int _2D_N_triggerPos; + std::vector _2D_N_triggerReply; + int _2D_N_snPos; + QString _2D_N_viewName; + + int _3D_triggerPos; + std::vector _3D_triggerReply; + int _3D_snPos; + QString _3D_P_viewName; + + int summary_triggerPos; +#pragma endregion + summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData; bool init(cameraManager* _cameraManagerPtr, triggerManager* _triggerManagerPtr, detDataManager* _detDataManagerPtr, detThreadManager* _threadManagerPtr, + nlohmann::json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { bridge = bridgeIn; _cameraManager = _cameraManagerPtr; _triggerManager = _triggerManagerPtr; _detDataManager = _detDataManagerPtr; _threadManager = _threadManagerPtr; - + prasingJson(_missionJson); _2DCamera_P = _cameraManager->getCamera(_2D_P_Camera_Name); if (_2DCamera_P == nullptr) { std::cout << "camera ->> " << _2D_P_Camera_Name <<" not found" << std::endl; @@ -94,10 +73,41 @@ public: _triggerManager->registerCallback(_2D_N_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发"); _triggerManager->registerCallback(_3D_triggerPos, 1, [this](QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发"); - _triggerManager->registerCallback(_summary_triggerPos, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "结果获取触发"); + _triggerManager->registerCallback(summary_triggerPos, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "结果获取触发"); //HDevEngineCpp::HDevEngine myEngine; //myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl"); return true; + } + void prasingJson(nlohmann::json& _missionJson) { + try { + _2D_P_Camera_Name = _missionJson["_2D_P_Camera_Name"].get(); + _2D_N_Camera_Name = _missionJson["_2D_N_Camera_Name"].get(); + _3D_1_Camera_Name = _missionJson["_3D_1_Camera_Name"].get(); + _2D_P_triggerPos = _missionJson["_2D_P_triggerPos"].get(); + _2D_P_triggerReply = _missionJson["_2D_P_triggerReply"].get>(); + _2D_P_snPos = _missionJson["_2D_P_snPos"].get(); + _2D_P_viewName = QString::fromStdString(_missionJson["_2D_P_viewName"].get()); + _2D_N_triggerPos = _missionJson["_2D_N_triggerPos"].get(); + _2D_N_triggerReply = _missionJson["_2D_N_triggerReply"].get>(); + _2D_N_snPos = _missionJson["_2D_N_snPos"].get(); + _2D_N_viewName = QString::fromStdString(_missionJson["_2D_N_viewName"].get()); + _3D_triggerPos = _missionJson["_3D_triggerPos"].get(); + _3D_triggerReply = _missionJson["_3D_triggerReply"].get>(); + _3D_snPos = _missionJson["_3D_snPos"].get(); + _3D_P_viewName = QString::fromStdString(_missionJson["_3D_P_viewName"].get()); + summary_triggerPos = _missionJson["summary_triggerPos"].get(); + } + catch (const nlohmann::json::out_of_range& e) { + std::cerr << "JSON out-of-range error: " << e.what() << std::endl; + } + catch (const nlohmann::json::type_error& e) { + std::cerr << "JSON type error: " << e.what() << std::endl; + } + catch (const nlohmann::json::exception& e) { + std::cerr << "JSON general exception: " << e.what() << std::endl; + } + + } //8010 1 void Qian_2D_P(QByteArray& byteArray){ @@ -108,16 +118,16 @@ public: _detDataManager->insertDetData("Qian_2D_P",sn, 3, ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - })); + }), processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; ////////拍照//////////////// _2DCamera_P->captureImage(data); + data->oriFormat = _2DCamera_P->_cameraStruct.oriSaveFormat; //data->imgSaveFileParameter.push_back(sn); //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); - data->resultImgShowSet.push_back(new showImgPack("通道1-2D正极", "结果图")); + data->resultImgShowSet.push_back(new showImgPack(_2D_P_viewName, "结果图")); _threadManager->addTask(data); } @@ -130,16 +140,16 @@ public: _detDataManager->insertDetData("Qian_2D_N", sn, 1, ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - })); + }), processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; ////////拍照//////////////// _2DCamera_N->captureImage(data); + data->oriFormat = _2DCamera_N->_cameraStruct.oriSaveFormat; //data->imgSaveFileParameter.push_back(sn); //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); - data->resultImgShowSet.push_back(new showImgPack("通道1-2D负极", "结果图")); + data->resultImgShowSet.push_back(new showImgPack(_2D_N_viewName, "结果图")); _threadManager->addTask(data); } @@ -152,16 +162,16 @@ public: _detDataManager->insertDetData("Qian_3D", sn, 2, ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - })); + }), processAlgo); - data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; ////////拍照//////////////// _3DCamera_1->captureImage(data); + data->oriFormat = _3DCamera_1->_cameraStruct.oriSaveFormat; //data->imgSaveFileParameter.push_back(sn); //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); - data->resultImgShowSet.push_back(new showImgPack("通道1-3D", "结果图")); + data->resultImgShowSet.push_back(new showImgPack(_3D_P_viewName, "结果图")); _threadManager->addTask(data); } @@ -220,7 +230,7 @@ public: //8040 1 Summary1 void sumRequest1(QByteArray& byteArray){ _triggerManager->writeShort({ "D8040_0" ,"D9402_1","D9404_1"}); - int snPos = 9500; + int snPos = _3D_snPos; std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); _triggerManager->sendFinsMsg("write_float_D8046_"+ dataPtr->_2D_P_Result);//右上留白 @@ -231,7 +241,7 @@ public: _summaryData.remove(sn); } - bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager){ + static bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager){ cv::Mat testImg; if(data->oriImgs[0].channels() == 1) cv::cvtColor(data->oriImgs[0], testImg, cv::COLOR_GRAY2BGR); diff --git a/subModule/Hd_VirualCamera/CMakeLists.txt b/subModule/Hd_VirualCamera/CMakeLists.txt new file mode 100644 index 0000000..0f64ccb --- /dev/null +++ b/subModule/Hd_VirualCamera/CMakeLists.txt @@ -0,0 +1,71 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "LMI" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + ${lmi_target_link} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp b/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp new file mode 100644 index 0000000..9d74565 --- /dev/null +++ b/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp @@ -0,0 +1,91 @@ +#include "Hd_VirualCamera.h" +#include +QQueue> queuePic; +QMutex* n_mutex = new QMutex(); + + + +Hd_VirualCamera::Hd_VirualCamera() +{ + //m_thread = new MyThread; + //m_mutex = new QMutex(); +} + +Hd_VirualCamera::~Hd_VirualCamera() +{ + + + if (n_mutex) + { + delete n_mutex; + n_mutex = nullptr; + } + + qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << " delete success!"; +} + +bool Hd_VirualCamera::readData(std::vector& mat, QByteArray& data, nlohmann::json& json) +{ + Q_UNUSED(data) + + + int cnt = 0; + while (queuePic.empty()) + { + cnt++; + QThread::msleep(10); + if (cnt > 3000) + { + qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null"; + return false; + } + } + n_mutex->lock(); + vector dstMat = queuePic.dequeue(); + n_mutex->unlock(); + //for (int i=0;i& mat, QByteArray& data, nlohmann::json& json) +{ + Q_UNUSED(mat) + + cameraName = data.toStdString(); + return true; +} + +bool Hd_VirualCamera::initParas(QByteArray&, nlohmann::json& json) +{ + return true; +} + +bool Hd_VirualCamera::run()//Èí´¥·¢ +{ + n_mutex->lock(); + if (cameraName == "156112" || cameraName == "162762") { + vector mats; + mats.push_back(cv::imread("H:\\testImg\\2.5D-H-1_16-00-14-38_Count0.bmp", -1)); + mats.push_back(cv::imread("H:\\testImg\\2.5D-H-1_16-00-14-38_Count1.tiff", -1)); + queuePic.enqueue(mats); + } + n_mutex->unlock(); + return true; +} + +Hd_VirualCamera* create(){ + qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << "Hd_VirualCamera create success!"; + return new Hd_VirualCamera; +} +void destory(Hd_VirualCamera* ptr){ + if (ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[info] " << __FUNCTION__ << " line:" << __LINE__ << "Hd_MvCamera_module destory success!"; +} \ No newline at end of file diff --git a/subModule/Hd_VirualCamera/Hd_VirualCamera.h b/subModule/Hd_VirualCamera/Hd_VirualCamera.h new file mode 100644 index 0000000..33ce727 --- /dev/null +++ b/subModule/Hd_VirualCamera/Hd_VirualCamera.h @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include +#include + +#include + +using namespace cv; +using namespace std; +#pragma execution_character_set("utf-8") + +class Hd_VirualCamera :public subModuleBase +{ +public: + Hd_VirualCamera(); + virtual ~Hd_VirualCamera(); + bool readData(std::vector&, QByteArray&, nlohmann::json& json); + bool writeData(std::vector&, QByteArray&, nlohmann::json& json); + bool initParas(QByteArray&, nlohmann::json& json = nlohmann::json()); + bool run(); + + std::string sTriggerSource; +private: + bool softwareTriggerStatus = 0; + std::string cameraName; +}; + +extern "C" +{ + Q_DECL_EXPORT Hd_VirualCamera* create(); + Q_DECL_EXPORT void destory(Hd_VirualCamera* ptr); +} \ No newline at end of file