Files

109 lines
3.7 KiB
C++

#include "protocol.h"
CmdData cmd_save;
static protocolComType_t pUartHandle;
__attribute__((weak)) void protocol_callback(CmdData cmd);
__attribute__((weak)) void protocol_data_write(uint8_t data);
static uint8_t CheckSumCal(uint8_t *pData, uint32_t num) {
if (pData == NULL) { return 0x00; }
if (num == 0) { return 0x00; }
uint8_t crc_data = 0x00;
for (uint32_t i = 0; i < num; i++) {
/*仅保留低位*/
crc_data += 0xff & pData[i];
}
return crc_data;
}
static void InitPtcStruct() {
pUartHandle.step = 0;
pUartHandle.tmpCnt = 0;
pUartHandle.aRxBufIndex = 0;
pUartHandle.aRxCrcIndex = 0;
}
void protocol_rec_put(uint8_t data) {
switch (pUartHandle.step) {
case 0:
if (data == FRAME_HEAD_SAME_FA) { /*帧头正确*/
pUartHandle.step++;/*跳转下一步骤*/
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data;
}
break;
case 1:
if (data == FRAME_HEAD_SAME_FA) {
pUartHandle.step = 1;/*第一帧头重复,回到第二帧头判断处,AA 55 AA 55的情况*/
pUartHandle.aRxBufIndex = 1;/*更新第二帧头*/
}
else {
pUartHandle.tmpCnt = data + 1;/*临时计数值*/
pUartHandle.step++;/*跳转下一步骤*/
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data;/*压入缓冲区*/
if (((RX_BUF_LENGTH - pUartHandle.aRxBufIndex) < data) || (data == 0)) {/*缓冲区溢出或数据长度为 0*/
InitPtcStruct();/*初始化结构体值,准备下一次接收*/
}
}
break;
case 2:
if ((--pUartHandle.tmpCnt) > 0) {/*接收数据到缓冲区*/
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data;
if (pUartHandle.aRxBufIndex >= RX_BUF_LENGTH) {/*长度被意外修改,导致缓冲区溢出*/
InitPtcStruct();/*初始化结构体值,准备下一次接收*/
}
}
else {
if (pUartHandle.aRxBufIndex > 7 && CheckSumCal(&pUartHandle.aRxBuf[0], pUartHandle.aRxBufIndex + 1) == data) {
cmd_save.src = pUartHandle.aRxBuf[2];
cmd_save.dst = pUartHandle.aRxBuf[3];
cmd_save.seq = pUartHandle.aRxBuf[4];
cmd_save.res = pUartHandle.aRxBuf[5];
cmd_save.payload.cmd_id = pUartHandle.aRxBuf[6];
cmd_save.payload.ack_flag = pUartHandle.aRxBuf[7];
cmd_save.payload.cmd_length = pUartHandle.aRxBufIndex - 8;
cmd_save.payload.cmd_value = (uint8_t *)malloc(sizeof(uint8_t) * cmd_save.payload.cmd_length);
for (int i = 0; i < cmd_save.payload.cmd_length; i++) {
cmd_save.payload.cmd_value[i] = pUartHandle.aRxBuf[8 + i];
}
protocol_callback(cmd_save);
free(cmd_save.payload.cmd_value);
}
InitPtcStruct(); /*初始化结构体值,准备下一次接收*/
}
break;
default:
InitPtcStruct();/*初始化结构体值,准备下一次接收*/
break;
}
}
void protocol_send_data(CmdData data) {
protocolComType_t pUartHandle;
pUartHandle.aRxBufIndex = 0;
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = FRAME_HEAD_SAME_FA;
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = data.payload.cmd_length + 6;
uint8_t *ptx = (uint8_t *)&data;
for (int i = 0; i < 6; i++) {
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = ptx[i];
}
if (data.payload.cmd_length) {
ptx = data.payload.cmd_value;
for (int i = 0; i < data.payload.cmd_length; i++) {
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = ptx[i];
}
}
uint8_t check = CheckSumCal(&pUartHandle.aRxBuf[0], 8 + data.payload.cmd_length);
pUartHandle.aRxBuf[pUartHandle.aRxBufIndex++] = check;
for (int i = 0; i < pUartHandle.aRxBufIndex; i++) {
protocol_data_write(pUartHandle.aRxBuf[i]);
}
InitPtcStruct();
}