/* * ringbuffer.c * * Created on: Jul 24, 2012 * Author: tkl */ #include "irq.h" #include "ringbuffer.h" //----------------------------------------------------------------------------- int ringbuffer_read(struct ringbuffer *this, char *buffer, int size) { int i; unsigned int irq; for(i = 0; i < size; i++) { if(this->used > 0) { irq = disable_irq(); buffer[i] = *this->read; this->read++; this->used--; if(this->read >= (this->buffer + this->size)) { this->read = this->buffer; } restore_irq(irq); } else { return i; } } return 0; } //----------------------------------------------------------------------------- int ringbuffer_write(struct ringbuffer *this, const char *buffer, int size) { int i = 0; unsigned int irq; for(i = 0; i < size; i++) { if(this->used < this->size) { irq = disable_irq(); *this->write = buffer[i]; this->write++; this->used++; if(this->write >= (this->buffer + this->size)) { this->write = this->buffer; } restore_irq(irq); } else { return i; } } return i; } //----------------------------------------------------------------------------- int ringbuffer_is_full(const struct ringbuffer *this) { return (this->used == this->size) ? 1 : 0; } //----------------------------------------------------------------------------- int ringbuffer_is_empty(const struct ringbuffer *this) { return (this->used == 0) ? 1 : 0; }