97 lines
2.1 KiB
C
97 lines
2.1 KiB
C
|
#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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|