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

#include "app_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);
}
}