diff --git a/include/interface.h b/include/interface.h index c859f17..cd614da 100644 --- a/include/interface.h +++ b/include/interface.h @@ -72,13 +72,13 @@ public: virtual void init(SQLiteDB* ,nlohmann::ordered_json& json) = 0; virtual void cleanup() = 0; virtual nlohmann::ordered_json getBackendJson() = 0; - virtual void getAllParams(std::vector>* params) = 0; - virtual void editParam(QString name, QVariant value) = 0; public slots: virtual bool excuteCliCommand(const QString& command) = 0; virtual bool excuteCliCommandPreset(const QString& uuid) = 0; virtual void triggerAndCaptureImage(std::string cameraName, std::vector* mats) = 0; virtual void getCameraNames(std::vector* cameraNames) = 0; + virtual void getAllParams(std::vector>* params) = 0; + virtual void editParam(QString name, QVariant value) = 0; }; extern "C" { diff --git a/include/sql/qSqlBase.h b/include/sql/qSqlBase.h index c97dc05..bf894a5 100644 --- a/include/sql/qSqlBase.h +++ b/include/sql/qSqlBase.h @@ -453,7 +453,9 @@ private: class CsvWriter : public QThread { public: - CsvWriter(SQLiteDB* dbIn) : db(dbIn) {} + CsvWriter(SQLiteDB* dbIn, QList>externalInitDataVec = QList>()) : db(dbIn) { + db_InitColumns.append(externalInitDataVec); + } ~CsvWriter() { // 确保线程安全退出 if (isRunning()) { @@ -547,6 +549,8 @@ private: {"创建时间", "TEXT"}, {"修改时间", "TEXT"}, {"CT", "TEXT"}, + {"算法结果", "TEXT"}, + {"AI检测结果", "TEXT"}, }; void processData(const QString& snCode, const std::map& data) { diff --git a/src/Core/backendInterface.cpp b/src/Core/backendInterface.cpp index bd214e3..9bbf06a 100644 --- a/src/Core/backendInterface.cpp +++ b/src/Core/backendInterface.cpp @@ -14,9 +14,16 @@ void Backend::init(SQLiteDB* db, nlohmann::ordered_json& json) { sqlDatabase = db; backendJson = json; _paramSyncManager = new paramSyncManager(&_signalHub,backendJson["missionSettings"]); - cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR); - _csvWriter = new CsvWriter(sqlDatabase); + + QList>externalInitDataVec; + if (backendJson.find("SQL") != backendJson.end()) { + for (auto it = backendJson["SQL"].begin(); it != backendJson["SQL"].end(); it++) { + externalInitDataVec.append(std::make_pair(QString::fromStdString(it.key()), QString::fromStdString(it.value().dump()))); + } + } + _csvWriter = new CsvWriter(sqlDatabase, externalInitDataVec); + _serviceManager._detDataManager = new detDataManager(); _missionResultHandle = new missionResultHandle(&_signalHub); _serviceManager._missionResultHandle = _missionResultHandle; diff --git a/src/core/backendInterface.h b/src/core/backendInterface.h index 393fa8d..60544a1 100644 --- a/src/core/backendInterface.h +++ b/src/core/backendInterface.h @@ -62,15 +62,15 @@ public: backendJson["missionSettings"] = _paramSyncManager->toJson(); return backendJson; } +public slots: void editParam(QString name, QVariant value) { _paramSyncManager->edit(name, value); qDebug() << name << "更改为" << value; } void getAllParams(std::vector>* params) { - auto allParams = _paramSyncManager->getAllParams(); + auto allParams = _paramSyncManager->getAllParams(); params->swap(allParams); } -public slots: void triggerAndCaptureImage(std::string cameraName, std::vector* mats) { if (cameraInitResult == false) { qCritical() << "[Error]调用triggerAndCaptureImage时相机未初始化!"; diff --git a/src/core/service/detCallbackChain.hpp b/src/core/service/detCallbackChain.hpp index 2c6648a..4ec2889 100644 --- a/src/core/service/detCallbackChain.hpp +++ b/src/core/service/detCallbackChain.hpp @@ -104,8 +104,8 @@ public: //std::cout << totalCtStr.toStdString() << std::endl; // 将耗时数据等保存入数据库或日志 data->sqlVec.insert({ "CT", QString::number(data->algoTime) + "ms" }); - data->sqlVec.insert({ "算法判定结果", data->halconOK == false ? "NG" : "OK" }); - data->sqlVec.insert({ "AI判定结果", data->aiDetOK == false ? "NG" : "OK" }); + data->sqlVec.insert({ "算法结果", data->halconOK == false ? "NG" : "OK" }); + data->sqlVec.insert({ "AI检测结果", data->aiDetOK == false ? "NG" : "OK" }); data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), data->sqlVec); // 异步保存检测图像 std::thread([this,data] {_imgSaveThreadManager->saveImage(data); }).detach(); diff --git a/src/core/service/paramSyncManager.h b/src/core/service/paramSyncManager.h index 5c09a06..bad3cea 100644 --- a/src/core/service/paramSyncManager.h +++ b/src/core/service/paramSyncManager.h @@ -9,6 +9,8 @@ #include #include + + class paramSyncManager :public QObject{ Q_OBJECT public: @@ -66,24 +68,27 @@ public: std::vector> getAllParams() { QMutexLocker locker(&globalMutex); std::vector> result; - result.reserve(map.size()); - for (auto it = map.cbegin(); it != map.cend(); ++it) { - result.emplace_back(it.key(), it.value()); - } + updateJsonFromMap(); + for (auto it = json.begin(); it != json.end(); ++it) { + QString key = QString::fromStdString(it.key()); + QVariant value = jsonToQVariant(it.value()); + result.emplace_back(key, value); + } return result; } // 从JSON加载数据 - void loadFromJson(const nlohmann::ordered_json& json) { + void loadFromJson(const nlohmann::ordered_json& jsonInput){ QMutexLocker locker(&globalMutex); + json = jsonInput; map.clear(); - if (!json.is_object()) { + if (!jsonInput.is_object()) { qDebug() << "Invalid JSON format for paramSyncManager"; return; } - for (auto it = json.begin(); it != json.end(); ++it) { + for (auto it = jsonInput.begin(); it != jsonInput.end(); ++it) { QString key = QString::fromStdString(it.key()); QVariant value = jsonToQVariant(it.value()); @@ -91,18 +96,22 @@ public: } } - // 导出为JSON - nlohmann::ordered_json toJson() const { + // 将当前 map 值合并回初始 json 并导出 + // 规则:map 中的键覆盖 json 中的同名键;json 中原有但未出现在 map 中的键保留 + nlohmann::ordered_json toJson() { QMutexLocker locker(&globalMutex); - nlohmann::ordered_json result = nlohmann::ordered_json::object(); - - for (auto it = map.begin(); it != map.end(); ++it) { - result[it.key().toStdString()] = qVariantToJson(it.value()); - } - - return result; + updateJsonFromMap(); + return json; } + void updateJsonFromMap() { + for (auto it = map.begin(); it != map.end(); ++it) { + if (json.find(it.key().toStdString()) != json.end()) + json[it.key().toStdString()] = qVariantToJson(it.value()); + else + json.emplace(it.key().toStdString(), qVariantToJson(it.value())); + } + } // 清空所有参数 void clear() { QMutexLocker locker(&globalMutex); @@ -111,7 +120,8 @@ public: private: bSignalHub* _signalHub; - QMap map; + QMap map;//存储当前最新参数值 + nlohmann::ordered_json json; mutable QMutex globalMutex; // 保护整个map的全局互斥锁 // 辅助方法:将JSON值转换为QVariant @@ -122,6 +132,8 @@ private: return QVariant(json.get()); } else if (json.is_number_integer()) { return QVariant(json.get()); + } else if (json.is_number_unsigned()) { + return QVariant(static_cast(json.get())); } else if (json.is_number_float()) { return QVariant(json.get()); } else if (json.is_string()) { @@ -143,6 +155,12 @@ private: return variant.toBool(); case QVariant::Int: return variant.toInt(); + case QVariant::UInt: + return static_cast(variant.toUInt()); + case QVariant::LongLong: + return static_cast(variant.toLongLong()); + case QVariant::ULongLong: + return static_cast(variant.toULongLong()); case QVariant::Double: return variant.toDouble(); case QVariant::String: @@ -156,3 +174,4 @@ private: } }; + diff --git a/src/launcher/GUI/pages/displayPageWidget.h b/src/launcher/GUI/pages/displayPageWidget.h index 546f97b..3968221 100644 --- a/src/launcher/GUI/pages/displayPageWidget.h +++ b/src/launcher/GUI/pages/displayPageWidget.h @@ -334,6 +334,7 @@ public: [this]() { paramTableEditor* dlg = new paramTableEditor(this); std::vector> params; + auto b = fSignalHub::getInstance(); emit fSignalHub::getInstance()->getAllParams(¶ms); dlg->setParams(params); dlg->show(); diff --git a/src/launcher/main.cpp b/src/launcher/main.cpp index ddf92b6..1e60b35 100644 --- a/src/launcher/main.cpp +++ b/src/launcher/main.cpp @@ -248,17 +248,18 @@ int main(int argc, char* argv[]) qRegisterMetaType>>("constvpqi"); qRegisterMetaType("PlcValueViewerStruct"); qRegisterMetaType>>("vecQStringQVarint"); + qRegisterMetaType>*>("vecQStringQVarintPtr"); #pragma endregion QApplication a(argc, argv); _core.initDatabase(); // 初始化数据库 QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + "/sqldrivers"); QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath()); MainWindow w(&config,bridge, config.missionJson); - connectFrontSignals(&_core, &w, bridge); // 连接前端UI的信号和槽 w.show(); QThread::msleep(100); // 创建后端对象 _core._backEnd.loadCore(); // 加载核心功能 + connectFrontSignals(&_core, &w, bridge); // 连接前端UI的信号和槽 connectBackSignals(&_core, &w, &_core._backEnd.backendPtr->_signalHub); // 连接前端UI的信号和槽 _core._backEnd.initCore(config.dataBase, config.missionJson["backend"]); // 初始化核心功能 w.registerQuitFunc([&]() {