Newer
Older
ZXSSCJ / CounterAcq / CounterDevice.cpp
TAN YUE on 23 Feb 2022 4 KB 20220223 离线钟差采集
#include "CounterDevice.h"

#include <iostream>
#include <QDateTime>
#include <QDebug>

CounterDevice::CounterDevice(QObject *parent) : QObject(parent)
{
    connect(&this->serialUtil, &QSerialPortUtil::dataRecieved,
                this, &CounterDevice::dataReceivedHandler);
    udpClient = new QUdpSocket(this);
}

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

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

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

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


void CounterDevice::dataReceivedHandler(QByteArray data)
{
    this->dataBuff.append(data);
    std::cout << QByteUtil::binToHexString(this->dataBuff).toStdString() << std::endl;

    CounterDataDto * counterData = new CounterDataDto(this);
    if (CounterProtocolXH::checkFrame(this->dataBuff) == true)
    {
        counterData->rawFrame = this->dataBuff;

        // ★解析成数据对象
        bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData);

        // 解析成功
        if (parse == true)
        {
            this->dataBuff.clear();
            QDateTime now = QDateTime::currentDateTime();
            counterData->devCode = this->devCode;
            counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz");
            counterData->milisecond = now.toMSecsSinceEpoch();
            this->afterFramePhase(counterData);
        }
    } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH)
    {
        std::cout << QString("%1").arg(this->dataBuff.size()).toStdString() << std::endl;
        this->dataBuff.clear();
    }

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


void CounterDevice::afterFramePhase(CounterDataDto * counterData)
{
    // 0. 输出到日志文件中
    QString date = counterData->timestamp.mid(0, 10);

    // 1. 原始字节数组数据
    QString filename = "raw_" + devCode + ".log";
    QString content = counterData->timestamp + " " + counterData->rawFrame;
    QLogUtil::writeRawDataLogByDate(date, filename, content);

    // 2. 各个通道的clock diff数据
    for (int i = 1; i <= counterData->channelActiveArray.size(); i++)
    {
        if (counterData->channelRefId == i)
        {
            continue;
        }
        if (counterData->channelActiveArray.at(i-1).toUInt() == 1)
        {
            QString chFilename("%1_CH_%2.log");
            chFilename = chFilename.arg(devCode);
            if (i < 10)
            {
                chFilename = chFilename.arg(QString("0%1").arg(i));
            } else
            {
                chFilename = chFilename.arg(i);
            }
            QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1));

            QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr);

            // 取到钟编号和时延值
            QString openClock = SettingConfig::getInstance().CLOCK_ARR.at(0).at(i - 1);
            QString closeClock = SettingConfig::getInstance().CLOCK_ARR.at(0).at(counterData->channelRefId - 1);
            QString delay = SettingConfig::getInstance().DELAY_ARR.at(0).at(i - 1);

            // 3. 通过UDP发送到本地的Java后端进行存库处理
            QJsonObject jsonObj = counterData->toJSON(i - 1);
            jsonObj.insert("deviceId", deviceId);
            jsonObj.insert("devCode", devCode);
            QJsonObject data = jsonObj.take("data").toObject();
            data.insert("openClock", openClock);
            data.insert("closeClock", closeClock);
            double value = data.find("dataValue")->toString().toDouble();
            value += delay.toDouble() * 1E-9;
            data.insert("dataValue", QString::number(value, 'f', 12));
            jsonObj.insert("data", data);
            udpClient->writeDatagram(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact)).toLocal8Bit(), QHostAddress(SettingConfig::getInstance().RECV_HOST), SettingConfig::getInstance().RECV_PORT);
        }
    }

    // 4. 在界面上简单显示相差数据结果
    emit this->sendDataToDraw(counterData);
}

void CounterDevice::onClockChanged()
{

}

void CounterDevice::onDelayChanged()
{

}