Просмотр исходного кода

add:增加lv_win_add_btn lv_tileview_set_valid_positions 增加lvgl部件demo

Dozingfiretruck 4 лет назад
Родитель
Сommit
2237fac359
44 измененных файлов с 1164 добавлено и 1 удалено
  1. 10 0
      bsp/win32/test/lvgl_demo_test/arc_demo.lua
  2. 11 0
      bsp/win32/test/lvgl_demo_test/bar_demo.lua
  3. 32 0
      bsp/win32/test/lvgl_demo_test/btn_demo.lua
  4. 24 0
      bsp/win32/test/lvgl_demo_test/btnmatrix_demo.lua
  5. 46 0
      bsp/win32/test/lvgl_demo_test/calendar_demo.lua
  6. 52 0
      bsp/win32/test/lvgl_demo_test/canvas.lua
  7. 41 0
      bsp/win32/test/lvgl_demo_test/chart_demo.lua
  8. 20 0
      bsp/win32/test/lvgl_demo_test/checkbox_demo.lua
  9. 27 0
      bsp/win32/test/lvgl_demo_test/cont_demo.lua
  10. 10 0
      bsp/win32/test/lvgl_demo_test/cpicker_demo.lua
  11. 26 0
      bsp/win32/test/lvgl_demo_test/dropdown.lua
  12. 17 0
      bsp/win32/test/lvgl_demo_test/gauge_demo.lua
  13. BIN
      bsp/win32/test/lvgl_demo_test/img/img_cogwheel_argb.png
  14. BIN
      bsp/win32/test/lvgl_demo_test/img/imgbtn_blue.png
  15. BIN
      bsp/win32/test/lvgl_demo_test/img/imgbtn_green.png
  16. 13 0
      bsp/win32/test/lvgl_demo_test/img_demo.lua
  17. 27 0
      bsp/win32/test/lvgl_demo_test/imgbtn_demo.lua
  18. 41 0
      bsp/win32/test/lvgl_demo_test/keyboard.lua
  19. 19 0
      bsp/win32/test/lvgl_demo_test/label_demo.lua
  20. 20 0
      bsp/win32/test/lvgl_demo_test/led_demo.lua
  21. 22 0
      bsp/win32/test/lvgl_demo_test/line_demo.lua
  22. 40 0
      bsp/win32/test/lvgl_demo_test/list_demo.lua
  23. 14 0
      bsp/win32/test/lvgl_demo_test/lmeter_demo.lua
  24. 81 0
      bsp/win32/test/lvgl_demo_test/main.lua
  25. 20 0
      bsp/win32/test/lvgl_demo_test/msdbox_demo.lua
  26. 73 0
      bsp/win32/test/lvgl_demo_test/objmask.lua
  27. 23 0
      bsp/win32/test/lvgl_demo_test/page_demo.lua
  28. 34 0
      bsp/win32/test/lvgl_demo_test/roller.lua
  29. 16 0
      bsp/win32/test/lvgl_demo_test/slider_demo.lua
  30. 39 0
      bsp/win32/test/lvgl_demo_test/spinbox_demo.lua
  31. 10 0
      bsp/win32/test/lvgl_demo_test/spinner_demo.lua
  32. 25 0
      bsp/win32/test/lvgl_demo_test/switch_demo.lua
  33. 68 0
      bsp/win32/test/lvgl_demo_test/symbol.lua
  34. 36 0
      bsp/win32/test/lvgl_demo_test/table_demo.lua
  35. 33 0
      bsp/win32/test/lvgl_demo_test/tabview_demo.lua
  36. 33 0
      bsp/win32/test/lvgl_demo_test/textarea.lua
  37. 50 0
      bsp/win32/test/lvgl_demo_test/tileview_demo.lua
  38. 27 0
      bsp/win32/test/lvgl_demo_test/win_demo.lua
  39. 2 1
      components/lvgl/binding/luat_lib_lvgl.c
  40. 7 0
      components/lvgl/binding/luat_lib_lvgl_map.c
  41. 58 0
      components/lvgl/binding/luat_lib_lvgl_widgets_ex.c
  42. 1 0
      components/lvgl/binding/luat_lvgl.h
  43. 2 0
      components/lvgl/binding/luat_lvgl_map.h
  44. 14 0
      components/lvgl/binding/luat_lvgl_widgets_ex.h

+ 10 - 0
bsp/win32/test/lvgl_demo_test/arc_demo.lua

@@ -0,0 +1,10 @@
+local arc_demo = {}
+
+function arc_demo.demo()
+    local arc = lvgl.arc_create(lvgl.scr_act(), nil)
+    lvgl.arc_set_end_angle(arc, 200)
+    lvgl.obj_set_size(arc, 150, 150)
+    lvgl.obj_align(arc, nil, lvgl.ALIGN_CENTER, 0, 0)
+end
+
+return arc_demo

+ 11 - 0
bsp/win32/test/lvgl_demo_test/bar_demo.lua

@@ -0,0 +1,11 @@
+local bar_demo = {}
+
+function bar_demo.demo()
+    local bar1 = lvgl.bar_create(lvgl.scr_act(), nil)
+    lvgl.obj_set_size(bar1, 200, 20)
+    lvgl.obj_align(bar1, nil, lvgl.ALIGN_CENTER, 0, 0)
+    lvgl.bar_set_anim_time(bar1, 2000)
+    lvgl.bar_set_value(bar1, 100, lvgl.ANIM_ON)
+end
+
+return bar_demo

+ 32 - 0
bsp/win32/test/lvgl_demo_test/btn_demo.lua

@@ -0,0 +1,32 @@
+local btn_demo = {}
+
+local function event_handler(obj, event)
+        if(event == lvgl.EVENT_CLICKED) then
+                print("Clicked\n")
+        elseif(event == lvgl.EVENT_VALUE_CHANGED) then
+                print("Toggled\n")
+        end
+end
+
+function btn_demo.demo()
+    local label
+    local btn1 = lvgl.btn_create(lvgl.scr_act(), nil)
+    lvgl.obj_set_event_cb(btn1, event_handler)
+    lvgl.obj_align(btn1, nil, lvgl.ALIGN_CENTER, 0, -40)
+
+    label = lvgl.label_create(btn1, nil)
+    lvgl.label_set_text(label, "Button")
+
+    local btn2 = lvgl.btn_create(lvgl.scr_act(), nil)
+    lvgl.obj_set_event_cb(btn2, event_handler)
+    lvgl.obj_align(btn2, nil, lvgl.ALIGN_CENTER, 0, 40)
+    lvgl.btn_set_checkable(btn2, true)
+    lvgl.btn_toggle(btn2)
+    lvgl.btn_set_fit2(btn2, lvgl.FIT_NONE, lvgl.FIT_TIGHT)
+
+    label = lvgl.label_create(btn2, nil)
+    lvgl.label_set_text(label, "Toggled")
+end
+
+return btn_demo
+

+ 24 - 0
bsp/win32/test/lvgl_demo_test/btnmatrix_demo.lua

@@ -0,0 +1,24 @@
+local btnmatrix_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+            local txt = lvgl.btnmatrix_get_active_btn_text(obj)
+            print(string.format("%s was pressed\n", txt))
+    end
+end
+
+function btnmatrix_demo.demo()
+    local btnm_map = {"1", "2", "3", "4", "5", "\n",
+                    "6", "7", "8", "9", "0", "\n",
+                    "Action1", "Action2",""}
+
+    local btnm1 = lvgl.btnmatrix_create(lvgl.scr_act(), nil)
+    lvgl.btnmatrix_set_map(btnm1, btnm_map)
+    lvgl.btnmatrix_set_btn_width(btnm1, 10, 2)        --Make "Action1" twice as wide as "Action2"
+    lvgl.btnmatrix_set_btn_ctrl(btnm1, 10, lvgl.BTNMATRIX_CTRL_CHECKABLE)
+    lvgl.btnmatrix_set_btn_ctrl(btnm1, 11, lvgl.BTNMATRIX_CTRL_CHECK_STATE)
+    lvgl.obj_align(btnm1, nil, lvgl.ALIGN_CENTER, 0, 0)
+    lvgl.obj_set_event_cb(btnm1, event_handler)
+end
+
+return btnmatrix_demo

+ 46 - 0
bsp/win32/test/lvgl_demo_test/calendar_demo.lua

@@ -0,0 +1,46 @@
+local calendar_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+            local date = lvgl.calendar_get_pressed_date(obj);
+            -- print(string.format("Clicked date: %02d.%02d.%d\n", date.day, date.month, date.year))
+    end
+end
+
+function calendar_demo.demo()
+    local calendar = lvgl.calendar_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(calendar, 235, 235);
+    lvgl.obj_align(calendar, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.obj_set_event_cb(calendar, event_handler);
+
+    --Make the date number smaller to be sure they fit into their area
+    lvgl.obj_set_style_local_text_font(calendar, lvgl.CALENDAR_PART_DATE, lvgl.STATE_DEFAULT, lvgl.theme_get_font_small());
+
+    --Set today's date
+    -- lvgl.calendar_date_t today;
+    -- local today = lvgl.calendar_date_t()
+    -- today.year = 2018;
+    -- today.month = 10;
+    -- today.day = 23;
+
+    -- lvgl.calendar_set_today_date(calendar, today);
+    -- lvgl.calendar_set_showed_date(calendar, today);
+
+    -- --Highlight a few days
+    -- static lvgl.calendar_date_t highlighted_days[3];       --Only its pointer will be saved so should be static
+    -- highlighted_days[0].year = 2018;
+    -- highlighted_days[0].month = 10;
+    -- highlighted_days[0].day = 6;
+
+    -- highlighted_days[1].year = 2018;
+    -- highlighted_days[1].month = 10;
+    -- highlighted_days[1].day = 11;
+
+    -- highlighted_days[2].year = 2018;
+    -- highlighted_days[2].month = 11;
+    -- highlighted_days[2].day = 22;
+
+    -- lvgl.calendar_set_highlighted_dates(calendar, highlighted_days, 3);
+end
+
+return calendar_demo

+ 52 - 0
bsp/win32/test/lvgl_demo_test/canvas.lua

@@ -0,0 +1,52 @@
+local canvas = {}
+
+local CANVAS_WIDTH  = 200
+local CANVAS_HEIGHT = 150
+
+function canvas.demo()
+    local obj = lvgl.obj_create(nil, nil);
+    local rect_dsc = lvgl.draw_rect_dsc_t();
+    lvgl.draw_rect_dsc_init(rect_dsc);
+    -- rect_dsc.radius = 10;
+    -- rect_dsc.bg_opa = lvgl.OPA_COVER;
+    -- rect_dsc.bg_grad_dir = lvgl.GRAD_DIR_HOR;
+    -- rect_dsc.bg_color = lvgl.COLOR_RED;
+    -- rect_dsc.bg_grad_color = lvgl.COLOR_BLUE;
+    -- rect_dsc.border_width = 2;
+    -- rect_dsc.border_opa = lvgl.OPA_90;
+    -- rect_dsc.border_color = lvgl.COLOR_WHITE;
+    -- rect_dsc.shadow_width = 5;
+    -- rect_dsc.shadow_ofs_x = 5;
+    -- rect_dsc.shadow_ofs_y = 5;
+
+    -- local label_dsc=lvgl.draw_label_dsc_t();
+    -- lvgl.draw_label_dsc_init(label_dsc);
+    -- label_dsc.color = lvgl.COLOR_YELLOW;
+
+    -- static lvgl.color_t cbuf[lvgl.CANVAS_BUF_SIZE_TRUE_COLOR(CANVAS_WIDTH, CANVAS_HEIGHT)];
+
+    -- lvgl.obj_t * canvas = lvgl.canvas_create(lvgl.scr_act(), NULL);
+    -- lvgl.canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, lvgl.IMG_CF_TRUE_COLOR);
+    -- lvgl.obj_align(canvas, NULL, lvgl.ALIGN_CENTER, 0, 0);
+    -- lvgl.canvas_fill_bg(canvas, lvgl.COLOR_SILVER, lvgl.OPA_COVER);
+
+    -- lvgl.canvas_draw_rect(canvas, 70, 60, 100, 70, rect_dsc);
+
+    -- lvgl.canvas_draw_text(canvas, 40, 20, 100, label_dsc, "Some text on text canvas", lvgl.LABEL_ALIGN_LEFT);
+
+    -- /* Test the rotation. It requires an other buffer where the orignal image is stored.
+    --     * So copy the current image to buffer and rotate it to the canvas */
+    -- static lvgl.color_t cbuf_tmp[CANVAS_WIDTH * CANVAS_HEIGHT];
+    -- memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp));
+    -- lvgl.img_dsc_t img;
+    -- img.data = (void *)cbuf_tmp;
+    -- img.header.cf = lvgl.IMG_CF_TRUE_COLOR;
+    -- img.header.w = CANVAS_WIDTH;
+    -- img.header.h = CANVAS_HEIGHT;
+
+    -- lvgl.canvas_fill_bg(canvas, lvgl.COLOR_SILVER, lvgl.OPA_COVER);
+    -- lvgl.canvas_transform(canvas, img, 30, lvgl.IMG_ZOOM_NONE, 0, 0, CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2, true);
+    lvgl.scr_load(obj)
+end
+
+return canvas

+ 41 - 0
bsp/win32/test/lvgl_demo_test/chart_demo.lua

@@ -0,0 +1,41 @@
+local chart_demo = {}
+
+function chart_demo.demo()
+    --Create a chart
+    local chart;
+    chart = lvgl.chart_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(chart, 200, 150);
+    lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.chart_set_type(chart, lvgl.CHART_TYPE_LINE);   --Show lines and points too*/
+
+    --Add two data series
+    local ser1 = lvgl.chart_add_series(chart, lvgl.color_make(0xFF, 0x00, 0x00));
+    local ser2 = lvgl.chart_add_series(chart, lvgl.color_make(0x00, 0x80, 0x00));
+
+    --Set the next points on 'ser1'
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 10);
+    lvgl.chart_set_next(chart, ser1, 30);
+    lvgl.chart_set_next(chart, ser1, 70);
+    lvgl.chart_set_next(chart, ser1, 90);
+
+    lvgl.chart_set_next(chart, ser2, 90);
+    lvgl.chart_set_next(chart, ser2, 70);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+    lvgl.chart_set_next(chart, ser2, 65);
+
+    lvgl.chart_refresh(chart); --Required after direct set
+end
+
+return chart_demo

+ 20 - 0
bsp/win32/test/lvgl_demo_test/checkbox_demo.lua

@@ -0,0 +1,20 @@
+local checkbox_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_CLICKED) then
+        if lvgl.checkbox_is_checked(obj) == true then
+            print("State: Checked\n")
+        else
+            print("State: Unchecked\n")
+        end
+    end
+end
+
+function checkbox_demo.demo()
+    local cb = lvgl.checkbox_create(lvgl.scr_act(), nil)
+    lvgl.checkbox_set_text(cb, "I agree to terms and conditions.")
+    lvgl.obj_align(cb, nil, lvgl.ALIGN_CENTER, 0, 0)
+    lvgl.obj_set_event_cb(cb, event_handler)
+end
+
+return checkbox_demo

+ 27 - 0
bsp/win32/test/lvgl_demo_test/cont_demo.lua

@@ -0,0 +1,27 @@
+local cont_demo = {}
+
+
+function cont_demo.demo()
+    local cont;
+    cont = lvgl.cont_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_auto_realign(cont, true);                    --Auto realign when the size changes*/
+    lvgl.obj_align_origo(cont, nil, lvgl.ALIGN_CENTER, 0, 0);  --This parametrs will be sued when realigned*/
+    lvgl.cont_set_fit(cont, lvgl.FIT_TIGHT);
+    lvgl.cont_set_layout(cont, lvgl.LAYOUT_COLUMN_MID);
+
+    local label;
+    label = lvgl.label_create(cont, nil);
+    lvgl.label_set_text(label, "Short text");
+
+    sys.wait(500)
+
+    label = lvgl.label_create(cont, nil);
+    lvgl.label_set_text(label, "It is a long text");
+
+    sys.wait(500)
+
+    label = lvgl.label_create(cont, nil);
+    lvgl.label_set_text(label, "Here is an even longer text");
+end
+
+return cont_demo

