a serial library to communicate with pebble time's smart strap interface

Dependents:   xadow_smartstrap_for_pebble

Committer:
KillingJacky
Date:
Wed Nov 04 09:58:41 2015 +0000
Revision:
0:e4dad9e53f06
initial commit;

Who changed what in which revision?

UserRevisionLine numberNew 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 }