Small library for using circular buffers

Dependents:   CircularBufferExample

This library provides circular buffers. The main difference with other circular buffer libraries is that it does not use dynamic memory allocation for storing data. Instead, the buffer is allocated statically.

Three types of buffer exist by default :

  • SmallCircularBuffer (32 bytes)
  • MediumCircularBuffer (128 bytes)
  • BigCircularBuffer (512 bytes)

You can also define buffers with specific size :

CircularBuffer<4> buffer;    // 4 bytes buffer
CircularBuffer<102> buffer2; // 102 bytes buffer

Import programCircularBufferExample

This example shows how to use the CircularBuffer library.

Committer:
feb11
Date:
Mon Mar 17 17:30:25 2014 +0000
Revision:
5:8204677dc3c4
Parent:
4:e15dee1d59ee
fixed bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:5d058c917599 1 #ifndef CIRCULAR_BUFFER_H
feb11 0:5d058c917599 2 #define CIRCULAR_BUFFER_H
feb11 0:5d058c917599 3
feb11 5:8204677dc3c4 4 #include <stdint.h>
feb11 5:8204677dc3c4 5
feb11 4:e15dee1d59ee 6 /** This class implements a static circular buffer.
feb11 4:e15dee1d59ee 7 */
feb11 0:5d058c917599 8 template<size_t T>
feb11 0:5d058c917599 9 class CircularBuffer
feb11 0:5d058c917599 10 {
feb11 0:5d058c917599 11 public :
feb11 0:5d058c917599 12
feb11 4:e15dee1d59ee 13 /** Default constructor
feb11 4:e15dee1d59ee 14 */
feb11 0:5d058c917599 15 CircularBuffer();
feb11 0:5d058c917599 16
feb11 4:e15dee1d59ee 17 /** Reads data from buffer
feb11 4:e15dee1d59ee 18
feb11 4:e15dee1d59ee 19 \param data output buffer
feb11 4:e15dee1d59ee 20 \param length Maximum number of bytes to read
feb11 4:e15dee1d59ee 21 \return Number of bytes read
feb11 4:e15dee1d59ee 22
feb11 4:e15dee1d59ee 23 \note The return value cannot exceed max(length,capacity)
feb11 4:e15dee1d59ee 24 */
feb11 2:6f3630f5fa06 25 uint32_t read(uint8_t *data, uint32_t length);
feb11 4:e15dee1d59ee 26
feb11 4:e15dee1d59ee 27 /** Writes data in buffer
feb11 4:e15dee1d59ee 28
feb11 4:e15dee1d59ee 29 \param data input buffer
feb11 4:e15dee1d59ee 30 \param length Maximum number of bytes to write
feb11 4:e15dee1d59ee 31 \return Number of bytes wrote
feb11 4:e15dee1d59ee 32
feb11 4:e15dee1d59ee 33 \note The return value cannot exceed max(length,capacity)
feb11 4:e15dee1d59ee 34 */
feb11 2:6f3630f5fa06 35 uint32_t write(uint8_t *data, uint32_t length);
feb11 3:9a45d6675e65 36
feb11 4:e15dee1d59ee 37 /** Returns the total capacity of this buffer
feb11 4:e15dee1d59ee 38 \return Capacity of buffer
feb11 4:e15dee1d59ee 39 */
feb11 2:6f3630f5fa06 40 uint32_t getCapacity() const;
feb11 4:e15dee1d59ee 41
feb11 4:e15dee1d59ee 42 /** Returns the number of bytes available in the buffer
feb11 4:e15dee1d59ee 43 \return Number of bytes available in the buffer
feb11 4:e15dee1d59ee 44 */
feb11 3:9a45d6675e65 45 uint32_t getSize() const;
feb11 4:e15dee1d59ee 46
feb11 4:e15dee1d59ee 47 /** Checks if this buffer is empty
feb11 4:e15dee1d59ee 48 \return True if the buffer is empty, false otherwise
feb11 4:e15dee1d59ee 49 */
feb11 3:9a45d6675e65 50 bool isEmpty() const;
feb11 4:e15dee1d59ee 51
feb11 4:e15dee1d59ee 52 /** Checks if this buffer is full
feb11 4:e15dee1d59ee 53 \return True if the buffer is full, false otherwise
feb11 4:e15dee1d59ee 54 */
feb11 3:9a45d6675e65 55 bool isFull() const;
feb11 2:6f3630f5fa06 56
feb11 0:5d058c917599 57 private :
feb11 0:5d058c917599 58
feb11 2:6f3630f5fa06 59 uint16_t readIndex, writeIndex;
feb11 0:5d058c917599 60 uint8_t buffer[T];
feb11 5:8204677dc3c4 61 size_t bytesAvailable;
feb11 0:5d058c917599 62 };
feb11 0:5d058c917599 63
feb11 0:5d058c917599 64 template<size_t T>
feb11 0:5d058c917599 65 CircularBuffer<T>::CircularBuffer():
feb11 5:8204677dc3c4 66 readIndex(0),
feb11 5:8204677dc3c4 67 writeIndex(0),
feb11 5:8204677dc3c4 68 bytesAvailable(0)
feb11 0:5d058c917599 69 {
feb11 0:5d058c917599 70 }
feb11 0:5d058c917599 71
feb11 0:5d058c917599 72 template<size_t T>
feb11 2:6f3630f5fa06 73 uint32_t CircularBuffer<T>::read(uint8_t *data, uint32_t length)
feb11 0:5d058c917599 74 {
feb11 2:6f3630f5fa06 75 uint32_t n = 0;
feb11 3:9a45d6675e65 76 while(n < length && getSize() > 0)
feb11 0:5d058c917599 77 {
feb11 5:8204677dc3c4 78 data[n++] = buffer[readIndex++];
feb11 2:6f3630f5fa06 79 if(readIndex == T)
feb11 2:6f3630f5fa06 80 readIndex = 0;
feb11 5:8204677dc3c4 81 --bytesAvailable;
feb11 0:5d058c917599 82 }
feb11 0:5d058c917599 83
feb11 2:6f3630f5fa06 84 return n;
feb11 0:5d058c917599 85 }
feb11 0:5d058c917599 86
feb11 0:5d058c917599 87 template<size_t T>
feb11 2:6f3630f5fa06 88 uint32_t CircularBuffer<T>::write(uint8_t *data, uint32_t length)
feb11 0:5d058c917599 89 {
feb11 2:6f3630f5fa06 90 uint32_t n = 0;
feb11 3:9a45d6675e65 91 while(n < length && getSize() < T)
feb11 0:5d058c917599 92 {
feb11 5:8204677dc3c4 93 buffer[writeIndex++] = data[n++];
feb11 0:5d058c917599 94 if(writeIndex == T)
feb11 0:5d058c917599 95 writeIndex = 0;
feb11 5:8204677dc3c4 96 ++bytesAvailable;
feb11 0:5d058c917599 97 }
feb11 5:8204677dc3c4 98
feb11 2:6f3630f5fa06 99 return n;
feb11 2:6f3630f5fa06 100 }
feb11 2:6f3630f5fa06 101
feb11 2:6f3630f5fa06 102 template<size_t T>
feb11 2:6f3630f5fa06 103 uint32_t CircularBuffer<T>::getCapacity() const
feb11 2:6f3630f5fa06 104 {
feb11 2:6f3630f5fa06 105 return T;
feb11 2:6f3630f5fa06 106 }
feb11 2:6f3630f5fa06 107
feb11 2:6f3630f5fa06 108 template<size_t T>
feb11 2:6f3630f5fa06 109 uint32_t CircularBuffer<T>::getSize() const
feb11 2:6f3630f5fa06 110 {
feb11 5:8204677dc3c4 111 return bytesAvailable;
feb11 3:9a45d6675e65 112 }
feb11 3:9a45d6675e65 113
feb11 3:9a45d6675e65 114 template<size_t T>
feb11 3:9a45d6675e65 115 bool CircularBuffer<T>::isEmpty() const
feb11 3:9a45d6675e65 116 {
feb11 3:9a45d6675e65 117 return getSize() == 0;
feb11 3:9a45d6675e65 118 }
feb11 3:9a45d6675e65 119
feb11 3:9a45d6675e65 120 template<size_t T>
feb11 3:9a45d6675e65 121 bool CircularBuffer<T>::isFull() const
feb11 3:9a45d6675e65 122 {
feb11 3:9a45d6675e65 123 return getSize() == T;
feb11 0:5d058c917599 124 }
feb11 0:5d058c917599 125
feb11 0:5d058c917599 126 typedef CircularBuffer<32> SmallCircularBuffer;
feb11 0:5d058c917599 127 typedef CircularBuffer<128> MediumCircularBuffer;
feb11 2:6f3630f5fa06 128 typedef CircularBuffer<512> BigCircularBuffer;
feb11 0:5d058c917599 129
feb11 0:5d058c917599 130 #endif