class library to access fischertechnik interfaces via USB
Dependencies: FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp
fifo.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 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 |