class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

message.h

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

File content as of revision 1:4676e8b9b357:

#ifndef MESSAGE_H
#define MESSAGE_H

template <class T, int N> class msgbuffer {
    T buffer[N];
    int in, out, n;
public:
    int push(T msg, int mode = 0);
    int nrOfMessages() {
        return n;
    }
    T pop();
    msgbuffer() {
        in = 0;
        out = 0;
        n = 0;
    }
    void clear() {
        in = 0;
        out = 0;
        n = 0;
    }
};

template <class T> bool operator==(T a, T b) {
    return memcmp(&a, &b, sizeof(T))==0;
}

template <class T, int N> int msgbuffer<T, N> ::push(T msg, int mode) {
    if (n>=N) return -1; //buffer full
    switch (mode) {
        case 2:
            for (int i = 0, j = out; i < n; i++, j++) {
                if (j >= N) j = 0;
                if (buffer[j] == msg)
                    return 0;
            }
            goto insert;
        case 1:
            if (buffer[in] == msg)
                return 0;
            goto insert;
        case 0:
insert:
            in++;
            if (in >= N) in = 0;
            buffer[in] = msg;
            n++;
            return 0;
    }
    return -2; //illegal option
}

template <class T, int N> T msgbuffer<T, N> ::pop() {
    T tmp = buffer[out++];
    if (out >= N)
        out = 0;
    return tmp;
}

#endif