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