Files

181 lines
3.2 KiB
C
Raw Permalink Normal View History

2023-06-10 11:52:00 +08:00
#include "buff.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#ifdef RT_THREAD
#include "rthw.h"
#define IRQ_DISABLE() rt_base_t irq_stat=rt_hw_interrupt_disable( )
#define IRQ_ENABLE() rt_hw_interrupt_enable (irq_stat)
#define MUTEX_INIT(buff,name) buff->mutex=rt_mutex_create(name,RT_IPC_FLAG_FIFO)
#define MUTEX_TAKE(buff) rt_mutex_take(buff->mutex,RT_WAITING_FOREVER)
#define MUTEX_RELEASE(buff) rt_mutex_release(buff->mutex);
#else
#define IRQ_DISABLE() { }
#define IRQ_ENABLE() { }
#define MUTEX_INIT(buff,name) {}
#define MUTEX_TAKE(buff) {}
#define MUTEX_RELEASE(buff) {}
#endif
static int g_buff_num=0;
int buff_init(data_buff *buff,int size,int use_frame,int frame_start,int frame_end)
{
int buff_index;
char str[20];
if(buff==0) return -1;
if(buff->buff==0)
{
IRQ_DISABLE();
buff_index=g_buff_num;
g_buff_num++;
IRQ_ENABLE();
buff->buff=malloc(size);
if(buff->buff==0) return -1;
memset(buff->buff,0,sizeof(size));
buff->buff_len= size;
buff->use_frame=use_frame;
buff->frame_start=frame_start;
buff->frame_end=frame_end;
sprintf(str,"buff_#%d",buff_index);
MUTEX_INIT(buff,str);
}
buff_clear(buff);
return 0;
}
int buff_deinit(data_buff *buff)
{
if(buff==0) return -1;
if(buff->buff)
{
free(buff->buff);
buff->buff=0;
buff->buff_len=0;
}
return 0;
}
int buff_get_used(data_buff *buff)
{
int ret=-1;
IRQ_DISABLE();
ret=buff->buff_used;
IRQ_ENABLE();
return ret;
}
int buff_save_byte(data_buff *buff,uint8_t data)
{
if(buff==0) return -1;
int ret=-1;
IRQ_DISABLE();
if((!buff->use_frame)||(data==buff->frame_start)) buff->active=1;
if((buff->buff_used<buff->buff_len)&&buff->active)
{
buff->buff[buff->save_ptr]=data;
buff->buff_used++;
if((buff->use_frame)&&(data==buff->frame_end)) {
buff->frame_num++;
buff->active=0;
}
buff->save_ptr++;
if (buff->save_ptr>=buff->buff_len)
buff->save_ptr=0;
ret= 0;
}
IRQ_ENABLE();
return ret;
}
int buff_save_bytes(data_buff *buff,const uint8_t *data,int len)
{
if(buff==0) return -1;
int ret=-1;
MUTEX_TAKE(buff);
if (buff->buff_used+len<=buff->buff_len)
{
while(len--)
{
ret=buff_save_byte(buff,*data);data++;
if(ret!=0) break;
}
}
MUTEX_RELEASE(buff);
return ret;
}
int buff_read_byte(data_buff *buff,uint8_t *data)
{
if(buff==0) return -1;
int ret=-1;
IRQ_DISABLE();
if (((buff->frame_num)&&(buff->buff_used))||((!buff->use_frame)&&(buff->buff_used)))
{
*data=buff->buff[buff->read_ptr];
buff->buff_used--;
if((buff->use_frame)&&(*data==buff->frame_end)) buff->frame_num--;
buff->read_ptr++;
if (buff->read_ptr>=buff->buff_len)
buff->read_ptr=0;
ret= 0;
}
IRQ_ENABLE();
return ret;
}
int buff_read_bytes(data_buff *buff,uint8_t *data,int len)
{
if(buff==0) return -1;
int ret=-1;
MUTEX_TAKE(buff);
if (buff->buff_used>=len)
{
while(len--)
{
ret=buff_read_byte(buff,data);data++;
if(ret!=0) break;
}
}
MUTEX_RELEASE(buff);
return ret;
}
int buff_clear(data_buff *buff)
{
if(buff==0) return -1;
IRQ_DISABLE();
buff->buff_used=0;
buff->read_ptr=0;
buff->save_ptr=0;
buff->frame_num=0;
buff->active=0;
IRQ_ENABLE();
return 0;
}