+ 10 - 0
bsp/win32/test/lvgl_demo_test/cpicker_demo.lua

@@ -0,0 +1,10 @@
+local cpicker_demo = {}
+
+function cpicker_demo.demo()
+    local cpicker
+    cpicker = lvgl.cpicker_create(lvgl.scr_act(), nil)
+    lvgl.obj_set_size(cpicker, 200, 200)
+    lvgl.obj_align(cpicker, nil, lvgl.ALIGN_CENTER, 0, 0)
+end
+
+return cpicker_demo

+ 26 - 0
bsp/win32/test/lvgl_demo_test/dropdown.lua

@@ -0,0 +1,26 @@
+local dropdown = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        -- local buf;
+        -- lvgl.dropdown_get_selected_str(obj, buf, sizeof(buf));
+        -- printf("Option: %s\n", buf);
+    end
+end
+
+function dropdown.demo()
+    --Create a normal drop down list
+    local ddlist = lvgl.dropdown_create(lvgl.scr_act(), nil);
+    lvgl.dropdown_set_options(ddlist, 
+[[Apple
+Banana
+Orange
+Melon
+Grape
+Raspberry]]);
+
+    lvgl.obj_align(ddlist, nil, lvgl.ALIGN_IN_TOP_MID, 0, 20);
+    lvgl.obj_set_event_cb(ddlist, event_handler);
+end
+
+return dropdown

+ 17 - 0
bsp/win32/test/lvgl_demo_test/gauge_demo.lua

@@ -0,0 +1,17 @@
+local gauge_demo = {}
+
+
+function gauge_demo.demo()
+    --Create a gauge*/
+    local gauge1 = lvgl.gauge_create(lvgl.scr_act(), nil);
+    lvgl.gauge_set_needle_count(gauge1, 3, lvgl.color_make(0x00, 0x00, 0xFF), lvgl.color_make(0xFF, 0xA5, 0x00), lvgl.color_make(0x80, 0x00, 0x80));
+    lvgl.obj_set_size(gauge1, 200, 200);
+    lvgl.obj_align(gauge1, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    --Set the values*/
+    lvgl.gauge_set_value(gauge1, 0, 10);
+    lvgl.gauge_set_value(gauge1, 1, 20);
+    lvgl.gauge_set_value(gauge1, 2, 30);
+end
+
+return gauge_demo

BIN
bsp/win32/test/lvgl_demo_test/img/img_cogwheel_argb.png


BIN
bsp/win32/test/lvgl_demo_test/img/imgbtn_blue.png


BIN
bsp/win32/test/lvgl_demo_test/img/imgbtn_green.png


+ 13 - 0
bsp/win32/test/lvgl_demo_test/img_demo.lua

@@ -0,0 +1,13 @@
+local img_demo = {}
+
+function img_demo.demo()
+    local img1 = lvgl.img_create(lvgl.scr_act(), nil);
+    lvgl.img_set_src(img1, "/img/img_cogwheel_argb.png");
+    lvgl.obj_align(img1, nil, lvgl.ALIGN_CENTER, 0, -20);
+
+    local img2 = lvgl.img_create(lvgl.scr_act(), nil);
+    lvgl.img_set_src(img2, LV_SYMBOL_OK.."Accept");
+    lvgl.obj_align(img2, img1, lvgl.ALIGN_OUT_BOTTOM_MID, 0, 20);
+end
+
+return img_demo

+ 27 - 0
bsp/win32/test/lvgl_demo_test/imgbtn_demo.lua

@@ -0,0 +1,27 @@
+local imgbtn_demo = {}
+
+function imgbtn_demo.demo()
+    --Darken the button when pressed
+    -- local lvgl.style_t style;
+    local style = lvgl.style_t()
+    lvgl.style_init(style);
+    lvgl.style_set_image_recolor_opa(style, lvgl.STATE_PRESSED, lvgl.OPA_30);
+    lvgl.style_set_image_recolor(style, lvgl.STATE_PRESSED, lvgl.color_make(0x00, 0x00, 0x00));
+    lvgl.style_set_text_color(style, lvgl.STATE_DEFAULT, lvgl.color_make(0xFF, 0xFF, 0xFF));
+
+    --Create an Image button
+    local imgbtn1 = lvgl.imgbtn_create(lvgl.scr_act(), nil);
+    lvgl.imgbtn_set_src(imgbtn1, lvgl.BTN_STATE_RELEASED, "/img/imgbtn_green.png");
+    lvgl.imgbtn_set_src(imgbtn1, lvgl.BTN_STATE_PRESSED, "/img/imgbtn_green.png");
+    lvgl.imgbtn_set_src(imgbtn1, lvgl.BTN_STATE_CHECKED_RELEASED, "/img/imgbtn_blue.png");
+    lvgl.imgbtn_set_src(imgbtn1, lvgl.BTN_STATE_CHECKED_PRESSED, "/img/imgbtn_blue.png");
+    lvgl.imgbtn_set_checkable(imgbtn1, true);
+    lvgl.obj_add_style(imgbtn1, lvgl.IMGBTN_PART_MAIN, style);
+    lvgl.obj_align(imgbtn1, nil, lvgl.ALIGN_CENTER, 0, -40);
+
+    --Create a label on the Image button
+    local label = lvgl.label_create(imgbtn1, nil);
+    lvgl.label_set_text(label, "Button");
+end
+
+return imgbtn_demo

+ 41 - 0
bsp/win32/test/lvgl_demo_test/keyboard.lua

@@ -0,0 +1,41 @@
+local keyboard = {}
+
+local  kb;
+local  ta;
+
+local function kb_event_cb(keyboard, e)
+    lvgl.keyboard_def_event_cb(kb, e);
+    if(e == lvgl.EVENT_CANCEL) then
+        lvgl.keyboard_set_textarea(kb, nil);
+        lvgl.obj_del(kb);
+        kb = nil;
+    end
+end
+
+local function kb_create()
+    kb = lvgl.keyboard_create(lvgl.scr_act(), nil);
+    lvgl.keyboard_set_cursor_manage(kb, true);
+    lvgl.obj_set_event_cb(kb, kb_event_cb);
+    lvgl.keyboard_set_textarea(kb, ta);
+end
+
+local function ta_event_cb(ta_local, e)
+    if(e == lvgl.EVENT_CLICKED and kb == nil) then
+        kb_create();
+    end
+end
+
+function keyboard.demo()
+    --Create a text area. The keyboard will write here
+    ta  = lvgl.textarea_create(lvgl.scr_act(), nil);
+    lvgl.obj_align(ta, nil, lvgl.ALIGN_IN_TOP_MID, 0, lvgl.DPI / 16);
+    lvgl.obj_set_event_cb(ta, ta_event_cb);
+    lvgl.textarea_set_text(ta, "");
+    local LV_VER_RES = lvgl.disp_get_ver_res(lvgl.disp_get_default())
+    local max_h = LV_VER_RES / 2 - lvgl.DPI / 8;
+    if(lvgl.obj_get_height(ta) > max_h) then lvgl.obj_set_height(ta, max_h)end;
+
+    kb_create();
+end
+
+return keyboard

+ 19 - 0
bsp/win32/test/lvgl_demo_test/label_demo.lua

@@ -0,0 +1,19 @@
+local label_demo = {}
+
+function label_demo.demo()
+    local label1 = lvgl.label_create(lvgl.scr_act(), nil);
+    lvgl.label_set_long_mode(label1, lvgl.LABEL_LONG_BREAK);     --Break the long lines
+    lvgl.label_set_recolor(label1, true);                      --Enable re-coloring by commands in the text
+    lvgl.label_set_align(label1, lvgl.LABEL_ALIGN_CENTER);       --Center aligned lines
+    lvgl.label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label and  wrap long text automatically.");
+    lvgl.obj_set_width(label1, 150);
+    lvgl.obj_align(label1, nil, lvgl.ALIGN_CENTER, 0, -30);
+
+    local label2 = lvgl.label_create(lvgl.scr_act(), nil);
+    lvgl.label_set_long_mode(label2, lvgl.LABEL_LONG_SROLL_CIRC);     --Circular scroll
+    lvgl.obj_set_width(label2, 150);
+    lvgl.label_set_text(label2, "It is a circularly scrolling text. ");
+    lvgl.obj_align(label2, nil, lvgl.ALIGN_CENTER, 0, 30);
+end
+
+return label_demo

+ 20 - 0
bsp/win32/test/lvgl_demo_test/led_demo.lua

@@ -0,0 +1,20 @@
+local led_demo = {}
+
+function led_demo.demo()
+    --Create a LED and switch it OFF
+    local led1  = lvgl.led_create(lvgl.scr_act(), nil);
+    lvgl.obj_align(led1, nil, lvgl.ALIGN_CENTER, -80, 0);
+    lvgl.led_off(led1);
+
+    --Copy the previous LED and set a brightness
+    local led2  = lvgl.led_create(lvgl.scr_act(), led1);
+    lvgl.obj_align(led2, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.led_set_bright(led2, 190);
+
+    --Copy the previous LED and switch it ON
+    local led3  = lvgl.led_create(lvgl.scr_act(), led1);
+    lvgl.obj_align(led3, nil, lvgl.ALIGN_CENTER, 80, 0);
+    lvgl.led_on(led3);
+end
+
+return led_demo

+ 22 - 0
bsp/win32/test/lvgl_demo_test/line_demo.lua

@@ -0,0 +1,22 @@
+local line_demo = {}
+
+function line_demo.demo()
+    --Create an array for the points of the line
+    local line_points = { {5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10} };
+
+    --Create style
+    local style_line = lvgl.style_t();
+    lvgl.style_init(style_line);
+    lvgl.style_set_line_width(style_line, lvgl.STATE_DEFAULT, 8);
+    lvgl.style_set_line_color(style_line, lvgl.STATE_DEFAULT, lvgl.color_make(0x00, 0x00, 0xFF));
+    lvgl.style_set_line_rounded(style_line, lvgl.STATE_DEFAULT, true);
+
+    --Create a line and apply the new style
+    local line1;
+    line1 = lvgl.line_create(lvgl.scr_act(), nil);
+    lvgl.line_set_points(line1, line_points, 5);     --Set the points
+    lvgl.obj_add_style(line1, lvgl.LINE_PART_MAIN, style_line);     --Set the points
+    lvgl.obj_align(line1, nil, lvgl.ALIGN_CENTER, 0, 0);
+end
+
+return line_demo

+ 40 - 0
bsp/win32/test/lvgl_demo_test/list_demo.lua

@@ -0,0 +1,40 @@
+local list_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_CLICKED) then
+        print(string.format("Clicked: %s\n", lvgl.list_get_btn_text(obj)));
+    end
+end
+
+function list_demo.demo()
+    --Create a list
+    local list1 = lvgl.list_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(list1, 160, 200);
+    lvgl.obj_align(list1, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    --Add buttons to the list
+    local list_btn;
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_FILE, "New");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_DIRECTORY, "Open");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_CLOSE, "Delete");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_EDIT, "Edit");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_SAVE, "Save");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_BELL, "Notify");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+
+    list_btn = lvgl.list_add_btn(list1, lvgl.SYMBOL_BATTERY_FULL, "Battery");
+    lvgl.obj_set_event_cb(list_btn, event_handler);
+end
+
+return list_demo

