# lvgl-lua-binding lua + lvgl = luavgl **luavgl is currently under development.** A flappy bird game is ready for showoff. See simulator instructions below which is tested on ubuntu and mac but not windows.

## Introduction `luavgl` is a wrapper around lvgl **core** functions and **widgets** with class inherence in mind, which is lvgl trying to do in `C`. Lua makes widgets inherence happens smoothly. `luavgl` does not support APIs for low level hardware initialization, lvgl setup etc. Those initialization must be done before executing lua scripts. `luavgl` mainly targets for embedded device, a simulator has been provided for preview and tested on Ubuntu/macOS. ```lua local root = lvgl.Object() root:set { w = lvgl.HOR_RES(), h = lvgl.VER_RES() } -- flex layout and align root:set { flex = { flex_direction = "row", flex_wrap = "wrap", justify_content = "center", align_items = "center", align_content = "center", }, w = 300, h = 75, align = lvgl.ALIGN.CENTER } -- create obj on root local obj = root:Object() -- create image on root and set position/img src/etc. properties. local img = root:Image { src = "res/image.png", x = 0, y = 0, bg_color = "#112233" -- #RRGGBB, 0xRRGGBB or "#RGB" pad_all = 0 } -- change image properties. img:set { src = "/assets/lvgl-logo.png", align = lvgl.ALIGN.CENTER, } -- create animation on object img:Anim { run = true, start_value = 0, end_value = 3600, duration = 2000, repeat_count = 2, path = "bounce", exec_cb = function(obj, value) obj:set { angle = value } end } -- create Label on root and set its font local label = root:Label { text = string.format("Hello %03d", 123), text_font = lvgl.Font("montserrat", 24, "normal"), -- or builtin font: -- text_font = lvgl.BUILTIN_FONT.MONTSERRAT_22, align = { type = lvgl.ALIGN.CENTER, x_ofs = 0, y_ofs = 100, } } ``` ### Embedded device For embedded device, lvgl environment must setup before using `luavgl`. Once `lvgl` and `lua interpreter` are up and running, add the `luavgl.c` to sources for compiling. And make sure `luaopen_lvgl` is added to global lib. Below is example from `simulator/main.c` shows this exact method. ```c /* add `lvgl` module to global package table */ luaL_requiref(L, "lvgl", luaopen_luavgl, 1); lua_pop(L, 1); ``` ### LuaJIT support Supporting `LuaJIT` is done by adding `deps/lua-compat-5.3`. ### Developing I personally using `vscode` plus extension [`Lua`](https://marketplace.visualstudio.com/items?itemName=sumneko.lua). File `src/lvgl.lua` is used for linting.

### Run on RTOS nuttx Check the ready-to-go examples [luavgl-nuttx-example](https://github.com/XuNeo/luavgl-nuttx-example) ### PC simulator **Currently compile luavgl to `so` or `dll` is NOT available.** `luavgl` depends on lvgl and various configurations(`lv_conf.h`), thus cannot run without a working lvgl environment. The simulator provided in this repo can be used as example if `luavgl` is required on PC. Make sure clone the submodules, luavgl simulator comes directly from lvgl simulator with lua added. ```bash git clone --recursive https://github.com/XuNeo/luavgl.git # or git sudmodule update --init ``` #### Dependencies To run simulator on PC, make sure `lua` header is available, you may need to install below packages. ``` sudo apt install libsdl2-dev lua5.3 liblua5.3-dev ``` Both lua5.3 and lua5.4 are supported. Versions below 5.2 has not been verified but should work through `deps/lua-compat-5.3`. #### Build and run ```bash cmake -Bbuild -DBUILD_SIMULATOR=ON cd build make make run # run simulator ``` ## Custom Widget `luavgl` support custom widget, and use them in `lua` just like lvgl core widgets. An example is provided in [`simulator/extension.c`](https://github.com/XuNeo/luavgl/blob/master/simulator/extension.c#L62) For custom widget, it should be registered to Lua after luavgl lib loaded.