diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp new file mode 100644 index 0000000..8539214 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -0,0 +1,148 @@ +#include "FreqReplicatorProtocolTX.h" + +FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqReplicatorProtocolTX::~FreqReplicatorProtocolTX() +{ + +} + +DeviceFrameBaseDto * FreqReplicatorProtocolTX::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new FreqReplicatorStatusDto(); + + return frameData; +} + +bool FreqReplicatorProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + QByteArray content = rawData.mid(4, rawData.size() - 5); + QByteArray inputACByte = content.mid(1, 2); + QByteArray inputBDByte = content.mid(3, 2); + QByteArray outputACByte = content.mid(5, 8); + QByteArray outputBDByte = content.mid(13, 8); + + QString inputAC = ""; + QString inputBD = ""; + QString outputAC = ""; + QString outputBD = ""; + + if (content.at(0) == 0x01) + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + } else + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + } + + ((FreqReplicatorStatusDto *)frameData)->frameType = FREQ_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +QList FreqReplicatorProtocolTX::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (QByteUtil::binToHexString(rawData.mid(0, 3)) == "AA5500") + { + QByteArray ba; + + qint8 length = rawData.mid(3, 1).toHex().toInt(0, 16); + if (rawData.length() >= length + 5) + { + ba.append(rawData.mid(0, length + 5)); + + resultList.append(ba); + ba.clear(); + + rawData = rawData.mid(length + 5, rawData.length() - length - 5); + } else + { + break; + } + } + + return resultList; +} + +int FreqReplicatorProtocolTX::checkFrame(QByteArray rawData) +{ + if (rawData.size() == 26) + return 1; + return 0; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp new file mode 100644 index 0000000..8539214 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -0,0 +1,148 @@ +#include "FreqReplicatorProtocolTX.h" + +FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqReplicatorProtocolTX::~FreqReplicatorProtocolTX() +{ + +} + +DeviceFrameBaseDto * FreqReplicatorProtocolTX::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new FreqReplicatorStatusDto(); + + return frameData; +} + +bool FreqReplicatorProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + QByteArray content = rawData.mid(4, rawData.size() - 5); + QByteArray inputACByte = content.mid(1, 2); + QByteArray inputBDByte = content.mid(3, 2); + QByteArray outputACByte = content.mid(5, 8); + QByteArray outputBDByte = content.mid(13, 8); + + QString inputAC = ""; + QString inputBD = ""; + QString outputAC = ""; + QString outputBD = ""; + + if (content.at(0) == 0x01) + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + } else + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + } + + ((FreqReplicatorStatusDto *)frameData)->frameType = FREQ_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +QList FreqReplicatorProtocolTX::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (QByteUtil::binToHexString(rawData.mid(0, 3)) == "AA5500") + { + QByteArray ba; + + qint8 length = rawData.mid(3, 1).toHex().toInt(0, 16); + if (rawData.length() >= length + 5) + { + ba.append(rawData.mid(0, length + 5)); + + resultList.append(ba); + ba.clear(); + + rawData = rawData.mid(length + 5, rawData.length() - length - 5); + } else + { + break; + } + } + + return resultList; +} + +int FreqReplicatorProtocolTX::checkFrame(QByteArray rawData) +{ + if (rawData.size() == 26) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h new file mode 100644 index 0000000..de189c0 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h @@ -0,0 +1,28 @@ +#ifndef FREQREPLICATORPROTOCOLTX_H +#define FREQREPLICATORPROTOCOLTX_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/FreqReplicatorStatusDto.h" + +class FreqReplicatorProtocolTX : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqReplicatorProtocolTX(QObject *parent = nullptr); + ~FreqReplicatorProtocolTX(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // FREQREPLICATORPROTOCOLTX_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp new file mode 100644 index 0000000..8539214 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -0,0 +1,148 @@ +#include "FreqReplicatorProtocolTX.h" + +FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqReplicatorProtocolTX::~FreqReplicatorProtocolTX() +{ + +} + +DeviceFrameBaseDto * FreqReplicatorProtocolTX::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new FreqReplicatorStatusDto(); + + return frameData; +} + +bool FreqReplicatorProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + QByteArray content = rawData.mid(4, rawData.size() - 5); + QByteArray inputACByte = content.mid(1, 2); + QByteArray inputBDByte = content.mid(3, 2); + QByteArray outputACByte = content.mid(5, 8); + QByteArray outputBDByte = content.mid(13, 8); + + QString inputAC = ""; + QString inputBD = ""; + QString outputAC = ""; + QString outputBD = ""; + + if (content.at(0) == 0x01) + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + } else + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + } + + ((FreqReplicatorStatusDto *)frameData)->frameType = FREQ_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +QList FreqReplicatorProtocolTX::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (QByteUtil::binToHexString(rawData.mid(0, 3)) == "AA5500") + { + QByteArray ba; + + qint8 length = rawData.mid(3, 1).toHex().toInt(0, 16); + if (rawData.length() >= length + 5) + { + ba.append(rawData.mid(0, length + 5)); + + resultList.append(ba); + ba.clear(); + + rawData = rawData.mid(length + 5, rawData.length() - length - 5); + } else + { + break; + } + } + + return resultList; +} + +int FreqReplicatorProtocolTX::checkFrame(QByteArray rawData) +{ + if (rawData.size() == 26) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h new file mode 100644 index 0000000..de189c0 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h @@ -0,0 +1,28 @@ +#ifndef FREQREPLICATORPROTOCOLTX_H +#define FREQREPLICATORPROTOCOLTX_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/FreqReplicatorStatusDto.h" + +class FreqReplicatorProtocolTX : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqReplicatorProtocolTX(QObject *parent = nullptr); + ~FreqReplicatorProtocolTX(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // FREQREPLICATORPROTOCOLTX_H diff --git a/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp new file mode 100644 index 0000000..9b551db --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp @@ -0,0 +1,31 @@ +#include "FreqReplicatorStatusDto.h" + +FreqReplicatorStatusDto::FreqReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ABCD", this->abOrCd); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < 4; i++) + { + inputArray.append(this->inValid.at(i)); + outputArray.append(outValid.at(i)); + } + dataObj.insert("inValid", inputArray); + dataObj.insert("outValid", outputArray); + + 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 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp new file mode 100644 index 0000000..8539214 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -0,0 +1,148 @@ +#include "FreqReplicatorProtocolTX.h" + +FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqReplicatorProtocolTX::~FreqReplicatorProtocolTX() +{ + +} + +DeviceFrameBaseDto * FreqReplicatorProtocolTX::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new FreqReplicatorStatusDto(); + + return frameData; +} + +bool FreqReplicatorProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + QByteArray content = rawData.mid(4, rawData.size() - 5); + QByteArray inputACByte = content.mid(1, 2); + QByteArray inputBDByte = content.mid(3, 2); + QByteArray outputACByte = content.mid(5, 8); + QByteArray outputBDByte = content.mid(13, 8); + + QString inputAC = ""; + QString inputBD = ""; + QString outputAC = ""; + QString outputBD = ""; + + if (content.at(0) == 0x01) + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + } else + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + } + + ((FreqReplicatorStatusDto *)frameData)->frameType = FREQ_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +QList FreqReplicatorProtocolTX::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (QByteUtil::binToHexString(rawData.mid(0, 3)) == "AA5500") + { + QByteArray ba; + + qint8 length = rawData.mid(3, 1).toHex().toInt(0, 16); + if (rawData.length() >= length + 5) + { + ba.append(rawData.mid(0, length + 5)); + + resultList.append(ba); + ba.clear(); + + rawData = rawData.mid(length + 5, rawData.length() - length - 5); + } else + { + break; + } + } + + return resultList; +} + +int FreqReplicatorProtocolTX::checkFrame(QByteArray rawData) +{ + if (rawData.size() == 26) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h new file mode 100644 index 0000000..de189c0 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h @@ -0,0 +1,28 @@ +#ifndef FREQREPLICATORPROTOCOLTX_H +#define FREQREPLICATORPROTOCOLTX_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/FreqReplicatorStatusDto.h" + +class FreqReplicatorProtocolTX : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqReplicatorProtocolTX(QObject *parent = nullptr); + ~FreqReplicatorProtocolTX(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // FREQREPLICATORPROTOCOLTX_H diff --git a/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp new file mode 100644 index 0000000..9b551db --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp @@ -0,0 +1,31 @@ +#include "FreqReplicatorStatusDto.h" + +FreqReplicatorStatusDto::FreqReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ABCD", this->abOrCd); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < 4; i++) + { + inputArray.append(this->inValid.at(i)); + outputArray.append(outValid.at(i)); + } + dataObj.insert("inValid", inputArray); + dataObj.insert("outValid", outputArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h new file mode 100644 index 0000000..068395b --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h @@ -0,0 +1,21 @@ +#ifndef FREQREPLICATORSTATUSDTO_H +#define FREQREPLICATORSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FreqReplicatorStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqReplicatorStatusDto(QObject * parent = nullptr); + + QString abOrCd; + QList inValid; + QList outValid; + + QJsonObject toJSON() override; +}; + +#endif // FREQREPLICATORSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 0633da3..d548ad5 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -10,6 +10,7 @@ freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); freqSwitDevice = new FreqSwitcher(this); + freqRepDevice = new FreqReplicator(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -59,5 +60,17 @@ freqSwitDevice->setDevCode("6001"); freqSwitDevice->initSerialPort(); +} +void DevStatusWindow::on_tmRepButt_clicked() +{ + +} + +void DevStatusWindow::on_freqRepButt_clicked() +{ + freqRepDevice->setComName("FreqReplicator"); + freqRepDevice->setDevCode("1001"); + + freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index a7996ef..9d5e031 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -7,6 +7,7 @@ #include "device/FrequencyTuning.h" #include "device/TimeSwitcher.h" #include "device/FreqSwitcher.h" +#include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -29,6 +30,10 @@ void on_freqSwiButt_clicked(); + void on_tmRepButt_clicked(); + + void on_freqRepButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -36,5 +41,6 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index c424b5a..b333c7e 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -92,6 +92,17 @@ 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"); + } else if (portName == "BCodeTerminal") + { + + } else if (portName == "TimeReplicator") + { + + } else if (portName == "FreqReplicator") + { + // freq replicator + buffer = QByteUtil::hexStringToBytes("AA550015010001000101010101010101010101010101010101EB"); + buffer.append(QByteUtil::hexStringToBytes("AA550015020001000101010101010101010101010101010101E8")); } emit dataRecieved(buffer); diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 3073fad..961f87f 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -8,6 +8,9 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" +#include "protocol/dto/DeviceFrameBaseDto.h" +#include "protocol/DeviceStatusProtocolBase.h" + class DeviceBase : public QObject { Q_OBJECT @@ -22,6 +25,8 @@ void initSerialPort(); bool isSerialOpen(); + virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + protected: QString devCode; QString comName; @@ -30,6 +35,8 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + + DeviceStatusProtocolBase * protocol; signals: }; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp new file mode 100644 index 0000000..a096e68 --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -0,0 +1,78 @@ +#include "FreqReplicator.h" + +#include +#include + +FreqReplicator::FreqReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +FreqReplicator::~FreqReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FreqReplicator::dataReceivedHandler); +} + +void FreqReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << QByteUtil::binToHexString(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 * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void FreqReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << QByteUtil::binToHexString(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/FreqReplicator.h b/DevStatusAcq/device/FreqReplicator.h new file mode 100644 index 0000000..221924f --- /dev/null +++ b/DevStatusAcq/device/FreqReplicator.h @@ -0,0 +1,24 @@ +#ifndef FREQREPLICATOR_H +#define FREQREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class FreqReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit FreqReplicator(QObject *parent = nullptr); + ~FreqReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // FREQREPLICATOR_H diff --git a/DevStatusAcq/device/FreqSwitcher.h b/DevStatusAcq/device/FreqSwitcher.h index a38769b..67f06f8 100644 --- a/DevStatusAcq/device/FreqSwitcher.h +++ b/DevStatusAcq/device/FreqSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FreqSwitcherProtocolBM.h" class FreqSwitcher : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 40d7629..033a924 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/FrequencyTuningProtocolBM.h" class FrequencyTuning : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/SignalGenerator.h b/DevStatusAcq/device/SignalGenerator.h index 70330af..839f22b 100644 --- a/DevStatusAcq/device/SignalGenerator.h +++ b/DevStatusAcq/device/SignalGenerator.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/SignalGeneratorProtocolBM.h" class SignalGenerator : public DeviceBase @@ -16,9 +15,6 @@ void afterFramePhase(DeviceFrameBaseDto * frameDto); -private: - DeviceStatusProtocolBase * protocol; - signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/device/TimeSwitcher.h b/DevStatusAcq/device/TimeSwitcher.h index 3bf458f..0ac7e3a 100644 --- a/DevStatusAcq/device/TimeSwitcher.h +++ b/DevStatusAcq/device/TimeSwitcher.h @@ -4,7 +4,6 @@ #include #include "device/DeviceBase.h" -#include "protocol/dto/DeviceFrameBaseDto.h" #include "protocol/TimeSwitcherProtocolBM.h" class TimeSwitcher : public DeviceBase @@ -16,9 +15,6 @@ 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 16877b5..1a1716d 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,9 +4,11 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index 0381234..fc8cfc5 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -3,6 +3,7 @@ #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" #include "FreqSwitcherProtocolBM.h" +#include "FreqReplicatorProtocolTX.h" #include @@ -26,6 +27,9 @@ } else if (deviceType.contains("FreqSwitcher") == true) { return new FreqSwitcherProtocolBM(); + } else if (deviceType.contains("FreqReplicator") == true) + { + return new FreqReplicatorProtocolTX(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 3ad7a30..d0edac0 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -24,6 +24,8 @@ static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -89,6 +91,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + class DeviceStatusProtocolBase : public QObject { diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp new file mode 100644 index 0000000..8539214 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -0,0 +1,148 @@ +#include "FreqReplicatorProtocolTX.h" + +FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +FreqReplicatorProtocolTX::~FreqReplicatorProtocolTX() +{ + +} + +DeviceFrameBaseDto * FreqReplicatorProtocolTX::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new FreqReplicatorStatusDto(); + + return frameData; +} + +bool FreqReplicatorProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + QByteArray content = rawData.mid(4, rawData.size() - 5); + QByteArray inputACByte = content.mid(1, 2); + QByteArray inputBDByte = content.mid(3, 2); + QByteArray outputACByte = content.mid(5, 8); + QByteArray outputBDByte = content.mid(13, 8); + + QString inputAC = ""; + QString inputBD = ""; + QString outputAC = ""; + QString outputBD = ""; + + if (content.at(0) == 0x01) + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + } else + { + ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; + + if (inputACByte.at(0) == 0x01) + { + inputAC += "10MHz,"; + } + if (inputACByte.at(1) == 0x01) + { + inputAC += "5MHz,"; + } + + if (inputBDByte.at(0) == 0x01) + { + inputBD += "10MHz,"; + } + if (inputBDByte.at(1) == 0x01) + { + inputBD += "5MHz,"; + } + + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + + + for (int i = 0; i < 8; i++) + { + outputAC += outputACByte.at(i) == 0x01 ? "1," : "0,"; + outputBD += outputBDByte.at(i) == 0x01 ? "1," : "0,"; + } + + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(""); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputAC.mid(0, outputAC.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->outValid.append(outputBD.mid(0, outputBD.size() - 1)); + } + + ((FreqReplicatorStatusDto *)frameData)->frameType = FREQ_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +QList FreqReplicatorProtocolTX::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (QByteUtil::binToHexString(rawData.mid(0, 3)) == "AA5500") + { + QByteArray ba; + + qint8 length = rawData.mid(3, 1).toHex().toInt(0, 16); + if (rawData.length() >= length + 5) + { + ba.append(rawData.mid(0, length + 5)); + + resultList.append(ba); + ba.clear(); + + rawData = rawData.mid(length + 5, rawData.length() - length - 5); + } else + { + break; + } + } + + return resultList; +} + +int FreqReplicatorProtocolTX::checkFrame(QByteArray rawData) +{ + if (rawData.size() == 26) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h new file mode 100644 index 0000000..de189c0 --- /dev/null +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.h @@ -0,0 +1,28 @@ +#ifndef FREQREPLICATORPROTOCOLTX_H +#define FREQREPLICATORPROTOCOLTX_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/FreqReplicatorStatusDto.h" + +class FreqReplicatorProtocolTX : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit FreqReplicatorProtocolTX(QObject *parent = nullptr); + ~FreqReplicatorProtocolTX(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // FREQREPLICATORPROTOCOLTX_H diff --git a/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp new file mode 100644 index 0000000..9b551db --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.cpp @@ -0,0 +1,31 @@ +#include "FreqReplicatorStatusDto.h" + +FreqReplicatorStatusDto::FreqReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FreqReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("ABCD", this->abOrCd); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < 4; i++) + { + inputArray.append(this->inValid.at(i)); + outputArray.append(outValid.at(i)); + } + dataObj.insert("inValid", inputArray); + dataObj.insert("outValid", outputArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h new file mode 100644 index 0000000..068395b --- /dev/null +++ b/DevStatusAcq/protocol/dto/FreqReplicatorStatusDto.h @@ -0,0 +1,21 @@ +#ifndef FREQREPLICATORSTATUSDTO_H +#define FREQREPLICATORSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FreqReplicatorStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FreqReplicatorStatusDto(QObject * parent = nullptr); + + QString abOrCd; + QList inValid; + QList outValid; + + QJsonObject toJSON() override; +}; + +#endif // FREQREPLICATORSTATUSDTO_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index abd26ba..17803e4 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -10,11 +10,13 @@ HEADERS += $$PWD/dto/TimeSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherStatusDto.h +HEADERS += $$PWD/dto/FreqReplicatorStatusDto.h HEADERS += $$PWD/DeviceStatusProtocolBase.h HEADERS += $$PWD/SignalGeneratorProtocolBM.h HEADERS += $$PWD/FrequencyTuningProtocolBM.h HEADERS += $$PWD/TimeSwitcherProtocolBM.h HEADERS += $$PWD/FreqSwitcherProtocolBM.h +HEADERS += $$PWD/FreqReplicatorProtocolTX.h SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp SOURCES += $$PWD/dto/SignalGeneratorInterfaceDto.cpp @@ -27,7 +29,9 @@ SOURCES += $$PWD/dto/FreqSwitcherInterfaceDto.cpp SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp SOURCES += $$PWD/DeviceStatusProtocolBase.cpp +SOURCES += $$PWD/dto/FreqReplicatorStatusDto.cpp SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp SOURCES += $$PWD/FreqSwitcherProtocolBM.cpp +SOURCES += $$PWD/FreqReplicatorProtocolTX.cpp