X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fprotothread%2Flib%2FFifo.cpp;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fprotothread%2Flib%2FFifo.cpp;h=767b784dfe725167e9a959e4214b906780de22a7;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/protothread/lib/Fifo.cpp b/dol/src/dol/visitor/protothread/lib/Fifo.cpp new file mode 100644 index 0000000..767b784 --- /dev/null +++ b/dol/src/dol/visitor/protothread/lib/Fifo.cpp @@ -0,0 +1,130 @@ +#include "Fifo.h" + +/** + * + */ +Fifo::Fifo(unsigned size = 18) { + //std::cout << "Create Fifo." << std::endl; + _size = size; + _buffer = new char[_size]; + _use = 0; + _tail = 0; +} + +/** + * + */ +Fifo::~Fifo() { + //std::cout << "Delete Fifo." << std::endl; + if (_buffer) { + delete _buffer; + } + _buffer = 0; + _use = 0; + _tail = 0; + //std::cout << "Deleted Fifo." << std::endl; +} + +/** + * + */ +unsigned Fifo::read(void *destination, unsigned len) { + char* buffer = (char*)destination; + unsigned read = (len <= _use ? len : 0); + //std::cout << "Try to read " << len << " bytes from Fifo." << std::endl; + + if (_tail + read <= _size) { + memcpy(buffer, _buffer + _tail, read); + } + else { + memcpy(buffer, _buffer + _tail, _size - _tail); + memcpy(buffer + _size - _tail, _buffer, read - _size + _tail); + } + + _tail = (_tail + read) % _size; + _use -= read; + //std::cout << "Read " << read << " bytes from Fifo." << std::endl; + return read; +} + +/** + * + */ +unsigned Fifo::write(const void *source, unsigned len) { + char* buffer = (char*)source; + unsigned write = (len <= unused() ? len : 0); + unsigned head = (_tail + _use) % _size; + //std::cout << "Try to write " << len << " bytes to Fifo." << std::endl; + + if (head + write <= _size) { + memcpy(_buffer + head, buffer, write); + } + else { + memcpy(_buffer + head, buffer, _size - head); + memcpy(_buffer, buffer + _size - head, write - _size + head); + } + + _use += write; + //std::cout << "Wrote " << write << " bytes to Fifo." << std::endl; + return write; +} + +/** + * + */ +unsigned Fifo::size() const { + return (_size); +} + +/** + * + */ +unsigned Fifo::unused() const { + return (_size) - _use; +} + +/** + * + */ +unsigned Fifo::used() const { + return _use; +} + +/** + * Test the implementation + */ +/* +int main() { + std::cout.width(5); + Fifo *myFifo = new Fifo(); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 6; i++) { + std::cout << "write " << i << " to Fifo. "; + int write = myFifo->write(&i, sizeof(int)); + printf(" %d ", write); + if (write == sizeof(int)) { + std::cout << "used: " << std::setw(2) << myFifo->used() + << ", unused: " << std::setw(2) << myFifo->unused() + << ", size: " << std::setw(2) << myFifo->size() + << std::endl; + } else { + std::cout << std::endl; + } + } + for (int i = 0; i < 6; i++) { + int value; + int read = myFifo->read(&value, sizeof(int)); + printf(" %d ", read); + if (read == sizeof(int)) { + std::cout << "read " << value << " from Fifo "; + std::cout << "used: " << std::setw(2) << myFifo->used() + << ", unused: " << std::setw(2) << myFifo->unused() + << ", size: " << std::setw(2) << myFifo->size() + << std::endl; + } + } + } + delete myFifo; + return 0; +} +*/