--- /dev/null
+#include "Fifo.h"\r
+\r
+/**\r
+ *\r
+ */\r
+Fifo::Fifo(unsigned size = 18) {\r
+ //std::cout << "Create Fifo." << std::endl;\r
+ _size = size;\r
+ _buffer = new char[_size];\r
+ _use = 0; \r
+ _tail = 0;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+Fifo::~Fifo() {\r
+ //std::cout << "Delete Fifo." << std::endl;\r
+ if (_buffer) {\r
+ delete _buffer;\r
+ }\r
+ _buffer = 0;\r
+ _use = 0; \r
+ _tail = 0;\r
+ //std::cout << "Deleted Fifo." << std::endl;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+unsigned Fifo::read(void *destination, unsigned len) {\r
+ char* buffer = (char*)destination;\r
+ unsigned read = (len <= _use ? len : 0);\r
+ //std::cout << "Try to read " << len << " bytes from Fifo." << std::endl;\r
+\r
+ if (_tail + read <= _size) {\r
+ memcpy(buffer, _buffer + _tail, read);\r
+ }\r
+ else {\r
+ memcpy(buffer, _buffer + _tail, _size - _tail);\r
+ memcpy(buffer + _size - _tail, _buffer, read - _size + _tail);\r
+ }\r
+\r
+ _tail = (_tail + read) % _size;\r
+ _use -= read;\r
+ //std::cout << "Read " << read << " bytes from Fifo." << std::endl;\r
+ return read;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+unsigned Fifo::write(const void *source, unsigned len) {\r
+ char* buffer = (char*)source;\r
+ unsigned write = (len <= unused() ? len : 0);\r
+ unsigned head = (_tail + _use) % _size;\r
+ //std::cout << "Try to write " << len << " bytes to Fifo." << std::endl;\r
+\r
+ if (head + write <= _size) {\r
+ memcpy(_buffer + head, buffer, write);\r
+ }\r
+ else {\r
+ memcpy(_buffer + head, buffer, _size - head);\r
+ memcpy(_buffer, buffer + _size - head, write - _size + head);\r
+ }\r
+\r
+ _use += write;\r
+ //std::cout << "Wrote " << write << " bytes to Fifo." << std::endl;\r
+ return write;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+unsigned Fifo::size() const {\r
+ return (_size);\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+unsigned Fifo::unused() const {\r
+ return (_size) - _use;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+unsigned Fifo::used() const {\r
+ return _use; \r
+}\r
+\r
+/**\r
+ * Test the implementation\r
+ */\r
+/*\r
+int main() {\r
+ std::cout.width(5);\r
+ Fifo *myFifo = new Fifo();\r
+ for (int j = 0; j < 3; j++) {\r
+ for (int i = 0; i < 6; i++) {\r
+ std::cout << "write " << i << " to Fifo. ";\r
+ int write = myFifo->write(&i, sizeof(int));\r
+ printf(" %d ", write);\r
+ if (write == sizeof(int)) {\r
+ std::cout << "used: " << std::setw(2) << myFifo->used()\r
+ << ", unused: " << std::setw(2) << myFifo->unused()\r
+ << ", size: " << std::setw(2) << myFifo->size()\r
+ << std::endl;\r
+ } else {\r
+ std::cout << std::endl;\r
+ }\r
+ }\r
+ for (int i = 0; i < 6; i++) {\r
+ int value;\r
+ int read = myFifo->read(&value, sizeof(int));\r
+ printf(" %d ", read);\r
+ if (read == sizeof(int)) {\r
+ std::cout << "read " << value << " from Fifo ";\r
+ std::cout << "used: " << std::setw(2) << myFifo->used()\r
+ << ", unused: " << std::setw(2) << myFifo->unused()\r
+ << ", size: " << std::setw(2) << myFifo->size()\r
+ << std::endl;\r
+ }\r
+ }\r
+ }\r
+ delete myFifo;\r
+ return 0;\r
+}\r
+*/\r