#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; } }