diff options
| author | Fred Sundvik <fsundvik@gmail.com> | 2016-02-14 14:04:51 +0200 | 
|---|---|---|
| committer | Fred Sundvik <fsundvik@gmail.com> | 2016-02-14 14:04:51 +0200 | 
| commit | ce3a21cbeaa58cfa6b117a8be13be47a69f086ae (patch) | |
| tree | 24287b3d060778f92ec46a4d4e4a296aa8169d29 /serial_link/protocol/byte_stuffer.c | |
| parent | 8a991a266e7f8f9aff48049dffb17eccfa353ca1 (diff) | |
| download | firmware-ce3a21cbeaa58cfa6b117a8be13be47a69f086ae.tar.gz firmware-ce3a21cbeaa58cfa6b117a8be13be47a69f086ae.tar.bz2 firmware-ce3a21cbeaa58cfa6b117a8be13be47a69f086ae.zip  | |
Implement receive of valid small byte stuffed frames
Diffstat (limited to 'serial_link/protocol/byte_stuffer.c')
| -rw-r--r-- | serial_link/protocol/byte_stuffer.c | 36 | 
1 files changed, 35 insertions, 1 deletions
diff --git a/serial_link/protocol/byte_stuffer.c b/serial_link/protocol/byte_stuffer.c index 95ce86524..7ce01a96a 100644 --- a/serial_link/protocol/byte_stuffer.c +++ b/serial_link/protocol/byte_stuffer.c @@ -25,5 +25,39 @@ SOFTWARE.  #include "protocol/byte_stuffer.h"  #include "protocol/frame_validator.h" -void recv_byte(uint8_t data) { +// This implements the "Consistent overhead byte stuffing protocol" +// https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing +// http://www.stuartcheshire.org/papers/COBSforToN.pdf + +typedef struct byte_stuffer_state { +    uint16_t next_zero; +    uint16_t data_pos; +    uint8_t data[256]; +}byte_stuffer_state_t; + +void init_byte_stuffer_state(byte_stuffer_state_t* state) { +    state->next_zero = 0; +    state->data_pos = 0; +} + +void recv_byte(byte_stuffer_state_t* state, uint8_t data) { +    if (state->next_zero == 0) { +        state->next_zero = data; +        state->data_pos = 0; +        return; +    } + +    state->next_zero--; +    if (data == 0) { +        recv_frame(state->data, state->data_pos); +    } +    else { +        if (state->next_zero == 0) { +            state->next_zero = data; +            state->data[state->data_pos++] = 0; +        } +        else { +            state->data[state->data_pos++] = data; +        } +    }  }  | 
