diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index bbb06f8..a170ee3 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -5,6 +5,7 @@ #include "FreqSwitcherProtocolBM.h" #include "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" +#include "BCodeTerminalProtocolBM.h" #include @@ -34,6 +35,9 @@ } else if (deviceType.contains("TimeReplicator") == true) { return new TimeReplicatorProtocolBM(); + } else if (deviceType.contains("BCodeTerminal") == true) + { + return new BCodeTerminalProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index bbb06f8..a170ee3 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -5,6 +5,7 @@ #include "FreqSwitcherProtocolBM.h" #include "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" +#include "BCodeTerminalProtocolBM.h" #include @@ -34,6 +35,9 @@ } else if (deviceType.contains("TimeReplicator") == true) { return new TimeReplicatorProtocolBM(); + } else if (deviceType.contains("BCodeTerminal") == true) + { + return new BCodeTerminalProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 0ae041e..6750c3d 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -94,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index bbb06f8..a170ee3 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -5,6 +5,7 @@ #include "FreqSwitcherProtocolBM.h" #include "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" +#include "BCodeTerminalProtocolBM.h" #include @@ -34,6 +35,9 @@ } else if (deviceType.contains("TimeReplicator") == true) { return new TimeReplicatorProtocolBM(); + } else if (deviceType.contains("BCodeTerminal") == true) + { + return new BCodeTerminalProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 0ae041e..6750c3d 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -94,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp new file mode 100644 index 0000000..44c3c38 --- /dev/null +++ b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp @@ -0,0 +1,37 @@ +#include "BCodeTerminalStatusDto.h" + +BCodeTerminalStatusDto::BCodeTerminalStatusDto(QObject* parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject BCodeTerminalStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("bdcInStatus", bdcInStatus); + dataObj.insert("bacInStatus", bacInStatus); + dataObj.insert("fiveInStatus", fiveInStatus); + dataObj.insert("ref", ref); + dataObj.insert("track", track); + dataObj.insert("bacRange", bacRange); + dataObj.insert("bacRatio", bacRatio); + + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 4; i++) + { + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index bbb06f8..a170ee3 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -5,6 +5,7 @@ #include "FreqSwitcherProtocolBM.h" #include "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" +#include "BCodeTerminalProtocolBM.h" #include @@ -34,6 +35,9 @@ } else if (deviceType.contains("TimeReplicator") == true) { return new TimeReplicatorProtocolBM(); + } else if (deviceType.contains("BCodeTerminal") == true) + { + return new BCodeTerminalProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 0ae041e..6750c3d 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -94,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp new file mode 100644 index 0000000..44c3c38 --- /dev/null +++ b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp @@ -0,0 +1,37 @@ +#include "BCodeTerminalStatusDto.h" + +BCodeTerminalStatusDto::BCodeTerminalStatusDto(QObject* parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject BCodeTerminalStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("bdcInStatus", bdcInStatus); + dataObj.insert("bacInStatus", bacInStatus); + dataObj.insert("fiveInStatus", fiveInStatus); + dataObj.insert("ref", ref); + dataObj.insert("track", track); + dataObj.insert("bacRange", bacRange); + dataObj.insert("bacRatio", bacRatio); + + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 4; i++) + { + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h new file mode 100644 index 0000000..db54b55 --- /dev/null +++ b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALSTATUSDTO_H +#define BCODETERMINALSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class BCodeTerminalStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit BCodeTerminalStatusDto(QObject * parent = nullptr); + + QString devStatus; + QString bdcInStatus; + QString bacInStatus; + QString fiveInStatus; + QList bdcOutStatusList; + QList bacOutStatusList; + QString ref; + QString track; + float bacRange; + qint8 bacRatio; + + QJsonObject toJSON() override; +}; + +#endif // BCODETERMINALSTATUSDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 6260afb..59ca492 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -12,6 +12,7 @@ freqSwitDevice = new FreqSwitcher(this); timeRepDevice = new TimeReplicator(this); freqRepDevice = new FreqReplicator(this); + bCodeTermDevice = new BCodeTerminal(this); // // connect(device, &SignalGenerator::sendDataToDraw, @@ -78,3 +79,11 @@ freqRepDevice->initSerialPort(); } + +void DevStatusWindow::on_bctButt_clicked() +{ + bCodeTermDevice->setComName("BCodeTerminal"); + bCodeTermDevice->setDevCode("07001"); + + bCodeTermDevice->initSerialPort(); +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 460bb30..0112284 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -9,6 +9,7 @@ #include "device/FreqSwitcher.h" #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" +#include "device/BCodeTerminal.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -35,6 +36,8 @@ void on_freqRepButt_clicked(); + void on_bctButt_clicked(); + private: Ui::DevStatusWindow *ui; @@ -44,5 +47,6 @@ FreqSwitcher * freqSwitDevice; TimeReplicator * timeRepDevice; FreqReplicator * freqRepDevice; + BCodeTerminal * bCodeTermDevice; }; #endif // DEVSTATUSWINDOW_H diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index d859e58..325d590 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -94,7 +94,9 @@ buffer.append("$GLN,0,192.168.000.123,255.255.255.000,192.168.000.001,192.168.001.123,255.255.255.000,192.168.001.001,255.255.255.255,3000,2000,2001*75").append("\r\n"); } else if (portName == "BCodeTerminal") { - + // b-code terminal + buffer.append("$2621304-20 210100112100f90210.035422*"); + buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*"); } else if (portName == "TimeReplicator") { // time replicator @@ -102,6 +104,7 @@ buffer.append("$3C21308-13 2101008220322222222111111110000000000000000ca24*"); buffer.append("$3C21308-13 21010052207111111111111111111111111000000005984*"); buffer.append("$3C21308-13 2101005121511111111111111111111111111111111bcfe*"); + buffer.append("$3E21308-13 2101001211308-13 2101001210929H.1.00S.1.00000292b*"); } else if (portName == "FreqReplicator") { // freq replicator diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp new file mode 100644 index 0000000..f455e70 --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -0,0 +1,78 @@ +#include "BCodeTerminal.h" + +#include +#include + +BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent) +{ + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); + + kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); + kafkaUtil.createProducer(); + + this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); +} + +BCodeTerminal::~BCodeTerminal() +{ + disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, + this, &BCodeTerminal::dataReceivedHandler); +} + +void BCodeTerminal::dataReceivedHandler(QByteArray data) +{ + this->dataBuff.append(data); + + std::cout << dataBuff.toStdString() << std::endl; + + QList frameList = protocol->extractFrameList(this->dataBuff); + + if (frameList.size() > 0) + { + for (int i = 0; i < frameList.size(); i++) + { + QByteArray frameByte = frameList.at(i); + + int frameType = protocol->checkFrame(frameByte); + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) + { + // ★解析成数据对象 + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); + + // 解析成功 + if (parse == true) + { + QDateTime now = QDateTime::currentDateTime(); + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; + + this->afterFramePhase(frameDto); + } + + // 在此处释放内存,不影响后续显示 + // 不在此处释放内存则会导致内存持续增加 + // 具体原因不明 + delete frameDto; + } + } + } +} + +void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * frameDto) +{ + std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; + std::cout << frameDto->rawFrame.toStdString() << std::endl; + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = frameDto->toJSON(); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", devCode); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } +} diff --git a/DevStatusAcq/device/BCodeTerminal.h b/DevStatusAcq/device/BCodeTerminal.h new file mode 100644 index 0000000..b3aa5cb --- /dev/null +++ b/DevStatusAcq/device/BCodeTerminal.h @@ -0,0 +1,24 @@ +#ifndef BCODETERMINAL_H +#define BCODETERMINAL_H + +#include + +#include "device/DeviceBase.h" + +class BCodeTerminal : public DeviceBase +{ + Q_OBJECT +public: + explicit BCodeTerminal(QObject *parent = nullptr); + ~BCodeTerminal(); + + void afterFramePhase(DeviceFrameBaseDto * frameDto); + +signals: + void sendDataToDraw(DeviceFrameBaseDto * frameData); + +public slots: + void dataReceivedHandler(QByteArray data); +}; + +#endif // BCODETERMINAL_H diff --git a/DevStatusAcq/device/device.pri b/DevStatusAcq/device/device.pri index 11fc6bd..c9cc393 100644 --- a/DevStatusAcq/device/device.pri +++ b/DevStatusAcq/device/device.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/FreqSwitcher.h HEADERS += $$PWD/TimeReplicator.h HEADERS += $$PWD/FreqReplicator.h +HEADERS += $$PWD/BCodeTerminal.h SOURCES += $$PWD/DeviceBase.cpp SOURCES += $$PWD/SignalGenerator.cpp @@ -14,3 +15,4 @@ SOURCES += $$PWD/FreqSwitcher.cpp SOURCES += $$PWD/TimeReplicator.cpp SOURCES += $$PWD/FreqReplicator.cpp +SOURCES += $$PWD/BCodeTerminal.cpp diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp new file mode 100644 index 0000000..eea0416 --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.cpp @@ -0,0 +1,88 @@ +#include "BCodeTerminalProtocolBM.h" + +BCodeTerminalProtocolBM::BCodeTerminalProtocolBM(QObject* parent) : DeviceStatusProtocolBase(parent) +{ + +} + +BCodeTerminalProtocolBM::~BCodeTerminalProtocolBM() +{ + +} + +// 解析数据 +bool BCodeTerminalProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) +{ + if (frameType != 1) + return false; + + qint8 length = rawData.mid(1, 2).toInt(0, 16); + QByteArray content = rawData.mid(19, length - 24); + int outBdcByte = 0; + int outBacByte = 0; + QString outStr = ""; + + ((BCodeTerminalStatusDto *) frameData)->devStatus = content.at(0); + ((BCodeTerminalStatusDto *) frameData)->bdcInStatus = content.at(2); + ((BCodeTerminalStatusDto *) frameData)->bacInStatus = content.at(3); + ((BCodeTerminalStatusDto *) frameData)->fiveInStatus = content.at(4); + + outBdcByte = content.mid(6, 1).toInt(0, 16); + outBacByte = content.mid(5, 1).toInt(0, 16); + for (int i = 0; i < 4; i++) + { + ((BCodeTerminalStatusDto *) frameData)->bdcOutStatusList.append(QString("%1").arg(outBdcByte % 2)); + ((BCodeTerminalStatusDto *) frameData)->bacOutStatusList.append(QString("%1").arg(outBacByte % 2)); + + outBdcByte = outBdcByte / 2; + outBacByte = outBacByte / 2; + } + + ((BCodeTerminalStatusDto *) frameData)->ref = content.at(7); + ((BCodeTerminalStatusDto *) frameData)->track = content.at(8); + ((BCodeTerminalStatusDto *) frameData)->bacRange = content.mid(9, 4).toFloat(); + ((BCodeTerminalStatusDto *) frameData)->bacRatio = content.mid(13, 1).toInt(); + + ((BCodeTerminalStatusDto *)frameData)->frameType = B_CODE_TERMINAL_STATUS_FRAME_TYPE; + + return true; +} +DeviceFrameBaseDto * BCodeTerminalProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = new BCodeTerminalStatusDto(); + + return frameData; +} + +// +QList BCodeTerminalProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + while (rawData.endsWith(QByteArray("*")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + qint8 length = rawData.mid(1, 2).toInt(0, 16); + if (rawData.at(0) == '$' && rawData.at(length - 1) == '*') + { + ba.append(rawData.mid(0, length)); + resultList.append(ba); + ba.clear(); + rawData = rawData.mid(length, rawData.size() - length); + } else + { + break; + } + } + + return resultList; +} + +// 检测帧格式,帧头帧尾 +int BCodeTerminalProtocolBM::checkFrame(QByteArray rawData) +{ + if (rawData.at(0) == '$' && rawData.at(rawData.size() - 1) == '*' && + rawData.at(3) == '2' && rawData.at(20) == '2' && // + rawData.size() == rawData.mid(1, 2).toInt(0, 16)) + return 1; + return 0; +} diff --git a/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h new file mode 100644 index 0000000..465110b --- /dev/null +++ b/DevStatusAcq/protocol/BCodeTerminalProtocolBM.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALPROTOCOLBM_H +#define BCODETERMINALPROTOCOLBM_H + +#include + +#include "common/utils/QByteUtil.h" +#include "DeviceStatusProtocolBase.h" +#include "dto/BCodeTerminalStatusDto.h" + +class BCodeTerminalProtocolBM : public DeviceStatusProtocolBase +{ + Q_OBJECT +public: + explicit BCodeTerminalProtocolBM(QObject *parent = nullptr); + ~BCodeTerminalProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); +}; + +#endif // BCODETERMINALPROTOCOLBM_H diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index bbb06f8..a170ee3 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -5,6 +5,7 @@ #include "FreqSwitcherProtocolBM.h" #include "TimeReplicatorProtocolBM.h" #include "FreqReplicatorProtocolTX.h" +#include "BCodeTerminalProtocolBM.h" #include @@ -34,6 +35,9 @@ } else if (deviceType.contains("TimeReplicator") == true) { return new TimeReplicatorProtocolBM(); + } else if (deviceType.contains("BCodeTerminal") == true) + { + return new BCodeTerminalProtocolBM(); } return nullptr; diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 0ae041e..6750c3d 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -94,6 +94,8 @@ static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; diff --git a/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp new file mode 100644 index 0000000..44c3c38 --- /dev/null +++ b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.cpp @@ -0,0 +1,37 @@ +#include "BCodeTerminalStatusDto.h" + +BCodeTerminalStatusDto::BCodeTerminalStatusDto(QObject* parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject BCodeTerminalStatusDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", this->devStatus); + dataObj.insert("bdcInStatus", bdcInStatus); + dataObj.insert("bacInStatus", bacInStatus); + dataObj.insert("fiveInStatus", fiveInStatus); + dataObj.insert("ref", ref); + dataObj.insert("track", track); + dataObj.insert("bacRange", bacRange); + dataObj.insert("bacRatio", bacRatio); + + QJsonArray bdcOutStatusArray; + QJsonArray bacOutStatusArray; + for (int i = 0; i < 4; i++) + { + bdcOutStatusArray.append(bdcOutStatusList.at(i)); + bacOutStatusArray.append(bacOutStatusList.at(i)); + } + dataObj.insert("bdcOutStatusArray", bdcOutStatusArray); + dataObj.insert("bacOutStatusArray", bacOutStatusArray); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h new file mode 100644 index 0000000..db54b55 --- /dev/null +++ b/DevStatusAcq/protocol/dto/BCodeTerminalStatusDto.h @@ -0,0 +1,28 @@ +#ifndef BCODETERMINALSTATUSDTO_H +#define BCODETERMINALSTATUSDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class BCodeTerminalStatusDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit BCodeTerminalStatusDto(QObject * parent = nullptr); + + QString devStatus; + QString bdcInStatus; + QString bacInStatus; + QString fiveInStatus; + QList bdcOutStatusList; + QList bacOutStatusList; + QString ref; + QString track; + float bacRange; + qint8 bacRatio; + + QJsonObject toJSON() override; +}; + +#endif // BCODETERMINALSTATUSDTO_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index ffbfe0a..f09b42f 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -1,5 +1,6 @@ -HEADERS += $$PWD/dto/DeviceFrameBaseDto.h +HEADERS += $$PWD/dto/DeviceFrameBaseDto.h \ + $$PWD/dto/BCodeTerminalStatusDto.h HEADERS += $$PWD/dto/SignalGeneratorStatusDto.h HEADERS += $$PWD/dto/SignalGeneratorInterfaceDto.h HEADERS += $$PWD/dto/SignalGeneratorZDATimeDto.h @@ -19,8 +20,10 @@ HEADERS += $$PWD/FreqSwitcherProtocolBM.h HEADERS += $$PWD/TimeReplicatorProtocolBM.h HEADERS += $$PWD/FreqReplicatorProtocolTX.h +HEADERS += $$PWD/BCodeTerminalProtocolBM.h -SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp +SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp \ + $$PWD/dto/BCodeTerminalStatusDto.cpp SOURCES += $$PWD/dto/SignalGeneratorInterfaceDto.cpp SOURCES += $$PWD/dto/SignalGeneratorZDATimeDto.cpp SOURCES += $$PWD/dto/SignalGeneratorMJDTimeDto.cpp @@ -39,3 +42,4 @@ SOURCES += $$PWD/FreqSwitcherProtocolBM.cpp SOURCES += $$PWD/TimeReplicatorProtocolBM.cpp SOURCES += $$PWD/FreqReplicatorProtocolTX.cpp +SOURCES += $$PWD/BCodeTerminalProtocolBM.cpp