luat_lib_easylvgl.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /*
  2. @module easylvgl
  3. @summary EasyLVGL图像库 (LVGL 9.4)
  4. @version 0.0.2
  5. @date 2024.11.07
  6. @tag LUAT_USE_EASYLVGL
  7. @usage
  8. -- 初始化 EasyLVGL
  9. easylvgl.init(480, 320)
  10. -- 创建按钮
  11. local btn = easylvgl.button()
  12. easylvgl.button_set_callback(btn, function(obj)
  13. print("Button clicked!")
  14. end)
  15. -- 创建标签
  16. local label = easylvgl.label()
  17. easylvgl.label_set_text(label, "Hello EasyLVGL!")
  18. */
  19. #include "luat_base.h"
  20. #include "luat_mem.h"
  21. #include "luat_log.h"
  22. #include "rotable2.h"
  23. #include "../inc/easylvgl.h"
  24. #define LUAT_LOG_TAG "easylvgl"
  25. #include "luat_log.h"
  26. static lua_State *g_L = NULL;
  27. /**
  28. * 初始化 EasyLVGL
  29. * @api easylvgl.init(w, h, buff_size, buff_mode)
  30. * @int 屏幕宽,可选,默认480
  31. * @int 屏幕高,可选,默认320
  32. * @int 缓冲区大小,可选,默认宽*10, 不含色深
  33. * @int 缓冲模式,可选,默认0x06, bit0:是否使用lcdbuff bit1:buff1 bit2:buff2 bit3:是否使用lua heap
  34. * @return bool 成功返回true,否则返回false
  35. */
  36. static int l_easylvgl_init(lua_State *L) {
  37. g_L = L;
  38. easylvgl_set_lua_state(L);
  39. int w = luaL_optinteger(L, 1, 480);
  40. int h = luaL_optinteger(L, 2, 320);
  41. size_t buf_size = 0;
  42. uint8_t buff_mode = 0x06; // 默认双缓冲,使用 heap
  43. if (lua_isinteger(L, 3)) {
  44. buf_size = luaL_checkinteger(L, 3);
  45. }
  46. if (lua_isinteger(L, 4)) {
  47. buff_mode = luaL_checkinteger(L, 4);
  48. }
  49. int ret = easylvgl_init_internal(w, h, buf_size, buff_mode);
  50. lua_pushboolean(L, ret == 0);
  51. return 1;
  52. }
  53. /**
  54. * 创建按钮对象
  55. * @api easylvgl.button(parent)
  56. * @userdata 父对象,可选,默认使用屏幕
  57. * @return userdata 按钮对象指针
  58. */
  59. static int l_easylvgl_button(lua_State *L) {
  60. lv_obj_t *parent = NULL;
  61. if (lua_isuserdata(L, 1)) {
  62. parent = (lv_obj_t *)lua_touserdata(L, 1);
  63. }
  64. lv_obj_t *btn = easylvgl_button_create(parent);
  65. if (btn == NULL) {
  66. lua_pushnil(L);
  67. return 1;
  68. }
  69. lua_pushlightuserdata(L, btn);
  70. return 1;
  71. }
  72. /**
  73. * 设置按钮点击回调
  74. * @api easylvgl.button_set_callback(btn, callback)
  75. * @userdata 按钮对象
  76. * @function 回调函数,接收按钮对象作为参数
  77. * @return nil
  78. */
  79. static int l_easylvgl_button_set_callback(lua_State *L) {
  80. if (!lua_isuserdata(L, 1)) {
  81. luaL_error(L, "expect userdata for button");
  82. return 0;
  83. }
  84. if (!lua_isfunction(L, 2)) {
  85. luaL_error(L, "expect function for callback");
  86. return 0;
  87. }
  88. lv_obj_t *btn = (lv_obj_t *)lua_touserdata(L, 1);
  89. // 将回调函数保存到注册表
  90. int callback_ref = luaL_ref(L, LUA_REGISTRYINDEX);
  91. easylvgl_button_set_callback(btn, callback_ref);
  92. return 0;
  93. }
  94. /**
  95. * 创建标签对象
  96. * @api easylvgl.label(parent)
  97. * @userdata 父对象,可选,默认使用屏幕
  98. * @return userdata 标签对象指针
  99. */
  100. static int l_easylvgl_label(lua_State *L) {
  101. lv_obj_t *parent = NULL;
  102. if (lua_isuserdata(L, 1)) {
  103. parent = (lv_obj_t *)lua_touserdata(L, 1);
  104. }
  105. lv_obj_t *label = easylvgl_label_create(parent);
  106. if (label == NULL) {
  107. lua_pushnil(L);
  108. return 1;
  109. }
  110. lua_pushlightuserdata(L, label);
  111. return 1;
  112. }
  113. /**
  114. * 设置标签文本
  115. * @api easylvgl.label_set_text(label, text)
  116. * @userdata 标签对象
  117. * @string 文本内容
  118. * @return nil
  119. */
  120. static int l_easylvgl_label_set_text(lua_State *L) {
  121. if (!lua_isuserdata(L, 1)) {
  122. luaL_error(L, "expect userdata for label");
  123. return 0;
  124. }
  125. const char *text = luaL_checkstring(L, 2);
  126. lv_obj_t *label = (lv_obj_t *)lua_touserdata(L, 1);
  127. easylvgl_label_set_text(label, text);
  128. return 0;
  129. }
  130. /**
  131. * 获取标签文本
  132. * @api easylvgl.label_get_text(label)
  133. * @userdata 标签对象
  134. * @return string 文本内容
  135. */
  136. static int l_easylvgl_label_get_text(lua_State *L) {
  137. if (!lua_isuserdata(L, 1)) {
  138. luaL_error(L, "expect userdata for label");
  139. return 0;
  140. }
  141. lv_obj_t *label = (lv_obj_t *)lua_touserdata(L, 1);
  142. const char *text = easylvgl_label_get_text(label);
  143. if (text == NULL) {
  144. lua_pushnil(L);
  145. } else {
  146. lua_pushstring(L, text);
  147. }
  148. return 1;
  149. }
  150. static const rotable_Reg_t reg_easylvgl[] = {
  151. {"init", ROREG_FUNC(l_easylvgl_init)},
  152. {"button", ROREG_FUNC(l_easylvgl_button)},
  153. {"button_set_callback", ROREG_FUNC(l_easylvgl_button_set_callback)},
  154. {"label", ROREG_FUNC(l_easylvgl_label)},
  155. {"label_set_text", ROREG_FUNC(l_easylvgl_label_set_text)},
  156. {"label_get_text", ROREG_FUNC(l_easylvgl_label_get_text)},
  157. {NULL, ROREG_INT(0)}
  158. };
  159. LUAMOD_API int luaopen_easylvgl(lua_State *L) {
  160. luat_newlib2(L, reg_easylvgl);
  161. return 1;
  162. }