#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; } } } }