HW_Lib/lib/inc/utils/tool.h

162 lines
5.2 KiB
C
Raw Normal View History

2024-05-09 05:56:55 +00:00
#ifndef HW_LIB_TOOL_H
#define HW_LIB_TOOL_H
2024-05-20 13:53:19 +00:00
#ifdef __cplusplus
extern "C" {
#endif
2024-05-09 05:56:55 +00:00
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef int s32;
typedef short int s16;
typedef char s8;
typedef union {
int i;
char c[4];
float f;
s8 s8[4];
s16 s16[2];
s32 s32;
u8 u8[4];
u16 u16[2];
u32 u32;
2024-05-20 13:53:19 +00:00
} Data32_t;
2024-05-09 05:56:55 +00:00
typedef union {
char c[2];
s8 s8[2];
s16 s16;
u8 u8[2];
u16 u16;
2024-05-20 13:53:19 +00:00
} Data16_t;
typedef enum { // 定义枚举类型Type_t包含不同数据类型
2024-06-22 03:08:31 +00:00
T_U8, // 无符号8位整数
T_U16, // 无符号16位整数
T_U32, // 无符号32位整数
2024-05-20 13:53:19 +00:00
2024-06-22 03:08:31 +00:00
T_CHAR, // 字符
T_SHORT, // 短整数
T_INT, // 整数
2024-05-20 13:53:19 +00:00
2024-06-22 03:08:31 +00:00
T_FLOAT, // 浮点数
T_DOUBLE, // 双精度浮点数
2024-05-20 13:53:19 +00:00
} Type_t;
#define TYPE_T(v) _Generic((v), \
u8 *:0,u16 *:1,u32 *:2, \
char *:3,short *:4,int *:5, \
2024-06-21 05:25:01 +00:00
float *:6,double *:7, \
2024-05-20 13:53:19 +00:00
default: ((void)0))
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) // 计算数组的元素个数
2024-06-22 03:08:31 +00:00
//#define in , // 定义逗号为in
2024-05-20 13:53:19 +00:00
#define _foreach(e, a) for(size_t e = 0; e < ARRAY_SIZE(a); e++) // 实现foreach宏遍历数组ae为当前元素下标
#define foreach(exp) _foreach(exp) // 定义foreach宏用于遍历数组
#define _VA_ARGS_N(_9, _8, _7, _6, _5, _4, _3, _2, _1, _0, N, ...) N
#define VA_ARGS_N(...) _VA_ARGS_N(0 __VA_OPT__(,) __VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define _range_1(var, n) (size_t var = 0; var < n; var++) // 定义范围循环从0到n-1
#define _range_2(var, a, b) (size_t var = a; var < b; var++) // 定义范围循环从a到b-1
#define _range_3(var, start, stop, step) (size_t var = start; var < stop; var += step) // 定义范围循环从start开始每次增加step直到stop
#define _range_n_cat(a, b) a ## b
#define _range_n(n) _range_n_cat(_range_, n)
#define _range(...) _range_n(VA_ARGS_N(__VA_ARGS__)) // 根据传入参数个数选择对应的范围循环宏
/**
* @Name
* @brief
* @param val: []
* @param a: [] 0a-1
* @param b: [] ab-1
* @param c: [] ab-1,c
* @retval
* @example range(i, 10) (size_t i = 0; i < 10; i++)
* @example range(c, 1, 10) (size_t c = 1; c < 10; c++)
* @example range(n, 10, 32, 3) (size_t n = 10; n < 32; n += 3)
**/
2024-05-20 13:57:52 +00:00
#define range(var, ...) for _range(__VA_ARGS__)(var, __VA_ARGS__) // 定义范围循环,传入循环变量和参数
2024-05-09 05:56:55 +00:00
/**
* @Name Mapping
* @brief ()
* @param val: []
* @param I_Min: []
* @param I_Max: []
* @param O_Min: []
* @param O_Max: []
2024-06-02 04:57:33 +00:00
* @return
2024-05-09 05:56:55 +00:00
* @example Mapping(128,0,4096,0.0,3.3) //0.10
* ADC
**/
float Mapping(float val, float I_Min, float I_Max, float O_Min, float O_Max);
2024-05-20 13:53:19 +00:00
/**
* @brief HEX
* @param name: []
* @param buf: []
* @param len: []
* @param frame: []
* @return void
* @example BufPrint("TX", buf, 64, 16); //将长64的buf以16个数据断帧打印
**/
#define Buf_Print(n, b, l, f) BufPrint(n,b,TYPE_T(b),l,f)
2024-05-09 05:56:55 +00:00
/**
* @brief HEX
* @param name: []
* @param buf: []
2024-05-20 13:53:19 +00:00
* @param size: [] Type_t[U8,U16,U32,CHAR,SHORT,INT...]
2024-05-09 05:56:55 +00:00
* @param len: []
* @param frame: []
* @return void
* @example BufPrint("TX", buf, 8, 64, 16); //将长64的8位buf以16个数据断帧打印
**/
2024-05-20 13:53:19 +00:00
void BufPrint(char *name, void *buf, Type_t type, unsigned int len, unsigned char frame);
2024-06-02 04:57:33 +00:00
/**
* @brief
* @param str: []
* @return float
* @example Str2Float("3.14");
**/
float Str2Float(char *str);
2024-05-20 13:53:19 +00:00
/**
* @brief
* @param arr: []
* @param fmt: []
* @param frame: []
* @return void
* @example BufPrint("TX", buf, 8, 64, 16); //将长64的8位buf以16个数据断帧打印
**/
#define PRINT_ARRAY(arr, fmt, frame) do { \
printf("\n"#arr ":\n"); \
2024-06-22 03:11:03 +00:00
_foreach(i,arr) {\
2024-05-20 13:53:19 +00:00
if(i%frame==0&&i!=0) printf("\n");\
printf(fmt " ", arr[i]); }\
printf("\n"); } while (0)
2024-05-09 05:56:55 +00:00
2024-06-20 13:58:30 +00:00
/**
* @brief
* @param name: []
* @param pFunction: []
* @return void
* @example Test("FunctionName", functionName);
**/
void Test_RunTime(char *name, void (*pFunction)());
#define END "\n"
#define TYPE_F(v) _Generic((v), \
char :"[char]-> "#v"=%c" END, \
short :"[short]-> "#v"=%d" END, \
int :"[int]-> "#v"=%d" END, \
float :"[float]-> "#v"=%.2f" END , \
double :"[double]-> "#v"=%.2f" END, \
default: "[err]-> "#v"=%p" END)
#define POUT(s) printf(TYPE_F(s) ,s)
#define GET_BIT(x, bit) ((x & (1 << bit)) >> bit)
2024-06-20 13:58:30 +00:00
2024-05-20 13:53:19 +00:00
#ifdef __cplusplus
}
#endif
2024-05-09 05:56:55 +00:00
#endif //HW_LIB_TOOL_H