205 lines
6.1 KiB
C
205 lines
6.1 KiB
C
|
|
|
|
#ifndef __HD_NEW_LOG_H__
|
|
#define __HD_NEW_LOG_H__
|
|
|
|
#include <stdint.h>
|
|
#include <string.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 LogTVHex(data, len) HDLogHexType((const uint8_t *)data, len, 1, NULL, kLogLevelTVHex)
|
|
|
|
// 仅用于兼容旧版, 实际不输出数据
|
|
#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级别日志
|
|
kLogLevelTVHex, ///< TV Hex 日志
|
|
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 获取当前时间
|
|
* @return 当前时间
|
|
*/
|
|
uint32_t HDLogGetTime();
|
|
|
|
/**
|
|
* @brief 格式打印
|
|
**/
|
|
__attribute__ ((format(printf, 6, 7)))
|
|
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);
|
|
void HDLogHexType(const uint8_t *data, int len, uint8_t checkPrint, uint32_t *offset, uint8_t logLevel);
|
|
|
|
/**
|
|
* @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);
|
|
void HDLogDebugInitStackAddrInfo(unsigned long currTask, uint32_t size, uint32_t stackAddr);
|
|
|
|
/**
|
|
* @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__
|