Skip to content

Commit 8e8e57a

Browse files
committed
Merge branch 'develop' into CMSIS-Pack
2 parents de77e21 + 11866b6 commit 8e8e57a

File tree

2 files changed

+59
-46
lines changed

2 files changed

+59
-46
lines changed

core/fc_log.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,6 @@ fc_weak void fc_log_fprintf(fc_log_t *log, fc_log_level_t level, const char *fmt
125125
fc_assert(log != NULL);
126126
fc_assert(log->alloc != NULL);
127127

128-
if (log->merge)
129-
{
130-
log->last_level = level; // 记录临时等级
131-
}
132-
133128
if (log->level >= level)
134129
{
135130
FC_FILE temp_f = {0};
@@ -254,11 +249,6 @@ int fc_log_fwrite(fc_log_t *log, fc_log_level_t level, const void *buff, int len
254249
{
255250
fc_assert(log != NULL);
256251

257-
if (log->merge)
258-
{
259-
log->last_level = level; // 记录临时等级
260-
}
261-
262252
if (log->level >= level)
263253
{
264254
FC_FILE temp_f = {0};
@@ -395,12 +385,12 @@ fc_log_t default_log = {
395385
.alloc = log_alloc_default,
396386
.file_user = {0}, // 临时对象中才会用到这个内存,其他都不用
397387
.f = {0},
398-
.level = FC_LOG_ALL,
399-
.last_level = FC_LOG_NONE, // 不限制
400-
.merge = false, // 默认不需要推迟输出
388+
.level = FC_LOG_LEVEL_ALL,
389+
.last_level = FC_LOG_LEVEL_NONE, // 不限制,使用write的时候会继承这个等级
390+
.merge = false, // 默认不需要推迟输出
401391
};
402392

403-
fc_log_t const *scope_log_ptr = NULL; // 设置为空指针!!!
393+
// fc_log_t const *scope_log_ptr = NULL; // 设置为空指针!!!
404394

405395
//+********************************* 使用fc_pool进行管理 **********************************/
406396

core/fc_log.h

Lines changed: 55 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,38 @@
2323
#include "fc_pool.h"
2424
#include "fc_stdio.h"
2525

26-
#ifndef FC_LOG_NOPREFIX_API
27-
#define FC_LOG_NOPREFIX_API 1 /**< 提供不带(fc_)前缀的log宏API */
28-
#endif
29-
3026
#ifndef FC_LOG_ENABLE
3127
#define FC_LOG_ENABLE 1 /**< 使能log */
3228
#endif
3329

30+
// clang-format off
31+
32+
#undef FC_LOG_LEVEL_NONE
33+
#undef FC_LOG_LEVEL_ERROR
34+
#undef FC_LOG_LEVEL_WARNING
35+
#undef FC_LOG_LEVEL_INFO
36+
#undef FC_LOG_LEVEL_DEBUG
37+
#undef FC_LOG_LEVEL_VERBOSE
38+
#undef FC_LOG_LEVEL_ALL
39+
40+
#define FC_LOG_LEVEL_NONE 0 /**< 屏蔽所有/无视等级 */
41+
#define FC_LOG_LEVEL_ERROR 1 /**< 错误 */
42+
#define FC_LOG_LEVEL_WARNING 2 /**< 警告 */
43+
#define FC_LOG_LEVEL_INFO 3 /**< 消息 */
44+
#define FC_LOG_LEVEL_DEBUG 4 /**< 调试 */
45+
#define FC_LOG_LEVEL_VERBOSE 5 /**< 冗余 */
46+
#define FC_LOG_LEVEL_ALL 6 /**< 所有日志 */
47+
48+
// clang-format on
49+
50+
#ifndef FC_LOG_FILE_LEVEL
51+
#define FC_LOG_FILE_LEVEL FC_LOG_LEVEL_ALL /**< 所在文件允许输出log等级 */
52+
#endif
53+
54+
#ifndef FC_LOG_NOPREFIX_API
55+
#define FC_LOG_NOPREFIX_API 1 /**< 提供不带(fc_)前缀的log宏API */
56+
#endif
57+
3458
#ifndef FC_LOG_LINE_SIZE
3559
#define FC_LOG_LINE_SIZE 128 /**< log行缓冲大小 */
3660
#endif
@@ -129,17 +153,6 @@
129153
#define FC_VERBOSE_TEXT FC_LOG_VERBOSE_HEAD FC_LOG_PREFIX_FMT FC_LOG_FMT_END
130154
#endif
131155

132-
typedef enum
133-
{
134-
FC_LOG_NONE = 0, /**< 屏蔽所有/无视等级 */
135-
FC_LOG_ERROR = 1, /**< 错误 */
136-
FC_LOG_WRANING = 2, /**< 警告 */
137-
FC_LOG_INFO = 3, /**< 消息 */
138-
FC_LOG_DEBUG = 4, /**< 调试 */
139-
FC_LOG_VERBOSE = 5, /**< 冗余 */
140-
FC_LOG_ALL = 6, /**< 所有日志 */
141-
} fc_log_level_t;
142-
143156
// clang-format on
144157

145158
// 存在多次获取,但是释放仅释放一次
@@ -151,6 +164,7 @@ typedef enum
151164
} fc_log_alloc_type_t;
152165

153166
//+********************************* 面向对象 **********************************/
167+
typedef uint8_t fc_log_level_t; // log等级类型
154168
typedef struct _fc_log_t fc_log_t;
155169
typedef struct _fc_log_mem_t fc_log_mem_t;
156170
typedef struct _fc_log_file_user_t fc_log_file_user_t; // 传递给write函数的用户数据
@@ -230,7 +244,7 @@ extern fc_log_t default_log; // 默认log对象
230244
#define FC_LOG_OBJ (default_log)
231245
#endif
232246

233-
extern fc_log_t const *scope_log_ptr; // 设置为空指针!!!
247+
static fc_log_t const *const scope_log_ptr = NULL; // 强制空指针!!!,强烈建议O1及以上优化可以省非常多空间
234248

235249
#ifndef FC_LOG_LOSE_HOOK
236250
/* #define FC_LOG_LOSE_HOOK(exp, log, len) (void)(0) */
@@ -303,36 +317,43 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
303317
#define fc_log_merge_0() \
304318
fc_log_merge_1({ (void)0; })
305319

320+
// 根据参数展开为0/1/2个参数的版本,超过2将报错,可以用复合语句{exp1;exp2...expN}算一个参数
306321
#define fc_log_merge(...) \
307322
FC_CONNECT2(fc_log_merge_, __PLOOC_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
308323

309-
#define fc_log_format(text, _level, fmt, ...) \
310-
do \
311-
{ \
312-
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
324+
#define fc_log_format(text, _level, fmt, ...) \
325+
do \
326+
{ \
327+
if (_level <= FC_LOG_FILE_LEVEL) \
328+
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
329+
if (scope_log_ptr) \
330+
{ \
331+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
332+
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333+
} \
313334
} while (0)
314335

315-
//+********************************* 期望使用 **********************************/
336+
//+********************************* 期望使用 **********************************/
316337
#define fc_log_error(fmt, ...) \
317-
fc_log_format(FC_ERROR_TEXT, FC_LOG_ERROR, fmt, ##__VA_ARGS__)
338+
fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
318339

319340
#define fc_log_warning(fmt, ...) \
320-
fc_log_format(FC_WARNING_TEXT, FC_LOG_WRANING, fmt, ##__VA_ARGS__)
341+
fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
321342

322343
#define fc_log_info(fmt, ...) \
323-
fc_log_format(FC_INFO_TEXT, FC_LOG_INFO, fmt, ##__VA_ARGS__)
344+
fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
324345

325346
#define fc_log_debug(fmt, ...) \
326-
fc_log_format(FC_DEBUG_TEXT, FC_LOG_DEBUG, fmt, ##__VA_ARGS__)
347+
fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
327348

328349
#define fc_log_verbose(fmt, ...) \
329-
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_VERBOSE, fmt, ##__VA_ARGS__)
350+
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
330351

331352
#define fc_log_printf(fmt, ...) \
332-
fc_log_format("", FC_LOG_NONE, fmt, ##__VA_ARGS__)
353+
fc_log_format("", (scope_log_ptr ? scope_log_ptr->last_level : FC_LOG_LEVEL_NONE), fmt, ##__VA_ARGS__);
333354

334355
#define fc_log_printf_lv(_level, fmt, ...) \
335-
fc_log_format("", _level, fmt, ##__VA_ARGS__)
356+
fc_log_format("", _level, fmt, ##__VA_ARGS__);
336357

337358
#define fc_log_assert(expr, ...) \
338359
if (!(expr)) \
@@ -352,10 +373,11 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
352373
fc_log_fwrite(SAFE_NAME(log_temp_ptr), SAFE_NAME(log_temp_ptr)->last_level, buf, len); \
353374
} while (0)
354375

355-
#define fc_log_write_lv(_level, buf, len) \
356-
do \
357-
{ \
358-
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
376+
#define fc_log_write_lv(_level, buf, len) \
377+
do \
378+
{ \
379+
if (_level <= FC_LOG_FILE_LEVEL) \
380+
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
359381
} while (0)
360382

361383
#else
@@ -420,3 +442,4 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
420442

421443
// 除了 FC_LOG_FMT_END 定义结尾外,还可以使用如下宏在每句log后面添加特定内容如换行
422444
// #define user_printf(fmt, ...) fc_log_printf(fmt "\r\n", ##__VA_ARGS__)
445+
// #define info_printf(fmt, ...) fc_log_info(fmt "\r\n", ##__VA_ARGS__)

0 commit comments

Comments
 (0)