luat_lib_lvgl_indev_ext.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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_lvgl.h"
  9. #include "lvgl.h"
  10. #include "luat_mem.h"
  11. static lv_indev_data_t point_emulator_data = {0};
  12. static lv_indev_data_t keyboard_emulator_data = {0};
  13. static bool point_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data) {
  14. memcpy(data, drv->user_data, sizeof(lv_indev_data_t));
  15. // if (((lv_indev_data_t*)drv->user_data)->state == LV_INDEV_STATE_PR){
  16. // ((lv_indev_data_t*)drv->user_data)->state == LV_INDEV_STATE_REL;
  17. // }
  18. return false;
  19. }
  20. /*
  21. 注册输入设备驱动
  22. @api lvgl.indev_drv_register(tp, dtp)
  23. @string 设备类型,当前支持"pointer",指针类/触摸类均可,"keyboard",键盘类型
  24. @string 设备型号,当前支持"emulator",模拟器类型
  25. @return bool 成功返回true,否则返回false
  26. @usage
  27. lvgl.indev_drv_register("pointer", "emulator")
  28. */
  29. int luat_lv_indev_drv_register(lua_State* L) {
  30. lv_indev_drv_t indev_drv;
  31. lv_indev_drv_init(&indev_drv);
  32. const char* type = luaL_checkstring(L, 1);
  33. int ok = 0;
  34. const char* dtype;
  35. if (!strcmp("pointer", type)) {
  36. indev_drv.type = LV_INDEV_TYPE_POINTER;
  37. dtype = luaL_checkstring(L, 2);
  38. if (!strcmp("emulator", dtype)) {
  39. indev_drv.user_data = &point_emulator_data;
  40. memset(indev_drv.user_data, 0, sizeof(lv_indev_data_t));
  41. indev_drv.read_cb = point_input_read;
  42. lv_indev_drv_register(&indev_drv);
  43. ok = 1;
  44. }
  45. //else if(!strcmp("xpt2046", type)) {
  46. // // TODO 支持xpt2046?
  47. //}
  48. }
  49. else if (!strcmp("keyboard", type)) {
  50. indev_drv.type = LV_INDEV_TYPE_KEYPAD;
  51. //dtype = luaL_checkstring(L, 2);
  52. //if (!strcmp("emulator", dtype)) {
  53. {
  54. indev_drv.user_data = &keyboard_emulator_data;
  55. memset(indev_drv.user_data, 0, sizeof(lv_indev_data_t));
  56. indev_drv.read_cb = point_input_read;
  57. lv_indev_drv_register(&indev_drv);
  58. ok = 1;
  59. }
  60. }
  61. lua_pushboolean(L, ok);
  62. return 1;
  63. }
  64. /*
  65. 更新模拟输入设备的坐标数据
  66. @api lvgl.indev_point_emulator_update(x, y, state)
  67. @int x坐标,以左上角为0,右下角为最大值
  68. @int y坐标,以左上角为0,右下角为最大值
  69. @int 状态, 0 为 释放, 1 为按下
  70. @return nil 无返回值
  71. @usage
  72. -- 模拟在屏幕上的点击,通过timeout模拟长按和短按
  73. sys.taskInit(function(x, y, timeout)
  74. lvgl.indev_point_emulator_update(x, y, 1)
  75. sys.wait(timeout)
  76. lvgl.indev_point_emulator_update(x, y, 0)
  77. end, 240, 120, 50)
  78. */
  79. int luat_lv_indev_point_emulator_update(lua_State* L) {
  80. int x = luaL_checkinteger(L, 1);
  81. int y = luaL_checkinteger(L, 2);
  82. int state = luaL_optinteger(L, 3, 1);
  83. point_emulator_data.point.x = x;
  84. point_emulator_data.point.y = y;
  85. point_emulator_data.state = state;
  86. return 0;
  87. }
  88. /*
  89. 更新键盘输入设备的按键值
  90. @api lvgl.indev_kb_update(key)
  91. @int 按键值,默认为0,按键抬起
  92. @return nil 无返回值
  93. @usage
  94. */
  95. int luat_lv_indev_keyboard_update(lua_State* L) {
  96. int key = luaL_optinteger(L, 1, 0);
  97. keyboard_emulator_data.key = key;
  98. return 0;
  99. }