2025-03-17T17:30:53

This commit is contained in:
yuntang 2025-03-17 17:30:54 +08:00
parent 859dde6b50
commit 1e41597024
19 changed files with 301 additions and 57 deletions

23
src/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,23 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "QtBuild",
"type": "cppdbg",
"request": "launch",
"program": "${command:cmake.launchTargetPath}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [
{
"name": "PATH",
"value": "D:/qt/Qt5.14.2/5.14.2/mingw73_64/bin"
}
],
"externalConsole": false,
"miDebuggerPath": "D:/qt/Qt5.14.2/5.14.2/mingw73_64/bin/gdb.exe"
}
]
}

3
src/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"qtConfigure.qtKitDir": "D:/qt/Qt5.14.2/5.14.2/mingw73_64"
}

View File

@ -16,6 +16,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
data/filemanager.cpp \
global.cpp \
ui/centralwidget.cpp \
main.cpp \
@ -28,6 +29,7 @@ SOURCES += \
ui/realtimedataform.cpp
HEADERS += \
data/filemanager.h \
defines.h \
global.h \
ui/centralwidget.h \
@ -47,7 +49,8 @@ FORMS += \
INCLUDEPATH += serialport \
ui \
thirdparty/qcustomplot
thirdparty/qcustomplot \
data
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin

21
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,21 @@
cmake_minimum_required(VERSION 3.5) # CMake install : https://cmake.org/download/
project(qt_new_proj LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_PREFIX_PATH "D:/qt/Qt5.14.2/5.14.2/mingw73_64") # Qt Kit Dir
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED) # Qt COMPONENTS
aux_source_directory(./src srcs)
# Specify MSVC UTF-8 encoding
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
add_executable(${PROJECT_NAME}
WIN32 # If you need a terminal for debug, please comment this statement
${srcs}
)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) # Qt5 Shared Library

55
src/data/filemanager.cpp Normal file
View File

@ -0,0 +1,55 @@
#include <QFile>
#include <QDebug>
#include "filemanager.h"
void FileManager::writeExperimentFile(const CommonData &cd, QFile &file)
{
// double sampleTemp = cd.sample_temp;
// double dsc = cd.dsc;
// write data to file
// QFile file("experiment_data.txt");
// if (!file.open(QIODevice::Append | QIODevice::Text)) {
// qDebug() << "无法打开文件";
// return;
// }
QTextStream out(&file);
out.setRealNumberPrecision(3); // 设置精度为三位小数
out.setFieldWidth(12); // 设置字段宽度,确保对齐
out.setPadChar(' '); // 设置填充字符为空格
// 写入数据
out << cd.sample_temp << ", "
<< cd.dsc << endl;
// 关闭文件
file.close();
}
void FileManager::createExperimentFile(const QString &fileName, QFile &file)
{
// 使用传入的文件名创建QFile对象
file.setFileName(fileName);
// 尝试以写入文本模式打开文件,如果文件不存在则创建它
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
qDebug() << "无法打开文件";
} else {
qDebug() << "文件打开成功";
}
}
void FileManager::test()
{
QString fileName = "experiment.txt";
QFile file;
createExperimentFile(fileName,file);
}

16
src/data/filemanager.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef FILE_MANAGER_H
#define FILE_MANAGER_H
#include <QString>
#include <QFile>
#include "protocol.h"
namespace FileManager{
void createExperimentFile(const QString&,QFile &);
void writeExperimentFile(const CommonData&, QFile &);
void test();
};
#endif

View File

@ -13,10 +13,11 @@ public:
enum Mode{
Analysis,
ConnectedToDev,
ExperimentStart
DeliveredData,
ExperimentStart,
// ExperimentStop = Analysis
};
void setMode(const Mode);
Mode getMode(){return _mode;}
@ -29,6 +30,7 @@ public:
void setDeviceConnectionStatus(const DeviceConnectionStatus);
DeviceConnectionStatus getDeviceConnectionStatus(){return _deviceConnectStatus;}
#endif
signals:
void sigModeModify(const Mode);
void sigDeviceConnnectionStatusModify(const DeviceConnectionStatus);

View File

@ -1,10 +1,9 @@
#include "mainwindow.h"
#include <QApplication>
#include "mainwindow.h"
#include "centralwidget.h"
#include "serialport/serialport.h"
#include "ui/realtimedataform.h"
#include "realtimedataform.h"
#include "experimentsettingform.h"
int main(int argc, char *argv[])

View File

