From 12d4c03b3d7676faac7cec73474b0f3e48ab425b Mon Sep 17 00:00:00 2001 From: yuntang <123@qq.com> Date: Wed, 23 Apr 2025 15:33:39 +0800 Subject: [PATCH] 2025-04-23T15:33:38 --- experiment_data/sample_data/23-1new.xlsx | Bin 0 -> 5407 bytes experiment_data/sample_data/new.xlsx | Bin 5407 -> 5407 bytes src/data/xlsxhandler.cpp | 3 + src/global.cpp | 2 + src/global.h | 2 + src/main.cpp | 4 +- src/mainwindow.cpp | 12 +- src/mainwindow.h | 2 + src/mainwindow.ui | 9 + src/serialport/dataparser.cpp | 320 +++++++++++++---------- src/serialport/dataparser.h | 1 + src/serialport/serialport.cpp | 38 ++- src/serialport/serialport.h | 3 +- src/ui/aboutform.cpp | 7 +- src/ui/centralwidget.cpp | 65 +++-- src/ui/centralwidget.h | 2 + src/ui/experimentsettingform.cpp | 7 +- 17 files changed, 307 insertions(+), 170 deletions(-) create mode 100644 experiment_data/sample_data/23-1new.xlsx diff --git a/experiment_data/sample_data/23-1new.xlsx b/experiment_data/sample_data/23-1new.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6f26f36d879eabe11d85e5134de8c48816261a7a GIT binary patch literal 5407 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 R=R-i)I|w!dBk_Lz`ai)PLvsKC literal 0 HcmV?d00001 diff --git a/experiment_data/sample_data/new.xlsx b/experiment_data/sample_data/new.xlsx index 3660b253d3e4886b6550bafe1ea932e8b389e693..259bed698d24881a1c947756e6e67f6e3487664e 100644 GIT binary patch delta 507 zcmbQQHD8N2z?+#xgn@yBgF!NH`bOSmjLblK^ESp*2t$rp2EwpqS;WWzl!{t@^ZnAv z&spW`Pv;#n5ODqex9i03Bb5%VYg9aPk8&*uTdEa(U9Rcsjg2|m73<^G9T*O-I{jjv zA%Y%5%s~}e6n`Lcg z{Q6gTPo(bs_E6`Azq}0{QqM^yvaQJW`T4BLH~0I&pc=`nT{7`0e`T|??w*pb(QdFW z-Tp&&lKgd>j0SeQeR7sM#a?!spHKhFG&OUM-{A_OWjC!(o=9<9<{AGW>(86X$Ls%u zSIp9HzjmE}NzD&tl%U@1#O?|S*)EPL5QZYx6IO8Oa|rN4L?i@j!Hmf>gq%S#lkW*x rfoW-BS1_F{Y>kMNWy0oQ!3V*n#PJB4%Lvx`+n=-6ha! delta 507 zcmbQQHD8N2z?+#xgn@yBgF(4<+D6`GjLblK^ESp*2t$rp2EwpqS;WWzl!`jA>CDN= z&spW`WBm^qh_t=`E9(7zdmi&eliMCw3RpYcdhT5N#?brP{no1+`?pIQC=@(>`pNG3 z&1%0WpYlz8bqB2$hIVdJaTU~9wliS1P_0h-N9C?L%eyW|X=?;>^ZBlBl03AfHGDO1 zg#H27gNtPnm$^j0=RJ61qpruRNe(Ln)@_}7rQLt`!M6HM`MVhBEPu)3{b5S5f1!HM z*#sAM)%4~|e{Sp&FKAoH#(Bzmj;f^HM!7X5=Ip3eJwpC)W{&g0hw(H#=@Kc765 z|1T={eD%JsPnlP~`^SJ1)SI2yT_GXc#W4lKP~>{T3J!e^0bYoRgkUY0F?oiNGe~Cg uJs~SFEiLQ{rjv!O5s|V?*c>eQK-eBkD~VWu=~xjvFg;Ji3`}1a@c;m%4ccq~ diff --git a/src/data/xlsxhandler.cpp b/src/data/xlsxhandler.cpp index 2cabf0c..3ee25ca 100644 --- a/src/data/xlsxhandler.cpp +++ b/src/data/xlsxhandler.cpp @@ -195,7 +195,10 @@ void XlsxHandler::writeFile(const QString filePath) xlsx.write(row , 2, edVtr.size()); row++; + logde<<"edVtr size:"< _curveFileDataVtr; +int _currentPhase = 0; ExperimentInfo _experimentInfo; QVector _curveExperimentDataVtr; +CurveExperimentData* _currentCurveExperimentDataPtr = nullptr; bool _enthalpyCoefficientEnableFlag = false; QVector _enthalpyCoefficientVtr; diff --git a/src/global.h b/src/global.h index 0536e2c..d157deb 100644 --- a/src/global.h +++ b/src/global.h @@ -76,8 +76,10 @@ extern Mode _mode; // Xlsx file data. extern QVector _curveFileDataVtr; // Experiment setting data. +extern int _currentPhase; extern ExperimentInfo _experimentInfo; extern QVector _curveExperimentDataVtr; +extern CurveExperimentData* _currentCurveExperimentDataPtr; // Instrument coefficient. extern bool _enthalpyCoefficientEnableFlag; diff --git a/src/main.cpp b/src/main.cpp index 348ee67..2ca4436 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,8 +62,8 @@ int main(int argc, char *argv[]) // ExperimentSettingForm es; // es.show(); - // CentralWidget central; - // central.show(); +// CentralWidget central; +// central.show(); // SerialPort::parserTest(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 33029c5..01982a3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -132,11 +132,14 @@ void MainWindow::connections() connect(SerialPort::instance(), &SerialPort::sigSendPhaseInfo, _expertmentSettingForm, &ExperimentSettingForm::slotRecvPhaseInfo); + connect(SerialPort::instance(), &SerialPort::sigAxisModify, + _centralWidget, &CentralWidget::slotAxisModify); #endif // mode // connect(Global::instance(), &Global::sigModeModify, // _centralWidget, &CentralWidget::slotModeModify); + //analysis connect(_leftWidget,&LeftWidget::sigSendAnalysisFileName, _centralWidget,&CentralWidget::slotRecvAnalysisFileName); @@ -216,7 +219,7 @@ void MainWindow::on_actionStop_triggered() QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Stop); SerialPort::instance()->slotSendData(ba); -#if 0 +#if 1 // Save data. if(saveExperimentFile(Global::_experimentInfo.sampleName)){ _leftWidget->reloadFileName(); @@ -376,3 +379,10 @@ void MainWindow::on_actionEnthalpyCorrectionSelection_triggered() { _coefficientSelectionForm->show(); } + +void MainWindow::on_actionSaveExperimentData_triggered() +{ + if(saveExperimentFile(Global::_experimentInfo.sampleName)){ + _leftWidget->reloadFileName(); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 631d9e2..56776bc 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -81,6 +81,8 @@ private slots: void on_actionEnthalpyCorrectionSelection_triggered(); + void on_actionSaveExperimentData_triggered(); + private: void connections(); void setActionEnable(const bool); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 8fe642a..f0df28d 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -28,6 +28,7 @@ 文件 + @@ -265,6 +266,14 @@ 热焓校正系数选择 + + + 保存实验数据 + + + 保存实验数据 + + diff --git a/src/serialport/dataparser.cpp b/src/serialport/dataparser.cpp index d24328d..d1edb63 100644 --- a/src/serialport/dataparser.cpp +++ b/src/serialport/dataparser.cpp @@ -9,104 +9,104 @@ namespace DataParser { - bool commonDataParser(const QByteArray &ba, CommonData &cd) - { - const char *charArray = ba.data(); +bool commonDataParser(const QByteArray &ba, CommonData &cd) +{ + const char *charArray = ba.data(); - // 判断前两个字节是否为 0xA5 和 0x5A (小端格式) - if (static_cast(charArray[0]) == 0xA5 && + // 判断前两个字节是否为 0xA5 和 0x5A (小端格式) + if (static_cast(charArray[0]) == 0xA5 && static_cast(charArray[1]) == 0x5A) - { - // std::cout << "前两个字节是 0x5AA5 (小端)" << std::endl; - } - else - { - // std::cout << "前两个字节不是 0x5AA5 (小端)" << std::endl; - qDebug() << "header failed."; - return false; - } - - if (static_cast(charArray[3]) != 0x83) - { - qDebug() << "mark failed."; - return false; - } - - memcpy(&cd, charArray + 6, sizeof(CommonData)); - - return true; + { + // std::cout << "前两个字节是 0x5AA5 (小端)" << std::endl; + } + else + { + // std::cout << "前两个字节不是 0x5AA5 (小端)" << std::endl; + qDebug() << "header failed."; + return false; } - - - QByteArray connectToDevice(const QVector &vtr) + if (static_cast(charArray[3]) != 0x83) { - const int phaseLength = sizeof(Phase); - const int phaseArrayLength = vtr.size() * phaseLength; - char phaseArray[300] = {}; - int offset = 0; - - for (const Phase &phase : vtr) - { - memcpy(phaseArray + offset, &phase, sizeof(Phase)); - offset += phaseLength; - } - - // - // int totalDataLength = 0; - char totalData[300] = {}; - - u16 header = 0x5aa5; - memcpy(totalData, (char *)&header, sizeof(u16)); - // totalDataLength +=2; - - totalData[2] = 1 + 2 + phaseArrayLength + 2; - // totalDataLength++; - - totalData[3] = 0x82; - // totalDataLength++; - - u16 address = 0x0050; - memcpy(totalData + 4, (char *)&address, sizeof(u16)); - - memcpy(totalData + 6, phaseArray, phaseArrayLength); - - // - char data[300] = {}; - - data[0] = 0x82; - - // u16 address = 0x0050; - memcpy(data + 1, (char *)&address, sizeof(u16)); - - memcpy(data + 3, phaseArray, phaseArrayLength); - - u16 crc = modbusCRC16((u8 *)data, 3 + phaseArrayLength); - // - memcpy(totalData + 6 + phaseArrayLength, (char *)&crc, sizeof(u16)); - - // - - return QByteArray(totalData, 6 + phaseArrayLength + 2); + qDebug() << "mark failed."; + return false; } - QByteArray setDeviceStartStop(const DeviceStartMode mode) + memcpy(&cd, charArray + 6, sizeof(CommonData)); + + return true; +} + + + +QByteArray connectToDevice(const QVector &vtr) +{ + const int phaseLength = sizeof(Phase); + const int phaseArrayLength = vtr.size() * phaseLength; + char phaseArray[300] = {}; + int offset = 0; + + for (const Phase &phase : vtr) { + memcpy(phaseArray + offset, &phase, sizeof(Phase)); + offset += phaseLength; + } + + // + // int totalDataLength = 0; + char totalData[300] = {}; + + u16 header = 0x5aa5; + memcpy(totalData, (char *)&header, sizeof(u16)); + // totalDataLength +=2; + + totalData[2] = 1 + 2 + phaseArrayLength + 2; + // totalDataLength++; + + totalData[3] = 0x82; + // totalDataLength++; + + u16 address = 0x0050; + memcpy(totalData + 4, (char *)&address, sizeof(u16)); + + memcpy(totalData + 6, phaseArray, phaseArrayLength); + + // + char data[300] = {}; + + data[0] = 0x82; + + // u16 address = 0x0050; + memcpy(data + 1, (char *)&address, sizeof(u16)); + + memcpy(data + 3, phaseArray, phaseArrayLength); + + u16 crc = modbusCRC16((u8 *)data, 3 + phaseArrayLength); + // + memcpy(totalData + 6 + phaseArrayLength, (char *)&crc, sizeof(u16)); + + // + + return QByteArray(totalData, 6 + phaseArrayLength + 2); +} + +QByteArray setDeviceStartStop(const DeviceStartMode mode) +{ #if 1 - SerialPortProtocol spp; - spp.head = FRANE_HEAD; - spp.len = 1 + 2 + 1 + 2; - spp.cmd = WRITE_CMD; - spp.addr = 0x002c; - spp.data_buf[0] = mode; + SerialPortProtocol spp; + spp.head = FRANE_HEAD; + spp.len = 1 + 2 + 1 + 2; + spp.cmd = WRITE_CMD; + spp.addr = 0x002c; + spp.data_buf[0] = mode; - int sppValidLength = 6 + 1; + int sppValidLength = 6 + 1; - u8 *dataPtr = (u8 *)&spp; - u16 crc = modbusCRC16((u8 *)(dataPtr + 3), 4); + u8 *dataPtr = (u8 *)&spp; + u16 crc = modbusCRC16((u8 *)(dataPtr + 3), 4); - return QByteArray((char *)&spp, sppValidLength) + - QByteArray((char *)&crc, 2); + return QByteArray((char *)&spp, sppValidLength) + + QByteArray((char *)&crc, 2); #endif #if 0 @@ -135,62 +135,118 @@ namespace DataParser return QByteArray(data,length); #endif +} + +void experimentalStateSwitching(const CommonData &cd) +{ + switch(cd.run_type){ + case DeviceRunStatus::Heat: + case DeviceRunStatus::ConstantTemp: + Global::_mode = Global::Mode::Experiment; + break; + case DeviceRunStatus::Idle: + case DeviceRunStatus::Cooling: + Global::_mode = Global::Mode::Analysis; + break; + default:break; } - unsigned short modbusCRC16(unsigned char *data, unsigned short length) + if(Global::_currentPhase != (int)cd.current_phase){ + Global::_currentPhase = (int)cd.current_phase; + +// Global::CurveExperimentData ced{nullptr,"",QVector()}; + Global::CurveExperimentData ced; + + Global::_curveExperimentDataVtr.push_back(ced); + Global::_currentCurveExperimentDataPtr = &Global::_curveExperimentDataVtr.last(); + + Global::_currentCurveExperimentDataPtr->fileName = Global::_experimentInfo.sampleName; + } + + logde<<"phase:"<<(int)cd.current_phase; + logde<<"run type:"<<(int)cd.run_type; + logde<<"software mode:"<> 1) ^ 0xA001; - } - else - { - crc = crc >> 1; - } + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc = crc >> 1; } } - // CRC结果低字节在前,高字节在后 - return crc; + } + // CRC结果低字节在前,高字节在后 + return crc; +} + +QByteArray inquirePhaseInfo() +{ + SerialPortProtocol spp; + spp.head = FRANE_HEAD; + spp.cmd = READ_CMD; + spp.addr = 0x0050; + spp.len = 6; + // + spp.data_buf[0] = PHASE_BYTE_SIZE * 6 + 2; + // + u8 *dataPtr = (u8 *)&spp; + u16 crc = modbusCRC16((u8 *)(dataPtr + 3), 4); + // + int sppValidLength = 6 + 1; + return QByteArray((char *)&spp, sppValidLength) + + QByteArray((char *)&crc, 2); +} + +bool isDevExperimentEnded(const CommonData &cd) +{ + switch(cd.run_type){ + case DeviceRunStatus::Heat: + case DeviceRunStatus::ConstantTemp: + Global::_mode = Global::Mode::Experiment; + break; + case DeviceRunStatus::Idle: + logde<<"idle..."; + case DeviceRunStatus::Cooling: + Global::_mode = Global::Mode::Analysis; + logde<<"cooling..."; + // return true; + break; + default:break; } - QByteArray inquirePhaseInfo() - { - SerialPortProtocol spp; - spp.head = FRANE_HEAD; - spp.cmd = READ_CMD; - spp.addr = 0x0050; - spp.len = 6; - // - spp.data_buf[0] = PHASE_BYTE_SIZE * 6 + 2; - // - u8 *dataPtr = (u8 *)&spp; - u16 crc = modbusCRC16((u8 *)(dataPtr + 3), 4); - // - int sppValidLength = 6 + 1; - return QByteArray((char *)&spp, sppValidLength) + - QByteArray((char *)&crc, 2); - } +#if 0 + logde<<"phase:"<<(int)cd.current_phase; + logde<<"run type:"<<(int)cd.run_type; - bool isDevExperimentEnded(const CommonData &cd) - { - switch(cd.run_type){ - case DeviceRunStatus::Idle: - case DeviceRunStatus::Cooling: -// Global::instance()->setMode(Global::Mode::Analysis); -// Global::_mode = Global::Mode::Analysis; -// logde<<"Device into cooling status,then set the software into annlysis mode."; - return true; - break; - default:break; - } - return false; + switch(cd.run_type){ + case DeviceRunStatus::Idle: + logde<<"idle..."; + // break; + case DeviceRunStatus::Cooling: + // Global::instance()->setMode(Global::Mode::Analysis); + // Global::_mode = Global::Mode::Analysis; + // logde<<"Device into cooling status,then set the software into annlysis mode."; + logde<<"cooling..."; + // return true; + break; + default:break; } + return false; +#endif +} + + }; diff --git a/src/serialport/dataparser.h b/src/serialport/dataparser.h index cd9fc2e..80b7ff2 100644 --- a/src/serialport/dataparser.h +++ b/src/serialport/dataparser.h @@ -13,6 +13,7 @@ QByteArray connectToDevice(const QVector&); QByteArray inquirePhaseInfo(); QByteArray setDeviceStartStop(const DeviceStartMode); +void experimentalStateSwitching(const CommonData&cd); bool isDevExperimentEnded(const CommonData&cd); bool commonDataParser(const QByteArray&ba,CommonData &cd); diff --git a/src/serialport/serialport.cpp b/src/serialport/serialport.cpp index d62ae49..75b94d2 100644 --- a/src/serialport/serialport.cpp +++ b/src/serialport/serialport.cpp @@ -94,12 +94,11 @@ void SerialPort::timerEvent(QTimerEvent *event) void SerialPort::slotReadData() { -#if 1 QByteArray ba = _sp->readAll(); if(ba.size() == 0){ return; } -#if 1 +#if 0 QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 qDebug() << "receive info (hex):" << hexData; #endif @@ -128,19 +127,18 @@ void SerialPort::slotReadData() } else if (READ_CMD == spp->cmd) { - // judge the device status. - DataParser::isDevExperimentEnded(cd); - // read data + DataParser::experimentalStateSwitching(cd); + setAxis(); + if (spp->addr == 0) { if (Global::Mode::Experiment == Global::_mode) { emit sigSendCommonData(cd); } - emit sigSendCommonDataToRealDataForm(cd); + // emit sigSendCommonDataToRealDataForm(cd); } } -#endif } void SerialPort::commonDataParser(const int dataLength, const u16 addr, @@ -173,7 +171,7 @@ void SerialPort::commonDataParser(const int dataLength, const u16 addr, { switch(cd.run_type){ case DeviceRunStatus::Cooling: -// Global::instance()->setMode(Global::Mode::Analysis); + // Global::instance()->setMode(Global::Mode::Analysis); Global::_mode = Global::Mode::Analysis; logde<<"set global mode analysis.common data parser."; break; @@ -201,12 +199,12 @@ void SerialPort::commonDataParser(const int dataLength, const u16 addr, switch (mode) { case DeviceStartMode::Stop: -// Global::instance()->setMode(Global::Mode::Analysis); + // Global::instance()->setMode(Global::Mode::Analysis); Global::_mode = Global::Mode::Analysis; logde<<"set global mode analysis."; break; case DeviceStartMode::Start: -// Global::instance()->setMode(Global::Mode::ExperimentStart); + // Global::instance()->setMode(Global::Mode::ExperimentStart); Global::_mode = Global::Mode::Experiment; break; default: @@ -394,6 +392,26 @@ void SerialPort::displayPortInfo() } } } + +void SerialPort::setAxis() +{ + static Global::Mode previousMode = Global::Analysis; // 记录上一次的模式 + + if (previousMode == Global::Analysis && + Global::_mode == Global::Experiment) { + // std::cout << "Mode has changed from Analysis to Experiment!" << std::endl; + Global::ExperimentInfo & eti = Global::_experimentInfo; + if(eti.phaseVtr.size() > 0){ + logde<<"serialport set axis."; + float temp = eti.phaseVtr.at(0).cutoff_temp; + emit sigAxisModify(temp); + } + } + + if(previousMode != Global::_mode){ + previousMode = Global::_mode; + } +} void SerialPort::parserTest() { const uchar data[] = {0xa5, 0x5a, 0x2d, 0x83, diff --git a/src/serialport/serialport.h b/src/serialport/serialport.h index 885941c..dd9530c 100644 --- a/src/serialport/serialport.h +++ b/src/serialport/serialport.h @@ -34,6 +34,7 @@ signals: void sigSendCommonData(const CommonData &); void sigSendCommonDataToRealDataForm(const CommonData &); void sigSendPhaseInfo(const QByteArray &); + void sigAxisModify(const float temp); public slots: void slotDeliverData(const QByteArray &); // void slotConnectToDevice(const QByteArray&); @@ -46,7 +47,7 @@ private: void commonDataParser(const int dataLength, const u16 addr, const CommonData &cd); void to_hex(char *in_char, int char_length, char *out_char); void displayPortInfo(); - + void setAxis(); private: SerialPort(QObject *parent = nullptr); QSerialPort *_sp; diff --git a/src/ui/aboutform.cpp b/src/ui/aboutform.cpp index 40b5b08..84c7a03 100644 --- a/src/ui/aboutform.cpp +++ b/src/ui/aboutform.cpp @@ -9,8 +9,6 @@ AboutForm::AboutForm(QWidget *parent) : { ui->setupUi(this); -// setFixedSize(geometry().width(),geometry().height()); - setWindowTitle("About"); QPixmap pixmap(":/images/logo.png"); // 假设图片在资源文件中 @@ -22,19 +20,16 @@ AboutForm::AboutForm(QWidget *parent) : ui->labelTitle->setText(QString("

关于差示扫描量热仪数据分析软件

")); -//#define COMPILE_TIME QString("编译时间:%1 %2").arg(__DATE__).arg(__TIME__) - QString ConCompleTime = QString("编译时间:%1 %2").arg(__DATE__).arg(__TIME__); QString aboutText = QString( "

软件版本:%1

" - "

%2

" "

版权所有 © 2025 山东云唐智能科技有限公司 保留所有权

" "
" "

本软件基于 Qt 框架开发,Qt 遵循 " "LGPL 协议

" "

Qt 官网:www.qt.io

") - .arg(Global::ConSoftVersion).arg(ConCompleTime); + .arg(Global::ConSoftVersion); ui->labelContent->setAlignment(Qt::AlignTop | Qt::AlignLeft); ui->labelContent->setTextFormat(Qt::RichText); diff --git a/src/ui/centralwidget.cpp b/src/ui/centralwidget.cpp index fc56882..dfc0149 100644 --- a/src/ui/centralwidget.cpp +++ b/src/ui/centralwidget.cpp @@ -74,15 +74,15 @@ CentralWidget::CentralWidget(QWidget *parent) _customPlot->yAxis->setRange(0, 100); _customPlot->replot(); #endif - // startTimer(1000); - // 设置坐标轴标签 _customPlot->xAxis->setLabel("Temp/℃"); _customPlot->yAxis->setLabel("DSC/mW"); // 设置坐标轴范围,以便我们可以看到全部数据 - _customPlot->xAxis->setRange(0, 400); - _customPlot->yAxis->setRange(-100,200); + _customPlot->xAxis->setRange(0,100); + _customPlot->yAxis->setRange(0,20); + + // startTimer(300); } CentralWidget::~CentralWidget() @@ -137,30 +137,47 @@ void CentralWidget::slotModeModify(const Global::Mode mode) void CentralWidget::slotRecvCommonData(const CommonData &cd) { - qDebug() << "slotRevCommonData"; + // logde<<"slotRecvCommonData..."; static double index = 0.0; if(!_currentCurve){ + logde<<"_currentCurve is nullptr"; _currentCurve = new QCPCurve(_customPlot->xAxis, _customPlot->yAxis); } logde<<"temp:"<addData(cd.sample_temp, cd.dsc); - // _currentCurve->data()->add(QCPCurveData(index++, cd.sample_temp, cd.dsc)); + _currentCurve->addData(index++,cd.sample_temp, cd.dsc); -// _currentCurve->addData(index++,cd.sample_temp, cd.dsc); + // _customPlot->rescaleAxes(); + _customPlot->replot(); - // 设置曲线数据 -// _currentCurve->setData(data); - - -// _customPlot->rescaleAxes(); -// _customPlot->replot(); + // return; // Record data. + logde<<"record data..."; + + if(!Global::_currentCurveExperimentDataPtr){ + logde<<"_currentCurveExperimentDataPtr is nullptr."; + exit(0); + }else{ + logde<<"add ed..."; + + Global::ExperimentData ed; + ed.dsc = cd .dsc; + ed.sampleTemp = cd.sample_temp; + ed.runTime = cd.add_run_time; + ed.constantTempTime = cd.add_constan_temp_time; + + Global::_currentCurveExperimentDataPtr->dataVtr.push_back(ed); + logde<<"111"; + Global::_currentCurveExperimentDataPtr->curve = _currentCurve; + logde<<"222"; + } + +#if 0 + logde<<"record data..."; QVector* pEdVtr = nullptr; // 声明指针变量 for(auto item:Global::_curveExperimentDataVtr){ if(item.curve == _currentCurve){ @@ -180,12 +197,15 @@ void CentralWidget::slotRecvCommonData(const CommonData &cd) ed.constantTempTime = cd.add_constan_temp_time; pEdVtr->push_back(ed); +#endif } void CentralWidget::slotRecvAnalysisFileName(const QString &filePath) { qDebug() << "slotRecvAnalysisFileName" << filePath; + _customPlot->setInteractions(QCP::iSelectPlottables); + // todo.禁止重复文件添加。 Global::CurveFileData cfd; if(XlsxHandler::readFile(filePath,cfd) != 0){ @@ -417,6 +437,9 @@ void CentralWidget::slotAnalysisSettingLineXPoint(const int index, const double) void CentralWidget::timerEvent(QTimerEvent *event) { + _customPlot->replot(); + +#if 0 // key的单位是秒 double key = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0; // 添加数据 @@ -439,6 +462,7 @@ void CentralWidget::timerEvent(QTimerEvent *event) _customPlot->yAxis->setRange(0, 20); // 设定x轴的范围 _customPlot->xAxis->setRange(key + 0.25, 80, Qt::AlignRight); // 设定x轴的范围 _customPlot->replot(); +#endif } void CentralWidget::contextMenuEvent(QContextMenuEvent *event) @@ -901,6 +925,7 @@ void CentralWidget::clearData(const CentralWidget::ClearDataMode mode) QCPGraph *graph = _customPlot->graph(i); _customPlot->removeGraph(graph); } + _currentCurve = nullptr; #endif // Delete items. @@ -922,3 +947,13 @@ void CentralWidget::clearAllData() { clearData(ClearDataMode::All); } + +void CentralWidget::slotAxisModify(const float temp) +{ + _customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables); + + float value = temp + 20; + + _customPlot->xAxis->setRange(10,value); + _customPlot->yAxis->setRange(-5,5); +} diff --git a/src/ui/centralwidget.h b/src/ui/centralwidget.h index fabf77f..e4ea755 100644 --- a/src/ui/centralwidget.h +++ b/src/ui/centralwidget.h @@ -35,6 +35,8 @@ signals: void sigSendLineXCoord(const int,const double); void sigRightDockWidgetHide(); public slots: + // experiment + void slotAxisModify(const float temp); void slotModeModify(const Global::Mode); void slotRecvCommonData(const CommonData&); void slotRecvAnalysisFileName(const QString&); diff --git a/src/ui/experimentsettingform.cpp b/src/ui/experimentsettingform.cpp index 32369af..f7fa538 100644 --- a/src/ui/experimentsettingform.cpp +++ b/src/ui/experimentsettingform.cpp @@ -404,12 +404,12 @@ void ExperimentSettingForm::on_pushButton_deliverData_clicked() } // Global::ExperimentInfo& ei = Global::_experimentInfo; - ei.phaseVtr = phaseVtr; ei.sampleName = ui->sampleNameLineEdit->text(); ei.sampleWeight = ui->sampleWeightLineEdit->text(); ei.date = ui->dateTimeLineEdit->text(); ei.experimentor = ui->userLineEdit->text(); - +#if 0 + ei.phaseVtr = phaseVtr; if(ui->radioButton_OIT->isChecked()){ ei.testType = Global::TestType::OIT; } else if(ui->radioButton_OIT_not->isChecked()){ @@ -417,7 +417,7 @@ void ExperimentSettingForm::on_pushButton_deliverData_clicked() } ei.initialAtmosPhere = (GasType)(ui->comboBox_phase_1_atmosphere->currentIndex()); - +#endif // QByteArray ba = DataParser::connectToDevice(phaseVtr); qDebug() << "ba size:" << ba.size(); @@ -497,6 +497,7 @@ void ExperimentSettingForm::slotRecvPhaseInfo(const QByteArray &ba) Phase *phase = (Phase *)(data + i * PHASE_BYTE_SIZE); phaseVtr.push_back(*phase); } + Global::_experimentInfo.phaseVtr = phaseVtr; //ui update for(int i = 0; i< phaseVtr.size();){