Files
lora_plug/hx_ringbuffer.c

123 lines
3.1 KiB
C
Raw Normal View History

2025-02-19 16:09:44 +08:00
#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]);
}
}