diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9db6c45 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9db6c45 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..b5a7d41 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> + QString inputTimeType; // <25> + QString inputValid; // <26> + qlonglong freqAdjustAcc; // <17> + qlonglong pulseAdjustAcc; // <18> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9db6c45 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..b5a7d41 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> + QString inputTimeType; // <25> + QString inputValid; // <26> + qlonglong freqAdjustAcc; // <17> + qlonglong pulseAdjustAcc; // <18> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..52d032c --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9db6c45 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..b5a7d41 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> + QString inputTimeType; // <25> + QString inputValid; // <26> + qlonglong freqAdjustAcc; // <17> + qlonglong pulseAdjustAcc; // <18> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..52d032c --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h new file mode 100644 index 0000000..372e594 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSPULSEDTO_H +#define FREQUENCYTUNINGSTATUSPULSEDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusPulseDto(QObject *parent = nullptr); + + QString synchStatus; // <1> + qlonglong secondDiff; // <2> + QString refValid; // <3> + qlonglong phaseShiftAcc; // <4> + qlonglong pulseWidth; // <5> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSPULSEDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 7ed0384..4cec73e 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -6,7 +6,8 @@ { ui->setupUi(this); - SignalGenerator * device = new SignalGenerator(this); +// SignalGenerator * device = new SignalGenerator(this); + FrequencyTuning * device = new FrequencyTuning(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -15,7 +16,7 @@ device->setComName("COM1"); device->setBaudRate(9600); - device->setDevCode("3001"); + device->setDevCode("5001"); device->initSerialPort(); } diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 43846b2..1a440c0 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -4,6 +4,7 @@ #include #include "device/SignalGenerator.h" +#include "device/FrequencyTuning.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 9026fcf..becf473 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -59,11 +59,20 @@ void QSerialPortUtil::mockReceivData() { QByteArray buffer; + + /* + // signal generator buffer.append("$GLN,0,192.168.000.126,255.255.255.000,192.168.000.001,192.168.001.126,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); buffer.append("$GLF,1,0,20210929,1,1,1,-0.01,20000,0,2,50,1*48").append("\r\n"); buffer.append("$GPZDA,192157.00,01,01,2000,0,01*5C").append("\r\n"); buffer.append("$GPMJD,192157.00,51544,0,01*73").append("\r\n"); buffer.append("$GLC,0,0*48").append("\r\n"); + */ + + // frequency tuning + buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); emit dataRecieved(buffer); } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp new file mode 100644 index 0000000..291a089 --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -0,0 +1,102 @@ +#include "FrequencyTuning.h" +#include +#include + +FrequencyTuning::FrequencyTuning(QObject *parent) : QObject(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); +} + +FrequencyTuning::~FrequencyTuning() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &FrequencyTuning::dataReceivedHandler); +} + +void FrequencyTuning::setComName(QString comName) +{ + this->comName = comName; +} +void FrequencyTuning::setBaudRate(int baudRate) +{ + this->baudRate = baudRate; +} +QString FrequencyTuning::getDevCode() +{ + return this->devCode; +} +void FrequencyTuning::setDevCode(QString devCode) +{ + this->devCode = devCode; +} + +bool FrequencyTuning::isSerialOpen() +{ + return this->serialUtil.isOpen(); +} + +void FrequencyTuning::initSerialPort() +{ + this->serialUtil.openSerialPort(this->comName, this->baudRate); +} + +void FrequencyTuning::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = FrequencyTuningProtocolBM::extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = FrequencyTuningProtocolBM::checkFrame(frameByte); + FrequencyTuningStatusDto * ftFrameDto = FrequencyTuningProtocolBM::ftFrameFactory(frameType); + if (ftFrameDto != nullptr) + { + // ★解析成数据对象 + bool parse = FrequencyTuningProtocolBM::parseFrequencyTuningData(frameByte, ftFrameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + ftFrameDto->milisecond = now.toMSecsSinceEpoch(); + ftFrameDto->rawFrame = frameByte; + + this->afterFramePhase(ftFrameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete ftFrameDto; + } + } + } +} + +void FrequencyTuning::afterFramePhase(FrequencyTuningStatusDto * 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/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h new file mode 100644 index 0000000..ffc702f --- /dev/null +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -0,0 +1,49 @@ +#ifndef FREQUENCYTUNING_H +#define FREQUENCYTUNING_H + +#include +#include "common/utils/QSerialPortUtil.h" +#include "common/utils/QKafkaUtil.h" +#include "common/utils/QByteUtil.h" +#include "common/utils/QLogUtil.h" +#include "common/utils/SettingConfig.h" + +#include "protocol/dto/FrequencyTuningStatusDto.h" +#include "protocol/FrequencyTuningProtocolBM.h" + +class FrequencyTuning : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuning(QObject *parent = nullptr); + ~FrequencyTuning(); + + void initSerialPort(); + + void afterFramePhase(FrequencyTuningStatusDto * frameDto); + + void setComName(QString comName); + void setBaudRate(int baudRate); + QString getDevCode(); + void setDevCode(QString devCode); + + bool isSerialOpen(); + +private: + QString devCode; + QString comName; + int baudRate; + + QSerialPortUtil serialUtil; + QKafkaUtil kafkaUtil; + QByteArray dataBuff; + +signals: + void sendDataToDraw(FrequencyTuningStatusDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); + +}; + +#endif // FREQUENCYTUNING_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 1153675..794ec5e 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -1,4 +1,6 @@ HEADERS += $$PWD/SignalGenerator.h +HEADERS += $$PWD/FrequencyTuning.h SOURCES += $$PWD/SignalGenerator.cpp +SOURCES += $$PWD/FrequencyTuning.cpp diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..d8067df --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,129 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : QObject(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +FrequencyTuningStatusDto * FrequencyTuningProtocolBM::ftFrameFactory(int frameType) +{ + FrequencyTuningStatusDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FREQUENCY_TUNING_FRAME_CONTENT_SEP); + int end = rawData.indexOf(FREQUENCY_TUNING_FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FREQUENCY_TUNING_FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FREQUENCY_TUNING_FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..59217db --- /dev/null +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,56 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 +static const QString FREQUENCY_TUNING_FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FREQUENCY_TUNING_FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FREQUENCY_TUNING_FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 + +static const int FREQUENCY_TUNING_FRAME_SUM_LENGTH = 2; +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; +static const int FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE = 2; + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FREQUENCY_TUNING_FRAME_TAIL.length() + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FREQUENCY_TUNING_FRAME_SUB_MIN_SIZE + + 1 + FREQUENCY_TUNING_FRAME_SUM_LENGTH; + +class FrequencyTuningProtocolBM : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + static bool parseFrequencyTuningData(QByteArray rawData, FrequencyTuningStatusDto * ftFrameData, int frameType); + static FrequencyTuningStatusDto * ftFrameFactory(int frameType); + + // + static QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + static int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index bea2e6f..51fe0ae 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -93,69 +93,7 @@ return true; } -/* -bool SignalGeneratorProtocolBM::parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - interfaceData->keyControl = subList.at(0).toUInt(); - interfaceData->timeType = subList.at(1).toUInt(); - - return true; -} - -bool SignalGeneratorProtocolBM::parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - - - return true; -} - -bool SignalGeneratorProtocolBM::parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData) -{ - // get the raw data between ',' and '*' - int start = rawData.indexOf(SIGNAL_GENERATOR_FRAME_CONTENT_SEP); - int end = rawData.indexOf(SIGNAL_GENERATOR_FRAME_SUM_SEP); - - QByteArray content = rawData.mid(start + 1, end - start - 1); - QString contentStr = QString(content); - QStringList subList = contentStr.split(","); - - mjdData->mjdTime = subList.at(0); - - - return true; -} -*/ QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 016d378..7e4a6b7 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -50,10 +50,6 @@ // 解析数据 static bool parseSignalGeneratorData(QByteArray rawData, SignalGeneratorFrameDto * sgFrameData, int frameType); static SignalGeneratorFrameDto * sgFrameFactory(int frameType); -// static bool parseInterfaceData(QByteArray rawData, SignalGeneratorInterfaceDto * interfaceData); -// static bool parseStatusData(QByteArray rawData, SignalGeneratorStatusDto * statusData); -// static bool parseZDAData(QByteArray rawData, SignalGeneratorZDATimeDto * zdaData); -// static bool parseMJDData(QByteArray rawData, SignalGeneratorMJDTimeDto * mjdData); // static QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp new file mode 100644 index 0000000..a5799c1 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningStatusDto.h" + +FrequencyTuningStatusDto::FrequencyTuningStatusDto(QObject *parent) : QObject(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h new file mode 100644 index 0000000..205bad2 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSDTO_H +#define FREQUENCYTUNINGSTATUSDTO_H + +#include +#include +#include + +class FrequencyTuningStatusDto : public QObject +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusDto(QObject *parent = nullptr); + + QByteArray rawFrame; // 原始帧字节数组 + + QString timestamp; // 时间戳字符串 + qlonglong milisecond; // 毫秒计数 + QString devCode; + + virtual QJsonObject toJSON() = 0; + +signals: + +}; + +#endif // FREQUENCYTUNINGSTATUSDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9db6c45 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..b5a7d41 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusFreqDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> + QString inputTimeType; // <25> + QString inputValid; // <26> + qlonglong freqAdjustAcc; // <17> + qlonglong pulseAdjustAcc; // <18> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..52d032c --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,23 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : FrequencyTuningStatusDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h new file mode 100644 index 0000000..372e594 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -0,0 +1,22 @@ +#ifndef FREQUENCYTUNINGSTATUSPULSEDTO_H +#define FREQUENCYTUNINGSTATUSPULSEDTO_H + +#include +#include "protocol/dto/FrequencyTuningStatusDto.h" + +class FrequencyTuningStatusPulseDto : public FrequencyTuningStatusDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusPulseDto(QObject *parent = nullptr); + + QString synchStatus; // <1> + qlonglong secondDiff; // <2> + QString refValid; // <3> + qlonglong phaseShiftAcc; // <4> + qlonglong pulseWidth; // <5> + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSPULSEDTO_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index 0589e42..b34eb88 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -5,6 +5,10 @@ HEADERS += $$PWD/dto/SignalGeneratorZDATimeDto.h HEADERS += $$PWD/dto/SignalGeneratorMJDTimeDto.h HEADERS += $$PWD/SignalGeneratorProtocolBM.h +HEADERS += $$PWD/dto/FrequencyTuningStatusDto.h +HEADERS += $$PWD/dto/FrequencyTuningStatusFreqDto.h +HEADERS += $$PWD/dto/FrequencyTuningStatusPulseDto.h +HEADERS += $$PWD/FrequencyTuningProtocolBM.h SOURCES += $$PWD/dto/SignalGeneratorFrameDto.cpp SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp @@ -12,3 +16,7 @@ SOURCES += $$PWD/dto/SignalGeneratorZDATimeDto.cpp SOURCES += $$PWD/dto/SignalGeneratorMJDTimeDto.cpp SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp +SOURCES += $$PWD/dto/FrequencyTuningStatusDto.cpp +SOURCES += $$PWD/dto/FrequencyTuningStatusFreqDto.cpp +SOURCES += $$PWD/dto/FrequencyTuningStatusPulseDto.cpp +SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp