From 3c72ba965427a1691389b2601dc0a57de6b18aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B5=B7?= Date: Wed, 8 Apr 2026 15:38:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E9=87=8F=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MainWindow.cpp | 31 +++--- src/MeasureAnalysisProjectModel.cpp | 40 +++++++ src/MeasureAnalysisProjectModel.h | 14 +++ src/MeasureClient/MeasureClient.h | 60 ++++++++++ src/MeasureClient/MeasureClient.pri | 6 +- src/MeasureClient/MeasureWorker.cpp | 165 ++++++++++++++++++++++++++++ src/MeasureClient/MeasureWorker.h | 42 +++++++ src/NewMeasureAnalysisDlg.cpp | 2 +- 8 files changed, 343 insertions(+), 17 deletions(-) create mode 100644 src/MeasureClient/MeasureClient.h create mode 100644 src/MeasureClient/MeasureWorker.cpp create mode 100644 src/MeasureClient/MeasureWorker.h diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 1439148..14e4128 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -156,22 +156,25 @@ void MainWindow::initAction() if (QDialog::Accepted == new_measure_analysis_dlg.exec()) { ProjectList* project_list_model = ProjectList::Instance(); auto project_model = project_list_model->GetCurrentProjectModel(); - emit newProject(project_model->GetProjectName()); - const QString& all_channel_particle_data_filename = project_model->GetAllChannelParticleDataFilename(); - if (!all_channel_particle_data_filename.isEmpty()) { - const QString& all_ch_count_dir = project_model->GetProjectDir(); - const QString& every_ch_count_dir = QDir(project_model->GetProjectDir()).filePath(QStringLiteral(u"通道道址计数")); - auto count_task = new DataProcessWorkPool::EveryChannelParticleCountDataTask; - count_task->SetAllChannelParticleDataFilename(all_channel_particle_data_filename); - count_task->SetAllChannelCountResultDir(all_ch_count_dir); - count_task->SetEveryChannelCountResultDir(every_ch_count_dir); - count_task->SetFinishedNotifier(project_list_model, "onChannelAddressCountProcessFinished", project_model->GetProjectName()); - count_task->StartTask(); - auto coincidence_process_task = new DataProcessWorkPool::CoincidenceEventAnalysisTask; - coincidence_process_task->SetFinishedNotifier(project_list_model, "onCoincidenceProcessFinished", project_model->GetProjectName()); - coincidence_process_task->StartTask(); + if (project_model->GetIsMeasureComplete()) { + const QString& all_channel_particle_data_filename = project_model->GetAllChannelParticleDataFilename(); + if (!all_channel_particle_data_filename.isEmpty()) { + const QString& all_ch_count_dir = project_model->GetProjectDir(); + const QString& every_ch_count_dir = QDir(project_model->GetProjectDir()).filePath(QStringLiteral(u"通道道址计数")); + auto count_task = new DataProcessWorkPool::EveryChannelParticleCountDataTask; + count_task->SetAllChannelParticleDataFilename(all_channel_particle_data_filename); + count_task->SetAllChannelCountResultDir(all_ch_count_dir); + count_task->SetEveryChannelCountResultDir(every_ch_count_dir); + count_task->SetFinishedNotifier(project_list_model, "onChannelAddressCountProcessFinished", project_model->GetProjectName()); + count_task->StartTask(); + auto coincidence_process_task = new DataProcessWorkPool::CoincidenceEventAnalysisTask; + coincidence_process_task->SetFinishedNotifier(project_list_model, "onCoincidenceProcessFinished", project_model->GetProjectName()); + coincidence_process_task->StartTask(); + } + } else { + } } }; diff --git a/src/MeasureAnalysisProjectModel.cpp b/src/MeasureAnalysisProjectModel.cpp index 35c13a9..00505ba 100644 --- a/src/MeasureAnalysisProjectModel.cpp +++ b/src/MeasureAnalysisProjectModel.cpp @@ -264,6 +264,46 @@ const QString MeasureAnalysisProjectModel::GetAnalysisCustomData(AnalysisType an return this->_analysis_custom_data_set.value(analysis_type).value(data_item_name); } +void MeasureAnalysisProjectModel::SetDeviceGuid(const QString &device_guid) +{ + this->_device_guid = device_guid; +} + +const QString &MeasureAnalysisProjectModel::GetDeviceGuid() const +{ + return this->_device_guid; +} + +void MeasureAnalysisProjectModel::SetStartTime(const QString &start_time) +{ + this->_start_time = start_time; +} + +const QString &MeasureAnalysisProjectModel::GetStartTime() const +{ + return this->_start_time; +} + +void MeasureAnalysisProjectModel::SetEndTime(const QString &end_time) +{ + this->_end_time = end_time; +} + +const QString &MeasureAnalysisProjectModel::GetEndTime() const +{ + return this->_end_time; +} + +void MeasureAnalysisProjectModel::SetGvfFilename(const QString &gvf_filename) +{ + this->_gvf_filename = gvf_filename; +} + +const QString &MeasureAnalysisProjectModel::GetGvfFilename() const +{ + return this->_gvf_filename; +} + bool MeasureAnalysisProjectModel::LoadProjectModel(const QString& project_filename) { QVariantMap model_data; diff --git a/src/MeasureAnalysisProjectModel.h b/src/MeasureAnalysisProjectModel.h index 65bb9ce..317c8c1 100644 --- a/src/MeasureAnalysisProjectModel.h +++ b/src/MeasureAnalysisProjectModel.h @@ -65,6 +65,15 @@ public: const QMap GetTimeWinConformEnergyDataFilenameList(uint time_win) const; const QString GetAnalysisCustomData(AnalysisType analysis_type, const QString& data_item_name); + void SetDeviceGuid(const QString& device_guid); + const QString& GetDeviceGuid() const; + void SetStartTime(const QString& start_time); + const QString& GetStartTime() const; + void SetEndTime(const QString& end_time); + const QString& GetEndTime() const; + void SetGvfFilename(const QString& gvf_filename); + const QString& GetGvfFilename() const; + private: QString _project_dir; QString _project_name; @@ -89,6 +98,11 @@ private: QMap > _time_win_conform_energy_data; QMap > _analysis_custom_data_set; + QString _device_guid; + QString _gvf_filename; + QString _start_time; + QString _end_time; + public: bool LoadProjectModel(const QString& project_filename); bool SaveProjectModel(); diff --git a/src/MeasureClient/MeasureClient.h b/src/MeasureClient/MeasureClient.h new file mode 100644 index 0000000..f075cfd --- /dev/null +++ b/src/MeasureClient/MeasureClient.h @@ -0,0 +1,60 @@ +#ifndef MEASURECLIENT_H +#define MEASURECLIENT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class MeasureClient : public QObject +{ + Q_OBJECT + +public: + explicit MeasureClient(QObject *parent = nullptr); + ~MeasureClient(); + + // 设置服务器地址和端口 + void setServerAddress(const QString &host, quint16 port); + // 启动测量(异步) + void startMeasure(const QString &deviceGuid, const QVariantMap &config); + // 停止测量(异步) + void stopMeasure(const QString &deviceGuid); + // 设置测量参数(异步) + void setMeasureConfigParams(const QString &deviceGuid, const QVariantMap &config); + // 清除数据(异步) + void clearData(const QString &deviceGuid); + // 获取设备列表(异步) + void getDeviceList(); + +signals: + // 操作结果信号 + void startMeasureResult(bool success, const QString &info); + void stopMeasureResult(bool success, const QString &message); + void setMeasureConfigParamsResult(bool success, const QString &message); + void clearDataResult(bool success, const QString &message); + void getDeviceListResult(bool success, const QStringList &devices); + // 错误信号 + void errorOccurred(const QString &errorString); + +private slots: + // 处理命令执行 + void processCommand(const QString &command, const QString &device_guid, const QVariantMap &config); + +private: + // 发送命令并获取响应(短连接模式) + QVariantMap sendCommand(const QString &command, const QString &device_guid, const QString &data = QString()); + +private: + QString _host; + quint16 _port; + QThread *_workerThread; + QMutex _mutex; +}; + +#endif // MEASURECLIENT_H \ No newline at end of file diff --git a/src/MeasureClient/MeasureClient.pri b/src/MeasureClient/MeasureClient.pri index 4282815..447a185 100644 --- a/src/MeasureClient/MeasureClient.pri +++ b/src/MeasureClient/MeasureClient.pri @@ -2,7 +2,9 @@ INCLUDEPATH += $${PWD} DEPENDPATH += $${PWD} SOURCES += \ - $$PWD/MeasureClient.cpp + $$PWD/MeasureClient.cpp \ + $$PWD/MeasureWorker.cpp HEADERS += \ - $$PWD/MeasureClient.h \ No newline at end of file + $$PWD/MeasureClient.h \ + $$PWD/MeasureWorker.h \ No newline at end of file diff --git a/src/MeasureClient/MeasureWorker.cpp b/src/MeasureClient/MeasureWorker.cpp new file mode 100644 index 0000000..6d30ab3 --- /dev/null +++ b/src/MeasureClient/MeasureWorker.cpp @@ -0,0 +1,165 @@ +#include "MeasureWorker.h" +#include "MeasureClient.h" +#include +#include "GlobalDefine.h" +#include "MeasureAnalysisProjectModel.h" + +MeasureWorker* MeasureWorker::_s_instance { nullptr }; + +MeasureWorker::MeasureWorker(QObject* parent) + : QObject(parent) +{ + _measure_client = new MeasureClient; + connect(_measure_client, &MeasureClient::getDeviceListResult, this, &MeasureWorker::onGetDeviceListResult); + connect(_measure_client, &MeasureClient::startMeasureResult, this, &MeasureWorker::onStartMeasureResult); + connect(_measure_client, &MeasureClient::stopMeasureResult, this, &MeasureWorker::onStopMeasureResult); + connect(_measure_client, &MeasureClient::setMeasureConfigParamsResult, this, &MeasureWorker::onSetMeasureConfigParamsResult); + connect(_measure_client, &MeasureClient::clearDataResult, this, &MeasureWorker::onClearDataResult); + connect(_measure_client, &MeasureClient::errorOccurred, this, &MeasureWorker::onErrorOccurred); +} + +MeasureWorker *MeasureWorker::Instance() +{ + if (!_s_instance) { + _s_instance = new MeasureWorker(); + } + return _s_instance; +} + +MeasureWorker::~MeasureWorker() +{ + delete _measure_client; +} + +void MeasureWorker::SetMeasureProjectName(const QString &project_name) +{ + _measure_project_name = project_name; +} + +void MeasureWorker::Connect() +{ + LOG_INFO(QStringLiteral(u"查找测量设备... ...")); + _measure_client->getDeviceList(); +} + +void MeasureWorker::Start() +{ + auto project_model = ProjectList::Instance()->GetProjectModel(_measure_project_name); + if (!project_model) { + return; + } + const QString& device_guid = project_model->GetDeviceGuid(); + if (device_guid.isEmpty()) { + LOG_WARN(QStringLiteral(u"未选择测量设备GUID.")); + return; + } + const QString& config_filename = project_model->GetMeasureDeviceParamsCfgFilename(); + QFile json_file(config_filename); + if (!json_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + LOG_WARN(QStringLiteral(u"加载设备参数配置失败:%1").arg(config_filename)); + return; + } + QByteArray json_data = json_file.readAll(); + json_file.close(); + QJsonDocument json_doc = QJsonDocument::fromJson(json_data); + if (json_doc.isNull()) { + return; + } + if (!json_doc.isObject()) + return; + QVariantMap device_config_info = json_doc.object().toVariantMap(); + if (!device_config_info.contains(QStringLiteral(u"ChannelConfig"))) + return; + QVariantList channel_config_list = device_config_info[QStringLiteral(u"ChannelConfig")].toList(); + if (channel_config_list.isEmpty()) { + LOG_WARN(QStringLiteral(u"测量设备通道配置参数为空.")); + return; + } + LOG_INFO(QStringLiteral(u"开始测量... ...")); + _measure_client->startMeasure(device_guid, device_config_info); +} + +void MeasureWorker::Stop() +{ + auto project_model = ProjectList::Instance()->GetProjectModel(_measure_project_name); + if (!project_model) { + return; + } + const QString& device_guid = project_model->GetDeviceGuid(); + if (device_guid.isEmpty()) { + LOG_WARN(QStringLiteral(u"未选择测量设备GUID.")); + return; + } + LOG_INFO(QStringLiteral(u"停止测量... ...")); + _measure_client->stopMeasure(device_guid); +} + +void MeasureWorker::ClearData() +{ + auto project_model = ProjectList::Instance()->GetProjectModel(_measure_project_name); + if (!project_model) { + return; + } + const QString& device_guid = project_model->GetDeviceGuid(); + if (device_guid.isEmpty()) { + LOG_WARN(QStringLiteral(u"未选择测量设备GUID.")); + return; + } + LOG_INFO(QStringLiteral(u"清除测量数据... ...")); + _measure_client->clearData(device_guid); +} + +void MeasureWorker::onStartMeasureResult(bool success, const QString &info) +{ + if (success) { + LOG_INFO(QStringLiteral(u"启动测量成功")); + LOG_INFO(QStringLiteral(u"测量数据GVF文件: %1").arg(info)); + } else { + LOG_WARN(QStringLiteral(u"启动测量失败: %1").arg(info)); + } +} + +void MeasureWorker::onStopMeasureResult(bool success, const QString &message) +{ + if (success) { + LOG_INFO(QStringLiteral(u"停止测量成功")); + } else { + LOG_WARN(QStringLiteral(u"停止测量失败: %1").arg(message)); + } +} + +void MeasureWorker::onSetMeasureConfigParamsResult(bool success, const QString &message) +{ + if (success) { + LOG_INFO(QStringLiteral(u"设置测量参数成功")); + } else { + LOG_WARN(QStringLiteral(u"设置测量参数失败: %1").arg(message)); + } +} + +void MeasureWorker::onClearDataResult(bool success, const QString &message) +{ + if (success) { + LOG_INFO(QStringLiteral(u"清除测量数据成功")); + } else { + LOG_WARN(QStringLiteral(u"清除测量数据失败: %1").arg(message)); + } +} + +void MeasureWorker::onGetDeviceListResult(bool success, const QStringList &devices) +{ + if (success && !devices.isEmpty()) { + LOG_INFO(QStringLiteral(u"获取测量设备GUID成功:%1").arg(devices.first())); + auto project_model = ProjectList::Instance()->GetProjectModel(_measure_project_name); + if (project_model) { + project_model->SetDeviceGuid(devices.first()); + } + } else { + LOG_WARN(QStringLiteral(u"获取测量设备失败")); + } +} + +void MeasureWorker::onErrorOccurred(const QString &errorString) +{ + LOG_WARN(QStringLiteral(u"错误: %1").arg(errorString)); +} diff --git a/src/MeasureClient/MeasureWorker.h b/src/MeasureClient/MeasureWorker.h new file mode 100644 index 0000000..385d1d2 --- /dev/null +++ b/src/MeasureClient/MeasureWorker.h @@ -0,0 +1,42 @@ +#ifndef MEASUREWORKER_H +#define MEASUREWORKER_H + +#include + +class MeasureClient; + +class MeasureWorker : public QObject +{ + Q_OBJECT + + +private: + MeasureWorker(QObject* parent = nullptr); + static MeasureWorker* _s_instance; + +public: + static MeasureWorker* Instance(); + virtual ~MeasureWorker(); + + void SetMeasureProjectName(const QString& project_name); + + void Connect(); + void Start(); + void Stop(); + void ClearData(); + +private slots: + void onStartMeasureResult(bool success, const QString& info); + void onStopMeasureResult(bool success, const QString& message); + void onSetMeasureConfigParamsResult(bool success, const QString& message); + void onClearDataResult(bool success, const QString& message); + void onGetDeviceListResult(bool success, const QStringList &devices); + void onErrorOccurred(const QString &errorString); + +private: + MeasureClient* _measure_client = nullptr; + QString _measure_project_name; +}; + +#endif + diff --git a/src/NewMeasureAnalysisDlg.cpp b/src/NewMeasureAnalysisDlg.cpp index 30a4d39..359da10 100644 --- a/src/NewMeasureAnalysisDlg.cpp +++ b/src/NewMeasureAnalysisDlg.cpp @@ -132,7 +132,7 @@ void NewMeasureAnalysisDlg::newProject(const QString& particle_data_filename) } else if (ui->rbtn_background_spec->isChecked()) { spec_type = MeasureAnalysisProjectModel::SpectrumType::Background; } - bool is_measure_complete = true; + bool is_measure_complete = !particle_data_filename.isEmpty(); MeasureAnalysisProjectModel* model = new MeasureAnalysisProjectModel; model->SetProjectDir(project_dir_path); model->SetProjectName(project_name);