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:
Thu Feb 11 08:10:08 2016 +0000
Revision:
2:b7a3ac7bcec8
Parent:
0:3a30eba5d8f7
Replaced MODSERIAL by BufferedSerial for increasing amount of supported devices

Who changed what in which revision?

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