88 lines
1.4 KiB
C++
88 lines
1.4 KiB
C++
#include "codec_m4.h"
|
|
#include "QDebug"
|
|
|
|
bool codec_m4::recvByte(int byte)
|
|
{
|
|
bool ack = false;
|
|
if (fullFrame == true)
|
|
{
|
|
return fullFrame;
|
|
}
|
|
data.append(byte);
|
|
switch (data.size())
|
|
{
|
|
case 1:
|
|
if (uint8_t(data[0]) == 0xff)
|
|
{
|
|
num_to_read = 2;
|
|
}
|
|
else
|
|
{
|
|
data.remove(0, 1);
|
|
num_to_read = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
int len = data[1];
|
|
num_to_read = len + 2;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
// 此时一帧数据已完成
|
|
if (num_to_read > 0 && num_to_read == data.size())
|
|
{
|
|
data.remove(0, 2);
|
|
qDebug() << "recv_m4:" << QString(data) << endl;
|
|
ack = true;
|
|
num_to_read = 0;
|
|
}
|
|
fullFrame = ack;
|
|
return fullFrame;
|
|
}
|
|
|
|
int codec_m4::packCheck(myarray data)
|
|
{
|
|
if (data[0] != 0xff)
|
|
{
|
|
return 0;
|
|
}
|
|
if (data.size() >= 2 && (data.size() >= (data[1] + 2)))
|
|
{
|
|
return data[1] + 2;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
myarray codec_m4::encode(int srcAddr, int dstAddr, int cmd, myarray data)
|
|
{
|
|
myarray r;
|
|
r.append(0xff);
|
|
r.append(char(data.size()));
|
|
r.append(data);
|
|
return r;
|
|
}
|
|
myarray codec_m4::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
|
|
{
|
|
// qDebug("m4 recv:%s",data.toHex(' ').data());
|
|
if (packCheck(data))
|
|
{
|
|
return data.mid(2,data[1]);
|
|
}
|
|
return myarray();
|
|
}
|
|
|
|
Codec *codec_get()
|
|
{
|
|
static Codec *codec_ = nullptr;
|
|
if (codec_ == nullptr)
|
|
{
|
|
codec_ = new codec_m4();
|
|
}
|
|
return codec_;
|
|
}
|
|
|
|
codec_export(codec_m4, codec_get);
|