459 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			459 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | 
 | |||
|  | 
 | |||
|  | #include "utility.h"
 | |||
|  | float myatof(const char* str) | |||
|  | { | |||
|  | 	 | |||
|  | 	uint32_t int_nu = 0; | |||
|  | 	uint32_t flot_nu = 0; | |||
|  | 	float val; | |||
|  | 	float f_count = 1; | |||
|  | 	while((*str != 0) && (*str != '.')) | |||
|  | 	{ | |||
|  | 		if(*str > '9' && *str < '0') | |||
|  | 		{ | |||
|  | 			str++; | |||
|  | 			continue; | |||
|  | 		} | |||
|  | 		int_nu = int_nu*10+(*str - 48); | |||
|  | 		str++; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	if(*str == 0) | |||
|  | 	{ | |||
|  | 		val = int_nu; | |||
|  | 		return val; | |||
|  | 	} | |||
|  | 	str++; | |||
|  | 	while(*str != 0) | |||
|  | 	{ | |||
|  | 		if(*str > '9' && *str < '0') | |||
|  | 		{ | |||
|  | 			str++; | |||
|  | 			continue; | |||
|  | 		} | |||
|  | 		flot_nu = flot_nu*10+(*str - 48); | |||
|  | 		f_count *= 10; | |||
|  | 		str++; | |||
|  | 	} | |||
|  | 	val = flot_nu; | |||
|  | 	val = val / f_count + int_nu; | |||
|  | 	return val; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	string to uint16_t | |||
|  | *@param		str:src string, base: | |||
|  | *@return	num:convert result | |||
|  | */ | |||
|  | uint16_t atoi16(const char* str,uint16_t base) | |||
|  | { | |||
|  |   unsigned int num = 0; | |||
|  |   while (*str !=0) | |||
|  |           num = num * base + c2d(*str++); | |||
|  |   return num; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	string to uint32 | |||
|  | *@param		str:src string, base: | |||
|  | *@return	num:convert result | |||
|  | */ | |||
|  | uint32_t atoi32(const char* str,uint16_t base) | |||
|  | { | |||
|  |   uint32_t num = 0; | |||
|  |   while (*str !=0) | |||
|  |           num = num * base + c2d(*str++); | |||
|  |   return num; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	uint16 data to string | |||
|  | *@param		n:src num, str[5]:string buffer  len:string size | |||
|  | *@return	void | |||
|  | */ | |||
|  | void itoa(uint16_t n,uint8_t str[5], uint8_t len) | |||
|  | { | |||
|  |    | |||
|  |   uint8_t i=len-1; | |||
|  | 
 | |||
|  |   memset(str,0x20,len); | |||
|  |   do{ | |||
|  |   str[i--]=n%10+'0'; | |||
|  |    | |||
|  |  }while((n/=10)>0); | |||
|  | 
 | |||
|  |  return; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	dec or hex string convert to uint32_t | |||
|  | *@param		str:src string, ret: the pointer of result | |||
|  | *@return	success = 1, fail = 0 | |||
|  | */ | |||
|  | int validatoi(const char* str, int base,uint32_t* ret) | |||
|  | { | |||
|  |   int c; | |||
|  |   const  char* tstr = str; | |||
|  |   if(str == 0 || *str == '\0')  | |||
|  |   { | |||
|  |   	return 0; | |||
|  | 	} | |||
|  |   while(*tstr != '\0') | |||
|  |   { | |||
|  |     c = c2d(*tstr); | |||
|  |     if( (c >= 0) && (c < base)) | |||
|  | 	{ | |||
|  | 		 tstr++; | |||
|  | 	} | |||
|  |     else | |||
|  | 	{ | |||
|  | 	    return 0; | |||
|  | 	} | |||
|  |   } | |||
|  |    | |||
|  |   *ret = atoi32(str,base); | |||
|  |   return 1; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	 new char to replace the old char  | |||
|  | *@param		str:src string,oldchar:dst char,newchar:src char | |||
|  | *@return	void | |||
|  | */ | |||
|  | void replacetochar(char * str,	char oldchar,char newchar) | |||
|  | { | |||
|  |   int x; | |||
|  |   for (x = 0; str[x]; x++)  | |||
|  |     if (str[x] == oldchar) str[x] = newchar;	 | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	char to num | |||
|  | *@param		c:src char | |||
|  | *@return	convert result | |||
|  | */ | |||
|  | char c2d(const uint8_t c) | |||
|  | { | |||
|  | 	if (c >= '0' && c <= '9') | |||
|  | 		return c - '0'; | |||
|  | 	if (c >= 'a' && c <= 'f') | |||
|  | 		return 10 + c -'a'; | |||
|  | 	if (c >= 'A' && c <= 'F') | |||
|  | 		return 10 + c -'A'; | |||
|  | 
 | |||
|  | 	return (char)0; | |||
|  | } | |||
|  | /**
 | |||
|  | *@brief	 	num to char | |||
|  | *@param		c:src num | |||
|  | *@return	convert result | |||
|  | */ | |||
|  | char d2c(const uint8_t c) | |||
|  | { | |||
|  | 	if ( c <= 9) | |||
|  | 	{ | |||
|  | 		return c + '0'; | |||
|  | 	} | |||
|  | 	if (c >= 0x0a && c <= 0x0f) | |||
|  | 	{ | |||
|  | 		return c + 'a' - 10; | |||
|  | 	} | |||
|  |     return 0; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	2bytes swap  | |||
|  | *@param		i:src num | |||
|  | *@return	convert result | |||
|  | */ | |||
|  | uint16_t swaps(uint16_t i) | |||
|  | { | |||
|  |   uint16_t ret=0; | |||
|  |   ret = (i & 0xFF) << 8; | |||
|  |   ret |= ((i >> 8)& 0xFF); | |||
|  |   return ret;	 | |||
|  | } | |||
|  | /**
 | |||
|  | *@brief	 	4 bytes swap, bytes order 4 3 2 1 convert to 1 2 3 4 | |||
|  | *@param		i:src num | |||
|  | *@return	convert result | |||
|  | */ | |||
|  | uint32_t swapl(uint32_t l) | |||
|  | { | |||
|  |   uint32_t ret=0; | |||
|  |   ret = (l & 0xFF) << 24; | |||
|  |   ret |= ((l >> 8) & 0xFF) << 16; | |||
|  |   ret |= ((l >> 16) & 0xFF) << 8; | |||
|  |   ret |= ((l >> 24) & 0xFF); | |||
|  |   return ret; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | *@brief	 	get substring | |||
|  | *@param		src:src string s1: target begin s2: target end sub: result pointer | |||
|  | *@return	void | |||
|  | */ | |||
|  | void mid(const char* src, const char* s1, const char* s2, char* sub) | |||
|  | { | |||
|  | 	char* sub1; | |||
|  | 	char* sub2; | |||
|  | 	uint16_t n; | |||
|  | 
 | |||
|  |   sub1=strstr(src,s1); | |||
|  |   sub1+=strlen(s1); | |||
|  |   sub2=strstr(sub1,s2); | |||
|  |   n=sub2-sub1; | |||
|  |   strncpy(sub,sub1,n); | |||
|  |   sub[n]=0; | |||
|  | } | |||
|  | /**
 | |||
|  | *@brief	 	bytes array conver to string  | |||
|  | *@param		*data: ponit src bytes len: array length str: resuter string pointer | |||
|  | *@return	void | |||
|  | */ | |||
|  | 	 | |||
|  | void bytes2hexString(const char* data, uint32_t len, char* str) | |||
|  | { | |||
|  | 	char c_temp; | |||
|  | 	while(len > 0) | |||
|  | 	{ | |||
|  | 		c_temp = ((*data) &0xF0) >> 4; | |||
|  | 		if(c_temp < 10) | |||
|  | 		{ | |||
|  | 			*str = c_temp + '0'; | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			*str = (c_temp - 10) + 'A'; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		c_temp = ((*data) &0x0F); | |||
|  | 		str++; | |||
|  | 		if(c_temp < 10) | |||
|  | 		{ | |||
|  | 			*str = c_temp + '0'; | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			*str = (c_temp - 10)+ 'A'; | |||
|  | 		} | |||
|  | 		str++; | |||
|  | 		data++; | |||
|  | 		len--; | |||
|  | 	} | |||
|  | 	*(str++) = '\0'; | |||
|  | 	 | |||
|  | } | |||
|  | /*
 | |||
|  | Hex Datas to Bytes | |||
|  | */ | |||
|  | uint8_t HexStrings2Byte(char**strs,uint16_t size,uint8_t* buf,uint16_t buf_size) | |||
|  | { | |||
|  | 	char* str; | |||
|  | 	uint8_t data = 0; | |||
|  | 	uint16_t count = 0; | |||
|  | 	while((size > 0) && (count < buf_size)) | |||
|  | 	{ | |||
|  | 		str = strs[count++]; | |||
|  | 		size--; | |||
|  | 		data = 0; | |||
|  | 		while(*str != '\0') | |||
|  | 		{ | |||
|  | 			 | |||
|  | 			if(*str == '0') | |||
|  | 			{ | |||
|  | 				if((*(str+1) == 'X') || (*(str+1) == 'x')) | |||
|  | 				{ | |||
|  | 					str+=2; | |||
|  | 					continue; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			data <<=4; | |||
|  | 			data |=c2d(*str); | |||
|  | 			str++; | |||
|  | 		} | |||
|  | 		*buf = data; | |||
|  | 		buf++; | |||
|  | 	} | |||
|  | 	return count; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | /*
 | |||
|  | Hex Datas to uint32_t | |||
|  | */ | |||
|  | uint32_t HexStrings2UInt(char*str) | |||
|  | { | |||
|  | 
 | |||
|  | 	uint32_t data = 0; | |||
|  | 	uint16_t count = 0; | |||
|  | 		data = 0; | |||
|  | 		while(*str != '\0' && count < 10) | |||
|  | 		{ | |||
|  | 			 | |||
|  | 			if(*str == '0') | |||
|  | 			{ | |||
|  | 				if((*(str+1) == 'X') || (*(str+1) == 'x')) | |||
|  | 				{ | |||
|  | 					str+=2; | |||
|  | 					continue; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			data <<=4; | |||
|  | 			data |=c2d(*str); | |||
|  | 			str++; | |||
|  | 			count++; | |||
|  | 		} | |||
|  | 	return data; | |||
|  | } | |||
|  | 
 | |||
|  | //冒泡排序16位数据
 | |||
|  | void Bubble_Sort_u16(uint16_t* buf,uint32_t len) | |||
|  | { | |||
|  | 	uint32_t ul_temp1 = 0; | |||
|  | 	uint32_t ul_temp2 = 0; | |||
|  | 	uint16_t us_temp; | |||
|  | 	if(len < 2) | |||
|  | 		return; | |||
|  | 	for(ul_temp2 = 0; ul_temp2 < len-1; ul_temp2++) | |||
|  | 	{ | |||
|  | 		for(ul_temp1 = 0; ul_temp1 < len-1-ul_temp2; ul_temp1++) | |||
|  | 		{ | |||
|  | 			if(buf[ul_temp1] > buf[ul_temp1+1]) | |||
|  | 			{ | |||
|  | 				us_temp = buf[ul_temp1]; | |||
|  | 				buf[ul_temp1] = buf[ul_temp1 + 1]; | |||
|  | 				buf[ul_temp1 + 1] = us_temp; | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	 | |||
|  | } | |||
|  | //数据左移
 | |||
|  | void BufMoveLeft(uint8_t* srcbuf,uint16_t offset,uint16_t data_len) | |||
|  | { | |||
|  | 	uint8_t index = 0; | |||
|  | 	while(data_len > 0) | |||
|  | 	{ | |||
|  | 		srcbuf[index] = srcbuf[index+offset]; | |||
|  | 		data_len--; | |||
|  | 		index++; | |||
|  | 	} | |||
|  | } | |||
|  | //数据右移
 | |||
|  | void BufMoveRight(uint8_t* srcbuf,uint16_t offset,uint16_t data_len) | |||
|  | { | |||
|  | 	while(data_len > 0) | |||
|  | 	{ | |||
|  | 		data_len--; | |||
|  | 		srcbuf[data_len+offset] = srcbuf[data_len] ;  | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | //@brief 计算数组的CRC8值
 | |||
|  | //@param *srcbuf 数据源指针
 | |||
|  | //@param len 数据源长度
 | |||
|  | //@rtvl 返回计算结果
 | |||
|  | uint8_t CheckXOR_8(uint8_t* srcbuf,uint16_t len) | |||
|  | { | |||
|  |   uint8_t crc = 0x00; | |||
|  |   while(len--) | |||
|  |   { | |||
|  |     crc ^= *srcbuf++; | |||
|  |   } | |||
|  |   return crc; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | //@brief 计算数组异或校验值
 | |||
|  | //@param *Ptr 数据源
 | |||
|  | //@param num 计算长度
 | |||
|  | //@rtvl 返回计算结果
 | |||
|  | uint8_t CheckCRC_8(uint8_t* Ptr,uint16_t num) | |||
|  | { | |||
|  |   uint8_t crc = 0; | |||
|  | 	uint16_t j,i; | |||
|  | 	 | |||
|  |     for (j = 0; j < num; j++) | |||
|  |     { | |||
|  |         crc ^= *(Ptr+j); | |||
|  |         for ( i = 0; i < 8; i++) | |||
|  |         { | |||
|  |             if ((crc & 0x01) != 0) | |||
|  |             { | |||
|  |                 crc >>= 1; | |||
|  |                 crc ^= 0x8c; | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 crc >>= 1; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  |     return crc; | |||
|  | } | |||
|  |  //@brief 计算CRC32
 | |||
|  | //@param *srcbuf 数据源
 | |||
|  | //@param len 计算长度
 | |||
|  | //@rtvl 返回计算结果
 | |||
|  | uint32_t Crc32Calu(uint32_t* buf, uint32_t len) | |||
|  | { | |||
|  | 	 uint32_t temp,crc = 0xFFFFFFFF; | |||
|  | 
 | |||
|  | 	 uint32_t i,j; | |||
|  | 	 i = 0; | |||
|  | 	 if(((uint32_t)buf %4) != 0) | |||
|  | 	 { | |||
|  | 			 return 1; | |||
|  | 	 } | |||
|  | 	 while(i<len) | |||
|  | 	 { | |||
|  | 			temp = *buf; | |||
|  | 			i += 4; | |||
|  | 			buf ++; | |||
|  | 			for(j=0; j<32; j++) | |||
|  | 			{ | |||
|  | 					if( (crc ^ temp) & 0x80000000 ) | |||
|  | 					{ | |||
|  | 							crc = 0x04C11DB7 ^(crc<<1); | |||
|  | 					} | |||
|  | 					else | |||
|  | 					{ | |||
|  | 							crc <<=1; | |||
|  | 					} | |||
|  | 					temp<<=1; | |||
|  | 			} | |||
|  | 			crc&=0xFFFFFFFF; | |||
|  | 	 } | |||
|  | 	 return crc; | |||
|  | } | |||
|  | /*
 | |||
|  | @brief 获取数组中的最大值和最小值 | |||
|  | @param *aus_buf 缓存数组 | |||
|  | @param us_size 数组长度 | |||
|  | @param *us_max 最大值 | |||
|  | @param *us_min 最小值 | |||
|  | */ | |||
|  | 
 | |||
|  | void GetMaxAndMinValue(uint16_t* aus_buf,uint16_t us_size,uint16_t* us_max,uint16_t* us_min) | |||
|  | { | |||
|  | 	*us_max = 0; | |||
|  | 	*us_min = ~0; | |||
|  | 	while(us_size > 0) | |||
|  | 	{ | |||
|  | 		if(*us_max < *aus_buf) | |||
|  | 		{ | |||
|  | 			*us_max = *aus_buf; | |||
|  | 		} | |||
|  | 		if(*us_min > *aus_buf) | |||
|  | 		{ | |||
|  | 			*us_min = *aus_buf; | |||
|  | 		} | |||
|  | 		aus_buf++; | |||
|  | 		us_size--; | |||
|  | 	} | |||
|  | } |