#include "ringbuffer.h" #include "kmalloc.h" #include "log.h" ringbuffer ringbuffer_init(uint32_t size) { ringbuffer f; f.data=kballoc(size); f.size=size*4096; f.head=0; f.tail=0; return f; } void ringbuffer_free(ringbuffer *f) { kbfree(f->data); } bool ringbuffer_full(ringbuffer* f) { return((f->tail+1)%f->size==f->head); } bool ringbuffer_not_full(ringbuffer* f) { return((f->tail+1)%f->size!=f->head); } bool ringbuffer_empty(ringbuffer* f) { return(f->head==f->tail); } bool ringbuffer_has(ringbuffer* f) { return(f->head!=f->tail); } bool ringbuffer_put(ringbuffer* f,uint8_t c) { if(ringbuffer_full(f)) { #ifdef LOG_RINGBUFFER_WARN klog("ringbuffer is full!"); #endif return false; } f->data[f->tail]=c; f->tail=(f->tail+1)%f->size; return true; } uint8_t ringbuffer_get(ringbuffer* f) { if(ringbuffer_empty(f)) { #ifdef LOG_RINGBUFFER_WARN klog("ringbuffer is empty!"); #endif return 0; // indistinguishable from byte value 0x00. } uint8_t c = f->data[f->head]; f->head=(f->head+1)%f->size; return c; } // TODO // uint32_t ringbuffer_write(ringbuffer* f, uint8_t *buf, uint32_t size) { return 0; } uint32_t ringbuffer_read(ringbuffer* f, uint8_t *buf, uint32_t size) { return 0; }