188 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			188 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2021, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2016-11-12     Bernard      The first version
							 | 
						||
| 
								 | 
							
								 * 2018-05-25     armink       Add simple API, such as LOG_D, LOG_E
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * The macro definitions for debug
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * These macros are defined in static. If you want to use debug macro, you can
							 | 
						||
| 
								 | 
							
								 * use as following code:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * In your C/C++ file, enable/disable DEBUG_ENABLE macro, and then include this
							 | 
						||
| 
								 | 
							
								 * header file.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * #define DBG_TAG           "MOD_TAG"
							 | 
						||
| 
								 | 
							
								 * #define DBG_LVL           DBG_INFO
							 | 
						||
| 
								 | 
							
								 * #include <rtdbg.h>          // must after of DBG_LVL, DBG_TAG or other options
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Then in your C/C++ file, you can use LOG_X macro to print out logs:
							 | 
						||
| 
								 | 
							
								 * LOG_D("this is a debug log!");
							 | 
						||
| 
								 | 
							
								 * LOG_E("this is a error log!");
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef RT_DBG_H__
							 | 
						||
| 
								 | 
							
								#define RT_DBG_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <rtconfig.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* the debug log will force enable when RT_DEBUG macro is defined */
							 | 
						||
| 
								 | 
							
								#if defined(RT_DEBUG) && !defined(DBG_ENABLE)
							 | 
						||
| 
								 | 
							
								#define DBG_ENABLE
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* it will force output color log when RT_DEBUG_COLOR macro is defined */
							 | 
						||
| 
								 | 
							
								#if defined(RT_DEBUG_COLOR) && !defined(DBG_COLOR)
							 | 
						||
| 
								 | 
							
								#define DBG_COLOR
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(RT_USING_ULOG)
							 | 
						||
| 
								 | 
							
								/* using ulog compatible with rtdbg  */
							 | 
						||
| 
								 | 
							
								#include <ulog.h>
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* DEBUG level */
							 | 
						||
| 
								 | 
							
								#define DBG_ERROR           0
							 | 
						||
| 
								 | 
							
								#define DBG_WARNING         1
							 | 
						||
| 
								 | 
							
								#define DBG_INFO            2
							 | 
						||
| 
								 | 
							
								#define DBG_LOG             3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef DBG_TAG
							 | 
						||
| 
								 | 
							
								#ifndef DBG_SECTION_NAME
							 | 
						||
| 
								 | 
							
								#define DBG_SECTION_NAME    DBG_TAG
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								/* compatible with old version */
							 | 
						||
| 
								 | 
							
								#ifndef DBG_SECTION_NAME
							 | 
						||
| 
								 | 
							
								#define DBG_SECTION_NAME    "DBG"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif /* DBG_TAG */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef DBG_ENABLE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef DBG_LVL
							 | 
						||
| 
								 | 
							
								#ifndef DBG_LEVEL
							 | 
						||
| 
								 | 
							
								#define DBG_LEVEL         DBG_LVL
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								/* compatible with old version */
							 | 
						||
| 
								 | 
							
								#ifndef DBG_LEVEL
							 | 
						||
| 
								 | 
							
								#define DBG_LEVEL         DBG_WARNING
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif /* DBG_LVL */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * The color for terminal (foreground)
							 | 
						||
| 
								 | 
							
								 * BLACK    30
							 | 
						||
| 
								 | 
							
								 * RED      31
							 | 
						||
| 
								 | 
							
								 * GREEN    32
							 | 
						||
| 
								 | 
							
								 * YELLOW   33
							 | 
						||
| 
								 | 
							
								 * BLUE     34
							 | 
						||
| 
								 | 
							
								 * PURPLE   35
							 | 
						||
| 
								 | 
							
								 * CYAN     36
							 | 
						||
| 
								 | 
							
								 * WHITE    37
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifdef DBG_COLOR
							 | 
						||
| 
								 | 
							
								#define _DBG_COLOR(n)        rt_kprintf("\033["#n"m")
							 | 
						||
| 
								 | 
							
								#define _DBG_LOG_HDR(lvl_name, color_n)                    \
							 | 
						||
