diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..b9b2894 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "TimeSwitcherInterfaceDto.h" + +TimeSwitcherInterfaceDto::TimeSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherInterfaceDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ctrlStatus", ctrlStatus); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..b9b2894 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "TimeSwitcherInterfaceDto.h" + +TimeSwitcherInterfaceDto::TimeSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherInterfaceDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ctrlStatus", ctrlStatus); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h new file mode 100644 index 0000000..11e4b53 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef TIMESWITCHERINTERFACEDTO_H +#define TIMESWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // TIMESWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..b9b2894 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "TimeSwitcherInterfaceDto.h" + +TimeSwitcherInterfaceDto::TimeSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherInterfaceDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ctrlStatus", ctrlStatus); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h new file mode 100644 index 0000000..11e4b53 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef TIMESWITCHERINTERFACEDTO_H +#define TIMESWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // TIMESWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp new file mode 100644 index 0000000..1cad164 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp @@ -0,0 +1,65 @@ +#include "TimeSwitcherStatusDto.h" + +TimeSwitcherStatusDto::TimeSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("refTmSrc", refTmSrc); + dataObj.insert("oppsPhaseAccOut", oppsPhaseAccOut); + dataObj.insert("bacRatio", bacRatio); + dataObj.insert("bacRange", bacRange); + + QJsonArray tmSrcStatusArray; + QJsonArray tmSrcStatusStrArray; + QJsonArray localTmDiffArray; + QJsonArray delayCompensArray; + QJsonArray oppsOutStatusArray; + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 5; i++) + { + tmSrcStatusArray.append(tmSrcStatusList.at(i)); + QString tmSrcStatus = tmSrcStatusList.at(i); + if (tmSrcStatus.length() == 3) + { + QString tmSrcStatusStr = ""; + for (int j = 0; j < 3; j++) + { + if (tmSrcStatus.mid(j, 1) == '1') + { + tmSrcStatusStr += tmSrcStr[j] + ","; + } + } + tmSrcStatusStrArray.append(tmSrcStatusStr.mid(0, tmSrcStatusStr.length() - 1)); + } else + { + tmSrcStatusStrArray.append(""); + } + localTmDiffArray.append(localTmDiffList.at(i)); + delayCompensArray.append(delayCompensList.at(i)); + oppsOutStatusArray.append(oppsOutStatusList.at(i)); + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("tmSrcStatusArray", tmSrcStatusArray); + dataObj.insert("tmSrcStatusStrArray", tmSrcStatusStrArray); + dataObj.insert("localTmDiffArray", localTmDiffArray); + dataObj.insert("delayCompensArray", delayCompensArray); + dataObj.insert("oppsOutStatusArray", oppsOutStatusArray); + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..b9b2894 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "TimeSwitcherInterfaceDto.h" + +TimeSwitcherInterfaceDto::TimeSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherInterfaceDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ctrlStatus", ctrlStatus); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h new file mode 100644 index 0000000..11e4b53 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef TIMESWITCHERINTERFACEDTO_H +#define TIMESWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // TIMESWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp new file mode 100644 index 0000000..1cad164 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp @@ -0,0 +1,65 @@ +#include "TimeSwitcherStatusDto.h" + +TimeSwitcherStatusDto::TimeSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("refTmSrc", refTmSrc); + dataObj.insert("oppsPhaseAccOut", oppsPhaseAccOut); + dataObj.insert("bacRatio", bacRatio); + dataObj.insert("bacRange", bacRange); + + QJsonArray tmSrcStatusArray; + QJsonArray tmSrcStatusStrArray; + QJsonArray localTmDiffArray; + QJsonArray delayCompensArray; + QJsonArray oppsOutStatusArray; + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 5; i++) + { + tmSrcStatusArray.append(tmSrcStatusList.at(i)); + QString tmSrcStatus = tmSrcStatusList.at(i); + if (tmSrcStatus.length() == 3) + { + QString tmSrcStatusStr = ""; + for (int j = 0; j < 3; j++) + { + if (tmSrcStatus.mid(j, 1) == '1') + { + tmSrcStatusStr += tmSrcStr[j] + ","; + } + } + tmSrcStatusStrArray.append(tmSrcStatusStr.mid(0, tmSrcStatusStr.length() - 1)); + } else + { + tmSrcStatusStrArray.append(""); + } + localTmDiffArray.append(localTmDiffList.at(i)); + delayCompensArray.append(delayCompensList.at(i)); + oppsOutStatusArray.append(oppsOutStatusList.at(i)); + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("tmSrcStatusArray", tmSrcStatusArray); + dataObj.insert("tmSrcStatusStrArray", tmSrcStatusStrArray); + dataObj.insert("localTmDiffArray", localTmDiffArray); + dataObj.insert("delayCompensArray", delayCompensArray); + dataObj.insert("oppsOutStatusArray", oppsOutStatusArray); + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h new file mode 100644 index 0000000..3862cc4 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h @@ -0,0 +1,33 @@ +#ifndef TIMESWITCHERSTATUSDTO_H +#define TIMESWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherStatusDto(QObject *parent = nullptr); + + QString devStatus; // <1> + QString refSelectType; // <2> + QString refTmSrc; // <3> + QList tmSrcStatusList; // <4-8> + QList localTmDiffList; // <9-13> + qlonglong oppsPhaseAccOut; // <14> + qint8 bacRatio; // <15> B-AC调制比,2~6 + float bacRange; // <16> B-AC幅度,5表示0.5V,50表示5.0V,100表示10V + QList delayCompensList; // <17-22> + QList oppsOutStatusList; // <23> + QList bdcOutStatusList; // <24> + QList bacOutStatusList; // <25> + + QJsonObject toJSON(); + +private: + const QString tmSrcStr[3] = {"1PPS", "B-DC", "B-AC"}; +}; + +#endif // TIMESWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 4cec73e..91558e7 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,19 +6,20 @@ { ui->setupUi(this); -// SignalGenerator * device = new SignalGenerator(this); - FrequencyTuning * device = new FrequencyTuning(this); + sigGenDevice = new SignalGenerator(this); + freqTunDevice = new FrequencyTuning(this); + timeSwitDevice = new TimeSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, // this, &DevStatusWindow::drawCounterDataOnPage); - device->setComName("COM1"); - device->setBaudRate(9600); +// device->setComName("COM1"); +// device->setBaudRate(9600); - device->setDevCode("5001"); +// device->setDevCode("5001"); - device->initSerialPort(); +// device->initSerialPort(); } DevStatusWindow::~DevStatusWindow() @@ -26,3 +27,27 @@ delete ui; } + +void DevStatusWindow::on_sigGenButt_clicked() +{ + sigGenDevice->setComName("SignalGenerator"); + sigGenDevice->setDevCode("3001"); + + sigGenDevice->initSerialPort(); +} + +void DevStatusWindow::on_freqTunButt_clicked() +{ + freqTunDevice->setComName("FrequencyTuning"); + freqTunDevice->setDevCode("4001"); + + freqTunDevice->initSerialPort(); +} + +void DevStatusWindow::on_tmSwiButt_clicked() +{ + timeSwitDevice->setComName("TimeSwitcher"); + timeSwitDevice->setDevCode("5001"); + + timeSwitDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 1a440c0..292e730 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -5,6 +5,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" +#include "device/TimeSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -18,7 +19,18 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +private slots: + void on_sigGenButt_clicked(); + + void on_freqTunButt_clicked(); + + void on_tmSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; + + SignalGenerator * sigGenDevice; + FrequencyTuning * freqTunDevice; + TimeSwitcher * timeSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 1de0a2c..4059230 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -13,6 +13,97 @@ DevStatusWindow + + + + 50 + 50 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 270 + 50 + 180 + 40 + + + + Mock FrequencyTuning + + + + + + 490 + 50 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + 50 + 120 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + 270 + 120 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + 50 + 190 + 180 + 40 + + + + Mock TimeReplicator + + + + + + 270 + 190 + 180 + 40 + + + + Mock FreqReplicator + + diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index becf473..1af9dc0 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -28,11 +28,14 @@ this, &QSerialPortUtil::readData); // mock data received per second - QTimer * timer = new QTimer(this); - connect(timer, &QTimer::timeout, - this, &QSerialPortUtil::mockReceivData); - timer->start(1000 * 10); +// QTimer * timer = new QTimer(this); +// connect(timer, &QTimer::timeout, +// this, &QSerialPortUtil::mockReceivData); +// timer->start(1000 * 10); // } + + this->mockReceivData(portName); + } void QSerialPortUtil::sendData(QByteArray data) @@ -56,23 +59,34 @@ return this->open; } -void QSerialPortUtil::mockReceivData() +void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; - /* - // signal generator - buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); - buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); - buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); - buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); - buffer.append("$GLC,0,0*48").append("\r\n"); - */ + if (portName == "SignalGenerator") + { - // frequency tuning - buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + // signal generator + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); + buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); + buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); + buffer.append("$GLC,0,0*48").append("\r\n"); + + } else if (portName == "FrequencyTuning") + { + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + } else if (portName == "TimeSwitcher") + { + // time swifter + buffer.append("$GPZDA,211219.00,01,01,2000,0,01*5D").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLF,1,1,1,010,100,100,000,000,0,-235136964.75,-235136959.89,0,0,0,5,50,-16390,-16710,-15660,-16700,-17300,11111,11111,11111*51").append("\r\n"); + buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); + } emit dataRecieved(buffer); } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index accf403..d018557 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -21,7 +21,7 @@ bool open; - void mockReceivData(); + void mockReceivData(QString portName); signals: void dataRecieved(QByteArray data); // 收到数据的信号 diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp new file mode 100644 index 0000000..97a7f25 --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -0,0 +1,33 @@ +#include "DeviceBase.h" + +DeviceBase::DeviceBase(QObject *parent) : QObject(parent) +{ + +} + +void DeviceBase::setComName(QString comName) +{ + this->comName = comName; +} +void DeviceBase::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +void DeviceBase::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool DeviceBase::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void DeviceBase::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h new file mode 100644 index 0000000..3073fad --- /dev/null +++ b/DevStatusAcq/device/DeviceBase.h @@ -0,0 +1,37 @@ +#ifndef DEVICEBASE_H +#define DEVICEBASE_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +class DeviceBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceBase(QObject *parent = nullptr); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + void initSerialPort(); + bool isSerialOpen(); + +protected: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; +signals: + +}; + +#endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index 291a089..d80d17e 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -2,7 +2,7 @@ #include #include -FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); @@ -18,32 +18,7 @@ this, &FrequencyTuning::dataReceivedHandler); } -void FrequencyTuning::setComName(QString comName) -{ - this->comName = comName; -} -void FrequencyTuning::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString FrequencyTuning::getDevCode() -{ - return this->devCode; -} -void FrequencyTuning::setDevCode(QString devCode) -{ - this->devCode = devCode; -} -bool FrequencyTuning::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void FrequencyTuning::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void FrequencyTuning::dataReceivedHandler(QByteArray data) { diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index ffc702f..f49dfed 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -2,42 +2,20 @@ #define FREQUENCYTUNING_H #include -#include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" -#include "common/utils/QByteUtil.h" -#include "common/utils/QLogUtil.h" -#include "common/utils/SettingConfig.h" +#include "device/DeviceBase.h" #include "protocol/dto/FrequencyTuningStatusDto.h" #include "protocol/FrequencyTuningProtocolBM.h" -class FrequencyTuning : public QObject +class FrequencyTuning : public DeviceBase { Q_OBJECT public: explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void initSerialPort(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); - -private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; - signals: void sendDataToDraw(FrequencyTuningStatusDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp new file mode 100644 index 0000000..67fd1a3 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -0,0 +1,76 @@ +#include "TimeSwitcher.h" + +#include +#include + +TimeSwitcher::TimeSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +TimeSwitcher::~TimeSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeSwitcher::dataReceivedHandler); +} + +void TimeSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + tsFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + tsFrameDto->milisecond = now.toMSecsSinceEpoch(); + tsFrameDto->rawFrame = frameByte; + + this->afterFramePhase(tsFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete tsFrameDto; + } + } + } +} + +void TimeSwitcher::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h new file mode 100644 index 0000000..02306d1 --- /dev/null +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -0,0 +1,27 @@ +#ifndef TIMESWITCHER_H +#define TIMESWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/TimeSwitcherProtocolBM.h" + +class TimeSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeSwitcher(QObject *parent = nullptr); + ~TimeSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // TIMESWITCHER_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 794ec5e..a0be651 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,6 +1,10 @@ +HEADERS += $$PWD/DeviceBase.h HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h +HEADERS += $$PWD/TimeSwitcher.h +SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp +SOURCES += $$PWD/TimeSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp new file mode 100644 index 0000000..05a0253 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -0,0 +1,6 @@ +#include "DeviceStatusProtocolBase.h" + +DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h new file mode 100644 index 0000000..8482a48 --- /dev/null +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -0,0 +1,86 @@ +#ifndef DEVICESTATUSPROTOCOLBASE_H +#define DEVICESTATUSPROTOCOLBASE_H + +#include + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + + +class DeviceStatusProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + +signals: + +}; + +#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 5883aca..0bf0379 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -33,8 +33,8 @@ bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); - int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -98,7 +98,7 @@ int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 2cc3545..96e7ea4 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -4,32 +4,10 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 -static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; -static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FREQUENCY_TUNING_FRAME_TAIL.length() + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + - 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - class FrequencyTuningProtocolBM : public QObject { Q_OBJECT diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6d8efc1..0797d34 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -42,8 +42,8 @@ bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); QByteArray content = rawData.mid(start + 1, end - start - 1); QString contentStr = QString(content); @@ -131,7 +131,7 @@ int SignalGeneratorProtocolBM::checkFrame(QByteArray rawData) { // 帧尾不是\r\n - if (SIGNAL_GENERATOR_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - SIGNAL_GENERATOR_FRAME_TAIL.size())) + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) { return SIGNAL_GENERATOR_FRAME_TYPE::UNKNOW_FRAME; } diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 1519872..7cdd61a 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -4,48 +4,12 @@ #include #include +#include "protocol/DeviceStatusProtocolBase.h" #include "dto/SignalGeneratorInterfaceDto.h" #include "dto/SignalGeneratorStatusDto.h" #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 -static const QString SIGNAL_GENERATOR_FRAME_TAIL = "\r\n"; // 帧尾 -static const QString SIGNAL_GENERATOR_FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString SIGNAL_GENERATOR_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 - -static const int SIGNAL_GENERATOR_FRAME_SUM_LENGTH = 2; -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; -static const int SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE = 2; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - SIGNAL_GENERATOR_FRAME_TAIL.length() + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * SIGNAL_GENERATOR_FRAME_SUB_MIN_SIZE + - 1 + SIGNAL_GENERATOR_FRAME_SUM_LENGTH; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - class SignalGeneratorProtocolBM : public QObject { public: diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp new file mode 100644 index 0000000..2046ba2 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -0,0 +1,156 @@ +#include "TimeSwitcherProtocolBM.h" + +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +TimeSwitcherProtocolBM::~TimeSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * TimeSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new TimeSwitcherInterfaceDto(); + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new TimeSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((TimeSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((TimeSwitcherInterfaceDto *)frameData)->frameType = TIME_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case TimeSwitcherProtocolBM::TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((TimeSwitcherStatusDto *)frameData)->devStatus = subList.at(0); + ((TimeSwitcherStatusDto *)frameData)->refSelectType = subList.at(1); + ((TimeSwitcherStatusDto *)frameData)->refTmSrc = subList.at(2); + ((TimeSwitcherStatusDto *)frameData)->oppsPhaseAccOut = subList.at(13).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->bacRatio = subList.at(14).toInt(); + ((TimeSwitcherStatusDto *)frameData)->bacRange = subList.at(15).toFloat(); + for (int i = 0; i < 5; i++) + { + // + QString tmSrcStatus = subList.at(i + 3); + ((TimeSwitcherStatusDto *)frameData)->tmSrcStatusList.append(tmSrcStatus); + + // + double localTmDiff = subList.at(i + 8).toDouble(); + ((TimeSwitcherStatusDto *)frameData)->localTmDiffList.append(localTmDiff); + + // + qlonglong delayComp = subList.at(i + 16).toLongLong(); + ((TimeSwitcherStatusDto *)frameData)->delayCompensList.append(delayComp); + + // + QString oppsOutStatus = subList.at(21).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->oppsOutStatusList.append(oppsOutStatus); + + // + QString bdcOutStatus = subList.at(22).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bdcOutStatusList.append(bdcOutStatus); + + // + QString bacOutStatus = subList.at(23).mid(i, 1); + ((TimeSwitcherStatusDto *)frameData)->bacOutStatusList.append(bacOutStatus); + } + + ((TimeSwitcherStatusDto *)frameData)->frameType = TIME_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList TimeSwitcherProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int TimeSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (TIME_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (TIME_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, TIME_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return TIME_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return TIME_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h new file mode 100644 index 0000000..39436d9 --- /dev/null +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef TIMESWITCHERPROTOCOLBM_H +#define TIMESWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/TimeSwitcherInterfaceDto.h" +#include "protocol/dto/TimeSwitcherStatusDto.h" + +class TimeSwitcherProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit TimeSwitcherProtocolBM(QObject *parent = nullptr); + ~TimeSwitcherProtocolBM(); + + // 解析数据 + static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + static DeviceFrameBaseDto * frameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum TIME_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // TIMESWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp new file mode 100644 index 0000000..668ddfc --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp @@ -0,0 +1,6 @@ +#include "DeviceFrameBaseDto.h" + +DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h new file mode 100644 index 0000000..05d8280 --- /dev/null +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -0,0 +1,28 @@ +#ifndef DEVICEFRAMEBASEDTO_H +#define DEVICEFRAMEBASEDTO_H + +#include +#include +#include +#include + +class DeviceFrameBaseDto : public QObject +{ + Q_OBJECT +public: + explicit DeviceFrameBaseDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + QString frameType; // 帧类型 + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // DEVICEFRAMEBASEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..b9b2894 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "TimeSwitcherInterfaceDto.h" + +TimeSwitcherInterfaceDto::TimeSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherInterfaceDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ctrlStatus", ctrlStatus); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h new file mode 100644 index 0000000..11e4b53 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef TIMESWITCHERINTERFACEDTO_H +#define TIMESWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // TIMESWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp new file mode 100644 index 0000000..1cad164 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.cpp @@ -0,0 +1,65 @@ +#include "TimeSwitcherStatusDto.h" + +TimeSwitcherStatusDto::TimeSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("refTmSrc", refTmSrc); + dataObj.insert("oppsPhaseAccOut", oppsPhaseAccOut); + dataObj.insert("bacRatio", bacRatio); + dataObj.insert("bacRange", bacRange); + + QJsonArray tmSrcStatusArray; + QJsonArray tmSrcStatusStrArray; + QJsonArray localTmDiffArray; + QJsonArray delayCompensArray; + QJsonArray oppsOutStatusArray; + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 5; i++) + { + tmSrcStatusArray.append(tmSrcStatusList.at(i)); + QString tmSrcStatus = tmSrcStatusList.at(i); + if (tmSrcStatus.length() == 3) + { + QString tmSrcStatusStr = ""; + for (int j = 0; j < 3; j++) + { + if (tmSrcStatus.mid(j, 1) == '1') + { + tmSrcStatusStr += tmSrcStr[j] + ","; + } + } + tmSrcStatusStrArray.append(tmSrcStatusStr.mid(0, tmSrcStatusStr.length() - 1)); + } else + { + tmSrcStatusStrArray.append(""); + } + localTmDiffArray.append(localTmDiffList.at(i)); + delayCompensArray.append(delayCompensList.at(i)); + oppsOutStatusArray.append(oppsOutStatusList.at(i)); + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("tmSrcStatusArray", tmSrcStatusArray); + dataObj.insert("tmSrcStatusStrArray", tmSrcStatusStrArray); + dataObj.insert("localTmDiffArray", localTmDiffArray); + dataObj.insert("delayCompensArray", delayCompensArray); + dataObj.insert("oppsOutStatusArray", oppsOutStatusArray); + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h new file mode 100644 index 0000000..3862cc4 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeSwitcherStatusDto.h @@ -0,0 +1,33 @@ +#ifndef TIMESWITCHERSTATUSDTO_H +#define TIMESWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class TimeSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeSwitcherStatusDto(QObject *parent = nullptr); + + QString devStatus; // <1> + QString refSelectType; // <2> + QString refTmSrc; // <3> + QList tmSrcStatusList; // <4-8> + QList localTmDiffList; // <9-13> + qlonglong oppsPhaseAccOut; // <14> + qint8 bacRatio; // <15> B-AC调制比,2~6 + float bacRange; // <16> B-AC幅度,5表示0.5V,50表示5.0V,100表示10V + QList delayCompensList; // <17-22> + QList oppsOutStatusList; // <23> + QList bdcOutStatusList; // <24> + QList bacOutStatusList; // <25> + + QJsonObject toJSON(); + +private: + const QString tmSrcStr[3] = {"1PPS", "B-DC", "B-AC"}; +}; + +#endif // TIMESWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index b34eb88..497ab2a 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -1,22 +1,38 @@ +HEADERS += $$PWD/dto/DeviceFrameBaseDto.h +HEADERS += $$PWD/DeviceStatusProtocolBase.h HEADERS += $$PWD/dto/SignalGeneratorFrameDto.h HEADERS += $$PWD/dto/SignalGeneratorStatusDto.h HEADERS += $$PWD/dto/SignalGeneratorInterfaceDto.h HEADERS += $$PWD/dto/SignalGeneratorZDATimeDto.h HEADERS += $$PWD/dto/SignalGeneratorMJDTimeDto.h HEADERS += $$PWD/SignalGeneratorProtocolBM.h + HEADERS += $$PWD/dto/FrequencyTuningStatusDto.h HEADERS += $$PWD/dto/FrequencyTuningStatusFreqDto.h HEADERS += $$PWD/dto/FrequencyTuningStatusPulseDto.h HEADERS += $$PWD/FrequencyTuningProtocolBM.h +HEADERS += $$PWD/dto/TimeSwitcherStatusDto.h +HEADERS += $$PWD/dto/TimeSwitcherInterfaceDto.h +HEADERS += $$PWD/TimeSwitcherProtocolBM.h + + +SOURCES += $$PWD/dto/DeviceFrameBaseDto.cpp +SOURCES += $$PWD/DeviceStatusProtocolBase.cpp SOURCES += $$PWD/dto/SignalGeneratorFrameDto.cpp SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp SOURCES += $$PWD/dto/SignalGeneratorInterfaceDto.cpp SOURCES += $$PWD/dto/SignalGeneratorZDATimeDto.cpp SOURCES += $$PWD/dto/SignalGeneratorMJDTimeDto.cpp SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp + SOURCES += $$PWD/dto/FrequencyTuningStatusDto.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusFreqDto.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusPulseDto.cpp SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp + +SOURCES += +SOURCES += $$PWD/dto/TimeSwitcherStatusDto.cpp +SOURCES += $$PWD/dto/TimeSwitcherInterfaceDto.cpp +SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp