Files
checker_host/interface/codec_slave.cpp
2023-11-29 15:36:45 +08:00

87 lines
2.0 KiB
C++

#include "codec_slave.h"
#include "base/crc.h"
myarray codec_slave::encode(int srcAddr, int dstAddr, int cmd, myarray data)
{
Q_UNUSED(srcAddr);
myarray t;
uint16_t len = data.size() + 10;
cmd_no++;
t.append('Y');
t.append('e');
t.append(len & 0xff);
t.append(len >> 8);
t.append(char(0)); // 源地址
t.append(char(dstAddr & 0xff)); // 目标地址
t.append(cmd); // 命令码
t.append(cmd_no & 0xff);
t.append(cmd_no >> 8);
t.append(data);
t.append(crc::crc8((uint8_t *)t.data(), t.size()));
return t;
}
myarray codec_slave::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
{
myarray r;
QString str_err = "ok";
if(data.size()==1){
srcAddr = data[0];
dstAddr = 0;
r.append(char(0));
return r;
}
if (data.size() < 10)
{
// 一帧数据至少10字节
qWarning("recv data len too less");
str_err = "recv data len too less.";
return r;
}
uint16_t len = data[2] | (data[3] << 8);
uint8_t crc = crc::crc8((uint8_t *)data.data(), data.size() - 1);
if (len != data.size())
{
// 如果长度不相等则产生了数据丢失
qWarning("recv data have lossed");
str_err = "recv data have lossed.";
return r;
}
srcAddr = data[4];
dstAddr = data[5];
uint16_t no = data[7] | (data[8] << 8);
uint16_t h_no = cmd_no;
if (no != h_no)
{
// 发送一条指令应等待其返回,此时流水号应相同
// qWarning()<<"alave_addr="<<src_addr<<" cmd_no error:host="<<h_no<<",slave="<<no<<endl;
// return r;
// str_err="cmd no err.";
}
if (crc != uint8_t(data[len - 1]))
{
// crc校验不对
qWarning("recv data crc check error:%02x,%02x", crc, uint8_t(data[len - 1]));
qWarning("data=%s", data.toHex(' ').data());
str_err = "crc check err.";
}
cmd = data[6];
r = data.mid(9, len - 10);
return r;
}
Codec *codec_slave_get()
{
static Codec *codec_ = nullptr;
if (codec_ == nullptr)
{
codec_ = new codec_slave();
}
return codec_;
}
codec_export(codec_slave, codec_slave_get);