A Low_Cost DAPLink Based On CH32X033F8P6
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

82 lines
2.0 KiB

#include "buffer.h"
void buffer_init(buffer_t *buffer, unsigned int len)
{
buffer->data = (unsigned char *)BUFFER_MALLOC(len);
buffer->buffer_size = len;
buffer->buffer_in_cnt = 0;
buffer->buffer_out_cnt = 0;
buffer->buffer_in_index = 0;
buffer->buffer_out_index = 0;
}
void buffer_reset(buffer_t *buffer)
{
buffer->buffer_in_cnt = 0;
buffer->buffer_out_cnt = 0;
buffer->buffer_in_index = 0;
buffer->buffer_out_index = 0;
}
int buffer_in(buffer_t *buffer, unsigned char *data, unsigned int len)
{
if (buffer->buffer_in_cnt + len - buffer->buffer_out_cnt > buffer->buffer_size)
{
return -1;
}
unsigned int i;
for (i = 0; i < len; i++)
{
buffer->data[(buffer->buffer_in_index + i) % buffer->buffer_size] = data[i];
}
buffer->buffer_in_index = (buffer->buffer_in_index + len) % buffer->buffer_size;
buffer->buffer_in_cnt += len;
return 0;
}
int buffer_out(buffer_t *buffer, unsigned char *data, unsigned int *len, unsigned int max_len)
{
if (buffer->buffer_out_cnt >= buffer->buffer_in_cnt)
{
return -1;
}
*len = buffer->buffer_in_cnt - buffer->buffer_out_cnt;
if (*len > max_len)
{
*len = max_len;
}
unsigned int i;
for (i = 0; i < *len; i++)
{
if (data)
data[i] = buffer->data[(buffer->buffer_out_index + i) % buffer->buffer_size];
}
buffer->buffer_out_index = (buffer->buffer_out_index + *len) % buffer->buffer_size;
buffer->buffer_out_cnt += *len;
return 0;
}
int buffer_out_without_decrease(buffer_t *buffer, unsigned char *data, unsigned int *len, unsigned int max_len)
{
if (buffer->buffer_out_cnt >= buffer->buffer_in_cnt)
{
return -1;
}
*len = buffer->buffer_in_cnt - buffer->buffer_out_cnt;
if (*len > max_len)
{
*len = max_len;
}
unsigned int i;
for (i = 0; i < *len; i++)
{
if (data)
data[i] = buffer->data[(buffer->buffer_out_index + i) % buffer->buffer_size];
}
return 0;
}