A library to send and receive packets over serial, uses MODSERIAL

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Committer:
p3p
Date:
Wed Aug 27 17:35:30 2014 +0000
Revision:
1:98ad30934a71
Parent:
0:1639507580d5
Fixed the packet state machine, and added access to the protocol from callbacks

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p3p 0:1639507580d5 1 #ifndef SIMPLE_SERIAL_PROTOCOL_PACKET
p3p 0:1639507580d5 2 #define SIMPLE_SERIAL_PROTOCOL_PACKET
p3p 0:1639507580d5 3
p3p 0:1639507580d5 4 namespace SimpleSerialProtocol {
p3p 0:1639507580d5 5
p3p 0:1639507580d5 6 class Packet {
p3p 0:1639507580d5 7 public:
p3p 0:1639507580d5 8 Packet() {
p3p 0:1639507580d5 9 _type = 0;
p3p 0:1639507580d5 10 _size = 0;
p3p 0:1639507580d5 11 _checksum = 0;
p3p 0:1639507580d5 12 _valid = false;
p3p 0:1639507580d5 13 memset(_data, 0, sizeof(_data));
p3p 0:1639507580d5 14 }
p3p 0:1639507580d5 15 virtual ~Packet() {}
p3p 0:1639507580d5 16
p3p 0:1639507580d5 17 void reset() {
p3p 0:1639507580d5 18 _type = 0;
p3p 0:1639507580d5 19 _size = 0;
p3p 0:1639507580d5 20 _checksum = 0;
p3p 0:1639507580d5 21 _valid = false;
p3p 0:1639507580d5 22 }
p3p 0:1639507580d5 23
p3p 0:1639507580d5 24 template <class T> void buildData (T* message) {
p3p 0:1639507580d5 25 uint8_t* payload_array = reinterpret_cast<uint8_t *>(message);
p3p 0:1639507580d5 26 memcpy(_data, payload_array, sizeof(T));
p3p 0:1639507580d5 27 _type = _data[0];
p3p 0:1639507580d5 28 _size = sizeof(T);
p3p 0:1639507580d5 29 }
p3p 0:1639507580d5 30
p3p 0:1639507580d5 31 template <class T> T* interpretData () {
p3p 0:1639507580d5 32 if (_size == sizeof(T)) {
p3p 0:1639507580d5 33 return reinterpret_cast<T*>(_data);
p3p 0:1639507580d5 34 }
p3p 0:1639507580d5 35 return 0;
p3p 0:1639507580d5 36 }
p3p 0:1639507580d5 37
p3p 0:1639507580d5 38 static void swapEndian(void *pv, size_t n) {
p3p 0:1639507580d5 39 uint8_t *p = reinterpret_cast<uint8_t *>(pv);
p3p 0:1639507580d5 40 size_t lo, hi;
p3p 0:1639507580d5 41 for (lo=0, hi=n-1; hi>lo; lo++, hi--) {
p3p 0:1639507580d5 42 uint8_t tmp=p[lo];
p3p 0:1639507580d5 43 p[lo] = p[hi];
p3p 0:1639507580d5 44 p[hi] = tmp;
p3p 0:1639507580d5 45 }
p3p 0:1639507580d5 46 }
p3p 0:1639507580d5 47
p3p 0:1639507580d5 48 template <class T> static T swapEndian(T pv) {
p3p 0:1639507580d5 49 swapEndian(reinterpret_cast<void*>(&pv), sizeof(T));
p3p 0:1639507580d5 50 return pv;
p3p 0:1639507580d5 51 }
p3p 0:1639507580d5 52
p3p 0:1639507580d5 53 uint8_t _type;
p3p 1:98ad30934a71 54 uint8_t _data[256];
p3p 0:1639507580d5 55 uint16_t _size;
p3p 0:1639507580d5 56 uint16_t _checksum;
p3p 0:1639507580d5 57 bool _valid;
p3p 0:1639507580d5 58 };
p3p 0:1639507580d5 59
p3p 0:1639507580d5 60 };
p3p 0:1639507580d5 61
p3p 0:1639507580d5 62 #endif