+ 14 - 0
bsp/win32/test/lvgl_demo_test/lmeter_demo.lua

@@ -0,0 +1,14 @@
+local lmeter_demo = {}
+
+function lmeter_demo.demo()
+    --Create a line meter
+    local lmeter;
+    lmeter = lvgl.linemeter_create(lvgl.scr_act(), nil);
+    lvgl.linemeter_set_range(lmeter, 0, 100);                   --Set the range
+    lvgl.linemeter_set_value(lmeter, 80);                       --Set the current value
+    lvgl.linemeter_set_scale(lmeter, 240, 21);                  --Set the angle and number of lines
+    lvgl.obj_set_size(lmeter, 150, 150);
+    lvgl.obj_align(lmeter, nil, lvgl.ALIGN_CENTER, 0, 0);
+end
+
+return lmeter_demo

+ 81 - 0
bsp/win32/test/lvgl_demo_test/main.lua

@@ -0,0 +1,81 @@
+_G.sys = require "sys"
+
+local arc_demo = require "arc_demo"
+local bar_demo = require "bar_demo"
+local btn_demo = require "btn_demo"
+local btnmatrix_demo = require "btnmatrix_demo"
+local calendar_demo = require "calendar_demo"
+local canvas = require "canvas"
+local checkbox_demo = require "checkbox_demo"
+local chart_demo = require "chart_demo"
+local cont_demo = require "cont_demo"
+local cpicker_demo = require "cpicker_demo"
+local dropdown = require "dropdown"
+local gauge_demo = require "gauge_demo"
+local img_demo = require "img_demo"
+local imgbtn_demo = require "imgbtn_demo"
+local keyboard = require "keyboard"
+local label_demo = require "label_demo"
+local led_demo = require "led_demo"
+local line_demo = require "line_demo"
+local list_demo = require "list_demo"
+local lmeter_demo = require "lmeter_demo"
+local msdbox_demo = require "msdbox_demo"
+local objmask = require "objmask"
+local page_demo = require "page_demo"
+local roller = require "roller"
+local slider_demo = require "slider_demo"
+local spinbox_demo = require "spinbox_demo"
+local spinner_demo = require "spinner_demo"
+local switch_demo = require "switch_demo"
+local table_demo = require "table_demo"
+local tabview_demo = require "tabview_demo"
+local textarea = require "textarea"
+local tileview_demo = require "tileview_demo"
+local win_demo = require "win_demo"
+
+_G.symbol = require "symbol"
+
+sys.taskInit(function ()
+    log.info("lvgl", lvgl.init(480,320))
+
+    -- arc_demo.demo()
+    -- bar_demo.demo()
+    -- btn_demo.demo()
+    -- btnmatrix_demo.demo()
+    -- calendar_demo.demo()
+    -- canvas.demo()
+    -- checkbox_demo.demo()
+    -- chart_demo.demo()
+    -- cont_demo.demo()
+    -- cpicker_demo.demo()
+    -- dropdown.demo()
+    -- gauge_demo.demo()
+    -- img_demo.demo()
+    -- imgbtn_demo.demo()
+    -- keyboard.demo()
+    -- label_demo.demo()
+    -- led_demo.demo()
+    -- line_demo.demo()
+    -- list_demo.demo()
+    -- lmeter_demo.demo()
+    -- msdbox_demo.demo()
+    -- objmask.demo()
+    -- page_demo.demo()
+    -- roller.demo()
+    -- slider_demo.demo()
+    -- spinbox_demo.demo()
+    -- spinner_demo.demo()
+    -- switch_demo.demo()
+    -- table_demo.demo()
+    -- tabview_demo.demo()
+    -- textarea.demo()
+    -- tileview_demo.demo()
+    win_demo.demo()
+
+    while true do
+        sys.wait(1000)
+    end
+end)
+
+sys.run()

+ 20 - 0
bsp/win32/test/lvgl_demo_test/msdbox_demo.lua

