This commit is contained in:
2025-11-12 15:38:01 +08:00
parent 3c00124d57
commit e799cc25fb
8 changed files with 59 additions and 27 deletions
+2 -2
View File
@@ -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<std::pair<QString, QVariant>>* 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<cv::Mat>* mats) = 0;
virtual void getCameraNames(std::vector<std::string>* cameraNames) = 0;
virtual void getAllParams(std::vector<std::pair<QString, QVariant>>* params) = 0;
virtual void editParam(QString name, QVariant value) = 0;
};
extern "C" {
+5 -1
View File
@@ -453,7 +453,9 @@ private:
class CsvWriter : public QThread {
public:
CsvWriter(SQLiteDB* dbIn) : db(dbIn) {}
CsvWriter(SQLiteDB* dbIn, QList<std::pair<QString, QString>>externalInitDataVec = QList<std::pair<QString, QString>>()) : 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<QString, QVariant>& data) {
+9 -2
View File
@@ -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<std::pair<QString, QString>>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;
+2 -2
View File
@@ -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<std::pair<QString, QVariant>>* params) {
auto allParams = _paramSyncManager->getAllParams();
auto allParams = _paramSyncManager->getAllParams();
params->swap(allParams);
}
public slots:
void triggerAndCaptureImage(std::string cameraName, std::vector<cv::Mat>* mats) {
if (cameraInitResult == false) {
qCritical() << "[Error]调用triggerAndCaptureImage时相机未初始化!";
+2 -2
View File
@@ -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();
+36 -17
View File
@@ -9,6 +9,8 @@
#include <vector>
#include <utility>
class paramSyncManager :public QObject{
Q_OBJECT
public:
@@ -66,24 +68,27 @@ public:
std::vector<std::pair<QString, QVariant>> getAllParams() {
QMutexLocker locker(&globalMutex);
std::vector<std::pair<QString, QVariant>> 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<QString, QVariant> map;
QMap<QString, QVariant> map;//存储当前最新参数值
nlohmann::ordered_json json;
mutable QMutex globalMutex; // 保护整个map的全局互斥锁
// 辅助方法:将JSON值转换为QVariant
@@ -122,6 +132,8 @@ private:
return QVariant(json.get<bool>());
} else if (json.is_number_integer()) {
return QVariant(json.get<int>());
} else if (json.is_number_unsigned()) {
return QVariant(static_cast<qulonglong>(json.get<unsigned long long>()));
} else if (json.is_number_float()) {
return QVariant(json.get<double>());
} 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<unsigned int>(variant.toUInt());
case QVariant::LongLong:
return static_cast<long long>(variant.toLongLong());
case QVariant::ULongLong:
return static_cast<unsigned long long>(variant.toULongLong());
case QVariant::Double:
return variant.toDouble();
case QVariant::String:
@@ -156,3 +174,4 @@ private:
}
};
@@ -334,6 +334,7 @@ public:
[this]() {
paramTableEditor* dlg = new paramTableEditor(this);
std::vector<std::pair<QString, QVariant>> params;
auto b = fSignalHub::getInstance();
emit fSignalHub::getInstance()->getAllParams(&params);
dlg->setParams(params);
dlg->show();
+2 -1
View File
@@ -248,17 +248,18 @@ int main(int argc, char* argv[])
qRegisterMetaType<std::vector<std::pair<QString, int>>>("constvpqi");
qRegisterMetaType<PlcValueViewerStruct>("PlcValueViewerStruct");
qRegisterMetaType<std::vector<std::pair<QString, QVariant>>>("vecQStringQVarint");
qRegisterMetaType<std::vector<std::pair<QString, QVariant>>*>("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([&]() {