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