Newer
Older
ZXSSCJ / DevStatusAcq / device / SignalGenerator.cpp
#include "SignalGenerator.h"

#include <iostream>
#include <QDateTime>

SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent)
{
    connect(&this->serialUtil, &QSerialPortUtil::dataRecieved,
            this, &SignalGenerator::dataReceivedHandler);

    kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS);
    kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC);
    kafkaUtil.createProducer();
}

SignalGenerator::~SignalGenerator()
{
    disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved,
               this, &SignalGenerator::dataReceivedHandler);
}

void SignalGenerator::setComName(QString comName)
{
    this->comName = comName;
}
void SignalGenerator::setBaudRate(int baudRate)
{
    this->baudRate = baudRate;
}
QString SignalGenerator::getDevCode()
{
    return this->devCode;
}
void SignalGenerator::setDevCode(QString devCode)
{
    this->devCode = devCode;
}

bool SignalGenerator::isSerialOpen()
{
    return this->serialUtil.isOpen();
}

void SignalGenerator::initSerialPort()
{
    this->serialUtil.openSerialPort(this->comName, this->baudRate);
}

void SignalGenerator::dataReceivedHandler(QByteArray data)
{
    this->dataBuff.append(data);

    std::cout << dataBuff.toStdString() << std::endl;

    QList<QByteArray> frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff);

    if (frameList.size() > 0)
    {
        for (int i = 0; i < frameList.size(); i++)
        {
            QByteArray frameByte = frameList.at(i);

            int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte);
            SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType);
            if (sgFrameDto != nullptr)
            {
                // ★解析成数据对象
                bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType);

                // 解析成功
                if (parse == true)
                {
                    QDateTime now = QDateTime::currentDateTime();
                    sgFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz");
                    sgFrameDto->milisecond = now.toMSecsSinceEpoch();
                    sgFrameDto->rawFrame = frameByte;

                    this->afterFramePhase(sgFrameDto);
                }

                // 在此处释放内存,不影响后续显示
                // 不在此处释放内存则会导致内存持续增加
                // 具体原因不明
                delete sgFrameDto;
            }
        }
    }
}

void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * 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)));
    }
}