#ifndef __HD_NEW_LOG_H__ #define __HD_NEW_LOG_H__ #include #include // 使用宏开关管理日志 #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__