Add ringbuffer

This is used in the UDP connection
This commit is contained in:
wh201906 2023-10-16 01:52:27 +08:00
parent 13f9972f39
commit 7aef669e59
No known key found for this signature in database
5 changed files with 131 additions and 0 deletions

View file

@ -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

View file

@ -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 \

View file

@ -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

View file

@ -0,0 +1,102 @@
#include "ringbuffer.h"
#include <stdlib.h>
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);
}

View file

@ -0,0 +1,26 @@
#ifndef _RINGBUFFER_H_
#define _RINGBUFFER_H_
#include <stdbool.h>
#include <stdint.h>
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