Files
checker_slave/source/elec_det/base/utility.c
2023-11-01 23:51:19 +08:00

459 lines
7.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 lenstring size
*@return void
*/
void myitoa(int n,char *str, int 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 stringoldchar:dst charnewcharsrc 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--;
}
}