UP 路径优化
This commit is contained in:
106
lib/utils/argpase.cpp
Normal file
106
lib/utils/argpase.cpp
Normal file
@@ -0,0 +1,106 @@
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "argpase.h"
|
||||
|
||||
char *Optarg, *Optstr;
|
||||
int Optindex = 0;
|
||||
|
||||
OptList *Options_Creat(char *name, OptId index) {
|
||||
OptList *p;
|
||||
p = (OptList *) malloc(sizeof(OptList));
|
||||
memset(p, 0, sizeof(OptList));
|
||||
Option *opt = (Option *) malloc(sizeof(Option));
|
||||
memset(opt, 0, sizeof(Option));
|
||||
opt->name = name;
|
||||
opt->id = index;
|
||||
p->Option = opt;
|
||||
p->next = NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
OptList *Options_CreatOpt(Option *opt) {
|
||||
OptList *p;
|
||||
p = (OptList *) malloc(sizeof(OptList));
|
||||
memset(p, 0, sizeof(OptList));
|
||||
p->Option = opt;
|
||||
p->next = NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
void Options_Add(OptList *opts, OptList *opt) {
|
||||
OptList *p = opts;
|
||||
while (NULL != p->next) {
|
||||
p = p->next;
|
||||
}
|
||||
p->next = opt;
|
||||
}
|
||||
|
||||
bool Options_Del(OptList *opts, char *opt) {
|
||||
//获取当前头节点的位置
|
||||
OptList *p = opts;
|
||||
OptList *prev = NULL;
|
||||
while (NULL != p->next) {
|
||||
//保存当前节点的前一个节点的指针
|
||||
prev = p;
|
||||
//然后让当前的指针继续往后移动
|
||||
p = p->next;
|
||||
//判断,找到了要删除的数据
|
||||
if (0 == strcmp(p->Option->name, opt)) {
|
||||
//两种情况,一种是普通节点,还有一种是尾节点
|
||||
if (p->next != NULL) //普通节点的情况
|
||||
{
|
||||
prev->next = p->next;
|
||||
free(p);
|
||||
} else //尾节点的情况
|
||||
{
|
||||
prev->next = NULL; //将这个尾节点的上一个节点的指针域指向空
|
||||
free(p);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Options_Print(OptList *opts) {
|
||||
OptList *p = opts;
|
||||
while (NULL != p) {
|
||||
printf("Option[%d]:%s\n", p->Option->id, p->Option->name);
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
|
||||
OptId Options_Load(OptList *opts, char *argv[], size_t argc) {
|
||||
OptList *p = opts;
|
||||
OptId id = -2;
|
||||
while (NULL != p) {
|
||||
if (0 == strcmp(p->Option->name, argv[Optindex])) {
|
||||
Optarg = argv[Optindex + 1];
|
||||
Optstr = p->Option->name;
|
||||
id = p->Option->id;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
Optindex++;
|
||||
if (Optindex >= argc) {
|
||||
return -1;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
size_t Str_To_Args(char *str, char *argv[]) {
|
||||
char *p;
|
||||
size_t argc = 0;
|
||||
size_t l = strlen(str);
|
||||
char *buf = (char *) malloc(sizeof(char) * l + 1);
|
||||
strcpy(buf, str);
|
||||
p = strtok(buf, " ");
|
||||
while (p) {
|
||||
argv[argc] = p;
|
||||
argc++;
|
||||
p = strtok(NULL, " ");
|
||||
}
|
||||
return argc;
|
||||
}
|
||||
|
45
lib/utils/inc/argpase.h
Normal file
45
lib/utils/inc/argpase.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#ifndef ARGPASE_H
|
||||
#define ARGPASE_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
typedef char OptId;
|
||||
|
||||
typedef struct Option {
|
||||
char *name;
|
||||
OptId id;
|
||||
} Option;
|
||||
|
||||
typedef struct OptList {
|
||||
struct OptList *next;
|
||||
Option *Option;
|
||||
} OptList;
|
||||
|
||||
extern char *Optarg, *Optstr;
|
||||
//索引指示,可手动重载为0
|
||||
extern int Optindex;
|
||||
|
||||
//选项链表创建
|
||||
OptList *Options_Creat(char *opt, OptId index);
|
||||
|
||||
//使用选项结构体创建
|
||||
OptList *Options_CreatOpt(Option *opt);
|
||||
|
||||
//添加
|
||||
void Options_Add(OptList *opts, OptList *opt);
|
||||
|
||||
//删除
|
||||
bool Options_Del(OptList *opts, char *opt);
|
||||
|
||||
//打印选项和id
|
||||
void Options_Print(OptList *opts);
|
||||
|
||||
//开始匹配参数
|
||||
OptId Options_Load(OptList *opts, char *argv[], size_t argc);
|
||||
|
||||
//字符串转参数数组
|
||||
size_t Str_To_Args(char *str, char *argv[]);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //ARGPASE_H
|
172
lib/utils/inc/log.h
Normal file
172
lib/utils/inc/log.h
Normal file
@@ -0,0 +1,172 @@
|
||||
/**
|
||||
* 方便打印日志
|
||||
* 为了保证输出顺序 都使用stdout而不是stderr
|
||||
*
|
||||
* 可配置项(默认都是未定义)
|
||||
* LOG_LINE_END_CRLF 默认是\n结尾 添加此宏将以\r\n结尾
|
||||
* LOG_FOR_MCU MCU项目可配置此宏 更适用于MCU环境
|
||||
* LOG_NDEBUG 关闭LOGD的输出
|
||||
* LOG_SHOW_VERBOSE 显示LOGV的输出
|
||||
* LOG_NOT_EXIT_ON_FATAL FATAL默认退出程序 添加此宏将不退出
|
||||
*/
|
||||
#ifndef HW_LIB_LOG_H
|
||||
#define HW_LIB_LOG_H
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#else
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#endif
|
||||
|
||||
/* 输出日志等级 */
|
||||
#define LOG_LVL_FATAL 0
|
||||
#define LOG_LVL_ERROR 1
|
||||
#define LOG_LVL_WARN 2
|
||||
#define LOG_LVL_INFO 3
|
||||
#define LOG_LVL_DEBUG 4
|
||||
#define LOG_LVL_VERBOSE 5
|
||||
|
||||
// 配置
|
||||
#define LOG_TIMER
|
||||
//#define LOG_FOR_MCU
|
||||
#define LOG_LINE_END_CRLF
|
||||
//#define LOG_WITH_RUN_TIMER
|
||||
#define LOG_OUTPUT_LVL LOG_LVL_INFO
|
||||
////////////////////////
|
||||
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOG_RUN_TIMER_FUN GetSysCnt32()
|
||||
#define LOG_RUN_TIMER_FMT "-T(%lums)"
|
||||
#else
|
||||
#define LOG_RUN_TIMER_FUN 0
|
||||
#define LOG_RUN_TIMER_FMT "-T(%lu)"
|
||||
#endif
|
||||
|
||||
#ifdef LOG_LINE_END_CRLF
|
||||
#define LOG_LINE_END "\r\n"
|
||||
#else
|
||||
#define LOG_LINE_END "\n"
|
||||
#endif
|
||||
|
||||
#ifdef LOG_NOT_EXIT_ON_FATAL
|
||||
#define LOG_EXIT_PROGRAM()
|
||||
#else
|
||||
#ifdef LOG_FOR_MCU
|
||||
#define LOG_EXIT_PROGRAM() do{ for(;;); } while(0)
|
||||
#else
|
||||
#define LOG_EXIT_PROGRAM() exit(EXIT_FAILURE)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define LOG_BASE_FILENAME \
|
||||
(strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : \
|
||||
strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
|
||||
|
||||
#define LOG_WITH_COLOR
|
||||
#if defined(_WIN32) || defined(LOG_FOR_MCU)
|
||||
#undef LOG_WITH_COLOR
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef LOG_WITH_COLOR
|
||||
#define LOG_COLOR_RED "\033[31m"
|
||||
#define LOG_COLOR_GREEN "\033[32m"
|
||||
#define LOG_COLOR_YELLOW "\033[33m"
|
||||
#define LOG_COLOR_BLUE "\033[34m"
|
||||
#define LOG_COLOR_CARMINE "\033[35m"
|
||||
#define LOG_COLOR_CYAN "\033[36m"
|
||||
#define LOG_COLOR_DEFAULT
|
||||
#define LOG_COLOR_END "\033[m"
|
||||
#else
|
||||
#define LOG_COLOR_RED
|
||||
#define LOG_COLOR_GREEN
|
||||
#define LOG_COLOR_YELLOW
|
||||
#define LOG_COLOR_BLUE
|
||||
#define LOG_COLOR_CARMINE
|
||||
#define LOG_COLOR_CYAN
|
||||
#define LOG_COLOR_DEFAULT
|
||||
#define LOG_COLOR_END
|
||||
#endif
|
||||
|
||||
#define LOG_END LOG_COLOR_END LOG_LINE_END
|
||||
|
||||
// 带时钟输出
|
||||
#if defined(LOG_TIMER)
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGT(tag, fmt, ...) do{ printf(LOG_COLOR_BLUE "[" tag "]" LOG_RUN_TIMER_FMT ": " fmt LOG_END,LOG_RUN_TIMER_FUN, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGT(tag, fmt, ...) do{ printf(LOG_COLOR_BLUE "[" tag "]: " fmt LOG_END, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGT(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
// 等级输出
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_FATAL
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGF(fmt, ...) do{ printf(LOG_COLOR_CYAN "[F]" LOG_RUN_TIMER_FMT ": %s: %s: %d: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); LOG_EXIT_PROGRAM(); } while(0)
|
||||
#else
|
||||
#define LOGF(fmt, ...) do{ printf(LOG_COLOR_CYAN "[F]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); LOG_EXIT_PROGRAM(); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGF(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_ERROR
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGE(fmt, ...) do{ printf(LOG_COLOR_RED "[E]" LOG_RUN_TIMER_FMT ": %s: %s: %d: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGE(fmt, ...) do{ printf(LOG_COLOR_RED "[E]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGE(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_WARN
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGW(fmt, ...) do{ printf(LOG_COLOR_CARMINE "[W]" LOG_RUN_TIMER_FMT ": %s: %s: %d: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGW(fmt, ...) do{ printf(LOG_COLOR_CARMINE "[W]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGW(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_INFO
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGI(fmt, ...) do{ printf(LOG_COLOR_YELLOW "[I]" LOG_RUN_TIMER_FMT ": %s: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGI(fmt, ...) do{ printf(LOG_COLOR_YELLOW "[I]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGI(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_DEBUG
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGD(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[D]" LOG_RUN_TIMER_FMT ": %s: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGD(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[D]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGD(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_VERBOSE
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#define LOGV(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[V]" LOG_RUN_TIMER_FMT ": %s: " fmt LOG_END,LOG_RUN_TIMER_FUN, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGV(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[V]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#endif
|
||||
#else
|
||||
#define LOGV(fmt, ...) ((void)0)
|
||||
#endif
|
||||
#endif //HW_LIB_LOG_H
|
161
lib/utils/inc/tool.h
Normal file
161
lib/utils/inc/tool.h
Normal file
@@ -0,0 +1,161 @@
|
||||
#ifndef HW_LIB_TOOL_H
|
||||
#define HW_LIB_TOOL_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
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;
|
||||
} Data32_t;
|
||||
|
||||
typedef union {
|
||||
char c[2];
|
||||
s8 s8[2];
|
||||
s16 s16;
|
||||
u8 u8[2];
|
||||
u16 u16;
|
||||
} Data16_t;
|
||||
typedef enum { // 定义枚举类型Type_t,包含不同数据类型
|
||||
T_U8, // 无符号8位整数
|
||||
T_U16, // 无符号16位整数
|
||||
T_U32, // 无符号32位整数
|
||||
|
||||
T_CHAR, // 字符
|
||||
T_SHORT, // 短整数
|
||||
T_INT, // 整数
|
||||
|
||||
T_FLOAT, // 浮点数
|
||||
T_DOUBLE, // 双精度浮点数
|
||||
} Type_t;
|
||||
|
||||
#define TYPE_T(v) _Generic((v), \
|
||||
u8 *:0,u16 *:1,u32 *:2, \
|
||||
char *:3,short *:4,int *:5, \
|
||||
float *:6,double *:7, \
|
||||
default: ((void)0))
|
||||
|
||||
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) // 计算数组的元素个数
|
||||
//#define in , // 定义逗号为in
|
||||
#define _foreach(e, a) for(size_t e = 0; e < ARRAY_SIZE(a); e++) // 实现foreach宏,遍历数组a,e为当前元素下标
|
||||
#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: [输入] 0到a-1
|
||||
* @param b: [输入] a到b-1
|
||||
* @param c: [输入] a到b-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)
|
||||
**/
|
||||
#define range(var, ...) for _range(__VA_ARGS__)(var, __VA_ARGS__) // 定义范围循环,传入循环变量和参数
|
||||
|
||||
/**
|
||||
* @Name Mapping
|
||||
* @brief 数据映射(缩放)
|
||||
* @param val: [输入] 数据采集值
|
||||
* @param I_Min: [输入] 数据最小值
|
||||
* @param I_Max: [输入] 数据最大值
|
||||
* @param O_Min: [输入] 需求最小值
|
||||
* @param O_Max: [输入] 需求最小值
|
||||
* @return 需求处理值
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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)
|
||||
|
||||
/**
|
||||
* @brief 数组内容HEX打印
|
||||
* @param name: [输入] 标识名
|
||||
* @param buf: [输入] 数组
|
||||
* @param size: [输入] 数组类型 Type_t[U8,U16,U32,CHAR,SHORT,INT...]
|
||||
* @param len: [输入] 数组长度
|
||||
* @param frame: [输入] 断帧大小
|
||||
* @return void
|
||||
* @example BufPrint("TX", buf, 8, 64, 16); //将长64的8位buf以16个数据断帧打印
|
||||
**/
|
||||
void BufPrint(char *name, void *buf, Type_t type, unsigned int len, unsigned char frame);
|
||||
|
||||
/**
|
||||
* @brief 字符串转浮点数
|
||||
* @param str: [输入] 输入的字符串
|
||||
* @return float 转换后的浮点数
|
||||
* @example Str2Float("3.14");
|
||||
**/
|
||||
float Str2Float(char *str);
|
||||
|
||||
/**
|
||||
* @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"); \
|
||||
_foreach(i,arr) {\
|
||||
if(i%frame==0&&i!=0) printf("\n");\
|
||||
printf(fmt " ", arr[i]); }\
|
||||
printf("\n"); } while (0)
|
||||
|
||||
/**
|
||||
* @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)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //HW_LIB_TOOL_H
|
93
lib/utils/tool.cpp
Normal file
93
lib/utils/tool.cpp
Normal file
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// Created by lydxh on 2024/5/9.
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <ctime>
|
||||
#include <stdint.h>
|
||||
#include <cstdlib>
|
||||
#include "tool.h"
|
||||
|
||||
float Mapping(float val, float I_Min, float I_Max, float O_Min, float O_Max) {
|
||||
return (((val - I_Min) * ((O_Max - O_Min) / (I_Max - I_Min))) + O_Min);
|
||||
}
|
||||
|
||||
void BufPrint(char *name, void *buf, Type_t type, unsigned int len, unsigned char frame) {
|
||||
printf("\n%s:\n", name);
|
||||
for (int i = 0; i < len; ++i) {
|
||||
if (i % frame == 0 && i != 0) printf("\n");
|
||||
switch (type) {
|
||||
case T_U8:
|
||||
printf("%02X ", *((unsigned char *) buf + i));
|
||||
break;
|
||||
case T_U16:
|
||||
printf("%04X ", *((unsigned short *) buf + i));
|
||||
break;
|
||||
case T_U32:
|
||||
printf("%08X ", *((unsigned int *) buf + i));
|
||||
break;
|
||||
case T_CHAR:
|
||||
printf("%c ", *((char *) buf + i));
|
||||
break;
|
||||
case T_SHORT:
|
||||
printf("%d ", *((short *) buf + i));
|
||||
break;
|
||||
case T_INT:
|
||||
printf("%d ", *((int *) buf + i));
|
||||
break;
|
||||
case T_FLOAT:
|
||||
printf("%0.2f ", *((float *) buf + i));
|
||||
break;
|
||||
case T_DOUBLE:
|
||||
printf("%0.2f ", *((double *) buf + i));
|
||||
break;
|
||||
default:
|
||||
printf("未指定类型大小:%p", buf);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
float Str2Float(char *str) {
|
||||
int integer = 0;
|
||||
double decimal = 0;
|
||||
int sign = 1;
|
||||
int decimalFlag = 0;
|
||||
int decimalWeight = 1;
|
||||
if (*str == '-') {
|
||||
sign = -1;
|
||||
str++;
|
||||
}
|
||||
while (*str != '\0') {
|
||||
if (*str == '.') {
|
||||
decimalFlag = 1;
|
||||
str++;
|
||||
continue;
|
||||
}
|
||||
if (!decimalFlag) {
|
||||
integer = integer * 10 + (*str - '0');
|
||||
} else {
|
||||
decimal = decimal * 10 + (*str - '0');
|
||||
decimalWeight *= 10;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
decimal /= decimalWeight;
|
||||
return float(sign * (integer + decimal));
|
||||
}
|
||||
|
||||
void Test_RunTime(char *name, void (*pFunction)()) {
|
||||
clock_t start, end;
|
||||
double cpu_time_used;
|
||||
|
||||
printf("\n------< %s TEST >------\n", name);
|
||||
|
||||
start = clock();
|
||||
pFunction();
|
||||
end = clock();
|
||||
|
||||
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
|
||||
|
||||
printf("\n------< %s END >------\n", name);
|
||||
|
||||
printf("\nTime taken by %s: %f seconds\n", name, cpu_time_used);
|
||||
}
|
Reference in New Issue
Block a user