A library to send and receive packets over serial, uses MODSERIAL
Dependents: SimpleSerialProtocolExample SerialFileReceiver
Packet.h@0:1639507580d5, 2012-06-28 (annotated)
- Committer:
- p3p
- Date:
- Thu Jun 28 21:19:58 2012 +0000
- Revision:
- 0:1639507580d5
- Child:
- 1:98ad30934a71
minor tweak
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:1639507580d5 | 54 | uint8_t _data[512]; |
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 |