123 lines
3.1 KiB
C
123 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "hx_ringbuffer.h"
|
|
|
|
int by_ringbuf_init(by_ringbuf_t *rb, int size) {
|
|
#ifdef BY_RINGBUF_STATIC_ALLOC
|
|
// 使用预先分配的内存
|
|
static uint8_t static_buffer[BY_RINGBUF_STATIC_BUFFER_SIZE];
|
|
|
|
if (size > sizeof(static_buffer)) {
|
|
return -1; // 预先分配的内存不足
|
|
}
|
|
rb->buffer = static_buffer;
|
|
#else
|
|
// 使用 malloc 动态分配内存
|
|
rb->buffer = (uint8_t *)malloc(size);
|
|
if (rb->buffer == NULL) {
|
|
return -1; // 分配内存失败
|
|
}
|
|
#endif
|
|
|
|
rb->size = size;
|
|
rb->head = 0;
|
|
rb->tail = 0;
|
|
rb->is_full = false;
|
|
return 0;
|
|
}
|
|
|
|
void by_ringbuf_free(by_ringbuf_t *rb) {
|
|
#ifndef BY_RINGBUF_STATIC_ALLOC
|
|
// 只有使用 malloc 分配的内存才需要释放
|
|
if (rb->buffer) {
|
|
free(rb->buffer);
|
|
rb->buffer = NULL;
|
|
}
|
|
#endif
|
|
|
|
rb->size = 0;
|
|
rb->head = 0;
|
|
rb->tail = 0;
|
|
rb->is_full = false;
|
|
}
|
|
|
|
int by_ringbuf_append(by_ringbuf_t *rb, const uint8_t *data, int len) {
|
|
if (len > by_ringbuf_available_space(rb)) {
|
|
return -1; // 缓冲区空间不足
|
|
}
|
|
|
|
for (int i = 0; i < len; i++) {
|
|
rb->buffer[rb->head] = data[i];
|
|
rb->head = (rb->head + 1) % rb->size;
|
|
if (rb->head == rb->tail) {
|
|
rb->is_full = true;
|
|
}
|
|
}
|
|
|
|
return len;
|
|
}
|
|
|
|
int by_ringbuf_pop(by_ringbuf_t *rb, uint8_t *data, int len) {
|
|
if (len > by_ringbuf_available_data(rb)) {
|
|
return -1; // 数据不足
|
|
}
|
|
|
|
for (int i = 0; i < len; i++) {
|
|
data[i] = rb->buffer[rb->tail];
|
|
rb->tail = (rb->tail + 1) % rb->size;
|
|
rb->is_full = false;
|
|
}
|
|
|
|
return len;
|
|
}
|
|
|
|
int by_ringbuf_find(by_ringbuf_t *rb, const uint8_t *pattern, int pattern_len) {
|
|
int available_data = by_ringbuf_available_data(rb);
|
|
if (pattern_len > available_data) {
|
|
return -1; // 数据不足,无法查找
|
|
}
|
|
|
|
for (int i = 0; i <= available_data - pattern_len; i++) {
|
|
int match = 1;
|
|
for (int j = 0; j < pattern_len; j++) {
|
|
int index = (rb->tail + i + j) % rb->size;
|
|
if (rb->buffer[index] != pattern[j]) {
|
|
match = 0;
|
|
break;
|
|
}
|
|
}
|
|
if (match) {
|
|
return i; // 返回匹配的起始位置
|
|
}
|
|
}
|
|
|
|
return -1; // 未找到匹配
|
|
}
|
|
|
|
int by_ringbuf_available_data(by_ringbuf_t *rb) {
|
|
if (rb->is_full) {
|
|
return rb->size;
|
|
}
|
|
return (rb->head - rb->tail + rb->size) % rb->size;
|
|
}
|
|
|
|
int by_ringbuf_available_space(by_ringbuf_t *rb) {
|
|
return rb->size - by_ringbuf_available_data(rb);
|
|
}
|
|
|
|
// 调试函数:打印环形缓冲区中的数据及其序号
|
|
void by_ringbuf_debug_print(by_ringbuf_t *rb) {
|
|
int available_data = by_ringbuf_available_data(rb);
|
|
if (available_data == 0) {
|
|
printf("Ring buffer is empty.\n");
|
|
return;
|
|
}
|
|
|
|
printf("Ring buffer content (size: %d, available data: %d):\n", rb->size, available_data);
|
|
for (int i = 0; i < available_data; i++) {
|
|
int index = (rb->tail + i) % rb->size;
|
|
printf("[%04d] 0x%02X\n", i, rb->buffer[index]);
|
|
}
|
|
} |