MIDI interpreter using mbed

Dependencies:   MIDI TextLCD mbed

Revision:
0:93868ff6d1b1
Child:
1:af9dd50ffbc2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RingBuffer.h	Fri Jun 14 09:25:58 2013 +0000
@@ -0,0 +1,115 @@
+#include <stdint.h>
+
+#ifndef __RINGBUFFER_H_
+#define __RINGBUFFER_H_
+
+template <class T>
+class RingBuffer {
+public:  // For experiment use
+    uint32_t readPos;
+    uint32_t writePos;
+    uint32_t itemCount;
+    uint32_t length;
+    T* buffer;
+    
+public:
+    RingBuffer(uint32_t);
+    ~RingBuffer();
+    uint32_t items();
+    bool isWritable();
+    bool isReadable();
+    bool write(T&);
+    T* read();
+    T* peek();
+    void flush();
+    int find(T);
+};
+
+
+template <class T>
+RingBuffer<T>::RingBuffer(uint32_t len) {
+    length = len;
+    buffer = new T[length];
+    readPos = 0;
+    writePos = 0;
+    itemCount = 0;
+}
+
+template <class T>
+RingBuffer<T>::~RingBuffer() {
+    delete[] buffer;
+}
+
+template <class T>
+uint32_t RingBuffer<T>::items() {
+    return itemCount;
+}
+
+template <class T>
+bool RingBuffer<T>::isWritable() {
+    return itemCount < length;
+}
+
+template <class T>
+bool RingBuffer<T>::isReadable() {
+    return itemCount > 0;
+}
+
+template <class T>
+bool RingBuffer<T>::write(T& n) {
+    if (!isWritable()) {
+        return false;
+    }
+    buffer[writePos++] = n;
+    if (writePos == length) {
+        writePos = 0;
+    }
+    itemCount++;
+    return true;
+}
+
+template <class T>
+T* RingBuffer<T>::read() {
+    uint32_t readPosTemp = readPos;
+    
+    if (!isReadable()) {
+        return NULL;
+    }
+    readPos++;
+    if (readPos == length) {
+        readPos = 0;
+    }
+    itemCount--;
+    return &buffer[readPosTemp];
+}
+
+template <class T>
+T* RingBuffer<T>::peek() {
+    if (!isReadable()) {
+        return NULL;
+    }
+    return &buffer[readPos];
+}
+
+template <class T>
+void RingBuffer<T>::flush() {
+    itemCount = 0;
+    readPos = writePos;
+}
+
+template <class T>
+int RingBuffer<T>::find(T key) {
+    int pos = 0;
+
+    uint32_t p = readPos;
+    for (uint32_t i = 0; i < itemCount; i++) {
+        if (buffer[p] == key) {
+            return i;
+        }
+        p++;
+        if (p == length) p = 0;
+    }
+    return -1;
+}
+
+#endif