Newer
Older
ZXSSCJ / DeviceHub / protocol / FrequencyTuningProtocolTX.cpp
#include "FrequencyTuningProtocolTX.h"

FrequencyTuningProtocolTX::FrequencyTuningProtocolTX(QObject *parent) : DeviceProtocolBase(parent)
{

}

FrequencyTuningProtocolTX::~FrequencyTuningProtocolTX()
{

}

DeviceFrameBaseDto * FrequencyTuningProtocolTX::frameFactory(int frameType)
{
    DeviceFrameBaseDto * frameData = 0;
    switch (frameType) {
        case FrequencyTuningProtocolTX::FREQUENCY_TUNING_FRAME_TYPE::STATUS_FRAME :
            frameData = new FrequencyTuningStatusFreqDto();
            break;

        case FrequencyTuningProtocolTX::FREQUENCY_TUNING_FRAME_TYPE::LOCK_FRAME :
            frameData = new FrequencyTuningStatusLockDto();
            break;

        case FrequencyTuningProtocolTX::FREQUENCY_TUNING_FRAME_TYPE::CMDREP_FRAME:
            frameData = new CommandReplyDto();
            break;

        default:
            frameData = nullptr;
            break;
    }

    return frameData;
}

bool FrequencyTuningProtocolTX::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType)
{
    // get the raw data between ',' and '*'
    qint8 length = rawData.mid(1, 2).toInt(0, 16);
    QByteArray content = rawData.mid(20, length - 25);

    switch (frameType) {
    case FrequencyTuningProtocolTX::FREQUENCY_TUNING_FRAME_TYPE::STATUS_FRAME :
    {
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = content.at(0);
        QList<QByteArray> subValues = content.split(0x20);
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjust = subValues.at(1).toDouble();
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subValues.at(2).toDouble();
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->phaseShift = subValues.at(3).toLongLong();
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseWidth = subValues.at(4).toLongLong();
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->phaseAdjust = subValues.at(5).toDouble();
        ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE;
        break;
    }
    case FrequencyTuningProtocolTX::FREQUENCY_TUNING_FRAME_TYPE::LOCK_FRAME :
    {
        ((FrequencyTuningStatusLockDto *)ftFrameData)->lockStatus = content.at(2);
        ((FrequencyTuningStatusLockDto *)ftFrameData)->frameType = FREQUENCY_TUNING_LOCK_FRAME_TYPE;
        break;
    }
    default:
        break;
    }

    return true;
}

QList<QByteArray> FrequencyTuningProtocolTX::extractFrameList(QByteArray rawData)
{
    QList<QByteArray> resultList;

    int start = rawData.indexOf("$");
    if (start < 0)
    {
        return resultList;
    }
    rawData = rawData.right(rawData.size() - start);

    int end = rawData.lastIndexOf("*");
    if (end < 0) {
        return resultList;
    }
    rawData = rawData.left(end - start + 1);

    QByteArray ba;
    for (int i = 0; i < rawData.size(); i++)
    {
        ba.append(rawData.at(i));
        if (rawData.at(i) == '*')
        {
            resultList.append(ba);
            ba.clear();
        }
    }

    return resultList;
}

int FrequencyTuningProtocolTX::checkFrame(QByteArray rawData)
{
    // 帧尾不是*
    if (FREQ_TUNN_STATUS_FRAME_TAIL != rawData.at(rawData.size() - 1))
    {
        return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME;
    }

    // 帧头不是$
    if (FREQ_TUNN_STATUS_FRAME_HEAD == rawData.at(0))
    {
        if (rawData.at(3) == '2')
        {
            if (rawData.at(1+2+1+9+7+1) == '2')
            {
                return FREQUENCY_TUNING_FRAME_TYPE::LOCK_FRAME;
            } else if (rawData.at(1+2+1+9+7+1) == '3')
            {
                return FREQUENCY_TUNING_FRAME_TYPE::STATUS_FRAME;
            }
        } else if (rawData.at(3) == '4')
        {
            return FREQUENCY_TUNING_FRAME_TYPE::CMDREP_FRAME;
        } else
        {
            return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME;
        }
    } else
    {
        return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME;
    }
}