Newer
Older
PhaseMeasure / PhaseDevice.cpp
#include "PhaseDevice.h"
#include "common/utils/QLogUtil.h"

#include <iostream>
#include <QDateTime>
#include <QMutex>
#include <QTimer>

// 原始数据 - 补偿之前的值
QVector<QVector<QStringList>> phaseVector(PHASE_MESSURE_CHANNEL, QVector<QStringList>());

// allan方差值 - 1s ~ 10000s
QVector<QVector<double>> channelAllan(PHASE_MESSURE_CHANNEL, QVector<double>(0,0));

PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent)
{
    clientUtil = new UDPClientUtil(this);
    connect(clientUtil, &UDPClientUtil::dataRecieved,
            this, &PhaseDevice::dataReceivedHandler);

    casicDev = new casic::birmm::tflab::CasicDevPhase();

    base = (qrand() % 100000) * 1000;

    QTimer * timer = new QTimer(this);
    connect(timer, &QTimer::timeout,
            this, &PhaseDevice::mockPhaseData);
    timer->start(1000);
}

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);

    qulonglong* frameSN;
    QList<double> * channelValue = new QList<double>();
    QList<double> * channelAllen = new QList<double>();

    int recCode = casicDev->frameParse(dataBuff, &frameSN, channelValue, channelAllen);
    if (recCode != casic::birmm::tflab::RETURN_STATUS::FAIL)
    {
        dataBuff.clear();

        std::cout << "[value]: ";
        for (int i = 0; i < 16; i++)
        {
            std::cout << QString::number(channelValue->at(i), 'e', 6).toStdString() << " ";
        }
        std::cout << std::endl;

        if (recCode == casic::birmm::tflab::RETURN_STATUS::SUCCESS)
        {
            std::cout << "[allen]: ";
            for (int i = 0; i < 16; i++)
            {
                std::cout << QString::number(channelAllen->at(i), 'e', 6).toStdString() << " ";
            }
            std::cout << std::endl;
        }
    }
}

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 + " " + ByteUtil::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")
        {
            // 3.1 计算补偿的值
            double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps
            phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay;
            phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15);

            // 3.2 将通道数据写日志
            QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0'));

            QString channelDataStr = QString("%1 %2")
                    .arg(phaseData->timestamp)
                    .arg(QString::number(phaseData->channelBeforeDelay.at(i), 'e', 6));

            QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr);

            // 3.3 将补偿前的时差数据存入数据栈, 用于计算allen方差
            QStringList valueList;
            valueList << QString::number(phaseData->milisecond) << QString::number(phaseData->channelBeforeDelay.at(i), 'e', 6);
            QMutex mutex;
            mutex.lock();
            phaseVector[i].append(valueList);
            mutex.unlock();

            // 3.4 分别计算不同时间维度的稳定度
            int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER;
//            if(size>=5)  vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0;
//            if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0;
//            if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0;
//            if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0;
//            if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0;

            // 3.5 将稳定度计算结果存入
            channelAllan[i] = vector;
        } else
        {
            channelAllan[i] = vectorZero;
        }
    }

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

void PhaseDevice::mockPhaseData()
{
    QDateTime now = QDateTime::currentDateTime();

    QString frameId = now.toString("HHmmsszzz");

    QByteArray buffer;
    buffer.append(ByteUtil::hexStringToBytes(frameId.mid(0, 8)));

    for (int i = 1; i <= 16; i++)
    {
        int value = base + qrand() % 40;
        base = value;
        buffer.append(ByteUtil::hexStringToBytes("00800000")).append(ByteUtil::ULongToBytes(value, 4));
    }

    buffer.append(ByteUtil::hexStringToBytes("EEEEEEEE"));

    this->dataReceivedHandler(buffer);
}