2025-03-19T15:19:44

This commit is contained in:
yuntang 2025-03-19 15:19:45 +08:00
parent 6cc70a2327
commit d985a8b39e
12 changed files with 5731 additions and 60 deletions

File diff suppressed because it is too large Load Diff

View File

@ -67,4 +67,39 @@ void fileClose()
}
}
void readExperimentFile(const QString fileName, QVector<ExperimentData> &dataVtr)
{
if(fileName.isEmpty()){
return;
}
if(!_expeFile.isOpen()){
_expeFile.close();
}
_expeFile.setFileName(fileName);
// 尝试以写入文本模式打开文件,如果文件不存在则创建它
if (!_expeFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "FileManager file open failed.";
} else {
qDebug() << "FileManager file open succ.";
}
QTextStream in(&_expeFile);
while (!in.atEnd()) {
QString line = in.readLine();
QStringList values = line.split(" ");
if (values.size() == 2) {
ExperimentData data;
data.sampleTemp = values[0].toFloat();
data.dsc = values[1].toFloat();
// dataVtr.append(data);
dataVtr.push_back(data);
}
}
_expeFile.close();
}
}

View File

@ -3,10 +3,20 @@
#include <QString>
#include <QFile>
#include <qdir.h>
#include "protocol.h"
namespace FileManager{
const QString ExperimentDirPath = QDir::currentPath()+"/../experiment_data";
const QString SampleDataFloder = ExperimentDirPath + "/sample_data";
const QString BaseLineFolder = ExperimentDirPath + "/base_line";
const QString AnalysisStateFolder = ExperimentDirPath + "/analysis_state";
struct ExperimentData {
float sampleTemp;
float dsc;
};
struct ExpeInfo
{
QString sampleName;
@ -21,6 +31,8 @@ void createExperimentFile();
void writeExperimentFile(const CommonData&);
void fileClose();
void readExperimentFile(const QString fileName,QVector<ExperimentData>&);
void test();
};

View File

@ -1,4 +1,6 @@
#include <QApplication>
#include <qdir.h>
#include <qdebug.h>
#include "mainwindow.h"
#include "centralwidget.h"

View File

@ -43,7 +43,7 @@ void MainWindow::connections()
#if 1
// dynamic data
connect(SerialPort::instance(), &SerialPort::sigSendCommonData,
_centralWidget, &CentralWidget::slotRevCommonData);
_centralWidget, &CentralWidget::slotRecvCommonData);
connect(SerialPort::instance(), &SerialPort::sigSendCommonData,
_realTimeDataForm, &RealTimeDataForm::slotRevCommonData);
@ -58,6 +58,9 @@ void MainWindow::connections()
// mode
connect(Global::instance(), &Global::sigModeModify,
_centralWidget, &CentralWidget::slotModeModify);
//analysis
connect(_leftWidget,&LeftWidget::sigSendAnalysisFileName,
_centralWidget,&CentralWidget::slotRecvAnalysisFileName);
}
void MainWindow::setActionEnable(const bool flag)

View File

@ -36,37 +36,7 @@ namespace DataParser
return true;
}
#if 0
bool DataParser::slotDataParser(const QByteArray &ba)
{
#if 0
SerialPortProtocol spp;
memcpy(&spp,ba.data(),ba.size());
#endif
SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
int length = spp->len - 5;
CommonData cd;
u8* cdPtr = (u8*)&cd;
memcpy(cdPtr + spp->addr,spp->data_buf,length);
qDebug()<<"revDataParser run_type:"<<cd.run_mode;
while(length){
switch(spp->addr){
case offsetof(CommonData,run_mode):
Global::Mode mode = (Global::Mode)cd.run_mode;
length--;
break;
};
}
}
#endif
void writeData(const QByteArray &)
{
}
QByteArray connectToDevice(const QVector<Phase> &vtr)
{
@ -204,6 +174,20 @@ bool DataParser::slotDataParser(const QByteArray &ba)
//
int sppValidLength = 6 + 1;
return QByteArray((char *)&spp, sppValidLength) +
QByteArray((char *)&crc, 2);
QByteArray((char *)&crc, 2);
}
bool isDevExperimentEnded(const CommonData &cd)
{
switch(cd.run_type){
case DeviceRunStatus::Idle:
case DeviceRunStatus::Cooling:
Global::instance()->setMode(Global::Mode::Analysis);
return true;
break;
default:break;
}
return false;
}
};

View File

@ -13,8 +13,8 @@ QByteArray connectToDevice(const QVector<Phase>&);
QByteArray inquirePhaseInfo();
QByteArray setDeviceStartStop(const DeviceStartMode);
bool isDevExperimentEnded(const CommonData&cd);
bool commonDataParser(const QByteArray&ba,CommonData &cd);
void writeData(const QByteArray&);
unsigned short modbusCRC16(unsigned char *data,unsigned short length);
}

View File

