class library to access fischertechnik interfaces via USB
Dependencies: FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp
message.h@1:4676e8b9b357, 2013-03-11 (annotated)
- Committer:
- networker
- Date:
- Mon Mar 11 08:04:37 2013 +0000
- Revision:
- 1:4676e8b9b357
- Parent:
- 0:7da612835693
first publication of this experimental class, just for sharing wip
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
networker |
0:7da612835693 | 1 | #ifndef MESSAGE_H |
networker |
0:7da612835693 | 2 | #define MESSAGE_H |
networker |
0:7da612835693 | 3 | |
networker |
0:7da612835693 | 4 | template <class T, int N> class msgbuffer { |
networker |
0:7da612835693 | 5 | T buffer[N]; |
networker |
0:7da612835693 | 6 | int in, out, n; |
networker |
0:7da612835693 | 7 | public: |
networker |
0:7da612835693 | 8 | int push(T msg, int mode = 0); |
networker |
0:7da612835693 | 9 | int nrOfMessages() { |
networker |
0:7da612835693 | 10 | return n; |
networker |
0:7da612835693 | 11 | } |
networker |
0:7da612835693 | 12 | T pop(); |
networker |
0:7da612835693 | 13 | msgbuffer() { |
networker |
0:7da612835693 | 14 | in = 0; |
networker |
0:7da612835693 | 15 | out = 0; |
networker |
0:7da612835693 | 16 | n = 0; |
networker |
0:7da612835693 | 17 | } |
networker |
0:7da612835693 | 18 | void clear() { |
networker |
0:7da612835693 | 19 | in = 0; |
networker |
0:7da612835693 | 20 | out = 0; |
networker |
0:7da612835693 | 21 | n = 0; |
networker |
0:7da612835693 | 22 | } |
networker |
0:7da612835693 | 23 | }; |
networker |
0:7da612835693 | 24 | |
networker |
0:7da612835693 | 25 | template <class T> bool operator==(T a, T b) { |
networker |
0:7da612835693 | 26 | return memcmp(&a, &b, sizeof(T))==0; |
networker |
0:7da612835693 | 27 | } |
networker |
0:7da612835693 | 28 | |
networker |
0:7da612835693 | 29 | template <class T, int N> int msgbuffer<T, N> ::push(T msg, int mode) { |
networker |
0:7da612835693 | 30 | if (n>=N) return -1; //buffer full |
networker |
0:7da612835693 | 31 | switch (mode) { |
networker |
0:7da612835693 | 32 | case 2: |
networker |
0:7da612835693 | 33 | for (int i = 0, j = out; i < n; i++, j++) { |
networker |
0:7da612835693 | 34 | if (j >= N) j = 0; |
networker |
0:7da612835693 | 35 | if (buffer[j] == msg) |
networker |
0:7da612835693 | 36 | return 0; |
networker |
0:7da612835693 | 37 | } |
networker |
0:7da612835693 | 38 | goto insert; |
networker |
0:7da612835693 | 39 | case 1: |
networker |
0:7da612835693 | 40 | if (buffer[in] == msg) |
networker |
0:7da612835693 | 41 | return 0; |
networker |
0:7da612835693 | 42 | goto insert; |
networker |
0:7da612835693 | 43 | case 0: |
networker |
0:7da612835693 | 44 | insert: |
networker |
0:7da612835693 | 45 | in++; |
networker |
0:7da612835693 | 46 | if (in >= N) in = 0; |
networker |
0:7da612835693 | 47 | buffer[in] = msg; |
networker |
0:7da612835693 | 48 | n++; |
networker |
0:7da612835693 | 49 | return 0; |
networker |
0:7da612835693 | 50 | } |
networker |
0:7da612835693 | 51 | return -2; //illegal option |
networker |
0:7da612835693 | 52 | } |
networker |
0:7da612835693 | 53 | |
networker |
0:7da612835693 | 54 | template <class T, int N> T msgbuffer<T, N> ::pop() { |
networker |
0:7da612835693 | 55 | T tmp = buffer[out++]; |
networker |
0:7da612835693 | 56 | if (out >= N) |
networker |
0:7da612835693 | 57 | out = 0; |
networker |
0:7da612835693 | 58 | return tmp; |
networker |
0:7da612835693 | 59 | } |
networker |
0:7da612835693 | 60 | |
networker |
0:7da612835693 | 61 | #endif |