Newer
Older
PhaseMeasure / PhaseDevice.cpp
#include "PhaseDevice.h"
#include "common/utils/QLogUtil.h"
#include <iostream>
#include <QDateTime>
QVector<QVector<double>> phaseVector(PHASE_MESSURE_CHANNEL,QVector<double>(0,0));
PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent)
{
    clientUtil = new UDPClientUtil(this);
    connect(clientUtil, &UDPClientUtil::dataRecieved,
            this, &PhaseDevice::dataReceivedHandler);
}

PhaseDevice::~PhaseDevice()
{
    disconnect(clientUtil, &UDPClientUtil::dataRecieved,
               this, &PhaseDevice::dataReceivedHandler);
}

void PhaseDevice::startWork()
{
    QString startCmd = PhaseProtocolBM::startMessure();
    clientUtil->sendData(startCmd.toLocal8Bit());
}

void PhaseDevice::stopWork()
{
    QString stopCmd = PhaseProtocolBM::stopMessure();
    clientUtil->sendData(stopCmd.toLocal8Bit());
}

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

    PhaseDataDto * phaseData = new PhaseDataDto(this);
    if (PhaseProtocolBM::checkFrame(this->dataBuff) == true)
    {
        phaseData->rawFrame = this->dataBuff;

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

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

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

void PhaseDevice::afterFramePhase(PhaseDataDto * phaseData)
{
    // 1. 清空dataBuff,等待下一帧的数据
    this->dataBuff.clear();

    // 2. 输出到日志文件中
    QString date = phaseData->timestamp.mid(0, 10);

    // 2.1 原始字节数组数据
    QString filename = "rawBytes.log";
    QString content = phaseData->timestamp + " " + QByteUtil::binToHexString(phaseData->rawFrame);
    QLogUtil::writeRawDataLogByDate(date, filename, content);

    QVector<double> vectorZero(5);
    QVector<double> vector(5);
    // 3.存+allen
    for (int i = 0; i < phaseData->channelActive.size(); i++)
    {

        if (phaseData->channelActive.at(i) == "1")
        {
            phaseVector[i].append(phaseData->channelData.at(i)); // 存
            int size = phaseVector[i].size();
            if(size>=5)  vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0;
            if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0;
            if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0;
            if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0;
            if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0;
            phaseData->channelAllan.append(vector);
        }
        else
        {
            phaseData->channelAllan.append(vectorZero);
        }

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