// -------------------------------------------------------------- #include #include #include "ringbuf.h" // -------------------------------------------------------------- void RBufInit(rbuf_t *pObj, uint32_t size) { pObj->ir = 0; pObj->iw = 0; pObj->dist = 0; pObj->size = size; pObj->pData = (radio_float_t*)malloc(size*sizeof(radio_float_t)); memset(pObj->pData, 0, size*sizeof(radio_float_t)); } void RBufFree(rbuf_t *pObj) { if (pObj->pData) free(pObj->pData); pObj->pData = NULL; pObj->size = 0; } void RBufPut(rbuf_t *pObj, radio_float_t x) { (pObj->iw)++; if (pObj->iw >= pObj->size) pObj->iw = 0; pObj->pData[pObj->iw] = x; pObj->dist++; } radio_float_t RBufGet(rbuf_t *pObj) { radio_float_t y; y = pObj->pData[(pObj->ir)++]; if (pObj->ir >= pObj->size) pObj->ir = 0; pObj->dist--; return y; } radio_float_t RBufGetAfter(rbuf_t *pObj, int32_t delay) { pObj->ir = (pObj->iw-delay)%pObj->size; if (pObj->ir < 0) pObj->ir += pObj->size; pObj->dist = delay; return pObj->pData[pObj->ir]; } radio_float_t RBufGetAt(rbuf_t *pObj, uint32_t index) { if (index < 0) index = 0; pObj->ir = (index)%pObj->size; pObj->dist = pObj->iw-pObj->ir; if (pObj->dist < 0) pObj->dist += pObj->size; return pObj->pData[pObj->ir]; } void FifoInit(fifo_t *pObj, uint32_t max_size) { pObj->size_max = max_size; pObj->size = 0; pObj->iw = (uint32_t)0; pObj->ir = (uint32_t)0; pObj->pData = (uint32_t*)malloc(max_size*sizeof(uint32_t)); memset(pObj->pData, 0, max_size*sizeof(uint32_t)); } void FifoFree(fifo_t *pObj) { if (pObj->pData) free(pObj->pData); pObj->pData = NULL; pObj->size_max = 0; pObj->size = 0; } uint32_t FifoSize(fifo_t *pObj) { return pObj->size; } uint32_t FifoSizeMax(fifo_t *pObj) { return pObj->size_max; } uint32_t FifoFront(fifo_t *pObj) { return pObj->pData[pObj->ir]; } uint32_t FifoBack(fifo_t *pObj) { return pObj->pData[pObj->iw]; } void FifoPushBack(fifo_t *pObj, uint32_t item) { pObj->pData[pObj->iw++] = item; if (pObj->iw >= pObj->size_max) pObj->iw = 0; if (pObj->size < pObj->size_max) { pObj->size++; } else { if (++pObj->ir >= pObj->size_max) pObj->ir = 0; } } void FifoPushFront(fifo_t *pObj, uint32_t item) { pObj->ir--; if (pObj->ir >= pObj->size_max) pObj->ir = 0; pObj->pData[pObj->ir] = item; if (pObj->size < pObj->size_max) { pObj->size++; } else { if (--pObj->iw >= pObj->size_max) pObj->iw = 0; } } void FifoPopBack(fifo_t *pObj) { pObj->iw--; if (pObj->iw >= pObj->size_max) pObj->iw = 0; if (pObj->size > 0) pObj->size--; } void FifoPopFront(fifo_t *pObj) { pObj->ir++; if (pObj->ir >= pObj->size_max) pObj->ir = 0; if (pObj->size > 0) pObj->size--; } // --------------------------------------------------------------