@@ -0,0 +1,20 @@
+local msdbox_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        print(string.format("Button: %s\n", lvgl.msgbox_get_active_btn_text(obj)));
+    end
+end
+
+function msdbox_demo.demo()
+    local  btns ={"Apply", "Close", ""};
+
+    local mbox1 = lvgl.msgbox_create(lvgl.scr_act(), NULL);
+    lvgl.msgbox_set_text(mbox1, "A message box with two buttons.");
+    lvgl.msgbox_add_btns(mbox1, btns);----
+    lvgl.obj_set_width(mbox1, 200);
+    lvgl.obj_set_event_cb(mbox1, event_handler);
+    lvgl.obj_align(mbox1, nil, lvgl.ALIGN_CENTER, 0, 0); --Align to the corner
+end
+
+return msdbox_demo

+ 73 - 0
bsp/win32/test/lvgl_demo_test/objmask.lua

@@ -0,0 +1,73 @@
+local objmask = {}
+
+function objmask.demo()
+    --Set a very visible color for the screen to clearly see what happens*/
+    -- lvgl.obj_set_style_local_bg_color(lvgl.scr_act(), lvgl.OBJ_PART_MAIN, lvgl.STATE_DEFAULT, lvgl.color_hex3(0xf33));
+
+    -- local om = lvgl.objmask_create(lvgl.scr_act(), nil);
+    -- lvgl.obj_set_size(om, 200, 200);
+    -- lvgl.obj_align(om, nil, lvgl.ALIGN_CENTER, 0, 0);
+    -- local label = lvgl.label_create(om, nil);
+    -- lvgl.label_set_long_mode(label, lvgl.LABEL_LONG_BREAK);
+    -- lvgl.label_set_align(label, lvgl.LABEL_ALIGN_CENTER);
+    -- lvgl.obj_set_width(label, 180);
+    -- lvgl.label_set_text(label, "This label will be masked out. See how it works.");
+    -- lvgl.obj_align(label, nil, lvgl.ALIGN_IN_TOP_MID, 0, 20);
+
+    -- local cont = lvgl.cont_create(om, nil);
+    -- lvgl.obj_set_size(cont, 180, 100);
+    -- lvgl.obj_set_drag(cont, true);
+    -- lvgl.obj_align(cont, nil, lvgl.ALIGN_IN_BOTTOM_MID, 0, -10);
+
+    -- local btn = lvgl.btn_create(cont, nil);
+    -- lvgl.obj_align(btn, nil, lvgl.ALIGN_CENTER, 0, 0);
+    -- lvgl.obj_set_style_local_value_str(btn, lvgl.BTN_PART_MAIN, lvgl.STATE_DEFAULT, "Button");
+    -- local t;
+
+    -- lvgl.refr_now(nil);
+    -- t = lvgl.tick_get();
+    -- while(lvgl.tick_elaps(t) < 1000);
+
+    -- lvgl.area_t a;
+    -- lvgl.draw_mask_radius_param_t r1;
+
+    -- a.x1 = 10;
+    -- a.y1 = 10;
+    -- a.x2 = 190;
+    -- a.y2 = 190;
+    -- lvgl.draw_mask_radius_init(r1, a, lvgl.RADIUS_CIRCLE, false);
+    -- lvgl.objmask_add_mask(om, r1);
+
+    -- lvgl.refr_now(nil);
+    -- t = lvgl.tick_get();
+    -- while(lvgl.tick_elaps(t) < 1000);
+
+    -- a.x1 = 100;
+    -- a.y1 = 100;
+    -- a.x2 = 150;
+    -- a.y2 = 150;
+    -- lvgl.draw_mask_radius_init(r1, a, lvgl.RADIUS_CIRCLE, true);
+    -- lvgl.objmask_add_mask(om, r1);
+
+    -- lvgl.refr_now(nil);
+    -- t = lvgl.tick_get();
+    -- while(lvgl.tick_elaps(t) < 1000);
+
+    -- lvgl.draw_mask_line_param_t l1;
+    -- lvgl.draw_mask_line_points_init(l1, 0, 0, 100, 200, lvgl.DRAW_MASK_LINE_SIDE_TOP);
+    -- lvgl.objmask_add_mask(om, l1);
+
+    -- lvgl.refr_now(nil);
+    -- t = lvgl.tick_get();
+    -- while(lvgl.tick_elaps(t) < 1000);
+
+    -- lvgl.draw_mask_fade_param_t f1;
+    -- a.x1 = 100;
+    -- a.y1 = 0;
+    -- a.x2 = 200;
+    -- a.y2 = 200;
+    -- lvgl.draw_mask_fade_init(f1, a, lvgl.OPA_TRANSP, 0, lvgl.OPA_COVER, 150);
+    -- lvgl.objmask_add_mask(om, f1);
+end
+
+return objmask

+ 23 - 0
bsp/win32/test/lvgl_demo_test/page_demo.lua

@@ -0,0 +1,23 @@
+local page_demo = {}
+
+function page_demo.demo()
+    --Create a page
+    local page = lvgl.page_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(page, 150, 200);
+    lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    --Create a label on the page
+    local label = lvgl.label_create(page, nil);
+    lvgl.label_set_long_mode(label, lvgl.LABEL_LONG_BREAK);            --Automatically break long lines
+    lvgl.obj_set_width(label, lvgl.page_get_width_fit(page));          --Set the label width to max value to not show hor. scroll bars
+    lvgl.label_set_text(label, 
+[[Lorem ipsum dolor sit amet, consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco
+laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
+dolor in reprehenderit in voluptate velit esse cillum dolore
+eu fugiat nulla pariatur.
+Excepteur sint occaecat cupidatat non proident, sunt in culpa
+qui officia deserunt mollit anim id est laborum.]]);
+end
+
+return page_demo

+ 34 - 0
bsp/win32/test/lvgl_demo_test/roller.lua

