1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

feat(refr): implement the monitor component (#4121)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
Signed-off-by: FASTSHIFT <vifextech@foxmail.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
This commit is contained in:
_VIFEXTech 2023-05-01 15:56:53 +08:00 committed by GitHub
parent 2f292c500b
commit 9b5f7d91af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 333 additions and 192 deletions

View File

@ -371,6 +371,7 @@ menu "LVGL configuration"
menu "Others" menu "Others"
config LV_USE_PERF_MONITOR config LV_USE_PERF_MONITOR
bool "Show CPU usage and FPS count." bool "Show CPU usage and FPS count."
depends on LV_USE_MONITOR
choice choice
prompt "Performance monitor position." prompt "Performance monitor position."
@ -400,6 +401,7 @@ menu "LVGL configuration"
config LV_USE_MEM_MONITOR config LV_USE_MEM_MONITOR
bool "Show the used memory and the memory fragmentation." bool "Show the used memory and the memory fragmentation."
depends on !LV_MEM_CUSTOM depends on !LV_MEM_CUSTOM
depends on LV_USE_MONITOR
choice choice
prompt "Memory monitor position." prompt "Memory monitor position."
@ -994,6 +996,10 @@ menu "LVGL configuration"
bool "Enable API to take snapshot" bool "Enable API to take snapshot"
default y if !LV_CONF_MINIMAL default y if !LV_CONF_MINIMAL
config LV_USE_MONITOR
bool "Enable Monitor component"
default n
config LV_USE_MONKEY config LV_USE_MONKEY
bool "Enable Monkey test" bool "Enable Monkey test"
default n default n

View File

@ -278,14 +278,17 @@
* Others * Others
*-----------*/ *-----------*/
/*1: Show CPU usage and FPS count*/ /*1: Show CPU usage and FPS count
* Requires `LV_USE_MONITOR = 1`*/
#define LV_USE_PERF_MONITOR 0 #define LV_USE_PERF_MONITOR 0
#if LV_USE_PERF_MONITOR #if LV_USE_PERF_MONITOR
#define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
#define LV_USE_PERF_MONITOR_LOG_MDOE 0
#endif #endif
/*1: Show the used memory and the memory fragmentation /*1: Show the used memory and the memory fragmentation
* Requires `LV_USE_BUILTIN_MALLOC = 1`*/ * Requires `LV_USE_BUILTIN_MALLOC = 1`
* Requires `LV_USE_MONITOR = 1`*/
#define LV_USE_MEM_MONITOR 0 #define LV_USE_MEM_MONITOR 0
#if LV_USE_MEM_MONITOR #if LV_USE_MEM_MONITOR
#define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
@ -692,6 +695,9 @@
/*1: Enable API to take snapshot for object*/ /*1: Enable API to take snapshot for object*/
#define LV_USE_SNAPSHOT 0 #define LV_USE_SNAPSHOT 0
/*1: Enable Monitor component*/
#define LV_USE_MONITOR 1
/*1: Enable Monkey test*/ /*1: Enable Monkey test*/
#define LV_USE_MONKEY 0 #define LV_USE_MONKEY 0

1
lvgl.h
View File

@ -80,6 +80,7 @@ extern "C" {
#include "src/others/gridnav/lv_gridnav.h" #include "src/others/gridnav/lv_gridnav.h"
#include "src/others/fragment/lv_fragment.h" #include "src/others/fragment/lv_fragment.h"
#include "src/others/imgfont/lv_imgfont.h" #include "src/others/imgfont/lv_imgfont.h"
#include "src/others/monitor/lv_monitor.h"
#include "src/others/msg/lv_msg.h" #include "src/others/msg/lv_msg.h"
#include "src/others/ime/lv_ime_pinyin.h" #include "src/others/ime/lv_ime_pinyin.h"
#include "src/others/file_explorer/lv_file_explorer.h" #include "src/others/file_explorer/lv_file_explorer.h"

View File

@ -18,10 +18,7 @@
#include "../draw/lv_draw.h" #include "../draw/lv_draw.h"
#include "../font/lv_font_fmt_txt.h" #include "../font/lv_font_fmt_txt.h"
#include "../others/snapshot/lv_snapshot.h" #include "../others/snapshot/lv_snapshot.h"
#include "../others/monitor/lv_monitor.h"
#if LV_USE_PERF_MONITOR || LV_USE_MEM_MONITOR
#include "../widgets/label/lv_label.h"
#endif
/********************* /*********************
* DEFINES * DEFINES
@ -30,23 +27,6 @@
/********************** /**********************
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
typedef struct {
uint32_t perf_last_time;
uint32_t elaps_sum;
uint32_t frame_cnt;
uint32_t fps_sum_cnt;
uint32_t fps_sum_all;
#if LV_USE_LABEL
lv_obj_t * perf_label;
#endif
} perf_monitor_t;
typedef struct {
uint32_t mem_last_time;
#if LV_USE_LABEL
lv_obj_t * mem_label;
#endif
} mem_monitor_t;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
@ -62,27 +42,12 @@ static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area
static void draw_buf_flush(lv_disp_t * disp); static void draw_buf_flush(lv_disp_t * disp);
static void call_flush_cb(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p); static void call_flush_cb(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p);
#if LV_USE_PERF_MONITOR
static void perf_monitor_init(perf_monitor_t * perf_monitor);
#endif
#if LV_USE_MEM_MONITOR
static void mem_monitor_init(mem_monitor_t * mem_monitor);
#endif
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
static uint32_t px_num;
static lv_disp_t * disp_refr; /*Display being refreshed*/ static lv_disp_t * disp_refr; /*Display being refreshed*/
#if LV_USE_PERF_MONITOR
static perf_monitor_t perf_monitor;
#endif
#if LV_USE_MEM_MONITOR
static mem_monitor_t mem_monitor;
#endif
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/
@ -101,11 +66,8 @@ static lv_disp_t * disp_refr; /*Display being refreshed*/
*/ */
void _lv_refr_init(void) void _lv_refr_init(void)
{ {
#if LV_USE_PERF_MONITOR #if LV_USE_MONITOR
perf_monitor_init(&perf_monitor); _lv_monitor_builtin_init();
#endif
#if LV_USE_MEM_MONITOR
mem_monitor_init(&mem_monitor);
#endif #endif
} }
@ -311,99 +273,8 @@ void _lv_disp_refr_timer(lv_timer_t * tmr)
lv_disp_send_event(disp_refr, LV_EVENT_REFR_START, NULL); lv_disp_send_event(disp_refr, LV_EVENT_REFR_START, NULL);
#if LV_USE_PERF_MONITOR && LV_USE_LABEL
volatile uint32_t elaps = lv_tick_elaps(disp_refr->last_render_start_time);
#endif
disp_refr->last_render_start_time = start; disp_refr->last_render_start_time = start;
#if LV_USE_PERF_MONITOR && LV_USE_LABEL
lv_obj_t * perf_label = perf_monitor.perf_label;
if(perf_label == NULL) {
perf_label = lv_label_create(lv_layer_sys());
lv_obj_set_style_bg_opa(perf_label, LV_OPA_50, 0);
lv_obj_set_style_bg_color(perf_label, lv_color_black(), 0);
lv_obj_set_style_text_color(perf_label, lv_color_white(), 0);
lv_obj_set_style_pad_top(perf_label, 3, 0);
lv_obj_set_style_pad_bottom(perf_label, 3, 0);
lv_obj_set_style_pad_left(perf_label, 3, 0);
lv_obj_set_style_pad_right(perf_label, 3, 0);
lv_obj_set_style_text_align(perf_label, LV_TEXT_ALIGN_RIGHT, 0);
lv_label_set_text(perf_label, "?");
lv_obj_align(perf_label, LV_USE_PERF_MONITOR_POS, 0, 0);
perf_monitor.perf_label = perf_label;
}
if(lv_tick_elaps(perf_monitor.perf_last_time) < 300) {
if(px_num > 5000) {
perf_monitor.elaps_sum += elaps;
perf_monitor.frame_cnt ++;
}
}
else {
perf_monitor.perf_last_time = lv_tick_get();
uint32_t fps_limit;
uint32_t fps;
if(disp_refr->refr_timer) {
fps_limit = 1000 / disp_refr->refr_timer->period;
}
else {
fps_limit = 1000 / 33;
}
if(perf_monitor.elaps_sum == 0) {
perf_monitor.elaps_sum = 1;
}
if(perf_monitor.frame_cnt == 0) {
fps = fps_limit;
}
else {
fps = (1000 * perf_monitor.frame_cnt) / perf_monitor.elaps_sum;
}
perf_monitor.elaps_sum = 0;
perf_monitor.frame_cnt = 0;
if(fps > fps_limit) {
fps = fps_limit;
}
perf_monitor.fps_sum_all += fps;
perf_monitor.fps_sum_cnt ++;
uint32_t cpu = 100 - lv_timer_get_idle();
lv_label_set_text_fmt(perf_label, "%"LV_PRIu32" FPS\n%"LV_PRIu32"%% CPU", fps, cpu);
}
#endif
#if LV_USE_MEM_MONITOR && LV_USE_BUILTIN_MALLOC && LV_USE_LABEL
lv_obj_t * mem_label = mem_monitor.mem_label;
if(mem_label == NULL) {
mem_label = lv_label_create(lv_layer_sys());
lv_obj_set_style_bg_opa(mem_label, LV_OPA_50, 0);
lv_obj_set_style_bg_color(mem_label, lv_color_black(), 0);
lv_obj_set_style_text_color(mem_label, lv_color_white(), 0);
lv_obj_set_style_pad_top(mem_label, 3, 0);
lv_obj_set_style_pad_bottom(mem_label, 3, 0);
lv_obj_set_style_pad_left(mem_label, 3, 0);
lv_obj_set_style_pad_right(mem_label, 3, 0);
lv_label_set_text(mem_label, "?");
lv_obj_align(mem_label, LV_USE_MEM_MONITOR_POS, 0, 0);
mem_monitor.mem_label = mem_label;
}
if(lv_tick_elaps(mem_monitor.mem_last_time) > 300) {
mem_monitor.mem_last_time = lv_tick_get();
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
uint32_t used_size = mon.total_size - mon.free_size;;
uint32_t used_kb = used_size / 1024;
uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
lv_label_set_text_fmt(mem_label,
"%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n"
"%d%% frag.",
used_kb, used_kb_tenth, mon.used_pct,
mon.frag_pct);
}
#endif
/*Refresh the screen's layout if required*/ /*Refresh the screen's layout if required*/
lv_obj_update_layout(disp_refr->act_scr); lv_obj_update_layout(disp_refr->act_scr);
if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr); if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr);
@ -478,23 +349,6 @@ refr_finish:
REFR_TRACE("finished"); REFR_TRACE("finished");
} }
#if LV_USE_PERF_MONITOR
void lv_refr_reset_fps_counter(void)
{
perf_monitor.fps_sum_all = 0;
perf_monitor.fps_sum_cnt = 0;
}
uint32_t lv_refr_get_fps_avg(void)
{
if(perf_monitor.fps_sum_cnt == 0) {
return 0;
}
return perf_monitor.fps_sum_all / perf_monitor.fps_sum_cnt;
}
#endif
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
@ -541,8 +395,6 @@ static void lv_refr_join_area(void)
*/ */
static void refr_invalid_areas(void) static void refr_invalid_areas(void)
{ {
px_num = 0;
if(disp_refr->inv_p == 0) return; if(disp_refr->inv_p == 0) return;
/*Find the last area which will be drawn*/ /*Find the last area which will be drawn*/
@ -570,7 +422,7 @@ static void refr_invalid_areas(void)
disp_refr->last_part = 0; disp_refr->last_part = 0;
refr_area(&disp_refr->inv_areas[i]); refr_area(&disp_refr->inv_areas[i]);
px_num += lv_area_get_size(&disp_refr->inv_areas[i]); lv_area_get_size(&disp_refr->inv_areas[i]);
} }
} }
@ -1237,25 +1089,3 @@ static void call_flush_cb(lv_disp_t * disp, const lv_area_t * area, lv_color_t *
disp->flush_cb(disp, &offset_area, color_p); disp->flush_cb(disp, &offset_area, color_p);
} }
#if LV_USE_PERF_MONITOR
static void perf_monitor_init(perf_monitor_t * _perf_monitor)
{
LV_ASSERT_NULL(_perf_monitor);
_perf_monitor->elaps_sum = 0;
_perf_monitor->fps_sum_all = 0;
_perf_monitor->fps_sum_cnt = 0;
_perf_monitor->frame_cnt = 0;
_perf_monitor->perf_last_time = 0;
_perf_monitor->perf_label = NULL;
}
#endif
#if LV_USE_MEM_MONITOR
static void mem_monitor_init(mem_monitor_t * _mem_monitor)
{
LV_ASSERT_NULL(_mem_monitor);
_mem_monitor->mem_last_time = 0;
_mem_monitor->mem_label = NULL;
}
#endif

