From c5ba19be8bf602620fba61f2098e3bd25762a867 Mon Sep 17 00:00:00 2001 From: Neo Xu Date: Sat, 3 Aug 2024 17:34:44 +0800 Subject: [PATCH] feat(simulator): upgrade to use lvgl's property API Signed-off-by: Neo Xu --- examples/align.lua | 17 +++++ examples/analogTime.lua | 3 +- examples/pointer.lua | 10 +-- examples/property.lua | 17 +++++ simulator/widgets/analog_time.c | 68 +++++-------------- simulator/widgets/extension.c | 3 +- simulator/widgets/lv_analog_time.c | 47 ++++++++++++- simulator/widgets/lv_analog_time.h | 10 +++ simulator/widgets/lv_analog_time_properties.c | 23 +++++++ simulator/widgets/lv_obj_property_names.h | 15 ++++ simulator/widgets/lv_pointer.c | 7 ++ simulator/widgets/lv_property_extend.h | 21 ++++++ simulator/widgets/lv_style_properties.h | 18 +++++ simulator/widgets/pointer.c | 66 ++++++++---------- simulator/widgets/widgets.c | 2 +- 15 files changed, 223 insertions(+), 104 deletions(-) create mode 100644 examples/align.lua create mode 100644 examples/property.lua create mode 100644 simulator/widgets/lv_analog_time_properties.c create mode 100644 simulator/widgets/lv_obj_property_names.h create mode 100644 simulator/widgets/lv_property_extend.h create mode 100644 simulator/widgets/lv_style_properties.h diff --git a/examples/align.lua b/examples/align.lua new file mode 100644 index 0000000..e27e2d7 --- /dev/null +++ b/examples/align.lua @@ -0,0 +1,17 @@ +lvgl.Object{ + w = 10, + h = 10, + bg_color = "#c00", + align = { + type = lvgl.ALIGN.BOTTOM_MID, + x_ofs = 10, + y_ofs = -200, + }, +} + +lvgl.Object{ + w = 10, + h = 10, + align = lvgl.ALIGN.CENTER, +} + diff --git a/examples/analogTime.lua b/examples/analogTime.lua index 84692c0..6c6f73a 100644 --- a/examples/analogTime.lua +++ b/examples/analogTime.lua @@ -1,5 +1,6 @@ local analogTime = lvgl.AnalogTime { - border_width = 0, + border_width = 1, + border_color = "#F00", x = lvgl.HOR_RES() // 2, y = lvgl.VER_RES() // 2, hands = { diff --git a/examples/pointer.lua b/examples/pointer.lua index d760961..9e4a71f 100644 --- a/examples/pointer.lua +++ b/examples/pointer.lua @@ -1,14 +1,16 @@ local root = lvgl.Object { - w = 0, + w = 1, h = 0, pad_all = 0, align = lvgl.ALIGN.CENTER, border_width = 1, border_color = "#F00", + flag_scrollable = false, } local pointer = root:Pointer { src = SCRIPT_PATH .. "/assets/second.png", + pivot = { 20, 233 }, x = -20, y = -233, border_width = 1, @@ -21,12 +23,6 @@ local pointer = root:Pointer { }, } --- lvgl requires src set firstly, since lua cannot guarantee table order, --- we set pivot after image src is set. -pointer:set { - pivot = { x = 20, y = 233 }, -} - print("img w,h: ", pointer:get_img_size()) pointer:Anim{ diff --git a/examples/property.lua b/examples/property.lua new file mode 100644 index 0000000..42336fe --- /dev/null +++ b/examples/property.lua @@ -0,0 +1,17 @@ +local root = lvgl.Object{ + bg_color = "#c00", + align = { + type = lvgl.ALIGN.BOTTOM_MID, + x_ofs = 10, + y_ofs = -200, + }, +} + +local t = { + +} + +t.x = 123 + +print("root.x", root.x) +root.y = 0 diff --git a/simulator/widgets/analog_time.c b/simulator/widgets/analog_time.c index faf87ca..13f7ffa 100644 --- a/simulator/widgets/analog_time.c +++ b/simulator/widgets/analog_time.c @@ -1,9 +1,3 @@ -#include -#include - -#include -#include - #include #include "lv_analog_time.h" @@ -13,11 +7,14 @@ static int luavgl_analog_time_create(lua_State *L) return luavgl_obj_create_helper(L, lv_analog_time_create); } -static void _lv_analog_time_set_hands(void *obj, lua_State *L) +static int analog_time_set_hands(lua_State *L, lv_obj_t *obj, bool set) { + if (!set) + return 0; + if (!lua_istable(L, -1)) { luaL_argerror(L, -1, "expect date table."); - return; + return 1; } const void *hour, *minute, *second; @@ -35,47 +32,17 @@ static void _lv_analog_time_set_hands(void *obj, lua_State *L) lua_pop(L, 1); lv_analog_time_set_hands(obj, hour, minute, second); + return 1; } -/* clang-format off */ -static const luavgl_value_setter_t analog_time_property_table[] = { - {"hands", SETTER_TYPE_STACK, {.setter_stack = _lv_analog_time_set_hands}}, - {"period", SETTER_TYPE_INT, {.setter = (setter_int_t)lv_analog_time_set_period}}, +static const luavgl_property_ops_t analog_time_property_ops[] = { + {.name = "hands", .ops = analog_time_set_hands}, }; -/* clang-format on */ - -static int luavgl_analog_time_set_property_kv(lua_State *L, void *data) -{ - lv_obj_t *obj = data; - int ret = luavgl_set_property(L, obj, analog_time_property_table); - - if (ret == 0) { - return 0; - } - - /* a base obj property? */ - ret = luavgl_obj_set_property_kv(L, obj); - if (ret != 0) { - printf("unkown property for analog_time: %s\n", lua_tostring(L, -2)); - } - - return -1; -} - -static int luavgl_analog_time_set(lua_State *L) -{ - lv_obj_t *obj = luavgl_to_obj(L, 1); - - if (!lua_istable(L, -1)) { - luaL_error(L, "expect a table on 2nd para."); - return 0; - } - - luavgl_iterate(L, -1, luavgl_analog_time_set_property_kv, obj); - - return 0; -} +static const luavgl_table_t analog_time_property_table = { + .len = sizeof(analog_time_property_ops) / sizeof(luavgl_property_ops_t), + .array = analog_time_property_ops, +}; static int luavgl_analog_time_pause(lua_State *L) { @@ -92,11 +59,11 @@ static int luavgl_analog_time_resume(lua_State *L) } static const rotable_Reg luavgl_analog_time_methods[] = { - {"set", LUA_TFUNCTION, {luavgl_analog_time_set} }, - {"pause", LUA_TFUNCTION, {luavgl_analog_time_pause} }, - {"resume", LUA_TFUNCTION, {luavgl_analog_time_resume}}, + {"pause", LUA_TFUNCTION, {luavgl_analog_time_pause} }, + {"resume", LUA_TFUNCTION, {luavgl_analog_time_resume} }, + {"__property", LUA_TLIGHTUSERDATA, {.ptr = &analog_time_property_table}}, - {0, 0, {0} }, + {0, 0, {0} }, }; void luavgl_analog_time_init(lua_State *L) @@ -106,8 +73,7 @@ void luavgl_analog_time_init(lua_State *L) lua_pop(L, 1); luaL_getmetatable(L, "widgets"); - lua_getfield(L, -1, "__index"); lua_pushcfunction(L, luavgl_analog_time_create); lua_setfield(L, -2, "AnalogTime"); - lua_pop(L, 2); + lua_pop(L, 1); } diff --git a/simulator/widgets/extension.c b/simulator/widgets/extension.c index a78d674..a63c9ac 100644 --- a/simulator/widgets/extension.c +++ b/simulator/widgets/extension.c @@ -62,8 +62,7 @@ void luavgl_extension_init(lua_State *L) lua_pop(L, 1); luaL_getmetatable(L, "widgets"); - lua_getfield(L, -1, "__index"); lua_pushcfunction(L, luavgl_extension_create); lua_setfield(L, -2, "Extension"); - lua_pop(L, 2); + lua_pop(L, 1); } diff --git a/simulator/widgets/lv_analog_time.c b/simulator/widgets/lv_analog_time.c index 8e3eb1c..36f962e 100644 --- a/simulator/widgets/lv_analog_time.c +++ b/simulator/widgets/lv_analog_time.c @@ -4,6 +4,9 @@ #include "lv_analog_time.h" #include "lv_pointer.h" +#include "lv_obj_property_names.h" + +#include #include #if LV_USE_ANALOG_TIME @@ -37,11 +40,35 @@ static lv_obj_t* create_hand(lv_obj_t* obj, const char* img); * STATIC VARIABLES **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t properties[] = { + { + .id = LV_PROPERTY_ANALOG_TIME_PERIOD, + .setter = lv_analog_time_set_period, + .getter = lv_analog_time_get_period, + }, +}; +#endif + const lv_obj_class_t lv_analog_time_class = { .constructor_cb = lv_analog_time_constructor, .destructor_cb = lv_analog_time_destructor, .instance_size = sizeof(lv_analog_time_t), .base_class = &lv_obj_class, + .name = "analogtime", + +#if LV_USE_OBJ_PROPERTY + .prop_index_start = LV_PROPERTY_ANALOG_TIME_START, + .prop_index_end = LV_PROPERTY_ANALOG_TIME_END, + .properties = properties, + .properties_count = sizeof(properties) / sizeof(properties[0]), + +#if LV_USE_OBJ_PROPERTY_NAME + .property_names = lv_analog_time_property_names, + .names_count = sizeof(lv_analog_time_property_names) / sizeof(lv_property_name_t), +#endif + +#endif }; /********************** @@ -149,10 +176,22 @@ void lv_analog_time_set_period(lv_obj_t* obj, uint32_t period) lv_timer_set_period(analog->timer, period); } +uint32_t lv_analog_time_get_period(lv_obj_t* obj) +{ + lv_analog_time_t* analog = (lv_analog_time_t*)obj; + return analog->period; +} + /********************** * STATIC FUNCTIONS **********************/ +static void ext_draw_size_event_cb(lv_event_t * e) +{ + lv_coord_t * cur_size = lv_event_get_param(e); + *cur_size = LV_MAX(*cur_size, LV_HOR_RES); +} + static void lv_analog_time_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj) { @@ -160,12 +199,14 @@ static void lv_analog_time_constructor(const lv_obj_class_t* class_p, LV_TRACE_OBJ_CREATE("begin"); lv_analog_time_t* analog = (lv_analog_time_t*)obj; + lv_obj_t * parent = lv_obj_get_parent(obj); analog->period = 60 * 60 * 1000; /* default to 1Hour = 60min*60sec*1000ms*/ - lv_obj_add_flag(lv_obj_get_parent(obj), LV_OBJ_FLAG_OVERFLOW_VISIBLE); + lv_obj_add_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE); + lv_obj_add_event_cb(parent, ext_draw_size_event_cb, LV_EVENT_REFR_EXT_DRAW_SIZE, NULL); /* hands pivot is place to 0, 0 */ lv_obj_remove_style_all(obj); - lv_obj_set_size(obj, 0, 0); + lv_obj_set_size(obj, 1, 0); analog->timer = lv_timer_create(timer_cb, UNIT_ONE_MINUTE, obj); lv_timer_pause(analog->timer); @@ -275,7 +316,7 @@ static void update_time(lv_obj_t* obj) static void timer_cb(lv_timer_t* t) { /* timeup */ - update_time(t->user_data); + update_time(lv_timer_get_user_data(t)); } /* examples */ diff --git a/simulator/widgets/lv_analog_time.h b/simulator/widgets/lv_analog_time.h index f4e63fe..d49a5cc 100644 --- a/simulator/widgets/lv_analog_time.h +++ b/simulator/widgets/lv_analog_time.h @@ -11,6 +11,8 @@ extern "C" { #include +#include "lv_property_extend.h" + #if LV_USE_ANALOG_TIME /********************* @@ -21,6 +23,13 @@ extern "C" { * TYPEDEFS **********************/ +#if LV_USE_OBJ_PROPERTY +enum { + LV_PROPERTY_ID(ANALOG_TIME, PERIOD, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ANALOG_TIME_END, +}; +#endif + typedef struct { lv_obj_t obj; lv_obj_t* hour; @@ -50,6 +59,7 @@ void lv_analog_time_set_hands(lv_obj_t* obj, const void* hour, void lv_analog_time_pause(lv_obj_t* obj); void lv_analog_time_resume(lv_obj_t* obj); void lv_analog_time_set_period(lv_obj_t* obj, uint32_t period); +uint32_t lv_analog_time_get_period(lv_obj_t* obj); /********************** * MACROS diff --git a/simulator/widgets/lv_analog_time_properties.c b/simulator/widgets/lv_analog_time_properties.c new file mode 100644 index 0000000..1ec16ea --- /dev/null +++ b/simulator/widgets/lv_analog_time_properties.c @@ -0,0 +1,23 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_analog_time_properties.c + */ + +#include "lv_analog_time.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_ANALOG_TIME +/** + * Analog_time widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_analog_time_property_names[1] = { + {"period", LV_PROPERTY_ANALOG_TIME_PERIOD,}, +}; +#endif /*LV_USE_ANALOG_TIME*/ + +/* *INDENT-ON* */ +#endif diff --git a/simulator/widgets/lv_obj_property_names.h b/simulator/widgets/lv_obj_property_names.h new file mode 100644 index 0000000..338efb5 --- /dev/null +++ b/simulator/widgets/lv_obj_property_names.h @@ -0,0 +1,15 @@ + +/** + * @file lv_obj_property_names.h + * GENERATED FILE, DO NOT EDIT IT! + */ +#ifndef _LV_OBJ_PROPERTY_NAMES_H +#define _LV_OBJ_PROPERTY_NAMES_H + +#include "lvgl.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + + extern const lv_property_name_t lv_analog_time_property_names[1]; +#endif +#endif diff --git a/simulator/widgets/lv_pointer.c b/simulator/widgets/lv_pointer.c index 80ba165..48890b9 100644 --- a/simulator/widgets/lv_pointer.c +++ b/simulator/widgets/lv_pointer.c @@ -20,6 +20,7 @@ static void lv_pointer_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj); static void angle_update(lv_obj_t* obj); +static void ext_draw_size_event_cb(lv_event_t * e); /********************** * STATIC VARIABLES @@ -46,6 +47,7 @@ lv_obj_t* lv_pointer_create(lv_obj_t* parent) /* pointer can rotate out of parent's area. */ lv_obj_add_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE); + lv_obj_add_event_cb(parent, ext_draw_size_event_cb, LV_EVENT_REFR_EXT_DRAW_SIZE, NULL); return obj; } @@ -76,6 +78,11 @@ void lv_pointer_set_range(lv_obj_t* obj, int value_start, int value_range, /********************** * STATIC FUNCTIONS **********************/ +static void ext_draw_size_event_cb(lv_event_t * e) +{ + lv_coord_t * cur_size = lv_event_get_param(e); + *cur_size = LV_MAX(*cur_size, LV_HOR_RES); +} static void lv_pointer_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj) diff --git a/simulator/widgets/lv_property_extend.h b/simulator/widgets/lv_property_extend.h new file mode 100644 index 0000000..d93dffa --- /dev/null +++ b/simulator/widgets/lv_property_extend.h @@ -0,0 +1,21 @@ +/** + * @file lv_property_extend.h + * + */ + +#ifndef LV_PROPERTY_EXTEND_H +#define LV_PROPERTY_EXTEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +enum { + _EXT_PROPID_START = LV_PROPERTY_ID_BUILTIN_LAST + 1, + LV_PROPERTY_POINTER_START = _EXT_PROPID_START + 0x100, /* lv_pointer.c */ + LV_PROPERTY_ANALOG_TIME_START = _EXT_PROPID_START + 0x200, /* lv_pointer.c */ +}; + +#endif /* LV_PROPERTY_EXTEND_H */ diff --git a/simulator/widgets/lv_style_properties.h b/simulator/widgets/lv_style_properties.h new file mode 100644 index 0000000..c0e3b9f --- /dev/null +++ b/simulator/widgets/lv_style_properties.h @@ -0,0 +1,18 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_style_properties.h + */ +#ifndef LV_STYLE_PROPERTIES_H +#define LV_STYLE_PROPERTIES_H + +#include "../../core/lv_obj_property.h" +#if LV_USE_OBJ_PROPERTY + + +/* *INDENT-OFF* */ +enum { +}; + +#endif +#endif diff --git a/simulator/widgets/pointer.c b/simulator/widgets/pointer.c index 0e4f86f..5a22838 100644 --- a/simulator/widgets/pointer.c +++ b/simulator/widgets/pointer.c @@ -1,9 +1,3 @@ -#include -#include - -#include -#include - #include #include "lv_pointer.h" @@ -13,11 +7,17 @@ static int luavgl_pointer_create(lua_State *L) return luavgl_obj_create_helper(L, lv_pointer_create); } -static void _lv_pointer_set_range(void *obj, lua_State *L) +static int _lv_pointer_set_range(lua_State *L, lv_obj_t *obj, bool set) { + if (!set) { + /* No getter */ + lua_pushnil(L); + return 1; + } + if (!lua_istable(L, -1)) { luaL_argerror(L, -1, "expect date table."); - return; + return 1; } uint32_t value_start, value_range, angle_start, angle_range; @@ -38,46 +38,35 @@ static void _lv_pointer_set_range(void *obj, lua_State *L) lua_pop(L, 1); lv_pointer_set_range(obj, value_start, value_range, angle_start, angle_range); + return 1; } -/* clang-format off */ -static const luavgl_value_setter_t pointer_property_table[] = { - {"range", SETTER_TYPE_STACK, {.setter_stack = _lv_pointer_set_range}}, - {"value", SETTER_TYPE_INT, {.setter = (setter_int_t)lv_pointer_set_value}}, -}; - -/* clang-format on */ - -static int luavgl_pointer_set_property_kv(lua_State *L, void *data) +static int _lv_pointer_set_value(lua_State *L, lv_obj_t *obj, bool set) { - lv_obj_t *obj = data; - int ret = luavgl_set_property(L, obj, pointer_property_table); - - if (ret == 0) { - return 0; + if (!set) { + /* No getter */ + lua_pushnil(L); + return 1; } - return -1; + lv_pointer_set_value(obj, lua_tointeger(L, -1)); + return 1; } -static int luavgl_pointer_set(lua_State *L) -{ - lv_obj_t *obj = luavgl_to_obj(L, 1); - - if (!lua_istable(L, -1)) { - luaL_error(L, "expect a table on 2nd para."); - return 0; - } - - luavgl_iterate(L, -1, luavgl_pointer_set_property_kv, obj); +static const luavgl_property_ops_t pointer_property_ops[] = { + {.name = "range", .ops = _lv_pointer_set_range}, + {.name = "value", .ops = _lv_pointer_set_value}, +}; - return 0; -} +static const luavgl_table_t pointer_property_table = { + .len = sizeof(pointer_property_ops) / sizeof(pointer_property_ops[0]), + .array = pointer_property_ops, +}; static const rotable_Reg luavgl_pointer_methods[] = { - {"set", LUA_TFUNCTION, luavgl_pointer_set}, + {"__property", LUA_TLIGHTUSERDATA, {.ptr = &pointer_property_table}}, - {0, 0, {0} }, + {0, 0, {0} }, }; void luavgl_pointer_init(lua_State *L) @@ -87,8 +76,7 @@ void luavgl_pointer_init(lua_State *L) lua_pop(L, 1); luaL_getmetatable(L, "widgets"); - lua_getfield(L, -1, "__index"); lua_pushcfunction(L, luavgl_pointer_create); lua_setfield(L, -2, "Pointer"); - lua_pop(L, 2); + lua_pop(L, 1); } diff --git a/simulator/widgets/widgets.c b/simulator/widgets/widgets.c index f8bbe07..5094ce4 100644 --- a/simulator/widgets/widgets.c +++ b/simulator/widgets/widgets.c @@ -2,7 +2,7 @@ void luavgl_widgets_init(lua_State *L) { - luavgl_extension_init(L); + // luavgl_extension_init(L); luavgl_pointer_init(L); luavgl_analog_time_init(L); } \ No newline at end of file