a serial library to communicate with pebble time's smart strap interface
Dependents: xadow_smartstrap_for_pebble
encoding.c@0:e4dad9e53f06, 2015-11-04 (annotated)
- Committer:
- KillingJacky
- Date:
- Wed Nov 04 09:58:41 2015 +0000
- Revision:
- 0:e4dad9e53f06
initial commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KillingJacky | 0:e4dad9e53f06 | 1 | #include "encoding.h" |
KillingJacky | 0:e4dad9e53f06 | 2 | |
KillingJacky | 0:e4dad9e53f06 | 3 | void encoding_streaming_decode_reset(EncodingStreamingContext *ctx) { |
KillingJacky | 0:e4dad9e53f06 | 4 | ctx->escape = false; |
KillingJacky | 0:e4dad9e53f06 | 5 | } |
KillingJacky | 0:e4dad9e53f06 | 6 | |
KillingJacky | 0:e4dad9e53f06 | 7 | bool encoding_streaming_decode(EncodingStreamingContext *ctx, uint8_t *data, bool *should_store, |
KillingJacky | 0:e4dad9e53f06 | 8 | bool *encoding_error) { |
KillingJacky | 0:e4dad9e53f06 | 9 | bool is_complete = false; |
KillingJacky | 0:e4dad9e53f06 | 10 | *encoding_error = false; |
KillingJacky | 0:e4dad9e53f06 | 11 | *should_store = false; |
KillingJacky | 0:e4dad9e53f06 | 12 | if (*data == ENCODING_FLAG) { |
KillingJacky | 0:e4dad9e53f06 | 13 | if (ctx->escape) { |
KillingJacky | 0:e4dad9e53f06 | 14 | // extra escape character before flag |
KillingJacky | 0:e4dad9e53f06 | 15 | ctx->escape = false; |
KillingJacky | 0:e4dad9e53f06 | 16 | *encoding_error = true; |
KillingJacky | 0:e4dad9e53f06 | 17 | } |
KillingJacky | 0:e4dad9e53f06 | 18 | // we've reached the end of the frame |
KillingJacky | 0:e4dad9e53f06 | 19 | is_complete = true; |
KillingJacky | 0:e4dad9e53f06 | 20 | } else if (*data == ENCODING_ESCAPE) { |
KillingJacky | 0:e4dad9e53f06 | 21 | if (ctx->escape) { |
KillingJacky | 0:e4dad9e53f06 | 22 | // invalid sequence |
KillingJacky | 0:e4dad9e53f06 | 23 | ctx->escape = false; |
KillingJacky | 0:e4dad9e53f06 | 24 | *encoding_error = true; |
KillingJacky | 0:e4dad9e53f06 | 25 | } else { |
KillingJacky | 0:e4dad9e53f06 | 26 | // ignore this character and escape the next one |
KillingJacky | 0:e4dad9e53f06 | 27 | ctx->escape = true; |
KillingJacky | 0:e4dad9e53f06 | 28 | } |
KillingJacky | 0:e4dad9e53f06 | 29 | } else { |
KillingJacky | 0:e4dad9e53f06 | 30 | if (ctx->escape) { |
KillingJacky | 0:e4dad9e53f06 | 31 | *data ^= ENCODING_ESCAPE_MASK; |
KillingJacky | 0:e4dad9e53f06 | 32 | ctx->escape = false; |
KillingJacky | 0:e4dad9e53f06 | 33 | } |
KillingJacky | 0:e4dad9e53f06 | 34 | *should_store = true; |
KillingJacky | 0:e4dad9e53f06 | 35 | } |
KillingJacky | 0:e4dad9e53f06 | 36 | |
KillingJacky | 0:e4dad9e53f06 | 37 | return is_complete; |
KillingJacky | 0:e4dad9e53f06 | 38 | } |
KillingJacky | 0:e4dad9e53f06 | 39 | |
KillingJacky | 0:e4dad9e53f06 | 40 | bool encoding_encode(uint8_t *data) { |
KillingJacky | 0:e4dad9e53f06 | 41 | if (*data == ENCODING_FLAG || *data == ENCODING_ESCAPE) { |
KillingJacky | 0:e4dad9e53f06 | 42 | *data ^= ENCODING_ESCAPE_MASK; |
KillingJacky | 0:e4dad9e53f06 | 43 | return true; |
KillingJacky | 0:e4dad9e53f06 | 44 | } |
KillingJacky | 0:e4dad9e53f06 | 45 | return false; |
KillingJacky | 0:e4dad9e53f06 | 46 | } |