View File

@ -78,19 +78,6 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p);
*/ */
lv_disp_t * _lv_refr_get_disp_refreshing(void); lv_disp_t * _lv_refr_get_disp_refreshing(void);
#if LV_USE_PERF_MONITOR
/**
* Reset FPS counter
*/
void lv_refr_reset_fps_counter(void);
/**
* Get the average FPS
* @return the average FPS
*/
uint32_t lv_refr_get_fps_avg(void);
#endif
/** /**
* Called periodically to handle the refreshing * Called periodically to handle the refreshing
* @param timer pointer to the timer itself * @param timer pointer to the timer itself

View File

@ -856,7 +856,8 @@
* Others * Others
*-----------*/ *-----------*/
/*1: Show CPU usage and FPS count*/ /*1: Show CPU usage and FPS count
* Requires `LV_USE_MONITOR = 1`*/
#ifndef LV_USE_PERF_MONITOR #ifndef LV_USE_PERF_MONITOR
#ifdef CONFIG_LV_USE_PERF_MONITOR #ifdef CONFIG_LV_USE_PERF_MONITOR
#define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR #define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR
@ -872,10 +873,18 @@
#define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
#endif #endif
#endif #endif
#ifndef LV_USE_PERF_MONITOR_LOG_MDOE
#ifdef CONFIG_LV_USE_PERF_MONITOR_LOG_MDOE
#define LV_USE_PERF_MONITOR_LOG_MDOE CONFIG_LV_USE_PERF_MONITOR_LOG_MDOE
#else
#define LV_USE_PERF_MONITOR_LOG_MDOE 0
#endif
#endif
#endif #endif
/*1: Show the used memory and the memory fragmentation /*1: Show the used memory and the memory fragmentation
* Requires `LV_USE_BUILTIN_MALLOC = 1`*/ * Requires `LV_USE_BUILTIN_MALLOC = 1`
* Requires `LV_USE_MONITOR = 1`*/
#ifndef LV_USE_MEM_MONITOR #ifndef LV_USE_MEM_MONITOR
#ifdef CONFIG_LV_USE_MEM_MONITOR #ifdef CONFIG_LV_USE_MEM_MONITOR
#define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR #define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR
@ -2326,6 +2335,19 @@
#endif #endif
#endif #endif
/*1: Enable Monitor component*/
#ifndef LV_USE_MONITOR
#ifdef _LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_MONITOR
#define LV_USE_MONITOR CONFIG_LV_USE_MONITOR
#else
#define LV_USE_MONITOR 0
#endif
#else
#define LV_USE_MONITOR 1
#endif
#endif
/*1: Enable Monkey test*/ /*1: Enable Monkey test*/
#ifndef LV_USE_MONKEY #ifndef LV_USE_MONKEY
#ifdef CONFIG_LV_USE_MONKEY #ifdef CONFIG_LV_USE_MONKEY

