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 FIFO_H
networker 0:7da612835693 2 #define FIFO_H
networker 0:7da612835693 3
networker 0:7da612835693 4 class fifo {
networker 0:7da612835693 5 char *buf;
networker 1:4676e8b9b357 6 int size, in, out, free;//free is nr of empty places, in is first empty place, out is first occupied place
networker 0:7da612835693 7 // fifo() {}
networker 0:7da612835693 8 public:
networker 0:7da612835693 9 fifo(int sz = 127):size(sz), in(0), out(0), free(sz) {
networker 0:7da612835693 10 buf = new char[sz];
networker 0:7da612835693 11 }
networker 0:7da612835693 12 ~fifo() {
networker 0:7da612835693 13 delete[] buf;
networker 0:7da612835693 14 }
networker 0:7da612835693 15
networker 0:7da612835693 16 void put(char c) {
networker 0:7da612835693 17 if (free) {
networker 0:7da612835693 18 buf[in++] = c;
networker 0:7da612835693 19 if (in==size) in = 0;
networker 0:7da612835693 20 free--;
networker 0:7da612835693 21 } else
networker 0:7da612835693 22 printf("fifo full\n");
networker 0:7da612835693 23 }
networker 0:7da612835693 24
networker 0:7da612835693 25 int get() {
networker 0:7da612835693 26 if (free == size)
networker 0:7da612835693 27 return -1;
networker 0:7da612835693 28 free++;
networker 0:7da612835693 29 int c = buf[out++];
networker 0:7da612835693 30 if (out == size) out = 0;
networker 0:7da612835693 31 return c;
networker 0:7da612835693 32 }
networker 0:7da612835693 33 int gets(char *line, int len) {
networker 0:7da612835693 34 int i = out, n = size-free, l = 0;
networker 0:7da612835693 35 while (n>0 && buf[i] != '\n' && l<len-1) {
networker 0:7da612835693 36 if (buf[i] != '\r')
networker 0:7da612835693 37 line[l++] = buf[i++];
networker 0:7da612835693 38 else
networker 0:7da612835693 39 i++; //skip the \r
networker 0:7da612835693 40 if (i==size) i = 0;
networker 0:7da612835693 41 n--;
networker 0:7da612835693 42 }
networker 0:7da612835693 43 if (n==0) //buf does not contain EOLN
networker 0:7da612835693 44 return -1;
networker 0:7da612835693 45 if (buf[i] == '\n') {
networker 0:7da612835693 46 line[l] = '\0';
networker 0:7da612835693 47 out = i+1;
networker 0:7da612835693 48 if (out==size) out = 0;
networker 0:7da612835693 49 free = size - n + 1;
networker 0:7da612835693 50 return 0; //success
networker 0:7da612835693 51 } else //line too short
networker 0:7da612835693 52 return -2;
networker 0:7da612835693 53 }
networker 0:7da612835693 54 void flush() {
networker 0:7da612835693 55 free = size;
networker 0:7da612835693 56 in = 0;
networker 0:7da612835693 57 out = 0;
networker 0:7da612835693 58 }
networker 0:7da612835693 59 };
networker 0:7da612835693 60
networker 0:7da612835693 61 #endif