luat_lib_softkeyboard.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. @module softkb
  3. @summary 软件键盘矩阵
  4. @version 1.0
  5. @date 2022.03.09
  6. @tag LUAT_USE_SOFTKB
  7. */
  8. #include "luat_base.h"
  9. #include "luat_softkeyboard.h"
  10. #include "luat_msgbus.h"
  11. #define MAX_DEVICE_COUNT 2
  12. static luat_softkeyboard_conf_t softkb_conf[MAX_DEVICE_COUNT];
  13. int l_softkeyboard_handler(lua_State *L, void* ptr) {
  14. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  15. lua_getglobal(L, "sys_pub");
  16. /*
  17. @sys_pub softkeyboard
  18. 软件键盘矩阵消息
  19. SOFT_KB_INC
  20. @number port, keyboard id 当前固定为0, 可以无视
  21. @number data, keyboard 按键 需要配合init的map进行解析
  22. @number state, 按键状态 1 为按下, 0 为 释放
  23. @usage
  24. sys.subscribe("SOFT_KB_INC", function(port, data, state)
  25. -- port 当前固定为0, 可以无视
  26. -- data, 需要配合init的map进行解析
  27. -- state, 1 为按下, 0 为 释放
  28. log.info("keyboard", port, data, state)
  29. end)
  30. */
  31. lua_pushstring(L, "SOFT_KB_INC");
  32. lua_pushinteger(L, msg->arg1);
  33. lua_pushinteger(L, msg->arg2);
  34. lua_pushinteger(L, msg->ptr);
  35. lua_call(L, 4, 0);
  36. return 0;
  37. }
  38. /**
  39. 初始化软件键盘矩阵
  40. @api softkb.init(port, key_in, key_out)
  41. @int 预留, 当前填0
  42. @table 矩阵输入按键表
  43. @table 矩阵输出按键表
  44. @usage
  45. key_in = {pin.PD10,pin.PE00,pin.PE01,pin.PE02}
  46. key_out = {pin.PD12,pin.PD13,pin.PD14,pin.PD15}
  47. softkb.init(0,key_in,key_out)
  48. sys.subscribe("SOFT_KB_INC", function(port, data, state)
  49. -- port 当前固定为0, 可以无视
  50. -- data, 需要配合init的map进行解析
  51. -- state, 1 为按下, 0 为 释放
  52. -- TODO 详细介绍
  53. end)
  54. */
  55. int l_softkb_init(lua_State* L) {
  56. uint8_t softkb_port = luaL_checkinteger(L,1);
  57. softkb_conf[softkb_port].port = softkb_port;
  58. if (lua_istable(L, 2)) {
  59. softkb_conf[softkb_port].inio_num = lua_rawlen(L, 2);
  60. softkb_conf[softkb_port].inio = (uint8_t*)luat_heap_calloc(softkb_conf[softkb_port].inio_num,sizeof(uint8_t));
  61. for (size_t i = 0; i < softkb_conf[softkb_port].inio_num; i++){
  62. lua_geti(L,2,i+1);
  63. softkb_conf[softkb_port].inio[i] = luaL_checkinteger(L,-1);
  64. lua_pop(L, 1);
  65. }
  66. }
  67. if (lua_istable(L, 3)) {
  68. softkb_conf[softkb_port].outio_num = lua_rawlen(L, 3);
  69. softkb_conf[softkb_port].outio = (uint8_t*)luat_heap_calloc(softkb_conf[softkb_port].outio_num,sizeof(uint8_t));
  70. for (size_t i = 0; i < softkb_conf[softkb_port].outio_num; i++){
  71. lua_geti(L,3,i+1);
  72. softkb_conf[softkb_port].outio[i] = luaL_checkinteger(L,-1);
  73. lua_pop(L, 1);
  74. }
  75. }
  76. int ret = luat_softkeyboard_init(&softkb_conf[softkb_port]);
  77. lua_pushboolean(L, ret == 0 ? 1 : 0);
  78. return 1;
  79. }
  80. /**
  81. 删除软件键盘矩阵
  82. @api softkb.deinit(port)
  83. @int 预留, 当前填0
  84. @usage
  85. softkb.deinit(0)
  86. */
  87. int l_softkb_deinit(lua_State* L) {
  88. luat_softkeyboard_conf_t conf = {0};
  89. uint8_t softkb_port = luaL_checkinteger(L,1);
  90. int ret = luat_softkeyboard_deinit(&softkb_conf[softkb_port]);
  91. luat_heap_free(softkb_conf[softkb_port].inio);
  92. luat_heap_free(softkb_conf[softkb_port].outio);
  93. lua_pushboolean(L, ret == 0 ? 1 : 0);
  94. return 1;
  95. }
  96. #include "rotable2.h"
  97. static const rotable_Reg_t reg_softkb[] =
  98. {
  99. { "init", ROREG_FUNC(l_softkb_init)},
  100. { "deinit", ROREG_FUNC(l_softkb_deinit)},
  101. { NULL, ROREG_INT(0)}
  102. };
  103. LUAMOD_API int luaopen_softkb( lua_State *L ) {
  104. luat_newlib2(L, reg_softkb);
  105. return 1;
  106. }