View File

@ -0,0 +1,212 @@
/**
* @file lv_monitor.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_monitor.h"
#if LV_USE_MONITOR
#include "../../misc/lv_assert.h"
#include LV_COLOR_EXTERN_INCLUDE
/*********************
* DEFINES
*********************/
#define MY_CLASS &lv_monitor_class
/**********************
* TYPEDEFS
**********************/
typedef struct {
uint32_t elaps_sum;
uint32_t frame_cnt;
lv_disp_t * disp;
} perf_info_t;
/**********************
* STATIC PROTOTYPES
**********************/
static void lv_monitor_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_monitor_event(const lv_obj_class_t * class_p, lv_event_t * e);
static void lv_monitor_timer_cb(lv_timer_t * timer);
static void monitor_async_cb(void * user_data);
#if LV_USE_PERF_MONITOR
static void perf_monitor_init(void);
#endif
#if LV_USE_MEM_MONITOR && LV_USE_BUILTIN_MALLOC
static void mem_monitor_init(void);
#endif
/**********************
* STATIC VARIABLES
**********************/
const lv_obj_class_t lv_monitor_class = {
.base_class = &lv_label_class,
.constructor_cb = lv_monitor_constructor,
.width_def = LV_SIZE_CONTENT,
.height_def = LV_SIZE_CONTENT,
.event_cb = lv_monitor_event,
.instance_size = sizeof(lv_monitor_t),
};
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
lv_obj_t * lv_monitor_create(void)
{
LV_LOG_INFO("begin");
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, lv_layer_sys());
lv_obj_class_init_obj(obj);
return obj;
}
void lv_monitor_set_refr_time(lv_obj_t * obj, uint32_t time)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_monitor_t * monitor = (lv_monitor_t *)obj;
lv_timer_set_period(monitor->timer, time);
}
void _lv_monitor_builtin_init(void)
{
lv_async_call(monitor_async_cb, NULL);
}
/**********************
* STATIC FUNCTIONS
**********************/
static void lv_monitor_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
LV_UNUSED(class_p);
lv_monitor_t * monitor = (lv_monitor_t *)obj;
monitor->timer = lv_timer_create(lv_monitor_timer_cb, 1000, obj);
lv_obj_set_style_bg_opa(obj, LV_OPA_50, 0);
lv_obj_set_style_bg_color(obj, lv_color_black(), 0);
lv_obj_set_style_text_color(obj, lv_color_white(), 0);
lv_obj_set_style_pad_top(obj, 3, 0);
lv_obj_set_style_pad_bottom(obj, 3, 0);
lv_obj_set_style_pad_left(obj, 3, 0);
lv_obj_set_style_pad_right(obj, 3, 0);
lv_label_set_text(obj, "?");
}
static void lv_monitor_timer_cb(lv_timer_t * timer)
{
lv_obj_t * obj = lv_timer_get_user_data(timer);
lv_obj_send_event(obj, LV_EVENT_REFRESH, NULL);
}
static void lv_monitor_event(const lv_obj_class_t * class_p, lv_event_t * e)
{
LV_UNUSED(class_p);
lv_obj_event_base(MY_CLASS, e);
}
#if LV_USE_PERF_MONITOR
static void perf_monitor_refr_finish_cb(lv_event_t * e)
{
lv_obj_t * monitor = lv_event_get_user_data(e);
perf_info_t * info = lv_obj_get_user_data(monitor);
info->elaps_sum += lv_tick_elaps(info->disp->last_render_start_time);
info->frame_cnt++;
}
static void perf_monitor_event_cb(lv_event_t * e)
{
lv_obj_t * monitor = lv_event_get_current_target_obj(e);
perf_info_t * info = lv_obj_get_user_data(monitor);
uint32_t cpu = 100 - lv_timer_get_idle();
uint32_t avg_time = info->frame_cnt ? info->elaps_sum / info->frame_cnt : 0;
#if LV_USE_PERF_MONITOR_LOG_MDOE
LV_LOG("Performance: %" LV_PRIu32" FPS / %" LV_PRIu32" ms / %" LV_PRIu32 "%% CPU\n",
info->frame_cnt,
avg_time,
cpu);
#else
lv_label_set_text_fmt(
monitor,
"%" LV_PRIu32" FPS / %" LV_PRIu32" ms\n%" LV_PRIu32 "%% CPU",
info->frame_cnt,
avg_time,
cpu
);
#endif /*LV_USE_PERF_MONITOR_LOG_MDOE*/
info->elaps_sum = 0;
info->frame_cnt = 0;
}
static void perf_monitor_init(void)
{
perf_info_t * info = lv_malloc(sizeof(perf_info_t));
LV_ASSERT_MALLOC(info);
lv_memzero(info, sizeof(perf_info_t));
info->disp = lv_disp_get_default();
lv_obj_t * monitor = lv_monitor_create();
lv_monitor_set_refr_time(monitor, 1000);
lv_obj_align(monitor, LV_USE_PERF_MONITOR_POS, 0, 0);
lv_obj_set_style_text_align(monitor, LV_TEXT_ALIGN_RIGHT, 0);
lv_obj_set_user_data(monitor, info);
lv_obj_add_event(monitor, perf_monitor_event_cb, LV_EVENT_REFRESH, NULL);
lv_disp_add_event(info->disp, perf_monitor_refr_finish_cb, LV_EVENT_REFR_FINISH, monitor);
#if LV_USE_PERF_MONITOR_LOG_MDOE
/*Reduce rendering performance consumption*/
lv_obj_add_flag(monitor, LV_OBJ_FLAG_HIDDEN);
#endif
}
#endif
#if LV_USE_MEM_MONITOR && LV_USE_BUILTIN_MALLOC
static void mem_monitor_event_cb(lv_event_t * e)
{
lv_obj_t * monitor = lv_event_get_current_target_obj(e);
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
uint32_t used_size = mon.total_size - mon.free_size;;
uint32_t used_kb = used_size / 1024;
uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
lv_label_set_text_fmt(monitor,
"%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n"
"%d%% frag.",
used_kb, used_kb_tenth, mon.used_pct,
mon.frag_pct);
}
static void mem_monitor_init(void)
{
lv_obj_t * monitor = lv_monitor_create();
lv_obj_add_event(monitor, mem_monitor_event_cb, LV_EVENT_REFRESH, NULL);
lv_obj_align(monitor, LV_USE_MEM_MONITOR_POS, 0, 0);
lv_monitor_set_refr_time(monitor, 300);
}
#endif
static void monitor_async_cb(void * user_data)
{
LV_UNUSED(user_data);
#if LV_USE_PERF_MONITOR
perf_monitor_init();
#endif
#if LV_USE_MEM_MONITOR && LV_USE_BUILTIN_MALLOC
mem_monitor_init();
#endif
}
#endif /*LV_USE_MONITOR*/

