git-svn-id: http://moon:8086/svn/software/trunk/libsrc/radio@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
169 lines
2.9 KiB
C
Executable File
169 lines
2.9 KiB
C
Executable File
// --------------------------------------------------------------
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
#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--;
|
|
}
|
|
|
|
// --------------------------------------------------------------
|