A library to send and receive packets over serial, uses MODSERIAL

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Revision:
0:1639507580d5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ringbuffer.h	Thu Jun 28 21:19:58 2012 +0000
@@ -0,0 +1,76 @@
+#ifndef RINGBUFFER
+#define RINGBUFFER
+namespace SimpleSerialProtocol {
+
+class RingBuffer {
+public:
+    RingBuffer() {
+        _read_index = 0;
+        _write_index = 0;
+        _size = 256;
+        _buffer = new uint8_t[_size];
+        _dropped_bytes = 0;
+    }
+    RingBuffer(uint16_t capacity) {
+        _read_index = 0;
+        _write_index = 0;
+        _size = capacity;
+        _buffer = new uint8_t[_size];
+        _dropped_bytes = 0;
+    }
+    ~RingBuffer() {
+        delete[] _buffer;
+    }
+
+    uint16_t size() {
+        return _size;
+    }
+
+    uint16_t available() {
+        if (_write_index < _read_index) {
+            return (_write_index + size()) - _read_index;
+        } else {
+            return _write_index - _read_index;
+        }
+    }
+
+    bool write(uint8_t byte) {
+        if(available() < (size() -1) ){
+            _buffer[_write_index++] = byte;
+            _write_index %= size();
+            return true;
+        } else {
+            _buffer[_write_index++] = byte;
+            _write_index %= size();
+            
+            ++_read_index;
+            _read_index %= size();
+            
+            _dropped_bytes++;
+            return true;
+        }
+    }
+
+    uint8_t read() {
+        if(available()){
+            uint8_t value = _buffer[_read_index++];
+            _read_index %= size();
+            return value;
+        }
+        return 0;
+    }
+    
+    uint32_t droppedBytes() {
+        return _dropped_bytes;
+    }
+
+private:
+    uint16_t _read_index;
+    uint16_t _write_index;
+    uint8_t* _buffer;
+    uint16_t _size;
+    uint32_t _dropped_bytes;
+};
+
+}
+#endif
\ No newline at end of file