备份
This commit is contained in:
+2
-2
@@ -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" {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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时相机未初始化!";
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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(¶ms);
|
||||
dlg->setParams(params);
|
||||
dlg->show();
|
||||
|
||||
@@ -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([&]() {
|
||||
|
||||
Reference in New Issue
Block a user