新增开始测量 并将数据写入粒子数据.csv文件中
This commit is contained in:
parent
2b0af32bf1
commit
38b2f45b00
|
|
@ -62,6 +62,7 @@ public:
|
||||||
bool convertGVF2CSVSync(const QString &gvfPath, const QString &csvPath);
|
bool convertGVF2CSVSync(const QString &gvfPath, const QString &csvPath);
|
||||||
// 添加错误信息获取
|
// 添加错误信息获取
|
||||||
QString getLastError() const { return m_lastError; }
|
QString getLastError() const { return m_lastError; }
|
||||||
|
QList<ParticleData> parseParticleFrames(const QByteArray &data);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void conversionProgress(int percent);
|
void conversionProgress(int percent);
|
||||||
|
|
@ -73,7 +74,6 @@ private slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processDBData();
|
void processDBData();
|
||||||
QList<ParticleData> parseParticleFrames(const QByteArray &data);
|
|
||||||
void cleanUp();
|
void cleanUp();
|
||||||
// 添加错误信息存储
|
// 添加错误信息存储
|
||||||
void setLastError(const QString& error) { m_lastError = error; emit errorOccurred(error); }
|
void setLastError(const QString& error) { m_lastError = error; emit errorOccurred(error); }
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,10 @@
|
||||||
#include "NuclideLib.h"
|
#include "NuclideLib.h"
|
||||||
#include "BackgroundTaskListView.h"
|
#include "BackgroundTaskListView.h"
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include "MeasureClient.h"
|
||||||
|
#include "GvfToCsv/GvfToCsv.h"
|
||||||
using namespace ads;
|
using namespace ads;
|
||||||
|
|
||||||
MainWindow* MainWindow::_s_main_win = nullptr;
|
MainWindow* MainWindow::_s_main_win = nullptr;
|
||||||
|
|
@ -90,6 +93,17 @@ MainWindow::MainWindow(QWidget* parent)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
_status_bar = ui->statusbar;
|
_status_bar = ui->statusbar;
|
||||||
|
_gvfToCsv = new GvfToCsv;
|
||||||
|
_measure_client = new MeasureClient;
|
||||||
|
connect(_measure_client, &MeasureClient::getDeviceListResult, this, &MainWindow::onGetDeviceListResult);
|
||||||
|
connect(_measure_client, &MeasureClient::startMeasureResult, this, &MainWindow::onStartMeasureResult);
|
||||||
|
connect(_measure_client, &MeasureClient::stopMeasureResult, this, &MainWindow::onStopMeasureResult);
|
||||||
|
connect(_measure_client, &MeasureClient::setMeasureConfigParamsResult, this, &MainWindow::onSetMeasureConfigParamsResult);
|
||||||
|
connect(_measure_client, &MeasureClient::clearDataResult, this, &MainWindow::onClearDataResult);
|
||||||
|
connect(_measure_client, &MeasureClient::runningInfo, this, &MainWindow::onRunningInfo);
|
||||||
|
connect(_measure_client, &MeasureClient::errorOccurred, this, &MainWindow::onErrorOccurred);
|
||||||
|
connect(_measure_client, &MeasureClient::gvfData, this, &MainWindow::onGvfData);
|
||||||
|
_measure_client->connectToServer();
|
||||||
|
|
||||||
initMainWindow();
|
initMainWindow();
|
||||||
initAction();
|
initAction();
|
||||||
|
|
@ -435,3 +449,160 @@ void MainWindow::resizeEvent(QResizeEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::on_action_start_measure_triggered()
|
||||||
|
{
|
||||||
|
LOG_INFO(QStringLiteral(u"查找测量设备... ..."));
|
||||||
|
_measure_client->getDeviceList();
|
||||||
|
LOG_INFO(QStringLiteral(u"开始测量... ..."));
|
||||||
|
QString device_guid;
|
||||||
|
if(deviceList.size()>0)
|
||||||
|
{
|
||||||
|
device_guid = deviceList.at(0);
|
||||||
|
}
|
||||||
|
MeasureAnalysisProjectModel* models = ProjectList::Instance()->GetCurrentProjectModel();
|
||||||
|
QMap<QString, QMap<QString, QStandardItem *> > project_node_items = ProjectList::Instance()->getProjectNodeItems();
|
||||||
|
QMap<QString, QStandardItem *> node = project_node_items[models->GetProjectName()];
|
||||||
|
QStandardItem *nodeItem = node[models->GetProjectName()];
|
||||||
|
ProjectList::Instance()->SetNodeStatus(nodeItem,"测量中",true);
|
||||||
|
QString projectName;
|
||||||
|
QString deviceCfg;
|
||||||
|
if(models)
|
||||||
|
{
|
||||||
|
projectName = models->GetProjectName();
|
||||||
|
deviceCfg = models->GetMeasureDeviceParamsCfgFilename();
|
||||||
|
if(deviceCfg == "")
|
||||||
|
{
|
||||||
|
QMessageBox::information(this,"提示","设备参数配置未配置","确认","取消");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile json_file(deviceCfg);
|
||||||
|
if (!json_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
LOG_INFO(QStringLiteral(u"加载设备参数配置失败:%1").arg(deviceCfg));
|
||||||
|
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_INFO(QStringLiteral(u"测量设备通道配置参数为空."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_measure_client->startMeasure(device_guid, device_config_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onStartMeasureResult(bool success, const QString &info)
|
||||||
|
{
|
||||||
|
if(success)
|
||||||
|
{
|
||||||
|
LOG_INFO(QStringLiteral(u"启动测量成功"));
|
||||||
|
LOG_INFO(QStringLiteral(u"测量数据GVF文件: %1").arg(info));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_INFO(QStringLiteral(u"启动测量失败: %1").arg(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onStopMeasureResult(bool success, const QString &message)
|
||||||
|
{
|
||||||
|
if(success){
|
||||||
|
LOG_INFO(QStringLiteral(u"停止测量成功"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_INFO(QStringLiteral(u"停止测量失败: %1").arg(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onSetMeasureConfigParamsResult(bool success, const QString &message)
|
||||||
|
{
|
||||||
|
if(success){
|
||||||
|
LOG_INFO(QStringLiteral(u"设置测量参数成功"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_INFO(QStringLiteral(u"设置测量参数失败: %1").arg(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onClearDataResult(bool success, const QString &message)
|
||||||
|
{
|
||||||
|
if(success){
|
||||||
|
LOG_INFO(QStringLiteral(u"清除测量数据成功"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_INFO(QStringLiteral(u"清除测量数据失败: %1").arg(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onGetDeviceListResult(bool success, const QString &message, const QStringList &devices)
|
||||||
|
{
|
||||||
|
if (success) {
|
||||||
|
deviceList = devices;
|
||||||
|
}
|
||||||
|
//测试
|
||||||
|
deviceList.append("0x01");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onErrorOccurred(const QString &error_string)
|
||||||
|
{
|
||||||
|
LOG_INFO(QStringLiteral(u"错误: %1").arg(error_string));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onRunningInfo(const QString &run_info)
|
||||||
|
{
|
||||||
|
LOG_INFO(QStringLiteral(u"信息: %1").arg(run_info));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onGvfData(const QByteArray &data)
|
||||||
|
{
|
||||||
|
LOG_INFO(QStringLiteral(u"GVFDATA: %1").arg(QString::fromUtf8(data.toHex().toUpper())));
|
||||||
|
QList<ParticleData> particles = _gvfToCsv->parseParticleFrames(data);
|
||||||
|
if (particles.isEmpty()) {
|
||||||
|
LOG_INFO(QStringLiteral(u"本次GVF数据未解析到有效粒子,跳过写入CSV"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QString dir = ProjectList::Instance()->GetCurrentProjectModel()->GetProjectDir();
|
||||||
|
QString csvPath = QStringLiteral(u"%1/%2").arg(dir).arg("粒子数据.csv");
|
||||||
|
|
||||||
|
QFile outFile(csvPath);
|
||||||
|
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
|
||||||
|
LOG_ERROR(QStringLiteral(u"无法打开CSV文件(追加模式): %1,错误: %2")
|
||||||
|
.arg(csvPath)
|
||||||
|
.arg(outFile.errorString()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream out(&outFile);
|
||||||
|
out.setCodec("UTF-8");
|
||||||
|
|
||||||
|
if (outFile.size() == 0) {
|
||||||
|
out << QStringLiteral(u"板卡号,通道号,道址,时间计数\n");
|
||||||
|
LOG_INFO(QStringLiteral(u"CSV文件为空,已自动写入表头: %1").arg(csvPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString csvBuffer;
|
||||||
|
csvBuffer.reserve(particles.size() * 64); // 单条数据约64字节,预分配足够内存
|
||||||
|
|
||||||
|
for (const auto &p : particles) {
|
||||||
|
csvBuffer += QString("%1,%2,%3,%4\n")
|
||||||
|
.arg(p.boardId)
|
||||||
|
.arg(p.channelId)
|
||||||
|
.arg(p.address)
|
||||||
|
.arg(p.timestampCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
out << csvBuffer;
|
||||||
|
out.flush(); // 确保数据立即写入磁盘,避免程序崩溃丢失数据
|
||||||
|
outFile.close();
|
||||||
|
|
||||||
|
LOG_INFO(QStringLiteral(u"已成功追加写入%1条粒子数据到CSV文件: %2")
|
||||||
|
.arg(particles.size())
|
||||||
|
.arg(csvPath));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ class QPlainTextEdit;
|
||||||
class MeasureAnalysisTreeView;
|
class MeasureAnalysisTreeView;
|
||||||
class BackgroundTaskListView;
|
class BackgroundTaskListView;
|
||||||
class QPushButton;
|
class QPushButton;
|
||||||
|
class MeasureClient;
|
||||||
|
class GvfToCsv;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow
|
||||||
|
|
@ -64,6 +66,18 @@ private slots:
|
||||||
void on_action_nuclideLib_triggered();
|
void on_action_nuclideLib_triggered();
|
||||||
void onShowBackgroundTaskList();
|
void onShowBackgroundTaskList();
|
||||||
|
|
||||||
|
void on_action_start_measure_triggered();
|
||||||
|
|
||||||
|
|
||||||
|
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 QString &message, const QStringList &devices);
|
||||||
|
void onErrorOccurred(const QString &error_string);
|
||||||
|
void onRunningInfo(const QString &run_info);
|
||||||
|
void onGvfData(const QByteArray& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMutex _mutex_info_output;
|
QMutex _mutex_info_output;
|
||||||
QPlainTextEdit* _plain_edit_info_output;
|
QPlainTextEdit* _plain_edit_info_output;
|
||||||
|
|
@ -80,5 +94,9 @@ private:
|
||||||
ads::CDockWidget* _dockw_measure_analysis_tree { nullptr };
|
ads::CDockWidget* _dockw_measure_analysis_tree { nullptr };
|
||||||
QMenu* _menu_view_data_table_list { nullptr };
|
QMenu* _menu_view_data_table_list { nullptr };
|
||||||
QMenu* _menu_view_analysis_view_list { nullptr };
|
QMenu* _menu_view_analysis_view_list { nullptr };
|
||||||
|
MeasureClient* _measure_client = nullptr;
|
||||||
|
QStringList deviceList;
|
||||||
|
GvfToCsv *_gvfToCsv = nullptr;
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|
|
||||||
|
|
@ -803,6 +803,11 @@ void MeasureAnalysisProjectModelList::ApplyEnergyScale(const QString &project_na
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMap<QString, QMap<QString, QStandardItem *> > MeasureAnalysisProjectModelList::getProjectNodeItems()
|
||||||
|
{
|
||||||
|
return _project_node_items;
|
||||||
|
}
|
||||||
|
|
||||||
void MeasureAnalysisProjectModelList::onDeviceConfigParamsFinished(bool ok, const QString &project_name, const QVariant &data)
|
void MeasureAnalysisProjectModelList::onDeviceConfigParamsFinished(bool ok, const QString &project_name, const QVariant &data)
|
||||||
{
|
{
|
||||||
Q_UNUSED(data);
|
Q_UNUSED(data);
|
||||||
|
|
|
||||||
|
|
@ -162,6 +162,8 @@ public:
|
||||||
|
|
||||||
void ApplyEnergyScale(const QString& project_name);
|
void ApplyEnergyScale(const QString& project_name);
|
||||||
|
|
||||||
|
QMap<QString, QMap<QString, QStandardItem*> > getProjectNodeItems();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onDeviceConfigParamsFinished(bool ok, const QString& project_name, const QVariant& data);
|
void onDeviceConfigParamsFinished(bool ok, const QString& project_name, const QVariant& data);
|
||||||
void onChannelAddressCountProcessFinished(bool ok, const QString& project_name, const QVariant& data);
|
void onChannelAddressCountProcessFinished(bool ok, const QString& project_name, const QVariant& data);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user