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