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;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | 