View File

@ -0,0 +1,77 @@
/**
* @file lv_monitor.h
*
*/
#ifndef LV_MONITOR_H
#define LV_MONITOR_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../../../lvgl.h"
#if LV_USE_MONITOR
#if LV_USE_LABEL == 0
#error "lv_monitor: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) "
#endif
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
typedef struct {
lv_label_t label;
lv_timer_t * timer;
} lv_monitor_t;
extern const lv_obj_class_t lv_monitor_class;
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Create a monitor object (on lv_layer_sys).
* @return pointer to the new monitor object
*/
lv_obj_t * lv_monitor_create(void);
/**
* Check if a given flag or any of the flags are set on an object.
* @param obj pointer to a monitor object
* @param time monitor refresh interval
*/
void lv_monitor_set_refr_time(lv_obj_t * obj, uint32_t time);
/**
* Initialize built-in monitors, such as performance and memory monitors.
*/
void _lv_monitor_builtin_init(void);
/**********************
* MACROS
**********************/
#else
#if LV_USE_PERF_MONITOR || LV_USE_MEM_MONITOR
#warning "lv_monitor: lv_monitor is required. Enable it in lv_conf.h (LV_USE_MONITOR 1)"
#endif
#endif /*LV_USE_MONITOR*/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*LV_MONITOR_H*/