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