class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

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?

UserRevisionLine numberNew 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