一、简介
前两篇我们介绍了LVGL的基本操作和定时器,今天来说一下日志系统。
不管是什么开发,日志系统都很重要,没有日志系统就不知道系统运行状态。LVGL也是一样的。
二、日志
惯例,先看demo。
cpp
static void log_cb(lv_log_level_t level, const char * buf)
{
fprintf(stderr, "%s\n", buf);
fflush(stderr);
}
int main(void)
{
/* 初始化 LVGL 核心库 */
lv_init();
/* ---- 创建显示设备 ---- */
/* lv_sdl_window_create() 内部会调用 SDL_Init 初始化 SDL,
* 创建窗口,注册刷新定时器,并设置 lv_tick */
lv_display_t * display = lv_sdl_window_create(500, 500);
if(display == NULL) {
return 1;
}
lv_log_register_print_cb(log_cb);
LV_LOG_INFO("hello");
/* 在屏幕中央显示一行文字 */
lv_obj_t * counter_label = lv_label_create(lv_screen_active());
lv_label_set_text(counter_label, "Hello, LVGL");
lv_obj_center(counter_label); /* 居中对齐 */
while(1) {
lv_timer_handler();
lv_delay_ms(5);
}
return 0;
}

lv_log_register_print_cb
cpp
void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb);
注册日志输出回调。
print_cb:日志回调
注册之后,日志系统会先把日志回调到注册的函数中,然后根据用户自定义的方式进行日志输出。
LVGL默认是不知道要把日志输出在哪里的,如果不指定,默认是不打印日志的。因为我们使用的是模拟器,所以我们要把日志指定到终端输出窗口。
后面使用MCU的时候,这里就可以把日志系统指定到uart或者rtt。
cpp
static void log_cb(lv_log_level_t level, const char * buf)
{
fprintf(stderr, "%s\n", buf);
fflush(stderr);
}
lv_log_register_print_cb(log_cb);
日志API
注册之后,我们就可以调用日志接口进行输出了。LVGL默认有多种日志接口,在lv_log.h中,有兴趣的可以自行查看。

cpp
#define LV_LOG_TRACE(...)
#define LV_LOG_INFO(...)
#define LV_LOG_WARN(...)
#define LV_LOG_WARN_ONCE(...)
#define LV_LOG_ERROR(...)
#define LV_LOG_USER(...)
#define LV_LOG(...)
LVGL采用的也是常规的日志系统,对日志分等级。这是很常见的,这里不过多介绍。这里演示一下常用的几个等级。
cpp
LV_LOG_INFO("hello");
LV_LOG_WARN("hello");
LV_LOG_ERROR("hello");

可以看到,日志系统打印了等级信息、时间戳,两条日志的时间差、日志内容、调用该日志的文件名、行号。
LVGL的日志系统打印的很详细,大家在后续的使用中也会频繁使用到日志系统的。