| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  | #include "bytearray.h"
 | 
					
						
							|  |  |  | #include "stdlib.h"
 | 
					
						
							|  |  |  | #include "string.h"
 | 
					
						
							|  |  |  | #include "stdio.h"
 | 
					
						
							|  |  |  | #include "board.h"
 | 
					
						
							|  |  |  | #include "mystdlib.h"
 | 
					
						
							|  |  |  | #include "debug.h"
 | 
					
						
							|  |  |  | #include "rtthread.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-04 18:48:14 +08:00
										 |  |  | #define ARR_MAX_PRINT_LEN   50
 | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define ARRAY_APPEND_SKIP   50
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 使用时保证不要在不同线程同时修改,可以不用保护以提高速度
 | 
					
						
							|  |  |  | #define rt_mutex_create(...) 0
 | 
					
						
							|  |  |  | #define rt_mutex_delete(...)
 | 
					
						
							|  |  |  | #define rt_mutex_take(...)
 | 
					
						
							|  |  |  | #define rt_mutex_release(...)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _array_def{ | 
					
						
							|  |  |  |   int32_t all; | 
					
						
							|  |  |  |   int32_t used; | 
					
						
							|  |  |  |   rt_mutex_t mutex; | 
					
						
							|  |  |  |   uint8_t data[0]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | array_def *arr_creat(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   array_def *a; | 
					
						
							|  |  |  |   static uint16_t count=0; | 
					
						
							|  |  |  | 	char s1[16]={0}; | 
					
						
							|  |  |  | 	sprintf(s1,"arr_mut#%d",count); | 
					
						
							|  |  |  |   int size=0; | 
					
						
							|  |  |  |   size+=sizeof(array_def); | 
					
						
							|  |  |  |   size+=ARRAY_APPEND_SKIP; | 
					
						
							|  |  |  |   a=malloc(size); | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   a->all=ARRAY_APPEND_SKIP; | 
					
						
							|  |  |  |   a->used=0; | 
					
						
							|  |  |  |   a->mutex=rt_mutex_create(s1,RT_IPC_FLAG_FIFO); | 
					
						
							|  |  |  |   count++; | 
					
						
							|  |  |  |   return a; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static array_def *arr_expend(array_def *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   array_def *r; | 
					
						
							|  |  |  |   int size=0; | 
					
						
							|  |  |  |   int cpysize=0; | 
					
						
							|  |  |  |   size+=sizeof(array_def); | 
					
						
							|  |  |  |   size+=a->all+ARRAY_APPEND_SKIP; | 
					
						
							|  |  |  |   r=malloc(size); | 
					
						
							|  |  |  |   param_check(r); | 
					
						
							|  |  |  |   cpysize=sizeof(array_def)+a->used; | 
					
						
							|  |  |  |   memcpy(r,a,cpysize); | 
					
						
							|  |  |  |   r->all+=ARRAY_APPEND_SKIP; | 
					
						
							|  |  |  |   free(a); | 
					
						
							|  |  |  |   return r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | array_def *_arr_append(array_def **a,uint8_t d) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   param_check(*a); | 
					
						
							|  |  |  |   array_def *r=*a; | 
					
						
							|  |  |  |   rt_mutex_take(r->mutex,RT_WAITING_FOREVER); | 
					
						
							|  |  |  |   if((*a)->used>=(*a)->all) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     r=arr_expend(*a); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   r->data[r->used]=d; | 
					
						
							|  |  |  |   r->used++; | 
					
						
							|  |  |  |   rt_mutex_release(r->mutex); | 
					
						
							|  |  |  |   *a=r; | 
					
						
							|  |  |  |   return r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint8_t arr_get(array_def *a,int index) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   uint8_t ret=0; | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   rt_mutex_take(a->mutex,RT_WAITING_FOREVER); | 
					
						
							|  |  |  |   if(index<0) index=a->used+index; | 
					
						
							|  |  |  |   if((index>=0&&index<a->used)==0) ret=0; | 
					
						
							|  |  |  |   else ret=a->data[index]; | 
					
						
							|  |  |  |   rt_mutex_release(a->mutex); | 
					
						
							|  |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint8_t *arr_data(array_def *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   return a->data; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int arr_length(array_def *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   return a->used; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 截取数组
 | 
					
						
							|  |  |  | array_def *arr_mid(array_def *a,int start,int len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   array_def *r; | 
					
						
							|  |  |  |   r=arr_creat(); | 
					
						
							|  |  |  |   if(start<0) start=a->used+start; | 
					
						
							|  |  |  |   if((start>=0&&start<a->used)==0) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return r; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if(start+len>a->used) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     len=a->used-start; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for(int i=0;i<len;i++) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     //_arr_append(&r,arr_get(a,i+start));
 | 
					
						
							|  |  |  |     _arr_append(&r,a->data[i+start]); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   //return tappend(r,0);
 | 
					
						
							|  |  |  |   return r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 移除一些数据,返回实际移除的数据长度
 | 
					
						
							|  |  |  | int arr_remove(array_def *a,int start,int len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   if(start<0) start=a->used+start; | 
					
						
							|  |  |  |   if((start>=0&&start<a->used)==0) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if(start+len>a->used) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     len=a->used-start; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   int move_len=a->used-(start+len); | 
					
						
							|  |  |  |   memcpy(&a->data[start],&a->data[start+len],move_len); | 
					
						
							|  |  |  |   a->used-=len; | 
					
						
							|  |  |  |   return len; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 输出打印字符串
 | 
					
						
							|  |  |  | char *arr_string(array_def *a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   param_check(a); | 
					
						
							|  |  |  |   array_def *d=arr_creat(); | 
					
						
							|  |  |  |   param_check(d); | 
					
						
							|  |  |  |   // DBG_LOG("d=%08x,a=%08x",d,a);
 | 
					
						
							|  |  |  |   // DBG_LOG("%s:length(a)==%d.",__func__,arr_length(a));
 | 
					
						
							|  |  |  |   int len=0; | 
					
						
							|  |  |  |   char s[20]; | 
					
						
							|  |  |  |   int index=0; | 
					
						
							|  |  |  |   arr_append(d,'['); | 
					
						
							|  |  |  |   for(int i=0;i<arr_length(a);i++) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     sprintf(s,"%02x",arr_get(a,i)); | 
					
						
							|  |  |  |     // sprintf(s,"%02x",(uint8_t)i);
 | 
					
						
							|  |  |  |     len=strlen(s); | 
					
						
							|  |  |  |     arr_appends(d,s,len); | 
					
						
							|  |  |  |     arr_append(d,','); | 
					
						
							|  |  |  |     index++; | 
					
						
							|  |  |  |     if(index>=ARR_MAX_PRINT_LEN){ | 
					
						
							|  |  |  |       // 超过20字节的 只打印前20字节
 | 
					
						
							|  |  |  |       sprintf(s,"...(%d)",arr_length(a)); | 
					
						
							|  |  |  |       len=strlen(s); | 
					
						
							|  |  |  |       arr_appends(d,s,len); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   arr_append(d,']'); | 
					
						
							|  |  |  |   len=arr_length(d); | 
					
						
							|  |  |  |   char *ptr=malloc(len+1); | 
					
						
							|  |  |  |   param_check(ptr); | 
					
						
							|  |  |  |   memcpy(ptr,arr_data(d),len); | 
					
						
							|  |  |  |   arr_delete(d); | 
					
						
							|  |  |  |   ptr[len]=0; | 
					
						
							|  |  |  |   return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |