diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + 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 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp index 2ef1c14..736c4c7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorStatusDto.h" -SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp index 2ef1c14..736c4c7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorStatusDto.h" -SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h index 53a8186..8268fef 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORSTATUSDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorStatusDto class * 信号产生器 工作状态信息 */ -class SignalGeneratorStatusDto : public SignalGeneratorFrameDto +class SignalGeneratorStatusDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp index 2ef1c14..736c4c7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorStatusDto.h" -SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h index 53a8186..8268fef 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORSTATUSDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorStatusDto class * 信号产生器 工作状态信息 */ -class SignalGeneratorStatusDto : public SignalGeneratorFrameDto +class SignalGeneratorStatusDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp index ab06c2e..8e5334c 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorZDATimeDto.h" -SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp index 2ef1c14..736c4c7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorStatusDto.h" -SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h index 53a8186..8268fef 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORSTATUSDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorStatusDto class * 信号产生器 工作状态信息 */ -class SignalGeneratorStatusDto : public SignalGeneratorFrameDto +class SignalGeneratorStatusDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp index ab06c2e..8e5334c 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorZDATimeDto.h" -SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h index 8e762a8..79049a7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORZDATIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorZDATimeDto class * 信号产生器 ZDA时间信息 */ -class SignalGeneratorZDATimeDto : public SignalGeneratorFrameDto +class SignalGeneratorZDATimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 91558e7..0633da3 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -9,6 +9,7 @@ sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); + freqSwitDevice = new FreqSwitcher(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -51,3 +52,12 @@ timeSwitDevice->initSerialPort(); } + +void DevStatusWindow::on_freqSwiButt_clicked() +{ + freqSwitDevice->setComName("FreqSwitcher"); + freqSwitDevice->setDevCode("6001"); + + freqSwitDevice->initSerialPort(); + +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 292e730..a7996ef 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -6,6 +6,7 @@ #include "device/SignalGenerator.h" #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" +#include "device/FreqSwitcher.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -26,11 +27,14 @@ void on_tmSwiButt_clicked(); + void on_freqSwiButt_clicked(); + private: Ui::DevStatusWindow *ui; SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; + FreqSwitcher * freqSwitDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 1af9dc0..c424b5a 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -81,11 +81,17 @@ buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { - // time swifter + // time switcher 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"); + } else if (portName == "FreqSwitcher") + { + // freq switcher + buffer.append("$GLF,0,4,0,0,22000,-745,-776,0,0,0,0,0,100,100,0,0,0,1,00000,111111,111111*54").append("\r\n"); + buffer.append("$GLC,0*54").append("\r\n"); + buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,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/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp new file mode 100644 index 0000000..c64e69e --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -0,0 +1,80 @@ +#include "FreqSwitcher.h" + +#include +#include + +FreqSwitcher::FreqSwitcher(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqSwitcher::~FreqSwitcher() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqSwitcher::dataReceivedHandler); +} + +void FreqSwitcher::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); + if (tsFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(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 FreqSwitcher::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/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h new file mode 100644 index 0000000..a38769b --- /dev/null +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -0,0 +1,29 @@ +#ifndef FREQSWITCHER_H +#define FREQSWITCHER_H + +#include + +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/FreqSwitcherProtocolBM.h" + +class FreqSwitcher : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqSwitcher(QObject *parent = nullptr); + ~FreqSwitcher(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQSWITCHER_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index d80d17e..fe674c5 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -10,6 +10,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } FrequencyTuning::~FrequencyTuning() @@ -26,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -34,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); - FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); if (ftFrameDto != nullptr) { // ★解析成数据对象 - bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); // 解析成功 if (parse == true) @@ -61,7 +63,7 @@ } } -void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * frameDto) +void FrequencyTuning::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index f49dfed..40d7629 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,7 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -14,10 +14,13 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(FrequencyTuningStatusDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +private: + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(FrequencyTuningStatusDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index 135f881..c72544a 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -3,7 +3,7 @@ #include #include -SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) +SignalGenerator::SignalGenerator(QObject *parent) : DeviceBase(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } SignalGenerator::~SignalGenerator() @@ -19,32 +21,6 @@ this, &SignalGenerator::dataReceivedHandler); } -void SignalGenerator::setComName(QString comName) -{ - this->comName = comName; -} -void SignalGenerator::setBaudRate(int baudRate) -{ - this->baudRate = baudRate; -} -QString SignalGenerator::getDevCode() -{ - return this->devCode; -} -void SignalGenerator::setDevCode(QString devCode) -{ - this->devCode = devCode; -} - -bool SignalGenerator::isSerialOpen() -{ - return this->serialUtil.isOpen(); -} - -void SignalGenerator::initSerialPort() -{ - this->serialUtil.openSerialPort(this->comName, this->baudRate); -} void SignalGenerator::dataReceivedHandler(QByteArray data) { @@ -52,7 +28,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -60,12 +36,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); - SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * sgFrameDto = protocol->frameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 - bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) @@ -87,7 +63,7 @@ } } -void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) +void SignalGenerator::afterFramePhase(DeviceFrameBaseDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index a295955..70330af 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -2,44 +2,25 @@ #define SIGNALGENERATOR_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 "protocol/dto/SignalGeneratorFrameDto.h" +#include "device/DeviceBase.h" +#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" -class SignalGenerator : public QObject +class SignalGenerator : public DeviceBase { Q_OBJECT public: explicit SignalGenerator(QObject *parent = nullptr); ~SignalGenerator(); - void initSerialPort(); - - void afterFramePhase(SignalGeneratorFrameDto * frameDto); - - void setComName(QString comName); - void setBaudRate(int baudRate); - QString getDevCode(); - void setDevCode(QString devCode); - - bool isSerialOpen(); + void afterFramePhase(DeviceFrameBaseDto * frameDto); private: - QString devCode; - QString comName; - int baudRate; - - QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; - QByteArray dataBuff; + DeviceStatusProtocolBase * protocol; signals: - void sendDataToDraw(SignalGeneratorFrameDto * frameData); + void sendDataToDraw(DeviceFrameBaseDto * frameData); public slots: void dataReceivedHandler(QByteArray data); diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 67fd1a3..004eeb4 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -11,6 +11,8 @@ kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } TimeSwitcher::~TimeSwitcher() @@ -25,7 +27,7 @@ std::cout << dataBuff.toStdString() << std::endl; - QList frameList = TimeSwitcherProtocolBM::extractFrameList(this->dataBuff); + QList frameList = protocol->extractFrameList(this->dataBuff); if (frameList.size() > 0) { @@ -33,12 +35,12 @@ { QByteArray frameByte = frameList.at(i); - int frameType = TimeSwitcherProtocolBM::checkFrame(frameByte); - DeviceFrameBaseDto * tsFrameDto = TimeSwitcherProtocolBM::frameFactory(frameType); + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * tsFrameDto = protocol->frameFactory(frameType); if (tsFrameDto != nullptr) { // ★解析成数据对象 - bool parse = TimeSwitcherProtocolBM::parseTimeSwitcherData(frameByte, tsFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, tsFrameDto, frameType); // 解析成功 if (parse == true) diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 02306d1..3bf458f 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -16,6 +16,9 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); +private: + DeviceStatusProtocolBase * protocol; + signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index a0be651..16877b5 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -3,8 +3,10 @@ HEADERS += $$PWD/SignalGenerator.h HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h +HEADERS += $$PWD/FreqSwitcher.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp +SOURCES += $$PWD/FreqSwitcher.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 05a0253..0381234 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,6 +1,32 @@ #include "DeviceStatusProtocolBase.h" +#include "SignalGeneratorProtocolBM.h" +#include "FrequencyTuningProtocolBM.h" +#include "TimeSwitcherProtocolBM.h" +#include "FreqSwitcherProtocolBM.h" + +#include DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) { } + +DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) +{ + std::cout << deviceType.toStdString() << std::endl; + if (deviceType.contains("SignalGenerator") == true) + { + return new SignalGeneratorProtocolBM(); + } else if (deviceType.contains("FrequencyTuning") == true) + { + return new FrequencyTuningProtocolBM(); + } else if (deviceType.contains("TimeSwitcher") == true) + { + return new TimeSwitcherProtocolBM(); + } else if (deviceType.contains("FreqSwitcher") == true) + { + return new FreqSwitcherProtocolBM(); + } + + return nullptr; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 8482a48..3ad7a30 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -2,6 +2,7 @@ #define DEVICESTATUSPROTOCOLBASE_H #include +#include "dto/DeviceFrameBaseDto.h" static const QString FRAME_TAIL = "\r\n"; // 帧尾 static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 @@ -20,6 +21,9 @@ static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_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; @@ -32,6 +36,9 @@ static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + @@ -60,6 +67,13 @@ FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_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"; @@ -72,6 +86,9 @@ static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + class DeviceStatusProtocolBase : public QObject { @@ -79,6 +96,13 @@ public: explicit DeviceStatusProtocolBase(QObject *parent = nullptr); + static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; + signals: }; diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp new file mode 100644 index 0000000..ba26a62 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.cpp @@ -0,0 +1,160 @@ +#include "FreqSwitcherProtocolBM.h" + +FreqSwitcherProtocolBM::FreqSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqSwitcherProtocolBM::~FreqSwitcherProtocolBM() +{ + +} + +DeviceFrameBaseDto * FreqSwitcherProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + frameData = new FreqSwitcherInterfaceDto(); + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + frameData = new FreqSwitcherStatusDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FreqSwitcherProtocolBM::parseDeviceFrameData(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 FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME : + + ((FreqSwitcherInterfaceDto *)frameData)->ctrlStatus = subList.at(0); + ((FreqSwitcherInterfaceDto *)frameData)->frameType = FREQ_SWITCHER_INTERFACE_FRAME_TYPE; + break; + + case FreqSwitcherProtocolBM::FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME : + + ((FreqSwitcherStatusDto *)frameData)->devStatus = subList.at(17); + ((FreqSwitcherStatusDto *)frameData)->lockPhaseType = subList.at(0); + ((FreqSwitcherStatusDto *)frameData)->digitalLockPhaseStatus = subList.at(1); + ((FreqSwitcherStatusDto *)frameData)->refSelectType = subList.at(2); + ((FreqSwitcherStatusDto *)frameData)->refFreqSrc = subList.at(3); + ((FreqSwitcherStatusDto *)frameData)->freqAdjustAcc = subList.at(10).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->phaseAdjustAcc = subList.at(11).toLongLong(); + for (int i = 0; i < 5; i++) + { + // + QString freqRefStatus = subList.at(4).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->freqRefStatusList.append(freqRefStatus); + + // + qlonglong localFreqDiff = subList.at(i + 5).toLongLong(); + ((FreqSwitcherStatusDto *)frameData)->localFreqDiffList.append(localFreqDiff); + + // + float freqRefWeight = subList.at(i + 12).toFloat(); + ((FreqSwitcherStatusDto *)frameData)->freqRefWeightList.append(freqRefWeight); + + // + QString inputFreqType = subList.at(18).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->inputFreqTypeList.append(inputFreqType); + } + + for (int i = 0; i < 6; i++) + { + // + QString outTenStatus = subList.at(19).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outTenStatusList.append(outTenStatus); + + // + QString outFiveStatus = subList.at(20).mid(i, 1); + ((FreqSwitcherStatusDto *)frameData)->outFiveStatusList.append(outFiveStatus); + } + + ((FreqSwitcherStatusDto *)frameData)->frameType = FREQ_SWITCHER_STATUS_FRAME_TYPE; + break; + + } + + return true; +} + +QList FreqSwitcherProtocolBM::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 FreqSwitcherProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQ_SWITCHER_INTERFACE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_INTERFACE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::INTERFACE_FRAME; + } + } else if (FREQ_SWITCHER_STATUS_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQ_SWITCHER_STATUS_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH) + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQ_SWITCHER_FRAME_TYPE::STATUS_FRAME; + } + } else + { + return FREQ_SWITCHER_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h new file mode 100644 index 0000000..b1e65f7 --- /dev/null +++ b/DevStatusAcq/protocol/FreqSwitcherProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQSWITCHERPROTOCOLBM_H +#define FREQSWITCHERPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/dto/FreqSwitcherInterfaceDto.h" +#include "protocol/dto/FreqSwitcherStatusDto.h" + +class FreqSwitcherProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqSwitcherProtocolBM(QObject *parent = nullptr); + ~FreqSwitcherProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQ_SWITCHER_FRAME_TYPE + { + UNKNOW_FRAME = 0, + INTERFACE_FRAME = 1, + STATUS_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQSWITCHERPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 0bf0379..51b6542 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningProtocolBM.h" -FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -10,9 +10,9 @@ } -FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) { - FrequencyTuningStatusDto * frameData = 0; + DeviceFrameBaseDto * frameData = 0; switch (frameType) { case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : frameData = new FrequencyTuningStatusFreqDto(); @@ -30,7 +30,7 @@ return frameData; } -bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 96e7ea4..1937f92 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -8,7 +8,7 @@ #include "dto/FrequencyTuningStatusFreqDto.h" #include "dto/FrequencyTuningStatusPulseDto.h" -class FrequencyTuningProtocolBM : public QObject +class FrequencyTuningProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~FrequencyTuningProtocolBM(); // 解析数据 - static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); - static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum FREQUENCY_TUNING_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 0797d34..6fc9ed8 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -1,7 +1,7 @@ #include "SignalGeneratorProtocolBM.h" #include -SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : QObject(parent) +SignalGeneratorProtocolBM::SignalGeneratorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -11,9 +11,9 @@ } -SignalGeneratorFrameDto * SignalGeneratorProtocolBM::sgFrameFactory(int frameType) +DeviceFrameBaseDto * SignalGeneratorProtocolBM::frameFactory(int frameType) { - SignalGeneratorFrameDto * sgFrameData = 0; + DeviceFrameBaseDto * sgFrameData = 0; switch (frameType) { case SignalGeneratorProtocolBM::SIGNAL_GENERATOR_FRAME_TYPE::INTERFACE_FRAME : sgFrameData = new SignalGeneratorInterfaceDto(); @@ -39,7 +39,7 @@ return sgFrameData; } -bool SignalGeneratorProtocolBM::parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType) +bool SignalGeneratorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 7cdd61a..475e3ec 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -10,21 +10,21 @@ #include "dto/SignalGeneratorMJDTimeDto.h" #include "dto/SignalGeneratorZDATimeDto.h" -class SignalGeneratorProtocolBM : public QObject +class SignalGeneratorProtocolBM : public DeviceStatusProtocolBase { public: explicit SignalGeneratorProtocolBM(QObject *parent = nullptr); ~SignalGeneratorProtocolBM(); // 解析数据 - static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); - static SignalGeneratorFrameDto * sgFrameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum SIGNAL_GENERATOR_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp index 2046ba2..0365d10 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.cpp @@ -1,6 +1,6 @@ #include "TimeSwitcherProtocolBM.h" -TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : QObject(parent) +TimeSwitcherProtocolBM::TimeSwitcherProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) { } @@ -30,7 +30,7 @@ return frameData; } -bool TimeSwitcherProtocolBM::parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +bool TimeSwitcherProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) { // get the raw data between ',' and '*' int start = rawData.indexOf(FRAME_CONTENT_SEP); diff --git a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h index 39436d9..4799498 100644 --- a/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h +++ b/DevStatusAcq/protocol/TimeSwitcherProtocolBM.h @@ -8,7 +8,7 @@ #include "protocol/dto/TimeSwitcherInterfaceDto.h" #include "protocol/dto/TimeSwitcherStatusDto.h" -class TimeSwitcherProtocolBM : public QObject +class TimeSwitcherProtocolBM : public DeviceStatusProtocolBase { Q_OBJECT public: @@ -16,14 +16,14 @@ ~TimeSwitcherProtocolBM(); // 解析数据 - static bool parseTimeSwitcherData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); - static DeviceFrameBaseDto * frameFactory(int frameType); + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); // - static QList extractFrameList(QByteArray rawData); + QList extractFrameList(QByteArray rawData); // 检测帧格式,帧头帧尾 - static int checkFrame(QByteArray rawData); + int checkFrame(QByteArray rawData); enum TIME_SWITCHER_FRAME_TYPE { diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp deleted file mode 100644 index 668ddfc..0000000 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "DeviceFrameBaseDto.h" - -DeviceFrameBaseDto::DeviceFrameBaseDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 05d8280..5c63915 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -10,7 +10,7 @@ { Q_OBJECT public: - explicit DeviceFrameBaseDto(QObject *parent = nullptr); + explicit DeviceFrameBaseDto(QObject *parent = nullptr) {} QByteArray rawFrame; // 原始帧字节数组 diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp new file mode 100644 index 0000000..bc75c2d --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.cpp @@ -0,0 +1,20 @@ +#include "FreqSwitcherInterfaceDto.h" + +FreqSwitcherInterfaceDto::FreqSwitcherInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherInterfaceDto::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/FreqSwitcherInterfaceDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h new file mode 100644 index 0000000..5203af6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherInterfaceDto.h @@ -0,0 +1,19 @@ +#ifndef FREQSWITCHERINTERFACEDTO_H +#define FREQSWITCHERINTERFACEDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherInterfaceDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqSwitcherInterfaceDto(QObject *parent = nullptr); + + QString ctrlStatus; // <1> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERINTERFACEDTO_H diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp new file mode 100644 index 0000000..dffbad6 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.cpp @@ -0,0 +1,51 @@ +#include "FreqSwitcherStatusDto.h" + +FreqSwitcherStatusDto::FreqSwitcherStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqSwitcherStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("refSelectType", refSelectType); + dataObj.insert("lockPhaseType", lockPhaseType); + dataObj.insert("digitalLockPhaseStatus", digitalLockPhaseStatus); + dataObj.insert("refFreqSrc", refFreqSrc); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("phaseAdjustAcc", phaseAdjustAcc); + + QJsonArray freqRefStatusArray; + QJsonArray localFreqDiffArray; + QJsonArray freqRefWeightArray; + QJsonArray inputFreqTypeArray; + QJsonArray outTenStatusArray; + QJsonArray outFiveStatusArray; + for (int i = 0; i < 5; i++) + { + freqRefStatusArray.append(freqRefStatusList.at(i)); + localFreqDiffArray.append(localFreqDiffList.at(i)); + freqRefWeightArray.append(freqRefWeightList.at(i)); + inputFreqTypeArray.append(inputFreqTypeList.at(i)); + } + for (int i = 0; i < 6; i++) + { + outTenStatusArray.append(outTenStatusList.at(i)); + outFiveStatusArray.append(outFiveStatusList.at(i)); + } + dataObj.insert("freqRefStatusArray", freqRefStatusArray); + dataObj.insert("localFreqDiffArray", localFreqDiffArray); + dataObj.insert("freqRefWeightArray", freqRefWeightArray); + dataObj.insert("inputFreqTypeArray", inputFreqTypeArray); + dataObj.insert("outTenStatusArray", outTenStatusArray); + dataObj.insert("outFiveStatusArray", outFiveStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h new file mode 100644 index 0000000..2cbdb12 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqSwitcherStatusDto.h @@ -0,0 +1,31 @@ +#ifndef FREQSWITCHERSTATUSDTO_H +#define FREQSWITCHERSTATUSDTO_H + +#include + +#include "protocol/dto/DeviceFrameBaseDto.h" + +class FreqSwitcherStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + FreqSwitcherStatusDto(QObject *parent = nullptr); + + QString lockPhaseType; // <1> + QString digitalLockPhaseStatus; // <2> + QString refSelectType; // <3> + QString refFreqSrc; // <4> + QList freqRefStatusList; // <5> + QList localFreqDiffList; // <6-10> + qlonglong freqAdjustAcc; // <11> 频率调整累计值,单位1pHz + qlonglong phaseAdjustAcc; // <12> 相位调整累计值,单位0.1fs + QList freqRefWeightList; // <13-17> + QString devStatus; // <18> + QList inputFreqTypeList; // <19> + QList outTenStatusList; // <20> + QList outFiveStatusList; // <21> + + QJsonObject toJSON(); +}; + +#endif // FREQSWITCHERSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp deleted file mode 100644 index a5799c1..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "FrequencyTuningStatusDto.h" - -FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h deleted file mode 100644 index 55b3080..0000000 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FREQUENCYTUNINGSTATUSDTO_H -#define FREQUENCYTUNINGSTATUSDTO_H - -#include -#include -#include - -class FrequencyTuningStatusDto : public QObject -{ - Q_OBJECT -public: - explicit FrequencyTuningStatusDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index b7da15d..0b0813d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusFreqDto.h" -FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h index d30ffad..83eb103 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSFREQDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusFreqDto class * 频率微调设备工作状态:频率输出状态 */ -class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp index 364e200..aefae50 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -1,6 +1,6 @@ #include "FrequencyTuningStatusPulseDto.h" -FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h index acd8867..2745f8d 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -2,13 +2,13 @@ #define FREQUENCYTUNINGSTATUSPULSEDTO_H #include -#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The FrequencyTuningStatusPulseDto class * 频率微调设备工作状态:秒脉冲状态 */ -class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp index d958555..dfed520 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorInterfaceDto.h" -SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorInterfaceDto::SignalGeneratorInterfaceDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h index 3316398..d4328cc 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorInterfaceDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORINTERFACEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorInterfaceDto class * 信号产生器 界面状态信息 */ -class SignalGeneratorInterfaceDto : public SignalGeneratorFrameDto +class SignalGeneratorInterfaceDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp index b2c2acf..84ce8fd 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorMJDTimeDto.h" -SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorMJDTimeDto::SignalGeneratorMJDTimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h index fb4f22b..059acfe 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorMJDTimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORMJDTIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorMJDTimeDto class * 信号产生器 MJD时间信息 */ -class SignalGeneratorMJDTimeDto : public SignalGeneratorFrameDto +class SignalGeneratorMJDTimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp index 2ef1c14..736c4c7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorStatusDto.h" -SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorStatusDto::SignalGeneratorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h index 53a8186..8268fef 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorStatusDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORSTATUSDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorStatusDto class * 信号产生器 工作状态信息 */ -class SignalGeneratorStatusDto : public SignalGeneratorFrameDto +class SignalGeneratorStatusDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp index ab06c2e..8e5334c 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp +++ b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.cpp @@ -1,6 +1,6 @@ #include "SignalGeneratorZDATimeDto.h" -SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : SignalGeneratorFrameDto(parent) +SignalGeneratorZDATimeDto::SignalGeneratorZDATimeDto(QObject *parent) : DeviceFrameBaseDto(parent) { } diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h index 8e762a8..79049a7 100644 --- a/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h +++ b/DevStatusAcq/protocol/dto/SignalGeneratorZDATimeDto.h @@ -2,13 +2,13 @@ #define SIGNALGENERATORZDATIMEDTO_H #include -#include "protocol/dto/SignalGeneratorFrameDto.h" +#include "protocol/dto/DeviceFrameBaseDto.h" /** * @brief The SignalGeneratorZDATimeDto class * 信号产生器 ZDA时间信息 */ -class SignalGeneratorZDATimeDto : public SignalGeneratorFrameDto +class SignalGeneratorZDATimeDto : public DeviceFrameBaseDto { Q_OBJECT public: diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index 497ab2a..abd26ba 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -1,38 +1,33 @@ 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/dto/FreqSwitcherInterfaceDto.h +HEADERS += $$PWD/dto/FreqSwitcherStatusDto.h +HEADERS += $$PWD/DeviceStatusProtocolBase.h +HEADERS += $$PWD/SignalGeneratorProtocolBM.h +HEADERS += $$PWD/FrequencyTuningProtocolBM.h HEADERS += $$PWD/TimeSwitcherProtocolBM.h +HEADERS += $$PWD/FreqSwitcherProtocolBM.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/dto/FreqSwitcherInterfaceDto.cpp +SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp +SOURCES += $$PWD/DeviceStatusProtocolBase.cpp +SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp +SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp +SOURCES += $$PWD/FreqSwitcherProtocolBM.cpp