class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

fifo.h

Committer:
networker
Date:
2013-03-11
Revision:
1:4676e8b9b357
Parent:
0:7da612835693

File content as of revision 1:4676e8b9b357:

#ifndef FIFO_H
#define FIFO_H

class fifo {
    char *buf;
    int size, in, out, free;//free is nr of empty places, in is first empty place, out is first occupied place
//    fifo() {}
public:
    fifo(int sz = 127):size(sz), in(0), out(0), free(sz) {
        buf = new char[sz];
    }
    ~fifo() {
        delete[] buf;
    }

    void put(char c) {
        if (free) {
            buf[in++] = c;
            if (in==size) in = 0;
            free--;
        } else
            printf("fifo full\n");
    }

    int get() {
        if (free == size)
            return -1;
        free++;
        int c = buf[out++];
        if (out == size) out = 0;
        return c;
    }
    int gets(char *line, int len) {
       int i = out, n = size-free, l = 0;
       while (n>0 && buf[i] != '\n' && l<len-1) {
         if (buf[i] != '\r')
           line[l++] = buf[i++];
         else
           i++; //skip the \r
         if (i==size) i = 0;
         n--;
       }
       if (n==0) //buf does not contain EOLN
         return -1;
       if (buf[i] == '\n') {
         line[l] = '\0';
         out = i+1;
         if (out==size) out = 0;
         free = size - n + 1;
         return 0; //success
       } else //line too short
         return -2;
    }
    void flush() {
      free = size;
      in = 0;
      out = 0;
    }
};

#endif