HCoreBase/include/HDLog.h
2025-08-11 16:33:30 +08:00

192 lines
5.6 KiB
C

#ifndef __HD_NEW_LOG_H__
#define __HD_NEW_LOG_H__
#include <stdint.h>
// 使用宏开关管理日志
#ifndef LOG_CLOSE_OUT
#define USE_HD_LOG_DEBUG (1)
#define USE_HD_LOG_ERROR (1)
#define USE_HD_LOG_DATA (1)
#define USE_HD_TRACE (1)
#define USE_HD_FPGA_CHECK (1)
#endif
// 当前检查栈数量的线程总数
#define USE_CHECK_STACK_NUM (1)
#if USE_RTOS
#define USE_SYS_CHECK_STACK (1)
#define USE_SYS_CHECK_HEAP (1)
#define USE_RTOS_LOG_LOCK (1)
#else
// 使用系统的栈检查
#define USE_SYS_CHECK_STACK (0)
// 使用系统的堆检查
#define USE_SYS_CHECK_HEAP (0)
// 使用RTOS的日志锁
#define USE_RTOS_LOG_LOCK (0)
#endif
// 标准日志输出
#define _LogDExtLevel(level, format, ...) HDLogOut(1, level, __FILE__, __func__, __LINE__, format, ##__VA_ARGS__)
#define _LogDLevel(level, format, ...) HDLogOut(0, level, __FILE__, __func__, __LINE__, format, ##__VA_ARGS__)
#if USE_HD_TRACE
#define LogTr(format, ...) _LogDLevel(kLogLevelTrace, format, ##__VA_ARGS__)
#define LogTrace() LogTr("")
#else
#define LogTr(format, ...)
#define LogTrace()
#endif
#if USE_HD_LOG_DEBUG
#define LogD(format, ...) _LogDLevel(kLogLevelDebug, format, ##__VA_ARGS__)
#define LogDExt(format, ...) _LogDExtLevel(kLogLevelDebug, format, ##__VA_ARGS__)
#define LogLine() LogDExt("\r\n")
#else
#define LogD(...)
#define LogDExt(...)
#define LogLine()
#endif
#if USE_HD_LOG_ERROR
#define LogE(format, ...) _LogDLevel(kLogLevelError, format, ##__VA_ARGS__)
#else
#define LogE(...)
#endif
#if USE_HD_LOG_DATA
#define LogData(data, len) HDLogData((const uint8_t *)data, len, 1)
#define LogFpgaData(data, len, isWrite) HDLogPrintFpga((const uint8_t *)data, len, isWrite, 1)
#define LogHexData(data, len) HDLogHex((const uint8_t *)data, len, 1, NULL)
#else
#define LogData(data, len)
#define LogFpgaData(data, len, isWrite)
#define LogHexData(data, len)
#endif
// 仅用于兼容旧版, 实际不输出数据
#define qDebugWin(A, B)
#define OutputFunInfo
#define DSDebug(...)
#define KEYDebug(...)
#define RTADebug(...)
#define CloudDebug(...)
#define FPGADebug(...)
#define TVDebug(...)
#define qDebugData(...)
#define qDebugBuffer(...)
#if 1
#define qDebug(...)
#else
#define qDebug printf
#endif
#define InitLogData() HDLogInit(NULL)
typedef enum eLogLevel {
kLogLevelSwitch = 0, ///< 日志开关
kLogLevelColor, ///< 彩色日志
kLogLevelDebug, ///< 常规调试信息
kLogLevelError, ///< 错误信息
kLogLevelHex, ///< 十六进制日志
kLogLevelStack, ///< 打印栈大小信息
kLogLevelHeap, ///< 打印堆大小信息
kLogLevelTrace, ///< trace级别日志
kLogLevelMax,
} eLogLevel;
typedef uint8_t (*HDLogFlashOpt_t)(uint8_t isWrite, eLogLevel level, uint8_t value);
/**
* @brief 设置日志flash读写调用, 注: 配置后必须调用 HDLogOptFlashInit, 否则日志项将处于全开状态
* @param call 日志flash读写调用
*/
void HDLogSetOptFlashCall(HDLogFlashOpt_t call);
/**
* @brief 日志flash初始化, 调用后触发日志flash回调
*/
void HDLogOptFlashInit();
/**
* @brief 日志初始化
*/
void HDLogInit(uint32_t (*getTime)());
/**
* @brief 格式打印
**/
void HDLogOut(uint8_t ext, uint8_t level, const char *fileName, const char *funcName, int line, const char *format, ...);
/**
* @brief 打印FPGA
* @param data FPGA数据
* @param len 数据长度
* @param isWrite 是否是写
* @param checkFpga 是否更新检查FPGA数据
* @return 是fpga数据或者需要打印返回1 否则返回0
*/
uint8_t HDLogPrintFpga(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga);
uint8_t HDLogCheckFpgaHeader(const uint8_t *data, int len);
/**
* @brief 十六进制格式打印数据
* @param data 数据
* @param len 数据长度
* @param checkPrint 是否检查打印开关是否打开
* @param offset 打印偏移, 一般传递 NULL 即可
**/
void HDLogHex(const uint8_t *data, int len, uint8_t checkPrint, uint32_t *offset);
/**
* @brief 无格式以16进制打印数据, 打印16个换行
* @param data 数据
* @param len 数据长度
* @param checkPrint 是否检查打印开关是否打开
*/
void HDLogData(const uint8_t *data, int len, uint8_t checkPrint);
typedef unsigned long(*HDLogGetTaskType_t)();
/**
* @brief 设置获取当前任务的方法
* @param getTask 获取当前任务, 如果非RTOS, 传递 NULL
*/
void HDLogDebugSetGetTask(HDLogGetTaskType_t getTask);
/**
* @brief 设置当前任务的栈大小
* @param currTask 当前任务, 如果非RTOS, 传递 NULL
* @param size 栈大小
*/
void HDLogDebugInitStackAddr(unsigned long currTask, uint32_t size);
/**
* @brief 删除当前任务的栈大小记录
* @param currTask 当前任务
*/
void HDLogDebugDeleteStackAddr(unsigned long currTask);
/**
* @brief 获取当前任务的栈大小
* @return 当前栈使用大小
*/
uint32_t HDLogDebugGetCurrStackSize();
typedef uint32_t(*HDLogGetStackSizeType_t)(unsigned long currTask);
/**
* @brief 设置获取当前任务的栈大小方法, 使用uxTaskGetStackHighWaterMark(NULL) * sizeof(long) 返回
* @param getStackSize 获取当前任务的栈大小
*/
void HDLogSetGetCurrStackSizeCall(HDLogGetStackSizeType_t getStackSize);
/**
* @brief 设置获取当前任务的堆剩余大小方法, 当前仅支持RTOS, 使用 esp_get_free_heap_size() 返回
* @param getHeadSize 获取当前任务的堆剩余大小
*/
void HDLogSetGetCurrHeapSizeCall(HDLogGetStackSizeType_t getHeapSize);
#endif // __HD_NEW_LOG_H__