xref: /nrf52832-nimble/rt-thread/include/rtdbg.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2016-11-12     Bernard      The first version
9*10465441SEvalZero  * 2018-05-25     armink       Add simple API, such as LOG_D, LOG_E
10*10465441SEvalZero  */
11*10465441SEvalZero 
12*10465441SEvalZero /*
13*10465441SEvalZero  * The macro definitions for debug
14*10465441SEvalZero  *
15*10465441SEvalZero  * These macros are defined in static. If you want to use debug macro, you can
16*10465441SEvalZero  * use as following code:
17*10465441SEvalZero  *
18*10465441SEvalZero  * In your C/C++ file, enable/disable DEBUG_ENABLE macro, and then include this
19*10465441SEvalZero  * header file.
20*10465441SEvalZero  *
21*10465441SEvalZero  * #define DBG_SECTION_NAME    "MOD"
22*10465441SEvalZero  * #define DBG_ENABLE          // enable debug macro
23*10465441SEvalZero  * #define DBG_LEVEL           DBG_INFO
24*10465441SEvalZero  * #include <rtdbg.h>          // must after of DEBUG_ENABLE or some other options
25*10465441SEvalZero  *
26*10465441SEvalZero  * Then in your C/C++ file, you can use LOG_X macro to print out logs:
27*10465441SEvalZero  * LOG_D("this is a debug log!");
28*10465441SEvalZero  * LOG_E("this is a error log!");
29*10465441SEvalZero  *
30*10465441SEvalZero  * If you want to use different color for different kinds log, you can
31*10465441SEvalZero  * #define DBG_COLOR
32*10465441SEvalZero  */
33*10465441SEvalZero 
34*10465441SEvalZero #ifndef RT_DBG_H__
35*10465441SEvalZero #define RT_DBG_H__
36*10465441SEvalZero 
37*10465441SEvalZero #include <rtconfig.h>
38*10465441SEvalZero 
39*10465441SEvalZero #if defined(RT_USING_ULOG) && defined(DBG_ENABLE)
40*10465441SEvalZero /* using ulog compatible with rtdbg  */
41*10465441SEvalZero #include <ulog.h>
42*10465441SEvalZero #else
43*10465441SEvalZero 
44*10465441SEvalZero /* DEBUG level */
45*10465441SEvalZero #define DBG_ERROR           0
46*10465441SEvalZero #define DBG_WARNING         1
47*10465441SEvalZero #define DBG_INFO            2
48*10465441SEvalZero #define DBG_LOG             3
49*10465441SEvalZero 
50*10465441SEvalZero #ifndef DBG_SECTION_NAME
51*10465441SEvalZero #define DBG_SECTION_NAME    "DBG"
52*10465441SEvalZero #endif
53*10465441SEvalZero 
54*10465441SEvalZero #ifdef DBG_ENABLE
55*10465441SEvalZero 
56*10465441SEvalZero #ifndef DBG_LEVEL
57*10465441SEvalZero #define DBG_LEVEL         DBG_WARNING
58*10465441SEvalZero #endif
59*10465441SEvalZero 
60*10465441SEvalZero /*
61*10465441SEvalZero  * The color for terminal (foreground)
62*10465441SEvalZero  * BLACK    30
63*10465441SEvalZero  * RED      31
64*10465441SEvalZero  * GREEN    32
65*10465441SEvalZero  * YELLOW   33
66*10465441SEvalZero  * BLUE     34
67*10465441SEvalZero  * PURPLE   35
68*10465441SEvalZero  * CYAN     36
69*10465441SEvalZero  * WHITE    37
70*10465441SEvalZero  */
71*10465441SEvalZero #ifdef DBG_COLOR
72*10465441SEvalZero #define _DBG_COLOR(n)        rt_kprintf("\033["#n"m")
73*10465441SEvalZero #define _DBG_LOG_HDR(lvl_name, color_n)                    \
74*10465441SEvalZero     rt_kprintf("\033["#color_n"m["lvl_name"/"DBG_SECTION_NAME"] ")
75*10465441SEvalZero #define _DBG_LOG_X_END                                     \
76*10465441SEvalZero     rt_kprintf("\033[0m\n")
77*10465441SEvalZero #else
78*10465441SEvalZero #define _DBG_COLOR(n)
79*10465441SEvalZero #define _DBG_LOG_HDR(lvl_name, color_n)                    \
80*10465441SEvalZero     rt_kprintf("["lvl_name"/"DBG_SECTION_NAME"] ")
81*10465441SEvalZero #define _DBG_LOG_X_END                                     \
82*10465441SEvalZero     rt_kprintf("\n")
83*10465441SEvalZero #endif /* DBG_COLOR */
84*10465441SEvalZero 
85*10465441SEvalZero /*
86*10465441SEvalZero  * static debug routine
87*10465441SEvalZero  * NOTE: This is a NOT RECOMMENDED API. Please using LOG_X API.
88*10465441SEvalZero  *       It will be DISCARDED later. Because it will take up more resources.
89*10465441SEvalZero  */
90*10465441SEvalZero #define dbg_log(level, fmt, ...)                            \
91*10465441SEvalZero     if ((level) <= DBG_LEVEL)                               \
92*10465441SEvalZero     {                                                       \
93*10465441SEvalZero         switch(level)                                       \
94*10465441SEvalZero         {                                                   \
95*10465441SEvalZero             case DBG_ERROR:   _DBG_LOG_HDR("E", 31); break; \
96*10465441SEvalZero             case DBG_WARNING: _DBG_LOG_HDR("W", 33); break; \
97*10465441SEvalZero             case DBG_INFO:    _DBG_LOG_HDR("I", 32); break; \
98*10465441SEvalZero             case DBG_LOG:     _DBG_LOG_HDR("D", 0); break;  \
99*10465441SEvalZero             default: break;                                 \
100*10465441SEvalZero         }                                                   \
101*10465441SEvalZero         rt_kprintf(fmt, ##__VA_ARGS__);                     \
102*10465441SEvalZero         _DBG_COLOR(0);                                      \
103*10465441SEvalZero     }
104*10465441SEvalZero 
105*10465441SEvalZero #define dbg_here                                            \
106*10465441SEvalZero     if ((DBG_LEVEL) <= DBG_LOG){                            \
107*10465441SEvalZero         rt_kprintf(DBG_SECTION_NAME " Here %s:%d\n",        \
108*10465441SEvalZero             __FUNCTION__, __LINE__);                        \
109*10465441SEvalZero     }
110*10465441SEvalZero 
111*10465441SEvalZero #define dbg_enter                                           \
112*10465441SEvalZero     if ((DBG_LEVEL) <= DBG_LOG){                            \
113*10465441SEvalZero         _DBG_COLOR(32);                                     \
114*10465441SEvalZero         rt_kprintf(DBG_SECTION_NAME " Enter %s\n",          \
115*10465441SEvalZero             __FUNCTION__);                                  \
116*10465441SEvalZero         _DBG_COLOR(0);                                      \
117*10465441SEvalZero     }
118*10465441SEvalZero 
119*10465441SEvalZero #define dbg_exit                                            \
120*10465441SEvalZero     if ((DBG_LEVEL) <= DBG_LOG){                            \
121*10465441SEvalZero         _DBG_COLOR(32);                                     \
122*10465441SEvalZero         rt_kprintf(DBG_SECTION_NAME " Exit  %s:%d\n",       \
123*10465441SEvalZero             __FUNCTION__);                                  \
124*10465441SEvalZero         _DBG_COLOR(0);                                      \
125*10465441SEvalZero     }
126*10465441SEvalZero 
127*10465441SEvalZero 
128*10465441SEvalZero #define dbg_log_line(lvl, color_n, fmt, ...)                \
129*10465441SEvalZero     do                                                      \
130*10465441SEvalZero     {                                                       \
131*10465441SEvalZero         _DBG_LOG_HDR(lvl, color_n);                         \
132*10465441SEvalZero         rt_kprintf(fmt, ##__VA_ARGS__);                     \
133*10465441SEvalZero         _DBG_LOG_X_END;                                     \
134*10465441SEvalZero     }                                                       \
135*10465441SEvalZero     while (0)
136*10465441SEvalZero 
137*10465441SEvalZero #define dbg_raw(...)         rt_kprintf(__VA_ARGS__);
138*10465441SEvalZero 
139*10465441SEvalZero #else
140*10465441SEvalZero #define dbg_log(level, fmt, ...)
141*10465441SEvalZero #define dbg_here
142*10465441SEvalZero #define dbg_enter
143*10465441SEvalZero #define dbg_exit
144*10465441SEvalZero #define dbg_log_line(lvl, color_n, fmt, ...)
145*10465441SEvalZero #define dbg_raw(...)
146*10465441SEvalZero #endif /* DBG_ENABLE */
147*10465441SEvalZero 
148*10465441SEvalZero #if (DBG_LEVEL >= DBG_LOG)
149*10465441SEvalZero #define LOG_D(fmt, ...)      dbg_log_line("D", 0, fmt, ##__VA_ARGS__)
150*10465441SEvalZero #else
151*10465441SEvalZero #define LOG_D(...)
152*10465441SEvalZero #endif
153*10465441SEvalZero 
154*10465441SEvalZero #if (DBG_LEVEL >= DBG_INFO)
155*10465441SEvalZero #define LOG_I(fmt, ...)      dbg_log_line("I", 32, fmt, ##__VA_ARGS__)
156*10465441SEvalZero #else
157*10465441SEvalZero #define LOG_I(...)
158*10465441SEvalZero #endif
159*10465441SEvalZero 
160*10465441SEvalZero #if (DBG_LEVEL >= DBG_WARNING)
161*10465441SEvalZero #define LOG_W(fmt, ...)      dbg_log_line("W", 33, fmt, ##__VA_ARGS__)
162*10465441SEvalZero #else
163*10465441SEvalZero #define LOG_W(...)
164*10465441SEvalZero #endif
165*10465441SEvalZero 
166*10465441SEvalZero #if (DBG_LEVEL >= DBG_ERROR)
167*10465441SEvalZero #define LOG_E(fmt, ...)      dbg_log_line("E", 31, fmt, ##__VA_ARGS__)
168*10465441SEvalZero #else
169*10465441SEvalZero #define LOG_E(...)
170*10465441SEvalZero #endif
171*10465441SEvalZero 
172*10465441SEvalZero #define LOG_RAW(...)         dbg_raw(__VA_ARGS__)
173*10465441SEvalZero 
174*10465441SEvalZero #endif /* defined(RT_USING_ULOG) && define(DBG_ENABLE) */
175*10465441SEvalZero 
176*10465441SEvalZero #endif /* RT_DBG_H__ */
177