Newer
Older
PhaseMeasure / protocol / PhaseProtocolBM.cpp
#include "PhaseProtocolBM.h"
#include <iostream>

PhaseProtocolBM::PhaseProtocolBM(QObject *parent) : QObject(parent)
{

}

PhaseProtocolBM::~PhaseProtocolBM()
{

}

bool PhaseProtocolBM::parseMessureData(QByteArray rawData, PhaseDataDto * dataObj)
{
    // 获取帧头——帧计数
    QByteArray head = rawData.left(PHASE_FRAME_ID_LENGTH);
    dataObj->frameId = QByteUtil::binToHexString(head);

    int j = 0; // 用于转换通道顺序

    // 获取每个通道的测量数据
    for (int i = 1; i <= PHASE_MESSURE_CHANNEL; i++)
    {
        if (i <= 8)
        {
            j = 2 * i - 1;

        } else
        {
            j = 2 * (i - 8);
        }

        QByteArray channelRaw = rawData.left(PHASE_MESSURE_SIZE * j + PHASE_FRAME_ID_LENGTH).right(PHASE_MESSURE_SIZE);
        qulonglong channelRawData = QByteUtil::binToULong(channelRaw, 8);

        if (channelRawData == CALCULATE_OFFSET)
        {
            dataObj->channelActive.append("0");
            dataObj->rawPhaseDiffData.append(0);
            dataObj->channelBeforeDelay.append(0.00);
            dataObj->channelData.append(0.00);
            dataObj->channelDataStr.append("0.00");
        } else if (channelRawData > CALCULATE_OFFSET)
        {
            double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR;
            dataObj->channelActive.append("1");
            dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET);
            dataObj->channelBeforeDelay.append(phase);
            dataObj->channelData.append(phase); // 暂时不加补偿值
            dataObj->channelDataStr.append(QString::number(phase, 'f', 15));
        } else
        {
            double phase = (CALCULATE_OFFSET - channelRawData) * CALCULATE_FACTOR;
            dataObj->channelActive.append("1");
            dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET);
            dataObj->channelBeforeDelay.append(phase);
            dataObj->channelData.append(phase); // 暂时不加补偿值
            dataObj->channelDataStr.append(QString::number(phase, 'f', 15));
        }
    }

    return true;
}

QString PhaseProtocolBM::startMessure()
{
    return "$START*";
}
QString PhaseProtocolBM::stopMessure()
{
    return "$$STOP*";
}

QList<QByteArray> PhaseProtocolBM::extractFrameList(QByteArray rawData)
{
    QList<QByteArray> resultList;
    if (rawData.size() < PHASE_FRAM_LENGTH)
    {
        // 长度小于帧长度则直接返回空
        return resultList;
    }

    int tail = rawData.indexOf(PHASE_FRAME_TAIL);
    if (tail < PHASE_FRAM_LENGTH - PHASE_FRAME_TAIL.size())
    {
        // 没有检测到帧尾EEEEEEEE或者帧尾前的长度不够则直接返回空
        return resultList;
    }

    while (rawData.size() > 0)
    {
        QByteArray ba;
        ba.append(rawData.mid(tail - PHASE_FRAM_LENGTH + PHASE_FRAME_TAIL.size(), PHASE_FRAM_LENGTH));
        resultList.append(ba);
        rawData = rawData.right(tail + PHASE_FRAME_TAIL.size());
    }

    return resultList;
}

bool PhaseProtocolBM::checkFrame(QByteArray rawData)
{
    // 帧长度小于最小的长度
    if (rawData.length() != PHASE_FRAM_LENGTH)
    {
        return false;
    }

    // 帧尾不是0xEEEEEEEE
    if (rawData.mid(rawData.length() - PHASE_FRAME_TAIL.size()) != PHASE_FRAME_TAIL)
    {
        return false;
    }

    return true;
}