diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a63d0df..a39a198 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -23,8 +23,16 @@ MainWindow::MainWindow(QWidget *parent) setCentralWidget(_centralWidget); addDockWidget(Qt::LeftDockWidgetArea, _leftWidget); - + // + ui->statusbar->showMessage("showMessage show temp message!"); + // permenent show + QLabel *permenentLabel = new QLabel(this); + permenentLabel->setText("Permanent show!"); + ui->statusbar->addPermanentWidget(permenentLabel); + // connections(); + // + _realTimeDataForm->show(); } MainWindow::~MainWindow() @@ -38,8 +46,15 @@ void MainWindow::connections() connect(_expertmentSettingForm,&ExperimentSettingForm::sigConnectToDevice, SerialPort::instance(),&SerialPort::slotConnectToDevice); //dynamic data +#if 1 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 + //mode connect(Global::instance(),&Global::sigModeModify, _centralWidget,&CentralWidget::slotModeModify); @@ -64,7 +79,7 @@ void MainWindow::on_actionStop_triggered() { QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Stop); SerialPort::instance()->slotSendData(ba); - SerialPort::instance()->slotCloseSp(); + // SerialPort::instance()->slotCloseSp(); } void MainWindow::on_actionNew_triggered() @@ -75,6 +90,10 @@ void MainWindow::on_actionNew_triggered() void MainWindow::on_actionStart_triggered() { QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Start); + + QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 + qDebug() << "on_actionStart_triggered info (hex):" << hexData; + SerialPort::instance()->slotSendData(ba); } diff --git a/src/mainwindow.h b/src/mainwindow.h index b704a15..1d5b85e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -2,11 +2,13 @@ #define MAINWINDOW_H #include +#include #include "centralwidget.h" #include "leftwidget.h" #include "experimentsettingform.h" #include "realtimedataform.h" +#include "dataparser.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -35,5 +37,6 @@ private: LeftWidget*_leftWidget; ExperimentSettingForm *_expertmentSettingForm; RealTimeDataForm* _realTimeDataForm; + QStatusBar *_statusBar; }; #endif // MAINWINDOW_H diff --git a/src/serialport/dataparser.cpp b/src/serialport/dataparser.cpp index 59418dd..34f4d72 100644 --- a/src/serialport/dataparser.cpp +++ b/src/serialport/dataparser.cpp @@ -1,12 +1,11 @@ #include #include +#include #include "dataparser.h" #include "defines.h" +#include "global.h" -DataParser::DataParser() -{ -} bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd) { @@ -17,7 +16,6 @@ bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd) static_cast(charArray[1]) == 0x5A) { // std::cout << "前两个字节是 0x5AA5 (小端)" << std::endl; - } else { @@ -37,6 +35,41 @@ bool DataParser::commonDataParser(const QByteArray &ba, CommonData &cd) 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:"<addr){ + case offsetof(CommonData,run_mode): + Global::Mode mode = (Global::Mode)cd.run_mode; + length--; + break; + }; + } +} +#endif + +void DataParser::writeData(const QByteArray &) +{ + +} + + QByteArray DataParser::connectToDevice(const QVector &vtr) { const int phaseLength = sizeof(Phase); @@ -90,6 +123,24 @@ QByteArray DataParser::connectToDevice(const QVector &vtr) QByteArray DataParser::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; + + int sppValidLength = 6 + 1; + + u8 *dataPtr = (u8*)&spp; + u16 crc = modbusCRC16((u8*)(dataPtr + 3),4); + + return QByteArray((char*)&spp,sppValidLength) + + QByteArray((char*)&crc,2); +#endif + +#if 0 char data[300] = {}; // header u16 header = 0x5aa5; @@ -114,6 +165,7 @@ QByteArray DataParser::setDeviceStartStop(const DeviceStartMode mode) int length = 9; return QByteArray(data,length); +#endif } unsigned short DataParser::modbusCRC16(unsigned char *data, unsigned short length) diff --git a/src/serialport/dataparser.h b/src/serialport/dataparser.h index 7d5162e..c39ece8 100644 --- a/src/serialport/dataparser.h +++ b/src/serialport/dataparser.h @@ -3,20 +3,45 @@ #include #include +#include #include "protocol.h" #include "defines.h" +namespace DataParser { +QByteArray connectToDevice(const QVector&); +QByteArray setDeviceStartStop(const DeviceStartMode); + +bool commonDataParser(const QByteArray&ba,CommonData &cd); +void writeData(const QByteArray&); + +unsigned short modbusCRC16(unsigned char *data,unsigned short length); +} + +#if 0 class DataParser { public: - DataParser(); + void dataParser(const QByteArray& ba); static unsigned short modbusCRC16(unsigned char *data,unsigned short length); static QByteArray connectToDevice(const QVector&); static QByteArray setDeviceStartStop(const DeviceStartMode); static bool commonDataParser(const QByteArray&ba,CommonData &cd); + bool revDataParser(const QByteArray&ba); +#if 0 +public slots: + void slotDataParser(const QByteArray& ba); +signals: + void sigSendCommonData(const CommonData&); + void sigSendCommonDataToRealDataForm(const CommonData&); +#endif +private: + void writeData(const QByteArray&); + void readData(const QByteArray&); }; +#endif + #endif // DATAPARSER_H diff --git a/src/serialport/protocol.h b/src/serialport/protocol.h index 2c0824c..b16b096 100644 --- a/src/serialport/protocol.h +++ b/src/serialport/protocol.h @@ -17,14 +17,14 @@ enum DeviceStartMode{ StopAutoTune // 停止升温速率自整定 }; -struct com_protocol +typedef struct com_protocol { uint16_t head; uint8_t len; uint8_t cmd; uint16_t addr; uint8_t data_buf[256]; -}; +}SerialPortProtocol; typedef enum gas_type { NC, diff --git a/src/serialport/serialport.cpp b/src/serialport/serialport.cpp index bfaf193..3ad2462 100644 --- a/src/serialport/serialport.cpp +++ b/src/serialport/serialport.cpp @@ -93,53 +93,67 @@ void SerialPort::timerEvent(QTimerEvent *event) void SerialPort::slotReadData() { +#if 1 QByteArray ba = _sp->readAll(); #if 0 - // 将 QByteArray 转换为十六进制字符串 QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 qDebug() << "receive info (hex):" << hexData; #endif + SerialPortProtocol *spp = (SerialPortProtocol*)ba.data(); + qDebug()<<"header:"<head,16).toUpper(); + if(FRANE_HEAD != spp->head){ + qDebug()<<"Data header error."; + return; + } + + int length = spp->len - 5; + CommonData cd; - if (!DataParser::commonDataParser(ba, cd)) - { - qDebug() << "CommonData parse failed."; + u8* cdPtr = (u8*)&cd; + memcpy(cdPtr + spp->addr,spp->data_buf,length); + + if(WRITE_CMD == spp->cmd){ + writeCmdHandle(spp->len,spp->addr,cd); + }else{ + if(Global::Mode::ExperimentStart == Global::instance()->getMode()){ + emit sigSendCommonData(cd); + } + emit sigSendCommonDataToRealDataForm(cd); } - - // 格式化输出 float 类型,保留两位小数 - QString formattedRunTime = QString::number(cd.add_run_time, 'f', 2); - qDebug() << "run time:" << formattedRunTime; - - qDebug()<<"phase:"<getMode()){ - emit sigSendCommonData(cd); - } - -#if 0 - CommonData *serialPortData = - reinterpret_cast(const_cast(&data.data()[6])); - - // 格式化输出 double 类型,保留三位小数 - QString formattedSampleTemp = QString::number(serialPortData->sample_temp, 'f', 3); - qDebug() << "sample temp:" << formattedSampleTemp; - - QString formattedColdTemp = QString::number(serialPortData->cold_temp, 'f', 3); - qDebug() << "cold temp:" << formattedColdTemp; - - emit sigSendSerialPortData(*serialPortData); #endif } +void SerialPort::writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd) +{ +#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:"<isOpen()){ @@ -351,29 +365,6 @@ void SerialPort::slotSendData(const QByteArray &ba) // qErrnoWarning("sp not open."); return; } - -#if 0 - // 将 QByteArray 转换为十六进制字符串 - QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 - qDebug() << "send info (hex):" << hexData; -#endif - - CommonData cd; - if (!DataParser::commonDataParser(ba, cd)) - { - qDebug() << "CommonData parse failed."; - } - - // 格式化输出 float 类型,保留两位小数 - QString formattedRunTime = QString::number(cd.add_run_time, 'f', 2); - qDebug() << "run time:" << formattedRunTime; - - // 格式化输出 double 类型,保留三位小数 - QString formattedSampleTemp = QString::number(cd.sample_temp, 'f', 3); - qDebug() << "sample temp:" << formattedSampleTemp; - - QString formattedColdTemp = QString::number(cd.cold_temp, 'f', 3); - qDebug() << "cold temp:" << formattedColdTemp; } void SerialPort::slotCloseSp() diff --git a/src/serialport/serialport.h b/src/serialport/serialport.h index f864775..dfeded9 100644 --- a/src/serialport/serialport.h +++ b/src/serialport/serialport.h @@ -5,6 +5,7 @@ #include #include +#include "defines.h" #include "protocol.h" class SerialPort:public QObject @@ -28,13 +29,14 @@ public slots: void slotSendData(const QByteArray&); void slotCloseSp(); signals: - // void sigSendSerialPortData(const CommonData&); void sigSendCommonData(const CommonData&); + void sigSendCommonDataToRealDataForm(const CommonData&); protected: void timerEvent(QTimerEvent *event); private slots: void slotReadData(); private: + void writeCmdHandle(const int dataLength,const u16 addr,const CommonData&cd); void to_hex(char* in_char, int char_length, char* out_char); void displayPortInfo(); private: diff --git a/src/ui/realtimedataform.cpp b/src/ui/realtimedataform.cpp index b6bf004..00008ac 100644 --- a/src/ui/realtimedataform.cpp +++ b/src/ui/realtimedataform.cpp @@ -2,12 +2,10 @@ #include "realtimedataform.h" #include "ui_realtimedataform.h" -RealTimeDataForm::RealTimeDataForm(QWidget *parent) : - QWidget(parent), - ui(new Ui::RealTimeDataForm) +RealTimeDataForm::RealTimeDataForm(QWidget *parent) : QWidget(parent), + ui(new Ui::RealTimeDataForm) { ui->setupUi(this); - } RealTimeDataForm::~RealTimeDataForm() @@ -15,7 +13,7 @@ RealTimeDataForm::~RealTimeDataForm() delete ui; } -void RealTimeDataForm::slotRevSerialPortData(const CommonData & data) +void RealTimeDataForm::slotRevCommonData(const CommonData &data) { #if 0 qDebug()<<"rev-------------------------"; @@ -26,7 +24,7 @@ void RealTimeDataForm::slotRevSerialPortData(const CommonData & data) QString formattedColdTemp = QString::number(data.cold_temp, 'f', 3); qDebug() << "cold temp:" << formattedColdTemp; #endif - //异常信息 + // 异常信息 /** * @brief abnormalStr * 0:空闲状态 @@ -36,39 +34,71 @@ void RealTimeDataForm::slotRevSerialPortData(const CommonData & data) 4:升温速率自整定 */ - QString abnormalStr = "空闲状态"; + QString abnormalStr = "正常"; - switch (data.hardware_err) { - case 0:abnormalStr = "空闲状态"; + switch (data.hardware_err) + { + case 0: + abnormalStr = "正常"; break; - case 1:abnormalStr = "加热运行"; + case 1: + abnormalStr = "冷端温度错误"; break; - case 2:abnormalStr = "恒温运行"; + case 2: + abnormalStr = "采集板卡错误"; break; - case 3:abnormalStr = "冷却中"; + case 3: + abnormalStr = "样品温度错误"; + break; + case 4: + abnormalStr = "DSC错误"; + break; + case 5: + abnormalStr = "加热模块错误"; + break; + default: break; - case 4:abnormalStr = "升温速率自整定";break; - default:break; } ui->abnormalLineEdit->setText(abnormalStr); - //运行状态 - ui->runStatusLineEdit->setText(QString::number(data.run_type)); - //当前阶段 + // 运行状态 + QString runTypeStr = "空闲状态"; + switch (data.run_type) + { + case 0: + runTypeStr = "空闲状态"; + break; + case 1: + runTypeStr = "加热运行"; + break; + case 2: + runTypeStr = "恒温运行"; + break; + case 3: + runTypeStr = "冷却中"; + break; + case 4: + runTypeStr = "升温速率自整定"; + break; + default: + break; + } + ui->runStatusLineEdit->setText(runTypeStr); + // 当前阶段 ui->currentStageLineEdit->setText(QString::number(data.current_phase)); - //累计运行时间 + // 累计运行时间 ui->addruntimeLineEdit->setText(QString::number(data.add_run_time, 'f', 3)); - //恒温时间 + // 恒温时间 ui->constantTempTimeLineEdit->setText(QString::number(data.add_constan_temp_time, 'f', 3)); - //温度 + // 温度 ui->tempLineEdit->setText(QString::number(data.sample_temp, 'f', 3)); - //DSC + // DSC ui->dSCMwLineEdit->setText(QString::number(data.dsc, 'f', 3)); - //样品质量 + // 样品质量 ui->weightLineEdit->setText("--"); - //通氧时间 + // 通氧时间 ui->oxyTimeLineEdit->setText("--"); - //扫描速率 + // 扫描速率 ui->scanRateLineEdit->setText("--"); - //当前气氛 + // 当前气氛 ui->currentAtmosphereLineEdit->setText(QString::number(data.current_gas)); } diff --git a/src/ui/realtimedataform.h b/src/ui/realtimedataform.h index 9844191..508c74b 100644 --- a/src/ui/realtimedataform.h +++ b/src/ui/realtimedataform.h @@ -17,7 +17,7 @@ public: explicit RealTimeDataForm(QWidget *parent = nullptr); ~RealTimeDataForm(); public: - void slotRevSerialPortData(const CommonData&); + void slotRevCommonData(const CommonData&); private: Ui::RealTimeDataForm *ui; };