#include "log.h"
#include <stdarg.h>
#include <time.h>
#include "ff.h"
#include "main.h"
#include "uart_driver.h"
#define LOG_OUT_HANDLE(data, len, max_delay) \
b_uart_send_data(&huart1, data, len, max_delay)
#define LOG_GET_SYS_TICK() HAL_GetTick()
#define LOG_CLONSE_CLEAR "\033[2J\033[0;0H" /* 清空控制台且光标置顶 */
#define LOG_COLOR_REST "\033[0m" /* 恢复颜色 */
#define LOG_COLOR_BLACK "\033[30m" /* 黑色字 */
#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_PURPLE "\033[35m" /* 紫色字 */
#define LOG_COLOR_SKYBLUE "\033[36m" /* 天蓝字 */
#define LOG_COLOR_WHITE "\033[37m" /* 白色字 */
#define LOG_COLOR_BLK_WHT "\033[40;37m" /* 黑底白字 */
#define LOG_COLOR_RED_WHT "\033[41;37m" /* 红底白字 */
#define LOG_COLOR_GREEN_WHT "\033[42;37m" /* 绿底白字 */
#define LOG_COLOR_YELLOW_WHT "\033[43;37m" /* 黄底白字 */
#define LOG_COLOR_BLUE_WHT "\033[44;37m" /* 蓝底白字 */
#define LOG_COLOR_PURPLE_WHT "\033[45;37m" /* 紫底白字 */
#define LOG_COLOR_SKYBLUE_WHT "\033[46;37m" /* 天蓝底白字 */
#define LOG_COLOR_WHT_BLK "\033[47;30m" /* 白底黑字 */
static const u8* b_log_level_color(u8 level)
{
switch(level)
{
case LOG_TRACE_LEVEL:
return LOG_COLOR_SKYBLUE;
case LOG_DEBUG_LEVEL:
return LOG_COLOR_WHITE;
case LOG_INFO_LEVEL:
return LOG_COLOR_GREEN;
case LOG_WARN_LEVEL:
return LOG_COLOR_YELLOW;
case LOG_ERROR_LEVEL:
return LOG_COLOR_RED;
case LOG_FATAL_LEVEL:
return LOG_COLOR_RED_WHT;
default:
return "";
}
}
static void b_log_printf_console(u8 level, const u8 *text, u32 len)
{
#if LOG_CLONSE_UI_SW
const u8 *ps = (const u8 *)b_log_level_color(level);
const u8 *pe = (const u8 *)LOG_COLOR_REST;
LOG_OUT_HANDLE((u8 *)ps, (u16)strlen((const char *)ps), HAL_MAX_DELAY);
#endif
LOG_OUT_HANDLE((u8 *)text, len, HAL_MAX_DELAY);
#if LOG_CLONSE_UI_SW
LOG_OUT_HANDLE((u8 *)pe, (u16)strlen((const char *)pe), HAL_MAX_DELAY);
#endif
}
static void b_log_printf_file(u8 level, const u8 *text, u32 len)
{
FIL fp;
u32 real_write = 0;
FRESULT ret = f_open(&fp, LOG_FILE_NAME, FA_WRITE | FA_OPEN_APPEND);
if(ret == FR_OK)
{
f_write(&fp, text, len, &real_write);
f_close(&fp);
}
}
static LOG_OUT_FUNCTION log_out_func[LOG_LEVEL_MAX] =
{
b_log_printf_console,
b_log_printf_console,
b_log_printf_console,
b_log_printf_console,
b_log_printf_console,
b_log_printf_console,
};
static LOG_OUT_FUNCTION b_log_get_log_out_func(u8 level)
{
if(level < LOG_FATAL_LEVEL || level >= LOG_LEVEL_MAX)
{
return NULL;
}
LOG_OUT_FUNCTION func = log_out_func[level];
return func;
}
s32 b_log_set_log_out_func(u8 level, LOG_OUT_PORT port, LOG_OUT_FUNCTION func)
{
if(level < LOG_FATAL_LEVEL || level >= LOG_LEVEL_MAX)
{
return -1;
}
if(port == LOG_OUT_PORT_CLONSE)
{
log_out_func[level] = b_log_printf_console;
}
else if(port == LOG_OUT_PORT_FILE)
{
log_out_func[level] = b_log_printf_file;
}
else if(port == LOG_OUT_PORT_CUSTOM && func != NULL)
{
log_out_func[level] = func;
}
else
{
return -1;
}
return 0;
}
const u8* b_log_level_name(u8 level)
{
#define LOG_LEVEL_NAME_LEN_MAX (10)
static const u8 log_level_name[LOG_LEVEL_MAX + 1][LOG_LEVEL_NAME_LEN_MAX] =
{
"FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "UNKNOW",
};
if(level < LOG_FATAL_LEVEL || level >= LOG_LEVEL_MAX)
{
return log_level_name[LOG_LEVEL_MAX];
}
return log_level_name[level];
}
const u8* b_log_serial_num(void)
{
#define LOG_ID_MAX_LEN (20)
static u8 log_id_buf[LOG_ID_MAX_LEN] = {0};
#if LOG_TIMESTAMP_SW
time_t time_stamp = 0;
struct tm *info = NULL;
time(&time_stamp);
info = localtime(&time_stamp);
sprintf(log_id_buf, "%4d-%2d-%2d %2d:%2d:%2d",
info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,
info->tm_hour, info->tm_min, info->tm_sec);
#else
u32 log_id = LOG_GET_SYS_TICK();
sprintf(log_id_buf, "%08d", log_id);
log_id++;
#endif
return log_id_buf;
}
s32 b_log_ptintf(u8 level, const char* fmt, ...)
{
va_list ap;
int i = 0, len = 0;
char text[LOG_TEXT_MAX_LEN] = {0};
if(level < LOG_FATAL_LEVEL || level >= LOG_LEVEL_MAX)
{
return -1;
}
va_start(ap, fmt);
len += vsnprintf(text + len, LOG_TEXT_MAX_LEN - len, fmt, ap);
va_end(ap);
LOG_OUT_FUNCTION func = b_log_get_log_out_func(level);
if(func != NULL)
{
func(level, text, len);
return len;
}
return -1;
}
void b_log_printf_bin(const u8* data, u32 len)
{
#define MAX_PRINTF_BIN_LENGTH (64)
u8 send_data[MAX_PRINTF_BIN_LENGTH * 3 + 12] = {0};
u32 i = 0;
for (i = 0; i < len && i < MAX_PRINTF_BIN_LENGTH; i++)
{
sprintf(send_data + i * 3, "%02X", data[i]);
send_data[i * 3 + 2] = ' ';
}
if (i >= MAX_PRINTF_BIN_LENGTH)
{
sprintf(send_data + i * 3, "%s", "......\n");
}
LOG_OUT_HANDLE((u8 *)send_data,
(u16)strlen((const char *)send_data), HAL_MAX_DELAY);
LOG_OUT_HANDLE((u8 *)"\r\n",
(u16)strlen((const char *)"\r\n"), HAL_MAX_DELAY);
}
void b_log_clonse_clear(void)
{
LOG_OUT_HANDLE((u8 *)LOG_CLONSE_CLEAR,
(u16)strlen((const char *)LOG_CLONSE_CLEAR), HAL_MAX_DELAY);
}
void b_log_test(void)
{
while(1)
{
LOG_CLEAR_CLONSE();
LOG_TRACE("abcdefghijk:%dr\n", 123);
LOG_DEBUG("abcdefghijk:%dr\n", 123);
LOG_INFO("abcdefghijk:%dr\n", 123);
LOG_WARN("abcdefghijk:%dr\n", 123);
LOG_ERROR("abcdefghijk:%dr\n", 123);
LOG_FATAL("abcdefghijk:%dr\n", 123);
vTaskDelay(200);
LOG_CLEAR_CLONSE();
LOG_TRACE("12345678910:%dr\n", 123);
LOG_DEBUG("12345678910:%dr\n", 123);
LOG_INFO("12345678910:%dr\n", 123);
LOG_WARN("12345678910:%dr\n", 123);
LOG_ERROR("12345678910:%dr\n", 123);
LOG_FATAL("12345678910:%dr\n", 123);
vTaskDelay(200);
}
}
单片机常用LOG打印模块
需积分: 1 124 浏览量
2023-07-19
10:25:43
上传
评论
收藏 2KB 7Z 举报
BIN-XYB
- 粉丝: 79
- 资源: 7