diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp new file mode 100644 index 0000000..9f2240a --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp @@ -0,0 +1,94 @@ +#include "TimeReplicatorProtocolBM.h" + +TimeReplicatorProtocolBM::TimeReplicatorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +TimeReplicatorProtocolBM::~TimeReplicatorProtocolBM() +{ + +} + +bool TimeReplicatorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto *frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + qint8 count; + int inputByte = 0; + QString outStr = ""; + + ((TimeReplicatorStatusDto *) frameData)->devStatus = content.at(0); + if (length < 0x30) + { + count = 2; + inputByte = content.mid(2, 1).toInt(); + outStr = content.mid(3, 8 * count); + } else + { + count = 4; + inputByte = content.mid(2, 2).toInt(); + outStr = content.mid(4, 8 * count); + } + + ((TimeReplicatorStatusDto *) frameData)->inCount = count; + for (int i = 0; i < count; i++) + { + qint8 in = inputByte % 2; + ((TimeReplicatorStatusDto *) frameData)->inValid.append(in == 1 ? "1" : "0"); + inputByte = inputByte / 2; + + QString output = ""; + for (int j = 0; j < 8; j++) + { + output += outStr.at(i * 8 + j); + output += ","; + } + ((TimeReplicatorStatusDto *) frameData)->outValid.append(output.mid(0, output.size() - 1)); + } + + ((TimeReplicatorStatusDto *)frameData)->frameType = TIME_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +int TimeReplicatorProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} + +DeviceFrameBaseDto * TimeReplicatorProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new TimeReplicatorStatusDto(); + + return frameData; +} + +QList TimeReplicatorProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp new file mode 100644 index 0000000..9f2240a --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp @@ -0,0 +1,94 @@ +#include "TimeReplicatorProtocolBM.h" + +TimeReplicatorProtocolBM::TimeReplicatorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +TimeReplicatorProtocolBM::~TimeReplicatorProtocolBM() +{ + +} + +bool TimeReplicatorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto *frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + qint8 count; + int inputByte = 0; + QString outStr = ""; + + ((TimeReplicatorStatusDto *) frameData)->devStatus = content.at(0); + if (length < 0x30) + { + count = 2; + inputByte = content.mid(2, 1).toInt(); + outStr = content.mid(3, 8 * count); + } else + { + count = 4; + inputByte = content.mid(2, 2).toInt(); + outStr = content.mid(4, 8 * count); + } + + ((TimeReplicatorStatusDto *) frameData)->inCount = count; + for (int i = 0; i < count; i++) + { + qint8 in = inputByte % 2; + ((TimeReplicatorStatusDto *) frameData)->inValid.append(in == 1 ? "1" : "0"); + inputByte = inputByte / 2; + + QString output = ""; + for (int j = 0; j < 8; j++) + { + output += outStr.at(i * 8 + j); + output += ","; + } + ((TimeReplicatorStatusDto *) frameData)->outValid.append(output.mid(0, output.size() - 1)); + } + + ((TimeReplicatorStatusDto *)frameData)->frameType = TIME_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +int TimeReplicatorProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} + +DeviceFrameBaseDto * TimeReplicatorProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new TimeReplicatorStatusDto(); + + return frameData; +} + +QList TimeReplicatorProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h new file mode 100644 index 0000000..0d65b31 --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef TIMEREPLICATORPROTOCOLBM_H +#define TIMEREPLICATORPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/TimeReplicatorStatusDto.h" + +class TimeReplicatorProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit TimeReplicatorProtocolBM(QObject *parent = nullptr); + ~TimeReplicatorProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // TIMEREPLICATORPROTOCOLBM_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp new file mode 100644 index 0000000..9f2240a --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp @@ -0,0 +1,94 @@ +#include "TimeReplicatorProtocolBM.h" + +TimeReplicatorProtocolBM::TimeReplicatorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +TimeReplicatorProtocolBM::~TimeReplicatorProtocolBM() +{ + +} + +bool TimeReplicatorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto *frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + qint8 count; + int inputByte = 0; + QString outStr = ""; + + ((TimeReplicatorStatusDto *) frameData)->devStatus = content.at(0); + if (length < 0x30) + { + count = 2; + inputByte = content.mid(2, 1).toInt(); + outStr = content.mid(3, 8 * count); + } else + { + count = 4; + inputByte = content.mid(2, 2).toInt(); + outStr = content.mid(4, 8 * count); + } + + ((TimeReplicatorStatusDto *) frameData)->inCount = count; + for (int i = 0; i < count; i++) + { + qint8 in = inputByte % 2; + ((TimeReplicatorStatusDto *) frameData)->inValid.append(in == 1 ? "1" : "0"); + inputByte = inputByte / 2; + + QString output = ""; + for (int j = 0; j < 8; j++) + { + output += outStr.at(i * 8 + j); + output += ","; + } + ((TimeReplicatorStatusDto *) frameData)->outValid.append(output.mid(0, output.size() - 1)); + } + + ((TimeReplicatorStatusDto *)frameData)->frameType = TIME_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +int TimeReplicatorProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} + +DeviceFrameBaseDto * TimeReplicatorProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new TimeReplicatorStatusDto(); + + return frameData; +} + +QList TimeReplicatorProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h new file mode 100644 index 0000000..0d65b31 --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef TIMEREPLICATORPROTOCOLBM_H +#define TIMEREPLICATORPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/TimeReplicatorStatusDto.h" + +class TimeReplicatorProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit TimeReplicatorProtocolBM(QObject *parent = nullptr); + ~TimeReplicatorProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // TIMEREPLICATORPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp new file mode 100644 index 0000000..8f0dba7 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp @@ -0,0 +1,32 @@ +#include "TimeReplicatorStatusDto.h" + +TimeReplicatorStatusDto::TimeReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("inCount", inCount); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < inCount; 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 d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp new file mode 100644 index 0000000..9f2240a --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp @@ -0,0 +1,94 @@ +#include "TimeReplicatorProtocolBM.h" + +TimeReplicatorProtocolBM::TimeReplicatorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +TimeReplicatorProtocolBM::~TimeReplicatorProtocolBM() +{ + +} + +bool TimeReplicatorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto *frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + qint8 count; + int inputByte = 0; + QString outStr = ""; + + ((TimeReplicatorStatusDto *) frameData)->devStatus = content.at(0); + if (length < 0x30) + { + count = 2; + inputByte = content.mid(2, 1).toInt(); + outStr = content.mid(3, 8 * count); + } else + { + count = 4; + inputByte = content.mid(2, 2).toInt(); + outStr = content.mid(4, 8 * count); + } + + ((TimeReplicatorStatusDto *) frameData)->inCount = count; + for (int i = 0; i < count; i++) + { + qint8 in = inputByte % 2; + ((TimeReplicatorStatusDto *) frameData)->inValid.append(in == 1 ? "1" : "0"); + inputByte = inputByte / 2; + + QString output = ""; + for (int j = 0; j < 8; j++) + { + output += outStr.at(i * 8 + j); + output += ","; + } + ((TimeReplicatorStatusDto *) frameData)->outValid.append(output.mid(0, output.size() - 1)); + } + + ((TimeReplicatorStatusDto *)frameData)->frameType = TIME_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +int TimeReplicatorProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} + +DeviceFrameBaseDto * TimeReplicatorProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new TimeReplicatorStatusDto(); + + return frameData; +} + +QList TimeReplicatorProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h new file mode 100644 index 0000000..0d65b31 --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef TIMEREPLICATORPROTOCOLBM_H +#define TIMEREPLICATORPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/TimeReplicatorStatusDto.h" + +class TimeReplicatorProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit TimeReplicatorProtocolBM(QObject *parent = nullptr); + ~TimeReplicatorProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // TIMEREPLICATORPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp new file mode 100644 index 0000000..8f0dba7 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp @@ -0,0 +1,32 @@ +#include "TimeReplicatorStatusDto.h" + +TimeReplicatorStatusDto::TimeReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("inCount", inCount); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < inCount; 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/TimeReplicatorStatusDto.h b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.h new file mode 100644 index 0000000..0a227cf --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.h @@ -0,0 +1,22 @@ +#ifndef TIMEREPLICATORSTATUSDTO_H +#define TIMEREPLICATORSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class TimeReplicatorStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeReplicatorStatusDto(QObject * parent = nullptr); + + QString devStatus; + qint8 inCount; + QList inValid; + QList outValid; + + QJsonObject toJSON() override; +}; + +#endif // TIMEREPLICATORSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index d548ad5..6260afb 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); + timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); // @@ -33,7 +34,7 @@ void DevStatusWindow::on_sigGenButt_clicked() { sigGenDevice->setComName("SignalGenerator"); - sigGenDevice->setDevCode("3001"); + sigGenDevice->setDevCode("300001"); sigGenDevice->initSerialPort(); } @@ -41,7 +42,7 @@ void DevStatusWindow::on_freqTunButt_clicked() { freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("4001"); + freqTunDevice->setDevCode("400001"); freqTunDevice->initSerialPort(); } @@ -49,7 +50,7 @@ void DevStatusWindow::on_tmSwiButt_clicked() { timeSwitDevice->setComName("TimeSwitcher"); - timeSwitDevice->setDevCode("5001"); + timeSwitDevice->setDevCode("500001"); timeSwitDevice->initSerialPort(); } @@ -57,20 +58,23 @@ void DevStatusWindow::on_freqSwiButt_clicked() { freqSwitDevice->setComName("FreqSwitcher"); - freqSwitDevice->setDevCode("6001"); + freqSwitDevice->setDevCode("600001"); freqSwitDevice->initSerialPort(); } void DevStatusWindow::on_tmRepButt_clicked() { + timeRepDevice->setComName("TimeReplicator"); + timeRepDevice->setDevCode("090001"); + timeRepDevice->initSerialPort(); } void DevStatusWindow::on_freqRepButt_clicked() { freqRepDevice->setComName("FreqReplicator"); - freqRepDevice->setDevCode("1001"); + freqRepDevice->setDevCode("100001"); freqRepDevice->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 9d5e031..460bb30 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/TimeReplicator.h" #include "device/FreqReplicator.h" QT_BEGIN_NAMESPACE @@ -41,6 +42,7 @@ FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; FreqSwitcher * freqSwitDevice; + TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index b333c7e..d859e58 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -97,7 +97,11 @@ } else if (portName == "TimeReplicator") { - + // time replicator + buffer.append("$2B21308-13 21010012200000000000000000faf0*"); + buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); + buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); + buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp new file mode 100644 index 0000000..b34c961 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -0,0 +1,78 @@ +#include "TimeReplicator.h" + +#include +#include + +TimeReplicator::TimeReplicator(QObject *parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +TimeReplicator::~TimeReplicator() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &TimeReplicator::dataReceivedHandler); +} + +void TimeReplicator::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * 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 TimeReplicator::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/TimeReplicator.h b/DevStatusAcq/device/TimeReplicator.h new file mode 100644 index 0000000..5acf6d9 --- /dev/null +++ b/DevStatusAcq/device/TimeReplicator.h @@ -0,0 +1,24 @@ +#ifndef TIMEREPLICATOR_H +#define TIMEREPLICATOR_H + +#include + +#include "device/DeviceBase.h" + +class TimeReplicator : public DeviceBase +{ + Q_OBJECT +public: + explicit TimeReplicator(QObject *parent = nullptr); + ~TimeReplicator(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // TIMEREPLICATOR_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1a1716d..11fc6bd 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -4,6 +4,7 @@ HEADERS += $$PWD/FrequencyTuning.h HEADERS += $$PWD/TimeSwitcher.h HEADERS += $$PWD/FreqSwitcher.h +HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h SOURCES += $$PWD/DeviceBase.cpp @@ -11,4 +12,5 @@ SOURCES += $$PWD/FrequencyTuning.cpp SOURCES += $$PWD/TimeSwitcher.cpp SOURCES += $$PWD/FreqSwitcher.cpp +SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index fc8cfc5..bbb06f8 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 "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" #include @@ -30,6 +31,9 @@ } else if (deviceType.contains("FreqReplicator") == true) { return new FreqReplicatorProtocolTX(); + } else if (deviceType.contains("TimeReplicator") == true) + { + return new TimeReplicatorProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index d0edac0..0ae041e 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -26,6 +26,9 @@ static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; @@ -91,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp new file mode 100644 index 0000000..9f2240a --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.cpp @@ -0,0 +1,94 @@ +#include "TimeReplicatorProtocolBM.h" + +TimeReplicatorProtocolBM::TimeReplicatorProtocolBM(QObject *parent) : DeviceStatusProtocolBase(parent) +{ + +} + +TimeReplicatorProtocolBM::~TimeReplicatorProtocolBM() +{ + +} + +bool TimeReplicatorProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto *frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + qint8 count; + int inputByte = 0; + QString outStr = ""; + + ((TimeReplicatorStatusDto *) frameData)->devStatus = content.at(0); + if (length < 0x30) + { + count = 2; + inputByte = content.mid(2, 1).toInt(); + outStr = content.mid(3, 8 * count); + } else + { + count = 4; + inputByte = content.mid(2, 2).toInt(); + outStr = content.mid(4, 8 * count); + } + + ((TimeReplicatorStatusDto *) frameData)->inCount = count; + for (int i = 0; i < count; i++) + { + qint8 in = inputByte % 2; + ((TimeReplicatorStatusDto *) frameData)->inValid.append(in == 1 ? "1" : "0"); + inputByte = inputByte / 2; + + QString output = ""; + for (int j = 0; j < 8; j++) + { + output += outStr.at(i * 8 + j); + output += ","; + } + ((TimeReplicatorStatusDto *) frameData)->outValid.append(output.mid(0, output.size() - 1)); + } + + ((TimeReplicatorStatusDto *)frameData)->frameType = TIME_REPLICATOR_STATUS_FRAME_TYPE; + + return true; +} + +int TimeReplicatorProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} + +DeviceFrameBaseDto * TimeReplicatorProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new TimeReplicatorStatusDto(); + + return frameData; +} + +QList TimeReplicatorProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} diff --git a/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h new file mode 100644 index 0000000..0d65b31 --- /dev/null +++ b/DevStatusAcq/protocol/TimeReplicatorProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef TIMEREPLICATORPROTOCOLBM_H +#define TIMEREPLICATORPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/TimeReplicatorStatusDto.h" + +class TimeReplicatorProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit TimeReplicatorProtocolBM(QObject *parent = nullptr); + ~TimeReplicatorProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // TIMEREPLICATORPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp new file mode 100644 index 0000000..8f0dba7 --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.cpp @@ -0,0 +1,32 @@ +#include "TimeReplicatorStatusDto.h" + +TimeReplicatorStatusDto::TimeReplicatorStatusDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject TimeReplicatorStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("inCount", inCount); + + QJsonArray inputArray; + QJsonArray outputArray; + + for (int i = 0; i < inCount; 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/TimeReplicatorStatusDto.h b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.h new file mode 100644 index 0000000..0a227cf --- /dev/null +++ b/DevStatusAcq/protocol/dto/TimeReplicatorStatusDto.h @@ -0,0 +1,22 @@ +#ifndef TIMEREPLICATORSTATUSDTO_H +#define TIMEREPLICATORSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class TimeReplicatorStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit TimeReplicatorStatusDto(QObject * parent = nullptr); + + QString devStatus; + qint8 inCount; + QList inValid; + QList outValid; + + QJsonObject toJSON() override; +}; + +#endif // TIMEREPLICATORSTATUSDTO_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index 17803e4..ffbfe0a 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -10,12 +10,14 @@ HEADERS += $$PWD/dto/TimeSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherStatusDto.h +HEADERS += $$PWD/dto/TimeReplicatorStatusDto.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/TimeReplicatorProtocolBM.h HEADERS += $$PWD/FreqReplicatorProtocolTX.h SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp @@ -27,6 +29,7 @@ SOURCES += $$PWD/dto/TimeSwitcherStatusDto.cpp SOURCES += $$PWD/dto/TimeSwitcherInterfaceDto.cpp SOURCES += $$PWD/dto/FreqSwitcherInterfaceDto.cpp +SOURCES += $$PWD/dto/TimeReplicatorStatusDto.cpp SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp SOURCES += $$PWD/DeviceStatusProtocolBase.cpp SOURCES += $$PWD/dto/FreqReplicatorStatusDto.cpp @@ -34,4 +37,5 @@ SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp SOURCES += $$PWD/FreqSwitcherProtocolBM.cpp +SOURCES += $$PWD/TimeReplicatorProtocolBM.cpp SOURCES += $$PWD/FreqReplicatorProtocolTX.cpp