181 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |