You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.9 KiB
115 lines
2.9 KiB
#include "ring_buffer.h"
|
|
|
|
// 큐 초기화
|
|
bool RingBuffer_Initialization(RING_BUFFER* pRingbuffer, bool isOverWrite, uint32_t buffer_size, uint8_t* pBuffer)
|
|
{
|
|
if(buffer_size == 0 || pRingbuffer == NULL || pBuffer == NULL)
|
|
return false;
|
|
pRingbuffer->pBuffer = pBuffer;
|
|
pRingbuffer->BufferSize = buffer_size;
|
|
pRingbuffer->isOverWrite = isOverWrite;
|
|
pRingbuffer->front = -1;
|
|
pRingbuffer->rear = -1;
|
|
return true;
|
|
}
|
|
|
|
bool RingBuffer_Clear(RING_BUFFER* pRingbuffer)
|
|
{
|
|
if(pRingbuffer == NULL || pRingbuffer->BufferSize == 0 || pRingbuffer->pBuffer == NULL)
|
|
return false;
|
|
|
|
pRingbuffer->front = -1;
|
|
pRingbuffer->rear = -1;
|
|
return true;
|
|
}
|
|
|
|
bool RingBuffer_isEmpty(RING_BUFFER* pRingbuffer)
|
|
{
|
|
return (pRingbuffer->front == -1);
|
|
}
|
|
|
|
bool RingBuffer_isFull(RING_BUFFER* pRingbuffer)
|
|
{
|
|
return ((pRingbuffer->front == 0 && pRingbuffer->rear == (pRingbuffer->BufferSize - 1)) || (pRingbuffer->front == (pRingbuffer->rear + 1)));
|
|
}
|
|
// 큐에 요소를 추가 (enqueue)
|
|
bool RingBuffer_Enqueue(RING_BUFFER* pRingbuffer, uint8_t value)
|
|
{
|
|
uint8_t temp;
|
|
if (RingBuffer_isFull(pRingbuffer))
|
|
{
|
|
if(pRingbuffer->isOverWrite == false)
|
|
return false;
|
|
else
|
|
RingBuffer_Dequeue(pRingbuffer, &temp);
|
|
}
|
|
|
|
if (pRingbuffer->front == -1)
|
|
{
|
|
pRingbuffer->front = 0;
|
|
}
|
|
pRingbuffer->rear = (pRingbuffer->rear + 1) % pRingbuffer->BufferSize;
|
|
pRingbuffer->pBuffer[pRingbuffer->rear] = value;
|
|
return true;
|
|
|
|
}
|
|
|
|
// 큐에서 요소를 제거하고 반환 (dequeue)
|
|
bool RingBuffer_Dequeue(RING_BUFFER* pRingbuffer, uint8_t* pRetValue)
|
|
{
|
|
if (RingBuffer_isEmpty(pRingbuffer))
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
*pRetValue = pRingbuffer->pBuffer[pRingbuffer->front];
|
|
if (pRingbuffer->front == pRingbuffer->rear)
|
|
{
|
|
pRingbuffer->front = -1;
|
|
pRingbuffer->rear = -1;
|
|
}
|
|
else
|
|
{
|
|
pRingbuffer->front = (pRingbuffer->front + 1) % pRingbuffer->BufferSize;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool RingBuffer_GetData(RING_BUFFER* pRingbuffer, uint8_t* pRetValue)
|
|
{
|
|
*pRetValue = pRingbuffer->pBuffer[pRingbuffer->front];
|
|
return true;
|
|
}
|
|
|
|
bool RingBuffer_PopData(RING_BUFFER* pRingbuffer)
|
|
{
|
|
if (pRingbuffer->front == pRingbuffer->rear)
|
|
{
|
|
pRingbuffer->front = -1;
|
|
pRingbuffer->rear = -1;
|
|
}
|
|
else
|
|
{
|
|
pRingbuffer->front = (pRingbuffer->front + 1) % pRingbuffer->BufferSize;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
uint32_t RingBuffer_Get_DataSize(RING_BUFFER* pRingbuffer)
|
|
{
|
|
if (RingBuffer_isEmpty(pRingbuffer))
|
|
{
|
|
return 0;
|
|
}
|
|
else if (pRingbuffer->front <= pRingbuffer->rear)
|
|
{
|
|
return (pRingbuffer->rear - pRingbuffer->front + 1);
|
|
}
|
|
else
|
|
{
|
|
return (pRingbuffer->BufferSize - pRingbuffer->front + pRingbuffer->rear + 1);
|
|
}
|
|
}
|