@ -19,7 +19,6 @@ MainWindow::MainWindow(QWidget *parent)
setActionEnable(false);
this->setToolTip(".....");
// resize(2222,1111);
setCentralWidget(_centralWidget);
addDockWidget(Qt::LeftDockWidgetArea, _leftWidget);
@ -43,14 +42,15 @@ MainWindow::~MainWindow()
void MainWindow::connections()
{
//ui
connect(_expertmentSettingForm,&ExperimentSettingForm::sigConnectToDevice,
SerialPort::instance(),&SerialPort::slotConnectToDevice);
//dynamic data
connect(_expertmentSettingForm,&ExperimentSettingForm::sigDeliverData,
SerialPort::instance(),&SerialPort::slotDeliverData);
#if 1
//dynamic data
connect(SerialPort::instance(),&SerialPort::sigSendCommonData,
_centralWidget,&CentralWidget::slotRevCommonData);
connect(SerialPort::instance(),&SerialPort::sigSendCommonData,
_realTimeDataForm,&RealTimeDataForm::slotRevCommonData);
connect(SerialPort::instance(),&SerialPort::sigSendCommonDataToRealDataForm,
_realTimeDataForm,&RealTimeDataForm::slotRevCommonData);
#endif
@ -111,7 +111,7 @@ void MainWindow::on_actionRealTimeWidget_triggered()
void MainWindow::on_actionConnectToDev_triggered()
{
if(SerialPort::instance()->openSp()){
setActionEnable(true);
ui->actionNew->setEnabled(true);
Global::instance()->setMode(Global::Mode::ConnectedToDev);
}else{
QMessageBox::warning(this, "warnning", "Serial Port open failed.");

View File

@ -101,23 +101,28 @@ void SerialPort::slotReadData()
qDebug() << "receive info (hex):" << hexData;
#endif
SerialPortProtocol *spp = (SerialPortProtocol*)ba.data();
qDebug()<<"header:"<<QString::number(spp->head,16).toUpper();
if(FRANE_HEAD != spp->head){
qDebug()<<"Data header error.";
SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
// qDebug()<<"header:"<<QString::number(spp->head,16).toUpper();
if (FRANE_HEAD != spp->head)
{
qDebug() << "Data header error.";
return;
}
int length = spp->len - 5;
int dataLength = spp->len - 5;
CommonData cd;
u8* cdPtr = (u8*)&cd;
memcpy(cdPtr + spp->addr,spp->data_buf,length);
u8 *cdPtr = (u8 *)&cd;
memcpy(cdPtr + spp->addr, spp->data_buf, dataLength);
if(WRITE_CMD == spp->cmd){
writeCmdHandle(spp->len,spp->addr,cd);
}else{
if(Global::Mode::ExperimentStart == Global::instance()->getMode()){
if (WRITE_CMD == spp->cmd)
{
writeCmdHandle(dataLength, spp->addr, cd);
}
else
{
if (Global::Mode::ExperimentStart == Global::instance()->getMode())
{
emit sigSendCommonData(cd);
}
emit sigSendCommonDataToRealDataForm(cd);
@ -125,38 +130,81 @@ void SerialPort::slotReadData()
#endif
}
void SerialPort::writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd)
void SerialPort::writeCmdHandle(const int dataLength, const u16 addr,
const CommonData &cd)
{
#if 0
SerialPortProtocol spp;
memcpy(&spp,ba.data(),ba.size());
#endif
int localLength = dataLength;
int localAddr = addr;
// SerialPortProtocol *spp = (SerialPortProtocol *)ba.data();
// int length = spp->len - 5;
int phaseByteSize = sizeof(Phase);
auto phaseParserFunc = [&](const int index){
Phase phase;
phase.onoff = 1;
phase.gas = cd.phase_data[index].gas;
phase.temp_flow = cd.phase_data[index].temp_flow;
phase.cutoff_temp = cd.phase_data[index].cutoff_temp;
phase.constant_temp_time_min =
cd.phase_data[index].constant_temp_time_min;
// CommonData cd;
// u8* cdPtr = (u8*)&cd;
localLength -= phaseByteSize;
localAddr += phaseByteSize;
};
// memcpy(cdPtr + spp->addr,spp->data_buf,length);
qDebug()<<"revDataParser run_type:"<<cd.run_mode;
int length = dataLength;
while(dataLength){
switch(addr){
case offsetof(CommonData,run_mode):
// Global::Mode mode = (Global::Mode)cd.run_mode;
length--;
while (localLength)
{
switch (localAddr)
{
case offsetof(CommonData, current_gas): //当前气氛
// gas_type_set(dev->temp, msg_data.current_gas);
localAddr += 1;
localLength -= 1;
break;
case offsetof(CommonData, auto_pid_temp_flow): //自整定升温速率
localAddr += 4;
localLength -= 4;
break;
case offsetof(CommonData, run_mode):
{
DeviceStartMode mode = (DeviceStartMode)cd.run_mode;
switch (mode)
{
case DeviceStartMode::Stop:
Global::instance()->setMode(Global::Mode::Analysis);
break;
case DeviceStartMode::Start:
Global::instance()->setMode(Global::Mode::ExperimentStart);
break;
default:
break;
}
//
localLength--;
localAddr++;
break;
}
case offsetof(CommonData, phase_data[0].onoff):
phaseParserFunc(0); break;
case offsetof(CommonData, phase_data[1].onoff):
phaseParserFunc(1); break;
case offsetof(CommonData, phase_data[2].onoff):
phaseParserFunc(2); break;
case offsetof(CommonData, phase_data[3].onoff):
phaseParserFunc(3); break;
case offsetof(CommonData, phase_data[4].onoff):
phaseParserFunc(4); break;
case offsetof(CommonData, phase_data[5].onoff):
phaseParserFunc(5); break;
default:break;
};
}
}
bool SerialPort::openSp()
{
if(_sp != nullptr && _sp->isOpen()){
if (_sp != nullptr && _sp->isOpen())
{
return true;
}
@ -205,7 +253,6 @@ bool SerialPort::openSp()
return true;
}
void SerialPort::sendCmd(const SerialPort::E_CMD_TYPE e)
{
#if 1
@ -347,7 +394,7 @@ void SerialPort::parserTest()
#endif
}
void SerialPort::slotConnectToDevice(const QByteArray &ba)
void SerialPort::slotDeliverData(const QByteArray &ba)
{
openSp();
@ -356,12 +403,22 @@ void SerialPort::slotConnectToDevice(const QByteArray &ba)
void SerialPort::slotSendData(const QByteArray &ba)
{
/***
*
* 1
*/
if(WRITE_CMD == ba.at(3)){
_lastWriteBa = ba;
}
qDebug() << "slotSendData:" << ba.size();
if(_sp != nullptr && _sp->isOpen()){
if (_sp != nullptr && _sp->isOpen())
{
_sp->write(ba);
}else{
qDebug()<<"sp not open.";
}
else
{
qDebug() << "sp not open.";
// qErrnoWarning("sp not open.");
return;
}
@ -369,7 +426,8 @@ void SerialPort::slotSendData(const QByteArray &ba)
void SerialPort::slotCloseSp()
{
if(_sp != nullptr && _sp->isOpen()){
if (_sp != nullptr && _sp->isOpen())
{
_sp->close();
}
}

View File

@ -25,7 +25,8 @@ public:
static void parserTest();
bool openSp();
public slots:
void slotConnectToDevice(const QByteArray&);
void slotDeliverData(const QByteArray&);
// void slotConnectToDevice(const QByteArray&);
void slotSendData(const QByteArray&);
void slotCloseSp();
signals:
@ -42,6 +43,7 @@ private:
private:
SerialPort(QObject* parent=nullptr);
QSerialPort *_sp;
QByteArray _lastWriteBa;
};
#endif // SERIALPORT_H

12
src/src/main.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "qt_new_proj.h"
#include <QApplication>
#pragma comment(lib, "user32.lib")
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qt_new_proj w;
w.show();
return a.exec();
}

13
src/src/qt_new_proj.cpp Normal file
View File

@ -0,0 +1,13 @@
#include "qt_new_proj.h"
qt_new_proj::qt_new_proj(QWidget* parent)
: QMainWindow(parent)
, ui(new Ui_qt_new_proj)
{
ui->setupUi(this);
}
qt_new_proj::~qt_new_proj()
{
delete ui;
}

14
src/src/qt_new_proj.h Normal file
View File

@ -0,0 +1,14 @@
#pragma once
#include "ui_qt_new_proj.h"
#include <QMainWindow>
class qt_new_proj : public QMainWindow {
Q_OBJECT
public:
qt_new_proj(QWidget* parent = nullptr);
~qt_new_proj();
private:
Ui_qt_new_proj* ui;
};

22
src/src/qt_new_proj.ui Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>qt_new_proj</class>
<widget class="QMainWindow" name="qt_new_proj">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>qt_new_proj</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar"/>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -55,6 +55,7 @@ void CentralWidget::slotModeModify(const Global::Mode mode)
void CentralWidget::slotRevCommonData(const CommonData &cd)
{
qDebug()<<"slotRevCommonData";
_customPlot->graph(0)->addData(cd.sample_temp, cd.dsc); // 添加数据到曲线
_customPlot->replot();
}

View File

@ -166,9 +166,9 @@ void ExperimentSettingForm::slotConnectToDevice()
QByteArray ba = DataParser::connectToDevice(phaseVtr);
qDebug()<<"ba size:"<<ba.size();
emit sigConnectToDevice(ba);
emit sigDeliverData(ba);
Global::instance()->setMode(Global::Mode::ConnectedToDev);
// Global::instance()->setMode(Global::Mode::ConnectedToDev);
#if 0
QByteArray startBa = DataParser::setDeviceStartStop(DeviceStartMode::Start);
@ -223,7 +223,7 @@ void ExperimentSettingForm::slotPhaseCheck()
}
}
void ExperimentSettingForm::on_pushButton_connect_to_device_clicked()
void ExperimentSettingForm::on_pushButton_deliverData_clicked()
{
slotConnectToDevice();
}

View File

@ -16,9 +16,9 @@ public:
~ExperimentSettingForm();
signals:
void sigConnectToDevice(const QByteArray&);
void sigDeliverData(const QByteArray&);
private slots:
void on_pushButton_connect_to_device_clicked();
void on_pushButton_deliverData_clicked();
private:
void uiReset();

View File

@ -460,7 +460,7 @@
</item>
</layout>
</widget>
<widget class="QPushButton" name="pushButton_connect_to_device">
<widget class="QPushButton" name="pushButton_deliverData">
<property name="geometry">
<rect>
<x>471</x>
@ -470,7 +470,7 @@
</rect>
</property>
<property name="text">
<string>连接仪器</string>
<string>下发数据</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_cancel">