First class data visualization and communication library with embedded devices. Code is maintained at github.com/Overdrivr/Telemetry

Dependents:   telemetry_car_demo telemetry_demo_FRDM-TFC telemetry_example_01 telemetry_indexed_data_demo ... more

Committer:
Overdrivr
Date:
Tue Apr 12 07:40:10 2016 +0000
Revision:
7:d224bddd5405
Parent:
6:f5e1b079bffd
Release 2.0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Overdrivr 3:37d2d127bc83 1 #include "framing.h"
Overdrivr 3:37d2d127bc83 2
Overdrivr 3:37d2d127bc83 3 typedef enum _state
Overdrivr 3:37d2d127bc83 4 {
Overdrivr 3:37d2d127bc83 5 IDLE, // No incoming frame is in process
Overdrivr 3:37d2d127bc83 6 ESCAPING, // incoming frame in process, next character to be escaped
Overdrivr 3:37d2d127bc83 7 ACTIVE // frame in process
Overdrivr 3:37d2d127bc83 8 } _state ;
Overdrivr 3:37d2d127bc83 9
Overdrivr 3:37d2d127bc83 10 typedef struct storage storage;
Overdrivr 3:37d2d127bc83 11 struct storage
Overdrivr 3:37d2d127bc83 12 {
Overdrivr 3:37d2d127bc83 13 uint8_t * ptr;
Overdrivr 3:37d2d127bc83 14 uint32_t size;
Overdrivr 3:37d2d127bc83 15 uint32_t cursor;
Overdrivr 3:37d2d127bc83 16
Overdrivr 3:37d2d127bc83 17 };
Overdrivr 3:37d2d127bc83 18
Overdrivr 3:37d2d127bc83 19 static storage incomingStorage;
Overdrivr 3:37d2d127bc83 20 static storage outgoingStorage;
Overdrivr 3:37d2d127bc83 21
Overdrivr 3:37d2d127bc83 22 int8_t safe_append(storage * s, uint8_t byte);
Overdrivr 3:37d2d127bc83 23
Overdrivr 3:37d2d127bc83 24 static uint8_t SOF_;
Overdrivr 3:37d2d127bc83 25 static uint8_t EOF_;
Overdrivr 3:37d2d127bc83 26 static uint8_t ESC_;
Overdrivr 3:37d2d127bc83 27
Overdrivr 3:37d2d127bc83 28 static _state incoming_state;
Overdrivr 3:37d2d127bc83 29
Overdrivr 3:37d2d127bc83 30 void (*on_incoming_frame_cb)(uint8_t * storage, uint32_t occupiedSize);
Overdrivr 3:37d2d127bc83 31 void (*on_error_cb)(int32_t errCode);
Overdrivr 3:37d2d127bc83 32
Overdrivr 3:37d2d127bc83 33 void initialize_framing()
Overdrivr 3:37d2d127bc83 34 {
Overdrivr 3:37d2d127bc83 35 incomingStorage.ptr = NULL;
Overdrivr 3:37d2d127bc83 36 outgoingStorage.ptr = NULL;
Overdrivr 3:37d2d127bc83 37
Overdrivr 3:37d2d127bc83 38 incomingStorage.size = 0;
Overdrivr 3:37d2d127bc83 39 outgoingStorage.size = 0;
Overdrivr 3:37d2d127bc83 40
Overdrivr 3:37d2d127bc83 41 incomingStorage.cursor = 0;
Overdrivr 3:37d2d127bc83 42 incomingStorage.cursor = 0;
Overdrivr 3:37d2d127bc83 43
Overdrivr 3:37d2d127bc83 44 SOF_ = 0xF7;
Overdrivr 3:37d2d127bc83 45 EOF_ = 0x7F;
Overdrivr 3:37d2d127bc83 46 ESC_ = 0x7D;
Overdrivr 3:37d2d127bc83 47
Overdrivr 3:37d2d127bc83 48 incoming_state = IDLE;
Overdrivr 3:37d2d127bc83 49 }
Overdrivr 3:37d2d127bc83 50
Overdrivr 3:37d2d127bc83 51 void outgoing_storage(uint8_t * buf, uint32_t bufSize)
Overdrivr 3:37d2d127bc83 52 {
Overdrivr 3:37d2d127bc83 53 outgoingStorage.ptr = buf;
Overdrivr 3:37d2d127bc83 54 outgoingStorage.size = bufSize;
Overdrivr 3:37d2d127bc83 55 }
Overdrivr 3:37d2d127bc83 56
Overdrivr 3:37d2d127bc83 57 void begin()
Overdrivr 3:37d2d127bc83 58 {
Overdrivr 3:37d2d127bc83 59 if(outgoingStorage.size == 0 || outgoingStorage.ptr == NULL)
Overdrivr 3:37d2d127bc83 60 return;
Overdrivr 3:37d2d127bc83 61
Overdrivr 3:37d2d127bc83 62 outgoingStorage.cursor = 0;
Overdrivr 3:37d2d127bc83 63
Overdrivr 3:37d2d127bc83 64 // Should not fail
Overdrivr 3:37d2d127bc83 65 safe_append(&outgoingStorage,SOF_);
Overdrivr 3:37d2d127bc83 66 }
Overdrivr 3:37d2d127bc83 67
Overdrivr 3:37d2d127bc83 68 void append(uint8_t byte)
Overdrivr 3:37d2d127bc83 69 {
Overdrivr 3:37d2d127bc83 70 if(outgoingStorage.size == 0 || outgoingStorage.ptr == NULL)
Overdrivr 3:37d2d127bc83 71 return;
Overdrivr 3:37d2d127bc83 72
Overdrivr 3:37d2d127bc83 73 // byte == to flag, need to escape it
Overdrivr 3:37d2d127bc83 74 if(byte == SOF_ || byte == EOF_ || byte == ESC_)
Overdrivr 3:37d2d127bc83 75 {
Overdrivr 3:37d2d127bc83 76 if(!safe_append(&outgoingStorage,ESC_))
Overdrivr 3:37d2d127bc83 77 return;
Overdrivr 3:37d2d127bc83 78 }
Overdrivr 3:37d2d127bc83 79
Overdrivr 3:37d2d127bc83 80 if(!safe_append(&outgoingStorage,byte))
Overdrivr 3:37d2d127bc83 81 return;
Overdrivr 3:37d2d127bc83 82 }
Overdrivr 3:37d2d127bc83 83
Overdrivr 3:37d2d127bc83 84 void append2(uint16_t twobytes)
Overdrivr 3:37d2d127bc83 85 {
Overdrivr 3:37d2d127bc83 86 uint8_t * ptr = (uint8_t*)(&twobytes);
Overdrivr 3:37d2d127bc83 87 append(ptr[0]);
Overdrivr 3:37d2d127bc83 88 append(ptr[1]);
Overdrivr 3:37d2d127bc83 89 }
Overdrivr 3:37d2d127bc83 90
Overdrivr 3:37d2d127bc83 91 void append4(uint32_t fourbytes)
Overdrivr 3:37d2d127bc83 92 {
Overdrivr 3:37d2d127bc83 93 uint8_t * ptr = (uint8_t*)(&fourbytes);
Overdrivr 3:37d2d127bc83 94 append(ptr[0]);
Overdrivr 3:37d2d127bc83 95 append(ptr[1]);
Overdrivr 3:37d2d127bc83 96 append(ptr[2]);
Overdrivr 3:37d2d127bc83 97 append(ptr[3]);
Overdrivr 3:37d2d127bc83 98 }
Overdrivr 3:37d2d127bc83 99
Overdrivr 3:37d2d127bc83 100 uint32_t end()
Overdrivr 3:37d2d127bc83 101 {
Overdrivr 3:37d2d127bc83 102 if(outgoingStorage.size == 0 || outgoingStorage.ptr == NULL)
Overdrivr 3:37d2d127bc83 103 return 0;
Overdrivr 3:37d2d127bc83 104
Overdrivr 3:37d2d127bc83 105 if(!safe_append(&outgoingStorage,EOF_))
Overdrivr 3:37d2d127bc83 106 return 0;
Overdrivr 3:37d2d127bc83 107
Overdrivr 3:37d2d127bc83 108 return outgoingStorage.cursor;
Overdrivr 3:37d2d127bc83 109 }
Overdrivr 3:37d2d127bc83 110
Overdrivr 3:37d2d127bc83 111 void incoming_storage(uint8_t * buf, uint32_t bufSize)
Overdrivr 3:37d2d127bc83 112 {
Overdrivr 3:37d2d127bc83 113 incomingStorage.ptr = buf;
Overdrivr 3:37d2d127bc83 114 incomingStorage.size = bufSize;
Overdrivr 3:37d2d127bc83 115 }
Overdrivr 3:37d2d127bc83 116
Overdrivr 3:37d2d127bc83 117 void set_on_incoming_frame(void (*callback)(uint8_t * storage, uint32_t occupiedSize))
Overdrivr 3:37d2d127bc83 118 {
Overdrivr 3:37d2d127bc83 119 on_incoming_frame_cb = callback;
Overdrivr 3:37d2d127bc83 120 }
Overdrivr 3:37d2d127bc83 121
Overdrivr 3:37d2d127bc83 122 void set_on_incoming_error(void (*callback)(int32_t errCode))
Overdrivr 3:37d2d127bc83 123 {
Overdrivr 3:37d2d127bc83 124 on_error_cb = callback;
Overdrivr 3:37d2d127bc83 125 }
Overdrivr 3:37d2d127bc83 126
Overdrivr 3:37d2d127bc83 127 void feed(uint8_t byte)
Overdrivr 3:37d2d127bc83 128 {
Overdrivr 3:37d2d127bc83 129 if(incomingStorage.size == 0 || incomingStorage.ptr == NULL)
Overdrivr 3:37d2d127bc83 130 return;
Overdrivr 3:37d2d127bc83 131
Overdrivr 3:37d2d127bc83 132 if(incoming_state == ESCAPING)
Overdrivr 3:37d2d127bc83 133 {
Overdrivr 3:37d2d127bc83 134 if(!safe_append(&incomingStorage,byte))
Overdrivr 3:37d2d127bc83 135 {
Overdrivr 3:37d2d127bc83 136 incoming_state = IDLE;
Overdrivr 3:37d2d127bc83 137 return;
Overdrivr 3:37d2d127bc83 138 }
Overdrivr 3:37d2d127bc83 139 incoming_state = ACTIVE;
Overdrivr 3:37d2d127bc83 140 return;
Overdrivr 3:37d2d127bc83 141 }
Overdrivr 3:37d2d127bc83 142
Overdrivr 3:37d2d127bc83 143 if(byte == SOF_)
Overdrivr 3:37d2d127bc83 144 {
Overdrivr 3:37d2d127bc83 145 incoming_state = ACTIVE;
Overdrivr 3:37d2d127bc83 146 incomingStorage.cursor = 0;
Overdrivr 3:37d2d127bc83 147 return;
Overdrivr 3:37d2d127bc83 148 }
Overdrivr 3:37d2d127bc83 149
Overdrivr 3:37d2d127bc83 150 if(incoming_state == ACTIVE)
Overdrivr 3:37d2d127bc83 151 {
Overdrivr 3:37d2d127bc83 152 if(byte == EOF_)
Overdrivr 3:37d2d127bc83 153 {
Overdrivr 3:37d2d127bc83 154 incoming_state = IDLE;
Overdrivr 3:37d2d127bc83 155 on_incoming_frame_cb(incomingStorage.ptr, incomingStorage.cursor);
Overdrivr 3:37d2d127bc83 156 }
Overdrivr 3:37d2d127bc83 157 // Escape next character
Overdrivr 3:37d2d127bc83 158 else if(byte == ESC_)
Overdrivr 3:37d2d127bc83 159 {
Overdrivr 3:37d2d127bc83 160 incoming_state = ESCAPING;
Overdrivr 3:37d2d127bc83 161 }
Overdrivr 3:37d2d127bc83 162 else
Overdrivr 3:37d2d127bc83 163 {
Overdrivr 3:37d2d127bc83 164 if(!safe_append(&incomingStorage,byte))
Overdrivr 3:37d2d127bc83 165 {
Overdrivr 3:37d2d127bc83 166 incoming_state = IDLE;
Overdrivr 3:37d2d127bc83 167 return;
Overdrivr 3:37d2d127bc83 168 }
Overdrivr 3:37d2d127bc83 169 incoming_state = ACTIVE;
Overdrivr 3:37d2d127bc83 170 }
Overdrivr 3:37d2d127bc83 171 }
Overdrivr 3:37d2d127bc83 172 }
Overdrivr 3:37d2d127bc83 173
Overdrivr 3:37d2d127bc83 174 int8_t safe_append(storage * s, uint8_t byte)
Overdrivr 3:37d2d127bc83 175 {
Overdrivr 3:37d2d127bc83 176 // Not enough space for 1 more character
Overdrivr 3:37d2d127bc83 177 if(s->cursor + 1 >= s->size)
Overdrivr 3:37d2d127bc83 178 return 0;
Overdrivr 3:37d2d127bc83 179
Overdrivr 3:37d2d127bc83 180 s->ptr[s->cursor++] = byte;
Overdrivr 3:37d2d127bc83 181
Overdrivr 3:37d2d127bc83 182 return 1;
Overdrivr 3:37d2d127bc83 183 }