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