/*
FIFO Buffer - First In First Out
based on
https://www.mikrocontroller.net/articles/FIFO and http://www.lothar-miller.de/s9y/categories/51-Fifo
2024-06-29 by noiasca
*/
#define BUFFER_SIZE 8 // muss 2^n betragen (8, 16, 32, 64, 128, 256)
#define BUFFER_MASK (BUFFER_SIZE-1) // Klammern auf keinen Fall vergessen
template <typename T_data>
class FIFO {
T_data data[BUFFER_SIZE] {};
uint8_t read = 0; // zeigt auf das Feld mit dem ältesten Inhalt
uint8_t write = 0; // zeigt immer auf leeres Feld
public:
static constexpr uint8_t BUFFER_FAIL {0};
static constexpr uint8_t BUFFER_SUCCESS {1};
// Stellt 1 Byte in den Ringbuffer
//
// Returns:
// BUFFER_FAIL der Ringbuffer ist voll. Es kann kein weiteres Byte gespeichert werden
// BUFFER_SUCCESS das Byte wurde gespeichert
//
int put(T_data byte) {
uint8_t next = ((write + 1) & BUFFER_MASK);
if (read == next)
return BUFFER_FAIL; // voll
data[write] = byte;
// data[write & BUFFER_MASK] = byte; // absolut Sicher
write = next;
return BUFFER_SUCCESS;
}
// Holt 1 Byte aus dem Ringbuffer, sofern mindestens eines abholbereit ist
//
// Returns:
// BUFFER_FAIL der Ringbuffer ist leer. Es kann kein Byte geliefert werden.
// BUFFER_SUCCESS 1 Byte wurde geliefert
//
int get(T_data *pByte) {
if (read == write)
return BUFFER_FAIL;
*pByte = data[read];
read = (read + 1) & BUFFER_MASK;
return BUFFER_SUCCESS;
}
};
//class <type> objectname
FIFO <uint8_t> buffer;
void setup() {
Serial.begin(115200);
uint8_t c = 0;
Serial.println("\nin out Test: ");
buffer.put(0); // store a value to the buffer
if (buffer.get(&c)) Serial.print(c); // retrive the next value from the buffer
Serial.println("\nseveral values: ");
buffer.put(1);
buffer.put(2);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
Serial.println("\nwhen the buffer is empty: ");
if (buffer.get(&c)) Serial.print(c);
Serial.println("\nwhat happens with full buffer");
Serial.println(buffer.put(0));
Serial.println(buffer.put(1));
Serial.println(buffer.put(2));
Serial.println(buffer.put(3));
Serial.println(buffer.put(4));
Serial.println(buffer.put(5));
Serial.println(buffer.put(6));
Serial.println(buffer.put(7)); // will not enter the buffer when buffersize is only 8
Serial.println(buffer.put(8)); // will not enter the buffer when buffersize is only 8
Serial.println("\nwhat is in the buffer");
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c);
if (buffer.get(&c)) Serial.print(c); // is 6 - the last element
if (buffer.get(&c)) Serial.print(c); // will not print anything - buffer is emtpy
if (buffer.get(&c)) Serial.print(c); // will not print anything
}
void loop() {
}
//