From 7aef669e594126123811d4356f3ec4573fc59e11 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Mon, 16 Oct 2023 01:52:27 +0800 Subject: [PATCH] Add ringbuffer This is used in the UDP connection --- client/CMakeLists.txt | 1 + client/Makefile | 1 + client/experimental_lib/CMakeLists.txt | 1 + client/src/uart/ringbuffer.c | 102 +++++++++++++++++++++++++ client/src/uart/ringbuffer.h | 26 +++++++ 5 files changed, 131 insertions(+) create mode 100644 client/src/uart/ringbuffer.c create mode 100644 client/src/uart/ringbuffer.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index eaee2f0f0..acf079f70 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -286,6 +286,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/mifare/desfirecore.c ${PM3_ROOT}/client/src/mifare/desfiretest.c ${PM3_ROOT}/client/src/mifare/gallaghercore.c + ${PM3_ROOT}/client/src/uart/ringbuffer.c ${PM3_ROOT}/client/src/uart/uart_posix.c ${PM3_ROOT}/client/src/uart/uart_win32.c ${PM3_ROOT}/client/src/ui/overlays.ui diff --git a/client/Makefile b/client/Makefile index b63fdf329..d45e958f7 100644 --- a/client/Makefile +++ b/client/Makefile @@ -707,6 +707,7 @@ SRCS = mifare/aiddesfire.c \ pm3line.c \ proxmark3.c \ scandir.c \ + uart/ringbuffer.c \ uart/uart_posix.c \ uart/uart_win32.c \ scripting.c \ diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index a5caeb014..04198cf88 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -286,6 +286,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/mifare/desfirecore.c ${PM3_ROOT}/client/src/mifare/desfiretest.c ${PM3_ROOT}/client/src/mifare/gallaghercore.c + ${PM3_ROOT}/client/src/uart/ringbuffer.c ${PM3_ROOT}/client/src/uart/uart_posix.c ${PM3_ROOT}/client/src/uart/uart_win32.c ${PM3_ROOT}/client/src/ui/overlays.ui diff --git a/client/src/uart/ringbuffer.c b/client/src/uart/ringbuffer.c new file mode 100644 index 000000000..4a3b01f74 --- /dev/null +++ b/client/src/uart/ringbuffer.c @@ -0,0 +1,102 @@ +#include "ringbuffer.h" +#include + +RingBuffer* RingBuf_create(int capacity) { + RingBuffer* buffer = (RingBuffer*)malloc(sizeof(RingBuffer)); + if (!buffer) { + return NULL; + } + + buffer->data = (uint8_t*)calloc(capacity, sizeof(uint8_t)); + if (!buffer->data) { + free(buffer); + return NULL; + } + + buffer->capacity = capacity; + buffer->size = 0; + buffer->front = 0; + buffer->rear = 0; + + return buffer; +} + +inline bool RingBuf_isFull(RingBuffer* buffer) { + return buffer->size == buffer->capacity; +} + +inline bool RingBuf_isEmpty(RingBuffer* buffer) { + return buffer->size == 0; +} + +bool RingBuf_enqueue(RingBuffer* buffer, uint8_t value) { + if (RingBuf_isFull(buffer)) { + return false; + } + + buffer->data[buffer->rear] = value; + buffer->rear = (buffer->rear + 1) % buffer->capacity; + buffer->size++; + return true; +} + +bool RingBuf_dequeue(RingBuffer* buffer, uint8_t* value) { + if (RingBuf_isEmpty(buffer)) { + return false; + } + + *value = buffer->data[buffer->front]; + buffer->front = (buffer->front + 1) % buffer->capacity; + buffer->size--; + return true; +} + +int RingBuf_enqueueBatch(RingBuffer* buffer, const uint8_t* values, int count) { + int processed = 0; + + if (RingBuf_getAvailableSize(buffer) < count) { + count = RingBuf_getAvailableSize(buffer); + } + + for (int i = 0; i < count; i++) { + buffer->data[buffer->rear] = values[i]; + buffer->rear = (buffer->rear + 1) % buffer->capacity; + processed++; + } + + buffer->size += processed; + + return processed; +} + +int RingBuf_dequeueBatch(RingBuffer* buffer, uint8_t* values, int count) { + int processed = 0; + + if (buffer->size < count) { + count = buffer->size; + } + + for (int i = 0; i < count; i++) { + values[i] = buffer->data[buffer->front]; + buffer->front = (buffer->front + 1) % buffer->capacity; + processed++; + } + + buffer->size -= processed; + + return processed; +} + +inline int RingBuf_getUsedSize(RingBuffer* buffer) { + return buffer->size; +} + +inline int RingBuf_getAvailableSize(RingBuffer* buffer) { + return (buffer->capacity) - (buffer->size); +} + +void RingBuf_destroy(RingBuffer* buffer) { + if (buffer != NULL) + free(buffer->data); + free(buffer); +} diff --git a/client/src/uart/ringbuffer.h b/client/src/uart/ringbuffer.h new file mode 100644 index 000000000..e78e284b4 --- /dev/null +++ b/client/src/uart/ringbuffer.h @@ -0,0 +1,26 @@ +#ifndef _RINGBUFFER_H_ +#define _RINGBUFFER_H_ + +#include +#include + +typedef struct { + uint8_t* data; + int capacity; + int size; + int front; + int rear; +} RingBuffer; + +RingBuffer* RingBuf_create(int capacity); +bool RingBuf_isFull(RingBuffer* buffer); +bool RingBuf_isEmpty(RingBuffer* buffer); +bool RingBuf_enqueue(RingBuffer* buffer, uint8_t value); +bool RingBuf_dequeue(RingBuffer* buffer, uint8_t* value); +int RingBuf_enqueueBatch(RingBuffer* buffer, const uint8_t* values, int count); +int RingBuf_dequeueBatch(RingBuffer* buffer, uint8_t* values, int count); +int RingBuf_getUsedSize(RingBuffer* buffer); +int RingBuf_getAvailableSize(RingBuffer* buffer); +void RingBuf_destroy(RingBuffer* buffer); + +#endif