@@ -0,0 +1,34 @@
+local roller = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        -- char buf[32];
+        -- lvgl.roller_get_selected_str(obj, buf, sizeof(buf));
+        -- printf("Selected month: %s\n", buf);
+        -- print(string.format("Clicked: %s\n", lvgl.list_get_btn_text(obj)));
+    end
+end
+
+function roller.demo()
+    local roller1 = lvgl.roller_create(lvgl.scr_act(), nil);
+    lvgl.roller_set_options(roller1,
+[[January
+February
+March
+April
+May
+June
+July
+August
+September
+October
+November
+December]],
+lvgl.ROLLER_MODE_INFINITE);
+
+    lvgl.roller_set_visible_row_count(roller1, 4);
+    lvgl.obj_align(roller1, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.obj_set_event_cb(roller1, event_handler);
+end
+
+return roller

+ 16 - 0
bsp/win32/test/lvgl_demo_test/slider_demo.lua

@@ -0,0 +1,16 @@
+local slider_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        print(string.format("Value: %d\n", lvgl.slider_get_value(obj)));
+    end
+end
+
+function slider_demo.demo()
+    --Create a slider
+    local slider = lvgl.slider_create(lvgl.scr_act(), nil);
+    lvgl.obj_align(slider, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.obj_set_event_cb(slider, event_handler);
+end
+
+return slider_demo

+ 39 - 0
bsp/win32/test/lvgl_demo_test/spinbox_demo.lua

@@ -0,0 +1,39 @@
+local spinbox_demo = {}
+
+local spinbox
+
+local function lv_spinbox_increment_event_cb(btn, e)
+    if(e == lvgl.EVENT_SHORT_CLICKED or e == lvgl.EVENT_LONG_PRESSED_REPEAT) then
+        lvgl.spinbox_increment(spinbox);
+    end
+end
+
+local function lv_spinbox_decrement_event_cb(btn, e)
+    if(e == lvgl.EVENT_SHORT_CLICKED or e == lvgl.EVENT_LONG_PRESSED_REPEAT) then
+        lvgl.spinbox_decrement(spinbox);
+    end
+end
+
+function spinbox_demo.demo()
+    spinbox = lvgl.spinbox_create(lvgl.scr_act(), nil);
+    lvgl.spinbox_set_range(spinbox, -1000, 90000);
+    lvgl.spinbox_set_digit_format(spinbox, 5, 2);
+    lvgl.spinbox_step_prev(spinbox);
+    lvgl.obj_set_width(spinbox, 100);
+    lvgl.obj_align(spinbox, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    local h = lvgl.obj_get_height(spinbox);
+    local btn = lvgl.btn_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(btn, h, h);
+    lvgl.obj_align(btn, spinbox, lvgl.ALIGN_OUT_RIGHT_MID, 5, 0);
+    lvgl.theme_apply(btn, lvgl.THEME_SPINBOX_BTN);
+    lvgl.obj_set_style_local_value_str(btn, lvgl.BTN_PART_MAIN, lvgl.STATE_DEFAULT, LV_SYMBOL_PLUS);
+    lvgl.obj_set_event_cb(btn, lv_spinbox_increment_event_cb);
+
+    btn = lvgl.btn_create(lvgl.scr_act(), btn);
+    lvgl.obj_align(btn, spinbox, lvgl.ALIGN_OUT_LEFT_MID, -5, 0);
+    lvgl.obj_set_event_cb(btn, lv_spinbox_decrement_event_cb);
+    lvgl.obj_set_style_local_value_str(btn, lvgl.BTN_PART_MAIN, lvgl.STATE_DEFAULT, LV_SYMBOL_MINUS);
+end
+
+return spinbox_demo

+ 10 - 0
bsp/win32/test/lvgl_demo_test/spinner_demo.lua

@@ -0,0 +1,10 @@
+local spinner_demo = {}
+
+function spinner_demo.demo()
+    --Create a Preloader object
+    local preload = lvgl.spinner_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(preload, 100, 100);
+    lvgl.obj_align(preload, nil, lvgl.ALIGN_CENTER, 0, 0);
+end
+
+return spinner_demo

+ 25 - 0
bsp/win32/test/lvgl_demo_test/switch_demo.lua

@@ -0,0 +1,25 @@
+local switch_demo = {}
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        if lvgl.switch_get_state(obj) == true then
+            print("State: On\n")
+        else
+            print("State: Off\n")
+        end
+    end
+end
+
+function switch_demo.demo()
+    --Create a switch and apply the styles
+    local sw1 = lvgl.switch_create(lvgl.scr_act(), nil);
+    lvgl.obj_align(sw1, nil, lvgl.ALIGN_CENTER, 0, -50);
+    lvgl.obj_set_event_cb(sw1, event_handler);
+
+    --Copy the first switch and turn it ON
+    local sw2 = lvgl.switch_create(lvgl.scr_act(), sw1);
+    lvgl.switch_on(sw2, lvgl.ANIM_ON);
+    lvgl.obj_align(sw2, nil, lvgl.ALIGN_CENTER, 0, 50);
+end
+
+return switch_demo

+ 68 - 0
bsp/win32/test/lvgl_demo_test/symbol.lua

@@ -0,0 +1,68 @@
+local symbol = {}
+
+_G.LV_SYMBOL_AUDIO           =    "\xef\x80\x81"-- 61441, 0xF001
+_G.LV_SYMBOL_VIDEO           =    "\xef\x80\x88"-- 61448, 0xF008
+_G.LV_SYMBOL_LIST            =    "\xef\x80\x8b"-- 61451, 0xF00B
+_G.LV_SYMBOL_OK              =    "\xef\x80\x8c"-- 61452, 0xF00C
+_G.LV_SYMBOL_CLOSE           =    "\xef\x80\x8d"-- 61453, 0xF00D
+_G.LV_SYMBOL_POWER           =    "\xef\x80\x91"-- 61457, 0xF011
+_G.LV_SYMBOL_SETTINGS        =    "\xef\x80\x93"-- 61459, 0xF013
+_G.LV_SYMBOL_HOME            =    "\xef\x80\x95"-- 61461, 0xF015
+_G.LV_SYMBOL_DOWNLOAD        =    "\xef\x80\x99"-- 61465, 0xF019
+_G.LV_SYMBOL_DRIVE           =    "\xef\x80\x9c"-- 61468, 0xF01C
+_G.LV_SYMBOL_REFRESH         =    "\xef\x80\xa1"-- 61473, 0xF021
+_G.LV_SYMBOL_MUTE            =    "\xef\x80\xa6"-- 61478, 0xF026
+_G.LV_SYMBOL_VOLUME_MID      =    "\xef\x80\xa7"-- 61479, 0xF027
+_G.LV_SYMBOL_VOLUME_MAX      =    "\xef\x80\xa8"-- 61480, 0xF028
+_G.LV_SYMBOL_IMAGE           =    "\xef\x80\xbe"-- 61502, 0xF03E
+_G.LV_SYMBOL_EDIT            =    "\xef\x8C\x84"-- 62212, 0xF304
+_G.LV_SYMBOL_PREV            =    "\xef\x81\x88"-- 61512, 0xF048
+_G.LV_SYMBOL_PLAY            =    "\xef\x81\x8b"-- 61515, 0xF04B
+_G.LV_SYMBOL_PAUSE           =    "\xef\x81\x8c"-- 61516, 0xF04C
+_G.LV_SYMBOL_STOP            =    "\xef\x81\x8d"-- 61517, 0xF04D
+_G.LV_SYMBOL_NEXT            =    "\xef\x81\x91"-- 61521, 0xF051
+_G.LV_SYMBOL_EJECT           =    "\xef\x81\x92"-- 61522, 0xF052
+_G.LV_SYMBOL_LEFT            =    "\xef\x81\x93"-- 61523, 0xF053
+_G.LV_SYMBOL_RIGHT           =    "\xef\x81\x94"-- 61524, 0xF054
+_G.LV_SYMBOL_PLUS            =    "\xef\x81\xa7"-- 61543, 0xF067
+_G.LV_SYMBOL_MINUS           =    "\xef\x81\xa8"-- 61544, 0xF068
+_G.LV_SYMBOL_EYE_OPEN        =    "\xef\x81\xae"-- 61550, 0xF06E
+_G.LV_SYMBOL_EYE_CLOSE       =    "\xef\x81\xb0"-- 61552, 0xF070
+_G.LV_SYMBOL_WARNING         =    "\xef\x81\xb1"-- 61553, 0xF071
+_G.LV_SYMBOL_SHUFFLE         =    "\xef\x81\xb4"-- 61556, 0xF074
+_G.LV_SYMBOL_UP              =    "\xef\x81\xb7"-- 61559, 0xF077
+_G.LV_SYMBOL_DOWN            =    "\xef\x81\xb8"-- 61560, 0xF078
+_G.LV_SYMBOL_LOOP            =    "\xef\x81\xb9"-- 61561, 0xF079
+_G.LV_SYMBOL_DIRECTORY       =    "\xef\x81\xbb"-- 61563, 0xF07B
+_G.LV_SYMBOL_UPLOAD          =    "\xef\x82\x93"-- 61587, 0xF093
+_G.LV_SYMBOL_CALL            =    "\xef\x82\x95"-- 61589, 0xF095
+_G.LV_SYMBOL_CUT             =    "\xef\x83\x84"-- 61636, 0xF0C4
+_G.LV_SYMBOL_COPY            =    "\xef\x83\x85"-- 61637, 0xF0C5
+_G.LV_SYMBOL_SAVE            =    "\xef\x83\x87"-- 61639, 0xF0C7
+_G.LV_SYMBOL_CHARGE          =    "\xef\x83\xa7"-- 61671, 0xF0E7
+_G.LV_SYMBOL_PASTE           =    "\xef\x83\xAA"-- 61674, 0xF0EA
+_G.LV_SYMBOL_BELL            =    "\xef\x83\xb3"-- 61683, 0xF0F3
+_G.LV_SYMBOL_KEYBOARD        =    "\xef\x84\x9c"-- 61724, 0xF11C
+_G.LV_SYMBOL_GPS             =    "\xef\x84\xa4"-- 61732, 0xF124
+_G.LV_SYMBOL_FILE            =    "\xef\x85\x9b"-- 61787, 0xF158
+_G.LV_SYMBOL_WIFI            =    "\xef\x87\xab"-- 61931, 0xF1EB
+_G.LV_SYMBOL_BATTERY_FULL    =    "\xef\x89\x80"-- 62016, 0xF240
+_G.LV_SYMBOL_BATTERY_3       =    "\xef\x89\x81"-- 62017, 0xF241
+_G.LV_SYMBOL_BATTERY_2       =    "\xef\x89\x82"-- 62018, 0xF242
+_G.LV_SYMBOL_BATTERY_1       =    "\xef\x89\x83"-- 62019, 0xF243
+_G.LV_SYMBOL_BATTERY_EMPTY   =    "\xef\x89\x84"-- 62020, 0xF244
+_G.LV_SYMBOL_USB             =    "\xef\x8a\x87"-- 62087, 0xF287
+_G.LV_SYMBOL_BLUETOOTH       =    "\xef\x8a\x93"-- 62099, 0xF293
+_G.LV_SYMBOL_TRASH           =    "\xef\x8B\xAD"-- 62189, 0xF2ED
+_G.LV_SYMBOL_BACKSPACE       =    "\xef\x95\x9A"-- 62810, 0xF55A
+_G.LV_SYMBOL_SD_CARD         =    "\xef\x9F\x82"-- 63426, 0xF7C2
+_G.LV_SYMBOL_NEW_LINE        =    "\xef\xA2\xA2"-- 63650, 0xF8A2
+_G.LV_SYMBOL_DUMMY           =    "\xEF\xA3\xBF"--
+_G.LV_SYMBOL_BULLET          =    "\xE2\x80\xA2"-- 20042, 0x2022
+
+return symbol
+
+
+
+
+

+ 36 - 0
bsp/win32/test/lvgl_demo_test/table_demo.lua

@@ -0,0 +1,36 @@
+local table_demo = {}
+
+function table_demo.demo()
+    local table = lvgl.table_create(lvgl.scr_act(), nil);
+    lvgl.table_set_col_cnt(table, 2);
+    lvgl.table_set_row_cnt(table, 4);
+    lvgl.obj_align(table, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    --Make the cells of the first row center aligned 
+    lvgl.table_set_cell_align(table, 0, 0, lvgl.LABEL_ALIGN_CENTER);
+    lvgl.table_set_cell_align(table, 0, 1, lvgl.LABEL_ALIGN_CENTER);
+
+    --Align the price values to the right in the 2nd column
+    lvgl.table_set_cell_align(table, 1, 1, lvgl.LABEL_ALIGN_RIGHT);
+    lvgl.table_set_cell_align(table, 2, 1, lvgl.LABEL_ALIGN_RIGHT);
+    lvgl.table_set_cell_align(table, 3, 1, lvgl.LABEL_ALIGN_RIGHT);
+
+    lvgl.table_set_cell_type(table, 0, 0, 2);
+    lvgl.table_set_cell_type(table, 0, 1, 2);
+
+
+    --Fill the first column
+    lvgl.table_set_cell_value(table, 0, 0, "Name");
+    lvgl.table_set_cell_value(table, 1, 0, "Apple");
+    lvgl.table_set_cell_value(table, 2, 0, "Banana");
+    lvgl.table_set_cell_value(table, 3, 0, "Citron");
+
+    --Fill the second column
+    lvgl.table_set_cell_value(table, 0, 1, "Price");
+    lvgl.table_set_cell_value(table, 1, 1, "$7");
+    lvgl.table_set_cell_value(table, 2, 1, "$4");
+    lvgl.table_set_cell_value(table, 3, 1, "$6");
+
+end
+
+return table_demo

+ 33 - 0
bsp/win32/test/lvgl_demo_test/tabview_demo.lua

@@ -0,0 +1,33 @@
+local tabview_demo = {}
+
+function tabview_demo.demo()
+    --Create a Tab view object
+    local tabview;
+    tabview = lvgl.tabview_create(lvgl.scr_act(), nil);
+
+    --Add 3 tabs (the tabs are page (lvgl.page) and can be scrolled
+    local tab1 = lvgl.tabview_add_tab(tabview, "Tab 1");
+    local tab2 = lvgl.tabview_add_tab(tabview, "Tab 2");
+    local tab3 = lvgl.tabview_add_tab(tabview, "Tab 3");
+
+
+    --Add content to the tabs
+    local label = lvgl.label_create(tab1, nil);
+    lvgl.label_set_text(label, 
+[[This the first tab
+If the content
+of a tab
+become too long
+the it 
+automatically
+become
+scrollable.]]);
+
+    label = lvgl.label_create(tab2, nil);
+    lvgl.label_set_text(label, "Second tab");
+
+    label = lvgl.label_create(tab3, nil);
+    lvgl.label_set_text(label, "Third tab");
+end
+
+return tabview_demo

+ 33 - 0
bsp/win32/test/lvgl_demo_test/textarea.lua

@@ -0,0 +1,33 @@
+local textarea = {}
+
+local ta1;
+
+local function event_handler(obj, event)
+    if(event == lvgl.EVENT_VALUE_CHANGED) then
+        print(string.format("Value: %s\n", lvgl.textarea_get_text(obj)));
+    elseif (event == lvgl.EVENT_LONG_PRESSED_REPEAT) then
+        --For simple test: Long press the Text are to add the text below
+        local txt = "\n\nYou can scroll it if the text is long enough.\n";
+        local i = 1;
+
+        if(txt.sub(i,i) ~= '\0') then
+            print(txt.sub(i,i))
+            lvgl.textarea_add_char(ta1, txt.sub(i,i+1));
+            i=i+1;
+        end
+        -- if(txt[i] ~= '\0') then
+        --     lvgl.textarea_add_char(ta1, txt[i]);
+        --     i=i+1;
+        -- end
+    end
+end
+
+function textarea.demo()
+    ta1 = lvgl.textarea_create(lvgl.scr_act(), nil);
+    lvgl.obj_set_size(ta1, 200, 100);
+    lvgl.obj_align(ta1, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.textarea_set_text(ta1, "A text in a Text Area");    --Set an initial text
+    lvgl.obj_set_event_cb(ta1, event_handler);
+end
+
+return textarea

+ 50 - 0
bsp/win32/test/lvgl_demo_test/tileview_demo.lua

@@ -0,0 +1,50 @@
+local tileview_demo = {}
+
+local LV_VER_RES = lvgl.disp_get_ver_res(lvgl.disp_get_default())
+local LV_HOR_RES = lvgl.disp_get_hor_res(lvgl.disp_get_default())
+
+function tileview_demo.demo()
+    local valid_pos = {{0,0}, {0, 1}, {1,1}};
+    local tileview;
+    tileview = lvgl.tileview_create(lvgl.scr_act(), nil);
+    lvgl.tileview_set_valid_positions(tileview, valid_pos, 3);
+    lvgl.tileview_set_edge_flash(tileview, true);
+
+    local tile1 = lvgl.obj_create(tileview, nil);
+    lvgl.obj_set_size(tile1, LV_HOR_RES, LV_VER_RES);
+    lvgl.tileview_add_element(tileview, tile1);
+
+    --Tile1: just a label
+    local label = lvgl.label_create(tile1, nil);
+    lvgl.label_set_text(label, "Scroll down");
+    lvgl.obj_align(label, nil, lvgl.ALIGN_CENTER, 0, 0);
+
+    --Tile2: a list
+    local list = lvgl.list_create(tileview, nil);
+    lvgl.obj_set_size(list, LV_HOR_RES, LV_VER_RES);
+    lvgl.obj_set_pos(list, 0, LV_VER_RES);
+    lvgl.list_set_scroll_propagation(list, true);
+    lvgl.list_set_scrollbar_mode(list, lvgl.SCROLLBAR_MODE_OFF);
+
+    lvgl.list_add_btn(list, nil, "One");
+    lvgl.list_add_btn(list, nil, "Two");
+    lvgl.list_add_btn(list, nil, "Three");
+    lvgl.list_add_btn(list, nil, "Four");
+    lvgl.list_add_btn(list, nil, "Five");
+    lvgl.list_add_btn(list, nil, "Six");
+    lvgl.list_add_btn(list, nil, "Seven");
+    lvgl.list_add_btn(list, nil, "Eight");
+
+    --Tile3: a button
+    local tile3 = lvgl.obj_create(tileview, tile1);
+    lvgl.obj_set_pos(tile3, LV_HOR_RES, LV_VER_RES);
+    lvgl.tileview_add_element(tileview, tile3);
+
+    local btn = lvgl.btn_create(tile3, nil);
+    lvgl.obj_align(btn, nil, lvgl.ALIGN_CENTER, 0, 0);
+    lvgl.tileview_add_element(tileview, btn);
+    label = lvgl.label_create(btn, nil);
+    lvgl.label_set_text(label, "No scroll up");
+end
+
+return tileview_demo

+ 27 - 0
bsp/win32/test/lvgl_demo_test/win_demo.lua

@@ -0,0 +1,27 @@
+local win_demo = {}
+
+function win_demo.demo()
+    --Create a window
+    local win = lvgl.win_create(lvgl.scr_act(), nil);
+    lvgl.win_set_title(win, "Window title");                        --Set the title
+
+
+    --Add control button to the header
+    local close_btn = lvgl.win_add_btn(win, LV_SYMBOL_CLOSE);           --Add close button and use built-in close action
+    lvgl.obj_set_event_cb(close_btn, lvgl.win_close_event_cb);
+    lvgl.win_add_btn(win, LV_SYMBOL_SETTINGS);        --Add a setup button
+
+    --Add some dummy content
+    local txt = lvgl.label_create(win, nil);
+    lvgl.label_set_text(txt,
+[[This is the content of the window
+You can add control buttons to
+the window header
+The content area becomes
+automatically scrollable is it's 
+large enough.
+You can scroll the content
+See the scroll bar on the right!]]);
+end
+
+return win_demo

+ 2 - 1
components/lvgl/binding/luat_lib_lvgl.c

@@ -120,7 +120,7 @@ LUAT_LV_TABVIEW_RLT
 LUAT_LV_TEXTAREA_RLT
 LUAT_LV_TILEVIEW_RLT
 LUAT_LV_WIN_RLT
-
+LUAT_LV_LINEMETER_RLT
 LUAT_LV_MAP_RLT
 LUAT_LV_GAUGE_EX_RLT
 LUAT_LV_CALENDAR_EX_RLT
@@ -143,6 +143,7 @@ LUAT_LV_IMG_EXT_RTL
 LUAT_LV_IMGBTN2_RTL
 LUAT_LV_LINE_EX_RLT
 LUAT_LV_EX_RLT
+LUAT_LV_WIDGETS_EX_RLT
 // 字体API
 LUAT_LV_FONT2_RLT
 

+ 7 - 0
components/lvgl/binding/luat_lib_lvgl_map.c

@@ -62,3 +62,10 @@ int luat_lv_obj_align_origo_y(lua_State *L) {
     return 1;
 }
 
+int luat_lv_win_add_btn(lua_State *L) {
+    lv_obj_t * win = lua_touserdata(L, 1);
+    const char* img_src = luaL_checkstring(L, 2);
+    lv_obj_t *btn = lv_win_add_btn(win, img_src);
+    lua_pushlightuserdata(L, btn);
+    return 1;
+}

+ 58 - 0
components/lvgl/binding/luat_lib_lvgl_widgets_ex.c

@@ -0,0 +1,58 @@
+/*
+@module  lvgl
+@summary LVGL图像库
+@version 1.0
+@date    2021.06.01
+*/
+
+#include "luat_base.h"
+#include "lvgl.h"
+#include "luat_lvgl.h"
+#include "luat_malloc.h"
+
+int luat_lv_msgbox_add_btns(lua_State *L) {
+    LV_DEBUG("CALL lv_msgbox_add_btns");
+    lv_obj_t* mbox = (lv_obj_t*)lua_touserdata(L, 1);
+    char **btn_mapaction;
+    if (lua_istable(L,2)){
+        int n = luaL_len(L, 2);
+        btn_mapaction = (char**)luat_heap_calloc(n,sizeof(char*));
+        for (int i = 0; i < n; i++) {  
+            lua_pushnumber(L, i+1);
+            if (LUA_TSTRING == lua_gettable(L, 2)) {
+                char* btn_mapaction_str = luaL_checkstring(L, -1);
+                printf("%d: %s\r\n",i,btn_mapaction_str);
+                btn_mapaction[i] =luat_heap_calloc(1,strlen(btn_mapaction_str)+1);
+                memcpy(btn_mapaction[i],btn_mapaction_str,strlen(btn_mapaction_str)+1);
+                };
+            lua_pop(L, 1);
+        }  
+    }
+    lv_msgbox_add_btns(mbox,btn_mapaction);
+    return 1;
+}
+
+int luat_lv_tileview_set_valid_positions(lua_State *L) {
+    LV_DEBUG("CALL lv_tileview_set_valid_positions");
+    lv_obj_t* tileview = (lv_obj_t*)lua_touserdata(L, 1);
+    uint16_t valid_pos_cnt = (uint16_t)luaL_checkinteger(L, 3);
+    lv_point_t *valid_pos;
+    valid_pos = (lv_point_t*)luat_heap_calloc(valid_pos_cnt,sizeof(lv_point_t));
+    if (lua_istable(L,2)){
+        for (int m = 0; m < valid_pos_cnt; m++) {  
+            lua_pushinteger(L, m+1);
+            if (LUA_TTABLE == lua_gettable(L, 2)) {
+                    lua_geti(L,-1,1);
+                    valid_pos[m].x=luaL_checkinteger(L,-1);
+                    lua_pop(L, 1);
+                    lua_geti(L,-1,2);
+                    valid_pos[m].y=luaL_checkinteger(L,-1);
+                    lua_pop(L, 1);
+            }
+            lua_pop(L, 1);
+        }
+    }
+    lv_tileview_set_valid_positions(tileview,valid_pos,valid_pos_cnt);
+    luat_heap_free(valid_pos);
+    return 1;
+}

+ 1 - 0
components/lvgl/binding/luat_lvgl.h

@@ -38,6 +38,7 @@ void luat_lv_fs_init(void);
 #include "luat_lvgl_calendar_ex.h"
 #include "luat_lvgl_ex.h"
 #include "luat_lvgl_line_ex.h"
+#include "luat_lvgl_widgets_ex.h"
 
 #include "luat_lvgl_fonts.h"
 #include "luat_lvgl_font.h"

+ 2 - 0
components/lvgl/binding/luat_lvgl_map.h

@@ -12,11 +12,13 @@ int luat_lv_chart_clear_serie(lua_State *L);
 int luat_lv_obj_align_origo(lua_State *L);
 int luat_lv_obj_align_origo_x(lua_State *L);
 int luat_lv_obj_align_origo_y(lua_State *L);
+int luat_lv_win_add_btn(lua_State *L);
 
 #define LUAT_LV_MAP_RLT {"obj_align_origo", luat_lv_obj_align_origo, 0},\
 {"obj_align_origo_x", luat_lv_obj_align_origo_x, 0},\
 {"obj_align_origo_y", luat_lv_obj_align_origo_y, 0},\
 {"chart_set_range", luat_lv_chart_set_range, 0},\
 {"chart_clear_serie", luat_lv_chart_clear_serie, 0},\
+{"win_add_btn", luat_lv_win_add_btn, 0},\
 
 #endif

+ 14 - 0
components/lvgl/binding/luat_lvgl_widgets_ex.h

@@ -0,0 +1,14 @@
+
+#ifndef LUAT_LVGL_WIDGETS_EX
+#define LUAT_LVGL_WIDGETS_EX
+
+#include "luat_base.h"
+#include "lvgl.h"
+
+int luat_lv_msgbox_add_btns(lua_State *L);
+int luat_lv_tileview_set_valid_positions(lua_State *L);
+
+#define LUAT_LV_WIDGETS_EX_RLT {"msgbox_add_btns", luat_lv_msgbox_add_btns, 0},\
+{"tileview_set_valid_positions", luat_lv_tileview_set_valid_positions, 0},\
+
+#endif