123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- #include "serial_link/protocol/byte_stuffer.h"
- #include "serial_link/protocol/frame_validator.h"
- #include "serial_link/protocol/physical.h"
- #include <stdbool.h>
- typedef struct byte_stuffer_state {
- uint16_t next_zero;
- uint16_t data_pos;
- bool long_frame;
- uint8_t data[MAX_FRAME_SIZE];
- }byte_stuffer_state_t;
- static byte_stuffer_state_t states[NUM_LINKS];
- void init_byte_stuffer_state(byte_stuffer_state_t* state) {
- state->next_zero = 0;
- state->data_pos = 0;
- state->long_frame = false;
- }
- void init_byte_stuffer(void) {
- int i;
- for (i=0;i<NUM_LINKS;i++) {
- init_byte_stuffer_state(&states[i]);
- }
- }
- void byte_stuffer_recv_byte(uint8_t link, uint8_t data) {
- byte_stuffer_state_t* state = &states[link];
-
- if (state->next_zero == 0) {
- state->next_zero = data;
- state->long_frame = data == 0xFF;
- state->data_pos = 0;
- return;
- }
- state->next_zero--;
- if (data == 0) {
- if (state->next_zero == 0) {
-
- if (state->data_pos > 0) {
- validator_recv_frame(link, state->data, state->data_pos);
- }
- }
- else {
-
- init_byte_stuffer_state(state);
- }
- }
- else {
- if (state->data_pos == MAX_FRAME_SIZE) {
-
-
- state->next_zero = data;
- state->long_frame = data == 0xFF;
- state->data_pos = 0;
- }
- else if (state->next_zero == 0) {
- if (state->long_frame) {
-
- state->next_zero = data;
- state->long_frame = data == 0xFF;
- }
- else {
-
- state->next_zero = data;
- state->data[state->data_pos++] = 0;
- }
- }
- else {
- state->data[state->data_pos++] = data;
- }
- }
- }
- static void send_block(uint8_t link, uint8_t* start, uint8_t* end, uint8_t num_non_zero) {
- send_data(link, &num_non_zero, 1);
- if (end > start) {
- send_data(link, start, end-start);
- }
- }
- void byte_stuffer_send_frame(uint8_t link, uint8_t* data, uint16_t size) {
- const uint8_t zero = 0;
- if (size > 0) {
- uint16_t num_non_zero = 1;
- uint8_t* end = data + size;
- uint8_t* start = data;
- while (data < end) {
- if (num_non_zero == 0xFF) {
-
-
- send_block(link, start, data, num_non_zero);
- start = data;
- num_non_zero = 1;
- }
- else {
- if (*data == 0) {
-
- send_block(link, start, data, num_non_zero);
- start = data + 1;
- num_non_zero = 1;
- }
- else {
- num_non_zero++;
- }
- ++data;
- }
- }
- send_block(link, start, data, num_non_zero);
- send_data(link, &zero, 1);
- }
- }
|