Files
99_7018_lmx/apps/earphone/94_rfid_stc/function.c

458 lines
9.6 KiB
C
Raw Normal View History

2025-12-01 10:01:10 +08:00
/**
************************************* Copyright ******************************
* (C) Copyright 2019,TuYW,FMSH,China.
* All Rights Reserved
* By(Shanghai Fudan MicroeleCardTyperonics Group Company Limited)
* https://www.fmsh.com
*
* FileName : function.c
* Version : v1.0
* Author : TuYW
* Date : 2019-03-19
* Description:
*******************************************************************************/
#include "function.h"
//#include "flash.h"
#include "intrins.h"
#include <stdio.h>
/**
* @brief Convert Hex 32Bits value into char
* @param value: value to convert
* @param pbuf: pointer to the buffer
* @param len: buffer length
* @retval None
*/
void IntToUnicode( uint32_t value, uint8_t *pbuf, uint8_t len )
{
uint8_t idx = 0;
for ( idx = 0; idx < len; idx++ )
{
if ( ( (value >> 28) ) < 0xA )
{
pbuf[2 * idx] = (value >> 28) + '0';
}
else
{
pbuf[2 * idx] = (value >> 28) + 'A' - 10;
}
value = value << 4;
pbuf[2 * idx + 1] = 0;
}
}
//תַ
u8 uitoa( u16 n, u8* s )
{
u16 i = 0, j;
u16 len = 0;
u8 tmp[7] = { 0 };
do
{
tmp[i++] = n % 10 + '0'; //ȡһ
}
while ( (n /= 10) > 0 ); //ɾ
len = i;
for ( j = 0; j < len; j++, i-- ) //򴢴
{
s[j] = tmp[i - 1];
}
return (len);
}
//ƽ
u32 power( u8 n )
{
u8 i;
u32 t;
t = 1;
for ( i = 0; i < n; i++ )
t *= 2;
return (t);
}
//m^n
u32 calpow( u8 m, u8 n )
{
u32 result = 1;
while ( n-- )
result *= m;
return (result);
}
//CRC
u16 UpdateCrc( u8 ch, u16 *lpwCrc )
{
ch = (ch ^ (u8) ( (*lpwCrc) & 0x00FF) );
ch = (ch ^ (ch << 4) );
*lpwCrc = (*lpwCrc >> 8) ^ ( (u16) ch << 8) ^ ( (u16) ch << 3) ^ ( (u16) ch >> 4);
return (*lpwCrc);
}
u16 ComputeCrc( const u16 InitCRC, const u8 *Data, const u32 Length )
{
u8 chBlock;
u32 InLength = Length;
u16 wCrc = InitCRC;
do
{
chBlock = *Data++;
UpdateCrc( chBlock, &wCrc );
}
while ( --InLength );
return (~wCrc);;
}
//u16 CalculateIapCrc(void)
//{
// return ComputeCrc(0xffff,(u8 *)PROGRAM_IAP_BASE,PROGRAM_IAP_LENGTH);
//}
//u16 CalculateAppCrc(void)
//{
// return ComputeCrc(0xffff,(u8 *)PROGRAM_APP_BASE,PROGRAM_APP_LENGTH);
//}
/*********************************************************************************************************
** : CalcBCC
** : bccУ
** :
** :
** ֵ:
*********************************************************************************************************/
u8 CalcBCC( u8 *ibuf, u16 ilen )
{
u8 BCC = 0x00;
u16 i = 0;
for ( i = 0; i < ilen; i++ )
{
BCC = BCC ^ ibuf[i];
}
return (BCC);
}
/*
// C prototype : void StrToHex(BYTE *pbDest, BYTE *pbSrc, int nLen)
// parameter(s): [OUT] pbDest -
// [IN] pbSrc - ַ
// [IN] nLen - 16ֽ(ַij/2)
// return value:
// remarks : ַתΪ16
*/
void StrToHex( BYTE *pbDest, BYTE *pbSrc, int nLen )
{
char h1, h2;
BYTE s1, s2;
int i;
for ( i = 0; i < nLen; i++ )
{
h1 = pbSrc[2 * i];
h2 = pbSrc[2 * i + 1];
s1 = toupper( h1 ) - 0x30;
if ( s1 > 9 )
s1 -= 7;
s2 = toupper( h2 ) - 0x30;
if ( s2 > 9 )
s2 -= 7;
pbDest[i] = s1 * 16 + s2;
}
}
/*
// C prototype : void HexToStr(BYTE *pbDest, BYTE *pbSrc, int nLen)
// parameter(s): [OUT] pbDest - Ŀַ
// [IN] pbSrc - 16ʼַ
// [IN] nLen - 16ֽ
// return value:
// remarks : 16תΪַ
*/
void HexToStr( BYTE *pbDest, BYTE *pbSrc, int nLen )
{
char ddl, ddh;
int i;
for ( i = 0; i < nLen; i++ )
{
ddh = 48 + pbSrc[i] / 16;
ddl = 48 + pbSrc[i] % 16;
if ( ddh > 57 )
ddh = ddh + 7;
if ( ddl > 57 )
ddl = ddl + 7;
pbDest[i * 2] = ddh;
pbDest[i * 2 + 1] = ddl;
}
pbDest[nLen * 2] = '\0';
}
U32 le32p_to_cpu( U8*p )
{
return ( (U32) ( (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]) );
}
U32 be32p_to_cpu( const U8*p )
{
return ( (U32) ( (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]) );
}
void cpu_to_le32p( U8*p, U32 n )
{
p[3] = (U8) (n >> 24);
p[2] = (U8) (n >> 16);
p[1] = (U8) (n >> 8);
p[0] = (U8) (n);
}
void cpu_to_be32p( U8*p, U32 n )
{
p[0] = (U8) (n >> 24);
p[1] = (U8) (n >> 16);
p[2] = (U8) (n >> 8);
p[3] = (U8) (n);
}
U32 le16p_to_cpu( const U8*p )
{
return ( (U32) ( (p[1] << 8) | p[0]) );
}
U32 be16p_to_cpu( U8*p )
{
return ( (U32) ( (p[0] << 8) | p[1]) );
}
void cpu_to_le16p( U8*p, U32 n )
{
p[1] = (U8) (n >> 8);
p[0] = (U8) (n);
}
void cpu_to_be16p( U8*p, U32 n )
{
p[0] = (U8) (n >> 8);
p[1] = (U8) (n);
}
/*ַs转Ӧ*/
//int atoi(char s[])
//{
// int i;
// int n = 0;
// for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
// {
// n = 10 * n + (s[i] - '0');
// }
// return n;
//}
int atoi_b( u8 *s, u32 sl )
{
int i;
int n = 0;
for ( i = 0; i < sl; i++ )
{
n = 10 * n + (s[i] - '0');
}
return (n);
}
//xtell tolower改成my_tolower
/*дĸ转Сдĸ*/
int my_tolower( int c )
{
if ( c >= 'A' && c <= 'Z' )
{
return (c + 'a' - 'A');
}
else
{
return (c);
}
}
//ʮƵַ转
int htoi( char s[] )
{
int i;
int n = 0;
if ( s[0] == '0' && (s[1] == 'x' || s[1] == 'X') )
{
i = 2;
}
else
{
i = 0;
}
for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'); ++i )
{
if ( my_tolower( s[i] ) > '9' )
{
n = 16 * n + (10 + my_tolower( s[i] ) - 'a');
}
else
{
n = 16 * n + (my_tolower( s[i] ) - '0');
}
}
return (n);
}
// itoa (ʾ integer to alphanumeric)ǰ转ַһ
char* itoa( long num, char* str, int radix )
{
char temp; // 移动到函数开头
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //
unsigned long unum; //Ҫ转ľֵ,转Ǹ
int i = 0, j, k; //iָʾַӦλ转֮iʵַijȣ转˳ģkָʾ˳Ŀʼλ;jָʾ˳ʱĽ
//ȡҪ转ľֵ
if ( radix == 10 && num < 0 ) //Ҫ转ʮǸ
{
unum = (unsigned long) -num; //numľֵunum
str[i++] = '-'; //ַǰΪ'-'ţ1
}
else
unum = (unsigned long) num; //numΪֱӸֵunum
//转֣ע转
do
{
str[i++] = index[unum % (unsigned long) radix]; //ȡunumһλΪstrӦλָʾ1
unum /= radix; //unumȥһλ
}
while ( unum ); //ֱunumΪ0˳ѭ
str[i] = '\0'; //ַ'\0'ַcַ'\0'
//˳
if ( str[0] == '-' )
k = 1; //ǸŲõӷź濪ʼ
else
k = 0; //ǸȫҪ
for ( j = k; j <= (i - 1) / 2; j++ ) //ͷβһһԳƽiʵַijȣֵȳ1
{
temp = str[j]; //ͷֵʱ
str[j] = str[i - 1 + k - j]; //βֵͷ
str[i - 1 + k - j] = temp; //ʱֵ(ʵ֮ǰͷֵ)β
}
return (str); //转ַ
}
static const char *ALPHA_BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//base64뺯
int base64_encode( const char *buf, const long size, char *base64Char )
{
int int63 = 0x3F; // 00111111 // 移动到函数开头
int int255 = 0xFF; // 11111111 // 移动到函数开头
int a = 0;
int i = 0;
int base64Len = 0;
while ( i < size )
{
char b0 = buf[i++];
char b1 = (i < size) ? buf[i++] : 0;
char b2 = (i < size) ? buf[i++] : 0;
base64Char[a++] = ALPHA_BASE[(b0 >> 2) & int63];
base64Char[a++] = ALPHA_BASE[( (b0 << 4) | ( (b1 & int255) >> 4) ) & int63];
base64Char[a++] = ALPHA_BASE[( (b1 << 2) | ( (b2 & int255) >> 6) ) & int63];
base64Char[a++] = ALPHA_BASE[b2 & int63];
}
base64Len = a;
switch ( size % 3 )
{
case 1:
base64Char[--a] = '=';
case 2:
base64Char[--a] = '=';
}
return (base64Len);
}
//base64뺯
char *base64_decode( const char *base64Char, const long base64CharSize, char *originChar, long originCharSize )
{
int toInt[128] = { -1 };
int int255 = 0xFF; // 移动到函数开头
int index = 0; // 移动到函数开头
int c2, c3; // 移动到函数开头
int i = 0;
int j = 0;
for ( i = 0; i < 64; i++ )
{
toInt[ALPHA_BASE[i]] = i;
}
for ( j = 0; j < base64CharSize; j += 4 )
{
int c0 = toInt[base64Char[j]];
int c1 = toInt[base64Char[j + 1]];
originChar[index++] = ( ( (c0 << 2) | (c1 >> 4) ) & int255);
if ( index >= originCharSize )
{
return (originChar);
}
c2 = toInt[base64Char[j + 2]];
originChar[index++] = ( ( (c1 << 4) | (c2 >> 2) ) & int255);
if ( index >= originCharSize )
{
return (originChar);
}
c3 = toInt[base64Char[j + 3]];
originChar[index++] = ( ( (c2 << 6) | c3) & int255);
}
return (originChar);
}
//建
void ClrLongBuf( u8* buf, u32 n )
{
memset( buf, 0x00, n );
}