mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-09-20 15:26:13 +08:00
Add ringbuffer
This is used in the UDP connection
This commit is contained in:
parent
13f9972f39
commit
7aef669e59
|
@ -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
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
102
client/src/uart/ringbuffer.c
Normal file
102
client/src/uart/ringbuffer.c
Normal 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);
|
||||
}
|
26
client/src/uart/ringbuffer.h
Normal file
26
client/src/uart/ringbuffer.h
Normal 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
|
Loading…
Reference in a new issue