@ -101,7 +101,6 @@ void SerialPort::slotReadData()
#if 1
QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数
qDebug() << "receive info (hex):" << hexData;
return;
#endif
SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
if (FRANE_HEAD != spp->head)
@ -129,7 +128,7 @@ void SerialPort::slotReadData()
else if (READ_CMD == spp->cmd)
{
// judge the device status.
commonDataParser(dataLength, spp->addr, cd);
DataParser::isDevExperimentEnded(cd);
// read data
if (spp->addr == 0)
{
@ -166,6 +165,7 @@ void SerialPort::commonDataParser(const int dataLength, const u16 addr,
while (localLength)
{
qDebug()<<"localLength:"<<localLength;
switch (localAddr)
{
case offsetof(CommonData, run_type): // 运行状态

View File

@ -61,7 +61,7 @@ void CentralWidget::slotModeModify(const Global::Mode mode)
}
}
void CentralWidget::slotRevCommonData(const CommonData &cd)
void CentralWidget::slotRecvCommonData(const CommonData &cd)
{
qDebug()<<"slotRevCommonData";
_customPlot->graph(0)->addData(cd.sample_temp, cd.dsc); // 添加数据到曲线
@ -70,6 +70,39 @@ void CentralWidget::slotRevCommonData(const CommonData &cd)
FileManager::writeExperimentFile(cd);
}
void CentralWidget::slotRecvAnalysisFileName(const QString &fileName)
{
qDebug()<<"slotRecvAnalysisFileName"<<fileName;
QVector<FileManager::ExperimentData> dataVtr;
FileManager::readExperimentFile(fileName,dataVtr);
if(dataVtr.size() < 0){
return;
}
//判断界面上是不是有曲线,有的话先删除。
_customPlot->clearGraphs();
// 创建画布,设置画布上的点数据
_customPlot->addGraph();
// 设置坐标轴标签
_customPlot->yAxis->setLabel("DSC/mW");
_customPlot->xAxis->setLabel("Temp/℃");
// 设置坐标轴范围,以便我们可以看到全部数据
_customPlot->xAxis->setRange(0, 400);
_customPlot->yAxis->setRange(-20, 20);
QVector<double> xVtr,yVtr;
for(FileManager::ExperimentData &ed:dataVtr){
xVtr.push_back(ed.sampleTemp);
yVtr.push_back(ed.dsc);
}
_customPlot->graph(0)->addData(xVtr,yVtr);
_customPlot->replot();
}
void CentralWidget::timerEvent(QTimerEvent *event)
{
// key的单位是秒

View File

@ -15,7 +15,8 @@ public:
~CentralWidget();
public slots:
void slotModeModify(const Global::Mode);
void slotRevCommonData(const CommonData&);
void slotRecvCommonData(const CommonData&);
void slotRecvAnalysisFileName(const QString&);
protected:
void timerEvent(QTimerEvent* event);
private:

View File

@ -3,10 +3,8 @@
#include <QHBoxLayout>
#include "leftwidget.h"
const QString sampleDataFloder = QDir::currentPath()+"/../experiment_data/sample_data";
const QString baseLineFolder = QDir::currentPath()+"/../experiment_data/base_line";
const QString analysisStateFolder = QDir::currentPath()+"/../experiment_data/analysis_state";
#include "filemanager.h"
#include "global.h"
LeftWidget::LeftWidget()
{
@ -23,36 +21,25 @@ LeftWidget::LeftWidget()
_sampleDataItem->setText(0,"样品数据");
_treeWidget->setSortingEnabled(false);
// _treeWidget->insertTopLevelItem(0,_sampleDataItem);
// _treeWidget->insertTopLevelItem(1,_baseLineItem);
// _treeWidget->insertTopLevelItem(2,_analysisStateItem);
_treeWidget->addTopLevelItem(_sampleDataItem);
_treeWidget->addTopLevelItem(_baseLineItem);
_treeWidget->addTopLevelItem(_analysisStateItem);
#if 0
qDebug()<<"current path:"<<QDir::currentPath();
QString folderPath = QDir::currentPath()+"/../experiment_data";
qDebug()<<"experit dir:"<<folderPath;
QDir dir(folderPath);
qDebug()<<"folderPath exist:"<< dir.exists();
#endif
setWidget(_treeWidget);
//init file name.
initFileName(_sampleDataItem,sampleDataFloder);
initFileName(_baseLineItem,baseLineFolder);
initFileName(_analysisStateItem,analysisStateFolder);
initFileName(_sampleDataItem,FileManager::SampleDataFloder);
initFileName(_baseLineItem,FileManager::BaseLineFolder);
initFileName(_analysisStateItem,FileManager::AnalysisStateFolder);
expandAll(_sampleDataItem);
expandAll(_baseLineItem);
expandAll(_analysisStateItem);
setWidget(_treeWidget);
//connections
connect(_treeWidget,&QTreeWidget::itemClicked,
this,&LeftWidget::slotTreeWidgetItemClicked);
}
void LeftWidget::initData()
@ -87,9 +74,33 @@ void LeftWidget::initData()
}
}
#endif
}
void LeftWidget::slotTreeWidgetItemClicked(QTreeWidgetItem *item, int column){
qDebug()<<"item clicked:"<<item->text(0)<<column;
if(Global::Mode::Analysis != Global::instance()->getMode()){
return;
}
QString fileName;
// 获取父节点
QTreeWidgetItem *parentItem = item->parent();
if (parentItem) {
qDebug() << "parent item text:" << parentItem->text(0);
if(parentItem == _sampleDataItem){
fileName =FileManager::SampleDataFloder + "/" + item->text(0);
}else if(parentItem == _baseLineItem){
fileName =FileManager::BaseLineFolder + "/" +item->text(0);
}else if(parentItem == _analysisStateItem){
fileName =FileManager::AnalysisStateFolder + "/" +item->text(0);
}
} else {
qDebug() << "item has no parent (it is a top-level item)";
return;
}
emit sigSendAnalysisFileName(fileName);
}
void LeftWidget::initFileName(QTreeWidgetItem* parentItem,const QString &folderPath)
{
QDir dir(folderPath);

View File

@ -15,6 +15,11 @@ private:
void initData();
void initFileName(QTreeWidgetItem*,const QString &folderPath);
void expandAll(QTreeWidgetItem* item);
signals:
void sigSendAnalysisFileName(const QString&);
protected:
private slots:
void slotTreeWidgetItemClicked(QTreeWidgetItem *item, int column);
private:
QTreeWidget *_treeWidget;
QTreeWidgetItem *_analysisStateItem,