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

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Committer:
p3p
Date:
Thu Jun 28 21:19:58 2012 +0000
Revision:
0:1639507580d5
minor tweak

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p3p 0:1639507580d5 1 #ifndef RINGBUFFER
p3p 0:1639507580d5 2 #define RINGBUFFER
p3p 0:1639507580d5 3 namespace SimpleSerialProtocol {
p3p 0:1639507580d5 4
p3p 0:1639507580d5 5 class RingBuffer {
p3p 0:1639507580d5 6 public:
p3p 0:1639507580d5 7 RingBuffer() {
p3p 0:1639507580d5 8 _read_index = 0;
p3p 0:1639507580d5 9 _write_index = 0;
p3p 0:1639507580d5 10 _size = 256;
p3p 0:1639507580d5 11 _buffer = new uint8_t[_size];
p3p 0:1639507580d5 12 _dropped_bytes = 0;
p3p 0:1639507580d5 13 }
p3p 0:1639507580d5 14 RingBuffer(uint16_t capacity) {
p3p 0:1639507580d5 15 _read_index = 0;
p3p 0:1639507580d5 16 _write_index = 0;
p3p 0:1639507580d5 17 _size = capacity;
p3p 0:1639507580d5 18 _buffer = new uint8_t[_size];
p3p 0:1639507580d5 19 _dropped_bytes = 0;
p3p 0:1639507580d5 20 }
p3p 0:1639507580d5 21 ~RingBuffer() {
p3p 0:1639507580d5 22 delete[] _buffer;
p3p 0:1639507580d5 23 }
p3p 0:1639507580d5 24
p3p 0:1639507580d5 25 uint16_t size() {
p3p 0:1639507580d5 26 return _size;
p3p 0:1639507580d5 27 }
p3p 0:1639507580d5 28
p3p 0:1639507580d5 29 uint16_t available() {
p3p 0:1639507580d5 30 if (_write_index < _read_index) {
p3p 0:1639507580d5 31 return (_write_index + size()) - _read_index;
p3p 0:1639507580d5 32 } else {
p3p 0:1639507580d5 33 return _write_index - _read_index;
p3p 0:1639507580d5 34 }
p3p 0:1639507580d5 35 }
p3p 0:1639507580d5 36
p3p 0:1639507580d5 37 bool write(uint8_t byte) {
p3p 0:1639507580d5 38 if(available() < (size() -1) ){
p3p 0:1639507580d5 39 _buffer[_write_index++] = byte;
p3p 0:1639507580d5 40 _write_index %= size();
p3p 0:1639507580d5 41 return true;
p3p 0:1639507580d5 42 } else {
p3p 0:1639507580d5 43 _buffer[_write_index++] = byte;
p3p 0:1639507580d5 44 _write_index %= size();
p3p 0:1639507580d5 45
p3p 0:1639507580d5 46 ++_read_index;
p3p 0:1639507580d5 47 _read_index %= size();
p3p 0:1639507580d5 48
p3p 0:1639507580d5 49 _dropped_bytes++;
p3p 0:1639507580d5 50 return true;
p3p 0:1639507580d5 51 }
p3p 0:1639507580d5 52 }
p3p 0:1639507580d5 53
p3p 0:1639507580d5 54 uint8_t read() {
p3p 0:1639507580d5 55 if(available()){
p3p 0:1639507580d5 56 uint8_t value = _buffer[_read_index++];
p3p 0:1639507580d5 57 _read_index %= size();
p3p 0:1639507580d5 58 return value;
p3p 0:1639507580d5 59 }
p3p 0:1639507580d5 60 return 0;
p3p 0:1639507580d5 61 }
p3p 0:1639507580d5 62
p3p 0:1639507580d5 63 uint32_t droppedBytes() {
p3p 0:1639507580d5 64 return _dropped_bytes;
p3p 0:1639507580d5 65 }
p3p 0:1639507580d5 66
p3p 0:1639507580d5 67 private:
p3p 0:1639507580d5 68 uint16_t _read_index;
p3p 0:1639507580d5 69 uint16_t _write_index;
p3p 0:1639507580d5 70 uint8_t* _buffer;
p3p 0:1639507580d5 71 uint16_t _size;
p3p 0:1639507580d5 72 uint32_t _dropped_bytes;
p3p 0:1639507580d5 73 };
p3p 0:1639507580d5 74
p3p 0:1639507580d5 75 }
p3p 0:1639507580d5 76 #endif