luat_lib_lvgl.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /*
  2. @module lvgl
  3. @summary LVGL图像库
  4. @version 1.0
  5. @date 2021.06.01
  6. */
  7. #include "luat_base.h"
  8. #include "luat_msgbus.h"
  9. #include "luat_lvgl.h"
  10. #define LUAT_LOG_TAG "lvgl"
  11. #include "luat_log.h"
  12. //---------------------------------
  13. // 几个快捷方法
  14. //---------------------------------
  15. /*
  16. 获取当前活跃的screen对象
  17. @api lvgl.scr_act()
  18. @return screen指针
  19. @usage
  20. local scr = lvgl.scr_act()
  21. */
  22. static int luat_lv_scr_act(lua_State *L) {
  23. lua_pushlightuserdata(L, lv_scr_act());
  24. return 1;
  25. };
  26. /*
  27. 获取layer_top
  28. @api lvgl.layer_top()
  29. @return layer指针
  30. */
  31. static int luat_lv_layer_top(lua_State *L) {
  32. lua_pushlightuserdata(L, lv_layer_top());
  33. return 1;
  34. };
  35. /*
  36. 获取layer_sys
  37. @api lvgl.layer_sys()
  38. @return layer指针
  39. */
  40. static int luat_lv_layer_sys(lua_State *L) {
  41. lua_pushlightuserdata(L, lv_layer_sys());
  42. return 1;
  43. };
  44. /*
  45. 载入指定的screen
  46. @api lvgl.scr_load(scr)
  47. @userdata screen指针
  48. @usage
  49. local scr = lvgl.obj_create(nil, nil)
  50. local btn = lvgl.btn_create(scr)
  51. lvgl.obj_align(btn, lvgl.scr_act(), lvgl.ALIGN_CENTER, 0, 0)
  52. local label = lvgl.label_create(btn)
  53. lvgl.label_set_text(label, "LuatOS!")
  54. lvgl.scr_load(scr)
  55. */
  56. static int luat_lv_scr_load(lua_State *L) {
  57. lv_scr_load(lua_touserdata(L, 1));
  58. return 0;
  59. };
  60. /*
  61. 设置主题
  62. @api lvgl.theme_set_act(name)
  63. @string 主题名称,可选值有 default/mono/empty/material_light/material_dark/material_no_transition/material_no_focus
  64. @return bool 成功返回true,否则返回nil
  65. @usage
  66. -- 黑白主题
  67. lvgl.theme_set_act("mono")
  68. -- 空白主题
  69. lvgl.theme_set_act("empty")
  70. */
  71. static int l_lv_theme_set_act(lua_State *L) {
  72. const char* name = luaL_checkstring(L, 1);
  73. lv_theme_t * th = NULL;
  74. if (!strcmp("default", name)) {
  75. th = LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  76. LV_THEME_DEFAULT_FLAG,
  77. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  78. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  79. }
  80. #if LV_USE_THEME_MONO
  81. else if (!strcmp("mono", name)) {
  82. th = lv_theme_mono_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  83. LV_THEME_DEFAULT_FLAG,
  84. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  85. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  86. }
  87. #endif
  88. #if LV_USE_THEME_EMPTY
  89. else if (!strcmp("empty", name)) {
  90. th = lv_theme_empty_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  91. LV_THEME_DEFAULT_FLAG,
  92. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  93. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  94. }
  95. #endif
  96. #if LV_USE_THEME_MATERIAL
  97. else if (!strcmp("material_light", name)) {
  98. th = lv_theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  99. LV_THEME_MATERIAL_FLAG_LIGHT,
  100. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  101. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  102. }
  103. else if (!strcmp("material_dark", name)) {
  104. th = lv_theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  105. LV_THEME_MATERIAL_FLAG_DARK,
  106. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  107. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  108. }
  109. else if (!strcmp("material_no_transition", name)) {
  110. th = lv_theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  111. LV_THEME_MATERIAL_FLAG_NO_TRANSITION,
  112. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  113. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  114. }
  115. else if (!strcmp("material_no_focus", name)) {
  116. th = lv_theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
  117. LV_THEME_MATERIAL_FLAG_NO_FOCUS,
  118. LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
  119. LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
  120. }
  121. #endif
  122. else {
  123. LLOGW("no such theme %s", name);
  124. return 0;
  125. }
  126. LLOGD("theme_set_act %s", name);
  127. lv_theme_set_act(th);
  128. lua_pushboolean(L, 1);
  129. return 1;
  130. }
  131. // 函数注册
  132. static const rotable_Reg reg_lvgl[] = {
  133. {"init", luat_lv_init, 0},
  134. {"scr_act", luat_lv_scr_act, 0},
  135. {"layer_top", luat_lv_layer_top, 0},
  136. {"layer_sys", luat_lv_layer_sys, 0},
  137. {"scr_load", luat_lv_scr_load, 0},
  138. {"theme_set_act", l_lv_theme_set_act, 0},
  139. // 兼容性命名
  140. {"sw_create", luat_lv_switch_create, 0},
  141. LUAT_LV_DISP_RLT
  142. LUAT_LV_GROUP_RLT
  143. LUAT_LV_OBJ_RLT
  144. LUAT_LV_REFR_RLT
  145. LUAT_LV_STYLE_RLT
  146. LUAT_LV_STYLE2_RLT
  147. // 添加STYLE_DEC那一百多个函数
  148. LUAT_LV_STYLE_DEC_RLT
  149. LUAT_LV_DRAW_RLT
  150. LUAT_LV_DRAW_EX_RLT
  151. LUAT_LV_ANIM_RLT
  152. LUAT_LV_ANIM_EX_RLT
  153. LUAT_LV_AREA_RLT
  154. LUAT_LV_COLOR_RLT
  155. LUAT_LV_MAP_RLT
  156. // 输入设备
  157. #ifdef LUAT_USE_LVGL_INDEV
  158. LUAT_LV_INDEV_RLT
  159. #endif
  160. //LVGL组件
  161. #ifdef LUAT_USE_LVGL_ARC
  162. LUAT_LV_ARC_RLT
  163. #endif
  164. #ifdef LUAT_USE_LVGL_BAR
  165. LUAT_LV_BAR_RLT
  166. #endif
  167. #ifdef LUAT_USE_LVGL_BTN
  168. LUAT_LV_BTN_RLT
  169. #endif
  170. #ifdef LUAT_USE_LVGL_BTNMATRIX
  171. LUAT_LV_BTNMATRIX_RLT
  172. LUAT_LV_BTNMATRIX_EX_RLT
  173. #endif
  174. #ifdef LUAT_USE_LVGL_CALENDAR
  175. LUAT_LV_CALENDAR_RLT
  176. LUAT_LV_CALENDAR_EX_RLT
  177. #endif
  178. #ifdef LUAT_USE_LVGL_CANVAS
  179. LUAT_LV_CANVAS_RLT
  180. LUAT_LV_CANVAS_EX_RLT
  181. #endif
  182. #ifdef LUAT_USE_LVGL_CHECKBOX
  183. LUAT_LV_CHECKBOX_RLT
  184. #endif
  185. #ifdef LUAT_USE_LVGL_CHART
  186. LUAT_LV_CHART_RLT
  187. #endif
  188. #ifdef LUAT_USE_LVGL_CONT
  189. LUAT_LV_CONT_RLT
  190. #endif
  191. #ifdef LUAT_USE_LVGL_CPICKER
  192. LUAT_LV_CPICKER_RLT
  193. #endif
  194. #ifdef LUAT_USE_LVGL_DROPDOWN
  195. LUAT_LV_DROPDOWN_RLT
  196. LUAT_LV_DROPDOWN_EX_RLT
  197. #endif
  198. #ifdef LUAT_USE_LVGL_GAUGE
  199. LUAT_LV_GAUGE_RLT
  200. LUAT_LV_GAUGE_EX_RLT
  201. #endif
  202. #ifdef LUAT_USE_LVGL_IMG
  203. LUAT_LV_IMG_RLT
  204. LUAT_LV_IMG_EX_RTL
  205. #endif
  206. #ifdef LUAT_USE_LVGL_IMGBTN
  207. LUAT_LV_IMGBTN_RLT
  208. LUAT_LV_IMGBTN_EX_RTL
  209. #endif
  210. #ifdef LUAT_USE_LVGL_KEYBOARD
  211. LUAT_LV_KEYBOARD_RLT
  212. #endif
  213. #ifdef LUAT_USE_LVGL_LABEL
  214. LUAT_LV_LABEL_RLT
  215. #endif
  216. #ifdef LUAT_USE_LVGL_LED
  217. LUAT_LV_LED_RLT
  218. #endif
  219. #ifdef LUAT_USE_LVGL_LINE
  220. LUAT_LV_LINE_RLT
  221. LUAT_LV_LINE_EX_RLT
  222. #endif
  223. #ifdef LUAT_USE_LVGL_LIST
  224. LUAT_LV_LIST_RLT
  225. #endif
  226. #ifdef LUAT_USE_LVGL_LINEMETER
  227. LUAT_LV_LINEMETER_RLT
  228. #endif
  229. #ifdef LUAT_USE_LVGL_MSGBOX
  230. LUAT_LV_MSGBOX_RLT
  231. LUAT_LV_MSGBOX_EX_RLT
  232. #endif
  233. #ifdef LUAT_USE_LVGL_OBJMASK
  234. LUAT_LV_OBJMASK_RLT
  235. #endif
  236. #ifdef LUAT_USE_LVGL_PAGE
  237. LUAT_LV_PAGE_RLT
  238. #endif
  239. #ifdef LUAT_USE_LVGL_SPINNER
  240. LUAT_LV_SPINNER_RLT
  241. #endif
  242. #ifdef LUAT_USE_LVGL_ROLLER
  243. LUAT_LV_ROLLER_RLT
  244. LUAT_LV_ROLLER_EX_RLT
  245. #endif
  246. #ifdef LUAT_USE_LVGL_SLIDER
  247. LUAT_LV_SLIDER_RLT
  248. #endif
  249. #ifdef LUAT_USE_LVGL_SPINBOX
  250. LUAT_LV_SPINBOX_RLT
  251. #endif
  252. #ifdef LUAT_USE_LVGL_SWITCH
  253. LUAT_LV_SWITCH_RLT
  254. #endif
  255. #ifdef LUAT_USE_LVGL_TEXTAREA
  256. LUAT_LV_TEXTAREA_RLT
  257. #endif
  258. #ifdef LUAT_USE_LVGL_TABLE
  259. LUAT_LV_TABLE_RLT
  260. #endif
  261. #ifdef LUAT_USE_LVGL_TABVIEW
  262. LUAT_LV_TABVIEW_RLT
  263. #endif
  264. #ifdef LUAT_USE_LVGL_TILEVIEW
  265. LUAT_LV_TILEVIEW_RLT
  266. LUAT_LV_TILEVIEW_EX_RLT
  267. #endif
  268. #ifdef LUAT_USE_LVGL_WIN
  269. LUAT_LV_WIN_RLT
  270. #endif
  271. // 图像库
  272. LUAT_LV_QRCODE_RLT
  273. #if defined(LUA_USE_LINUX) || defined(LUA_USE_WINDOWS) || defined(LUA_USE_MACOSX)
  274. LUAT_LV_GIF_RLT
  275. #endif
  276. // 回调
  277. LUAT_LV_CB_RLT
  278. // 额外添加的函数
  279. LUAT_LV_EX_RLT
  280. // LUAT_LV_WIDGETS_EX_RLT
  281. // 字体API
  282. LUAT_LV_FONT_EX_RLT
  283. // 结构体
  284. LUAT_LV_STRUCT_RLT
  285. // 常量
  286. LUAT_LV_ENMU_RLT
  287. {"ROLLER_MODE_INIFINITE", NULL, LV_ROLLER_MODE_INIFINITE},
  288. {NULL, NULL, 0},
  289. };
  290. #if (LV_USE_LOG && LV_LOG_PRINTF == 0)
  291. static void lv_log_print(lv_log_level_t level, const char * file, uint32_t lineno, const char * func, const char * desc) {
  292. switch (level)
  293. {
  294. case LV_LOG_LEVEL_TRACE:
  295. LLOGD("%s:%d - %s - %s", file, lineno, func, desc);
  296. break;
  297. case LV_LOG_LEVEL_INFO:
  298. LLOGI("%s:%d - %s - %s", file, lineno, func, desc);
  299. break;
  300. case LV_LOG_LEVEL_WARN:
  301. LLOGW("%s:%d - %s - %s", file, lineno, func, desc);
  302. break;
  303. case LV_LOG_LEVEL_ERROR:
  304. LLOGE("%s:%d - %s - %s", file, lineno, func, desc);
  305. break;
  306. default:
  307. LLOGD("%s:%d - %s - %s", file, lineno, func, desc);
  308. break;
  309. }
  310. };
  311. #endif
  312. LUAMOD_API int luaopen_lvgl( lua_State *L ) {
  313. #if (LV_USE_LOG && LV_LOG_PRINTF == 0)
  314. lv_log_register_print_cb(lv_log_print);
  315. #endif
  316. luat_newlib(L, reg_lvgl);
  317. luat_lvgl_struct_init(L);
  318. return 1;
  319. }
  320. static int lv_func_unref(lua_State *L, void* ptr) {
  321. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  322. if (msg->arg1)
  323. luaL_unref(L, LUA_REGISTRYINDEX, msg->arg1);
  324. if (msg->arg2)
  325. luaL_unref(L, LUA_REGISTRYINDEX, msg->arg2);
  326. return 0;
  327. }
  328. void luat_lv_user_data_free(lv_obj_t * obj) {
  329. if (obj == NULL || (obj->user_data.event_cb_ref == 0 && obj->user_data.signal_cb_ref)) return;
  330. rtos_msg_t msg = {0};
  331. msg.handler = lv_func_unref;
  332. msg.arg1 = obj->user_data.event_cb_ref;
  333. msg.arg2 = obj->user_data.signal_cb_ref;
  334. luat_msgbus_put(&msg, 0);
  335. }