AVS/GD32F103C8T6/App/User/Peripheral/DiaoDu/diaodu.c

97 lines
2.1 KiB
C
Raw Normal View History

2023-10-18 17:36:51 +08:00
#include "diaodu.h"
#define DIAODU_RX_LEN 256
static uint16_t diaodu_rx_status = 0;
static uint16_t diaodu_rx_length = 0;
static uint8_t diaodu_rx_buffer[DIAODU_RX_LEN] = {0};
static void diaodu_unpacking(uint8_t *buffer, uint16_t length);
void diaodu_init(void)
{
}
void diaodu_process(void)
{
if (diaodu_rx_status & 0x8000)
{
diaodu_unpacking(diaodu_rx_buffer, diaodu_rx_status & 0x7FFF);
diaodu_rx_status = 0;
diaodu_rx_length = 0;
}
}
void diaodu_concat_byte(uint8_t data)
{
if (diaodu_rx_status & 0x8000)
return;
if (diaodu_rx_status > DIAODU_RX_LEN)
diaodu_rx_status = 0;
diaodu_rx_buffer[diaodu_rx_status++] = data;
if (diaodu_rx_status == 1)
{
if (data != 0x7E)
diaodu_rx_status = 0;
}
else if (diaodu_rx_status == 4)
{
if (diaodu_rx_buffer[3] != 0x32)
diaodu_rx_status = 0;
}
else if (diaodu_rx_status == 7)
{
diaodu_rx_length = (diaodu_rx_buffer[5] << 8 & 0xFF00) | (diaodu_rx_buffer[6] & 0xFF);
diaodu_rx_length += 9;
}
else if (diaodu_rx_status == diaodu_rx_length)
{
if (diaodu_rx_buffer[diaodu_rx_status - 1] == 0x7F)
diaodu_rx_status |= 0x8000;
else
{
diaodu_rx_status = 0;
diaodu_rx_length = 0;
}
}
}
__weak void diaodu_arrival_or_departure_parsing(uint8_t status) {}
static uint8_t diaodu_check(uint8_t *buffer, uint16_t index, uint16_t length)
{
uint8_t data = 0;
for (uint16_t i = index; i < length; i++)
data ^= buffer[i];
return data;
}
static void diaodu_unpacking(uint8_t *buffer, uint16_t length)
{
uint8_t crc = 0x00;
for (uint16_t i = 0; i < length - 2; i++)
crc ^= buffer[i];
if (crc == buffer[length - 2])
{
uint16_t len = 0;
for (uint8_t i = 7; i < length; i += 4)
{
/* 到、离站类型 */
if (buffer[i] == 0x04)
{
diaodu_arrival_or_departure_parsing(buffer[i + 3]);
return;
}
}
}
}