| 
								 | 
							
								    rt_kprintf("\033["#color_n"m[" lvl_name "/" DBG_SECTION_NAME "] ")
							 | 
						||
| 
								 | 
							
								#define _DBG_LOG_X_END                                     \
							 | 
						||
| 
								 | 
							
								    rt_kprintf("\033[0m\n")
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _DBG_COLOR(n)
							 | 
						||
| 
								 | 
							
								#define _DBG_LOG_HDR(lvl_name, color_n)                    \
							 | 
						||
| 
								 | 
							
								    rt_kprintf("[" lvl_name "/" DBG_SECTION_NAME "] ")
							 | 
						||
| 
								 | 
							
								#define _DBG_LOG_X_END                                     \
							 | 
						||
| 
								 | 
							
								    rt_kprintf("\n")
							 | 
						||
| 
								 | 
							
								#endif /* DBG_COLOR */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * static debug routine
							 | 
						||
| 
								 | 
							
								 * NOTE: This is a NOT RECOMMENDED API. Please using LOG_X API.
							 | 
						||
| 
								 | 
							
								 *       It will be DISCARDED later. Because it will take up more resources.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define dbg_log(level, fmt, ...)                            \
							 | 
						||
| 
								 | 
							
								    if ((level) <= DBG_LEVEL)                               \
							 | 
						||
| 
								 | 
							
								    {                                                       \
							 | 
						||
| 
								 | 
							
								        switch(level)                                       \
							 | 
						||
| 
								 | 
							
								        {                                                   \
							 | 
						||
| 
								 | 
							
								            case DBG_ERROR:   _DBG_LOG_HDR("E", 31); break; \
							 | 
						||
| 
								 | 
							
								            case DBG_WARNING: _DBG_LOG_HDR("W", 33); break; \
							 | 
						||
| 
								 | 
							
								            case DBG_INFO:    _DBG_LOG_HDR("I", 32); break; \
							 | 
						||
| 
								 | 
							
								            case DBG_LOG:     _DBG_LOG_HDR("D", 0); break;  \
							 | 
						||
| 
								 | 
							
								            default: break;                                 \
							 | 
						||
| 
								 | 
							
								        }                                                   \
							 | 
						||
| 
								 | 
							
								        rt_kprintf(fmt, ##__VA_ARGS__);                     \
							 | 
						||
| 
								 | 
							
								        _DBG_COLOR(0);                                      \
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define dbg_here                                            \
							 | 
						||
| 
								 | 
							
								    if ((DBG_LEVEL) <= DBG_LOG){                            \
							 | 
						||
| 
								 | 
							
								        rt_kprintf(DBG_SECTION_NAME " Here %s:%d\n",        \
							 | 
						||
| 
								 | 
							
								            __FUNCTION__, __LINE__);                        \
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define dbg_log_line(lvl, color_n, fmt, ...)                \
							 | 
						||
| 
								 | 
							
								    do                                                      \
							 | 
						||
| 
								 | 
							
								    {                                                       \
							 | 
						||
| 
								 | 
							
								        _DBG_LOG_HDR(lvl, color_n);                         \
							 | 
						||
| 
								 | 
							
								        rt_kprintf(fmt, ##__VA_ARGS__);                     \
							 | 
						||
| 
								 | 
							
								        _DBG_LOG_X_END;                                     \
							 | 
						||
| 
								 | 
							
								    }                                                       \
							 | 
						||
| 
								 | 
							
								    while (0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define dbg_raw(...)         rt_kprintf(__VA_ARGS__);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define dbg_log(level, fmt, ...)
							 | 
						||
| 
								 | 
							
								#define dbg_here
							 | 
						||
| 
								 | 
							
								#define dbg_enter
							 | 
						||
| 
								 | 
							
								#define dbg_exit
							 | 
						||
| 
								 | 
							
								#define dbg_log_line(lvl, color_n, fmt, ...)
							 | 
						||
| 
								 | 
							
								#define dbg_raw(...)
							 | 
						||
| 
								 | 
							
								#endif /* DBG_ENABLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (DBG_LEVEL >= DBG_LOG)
							 | 
						||
| 
								 | 
							
								#define LOG_D(fmt, ...)      dbg_log_line("D", 0, fmt, ##__VA_ARGS__)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define LOG_D(...)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (DBG_LEVEL >= DBG_INFO)
							 | 
						||
| 
								 | 
							
								#define LOG_I(fmt, ...)      dbg_log_line("I", 32, fmt, ##__VA_ARGS__)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define LOG_I(...)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (DBG_LEVEL >= DBG_WARNING)
							 | 
						||
| 
								 | 
							
								#define LOG_W(fmt, ...)      dbg_log_line("W", 33, fmt, ##__VA_ARGS__)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define LOG_W(...)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (DBG_LEVEL >= DBG_ERROR)
							 | 
						||
| 
								 | 
							
								#define LOG_E(fmt, ...)      dbg_log_line("E", 31, fmt, ##__VA_ARGS__)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define LOG_E(...)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define LOG_RAW(...)         dbg_raw(__VA_ARGS__)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* defined(RT_USING_ULOG) && define(DBG_ENABLE) */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* RT_DBG_H__ */
							 |