luat_lib_keyboard.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. @module keyboard
  3. @summary 键盘矩阵
  4. @version 1.0
  5. @date 2021.11.24
  6. @demo keyboard
  7. @tag LUAT_USE_KEYBOARD
  8. */
  9. #include "luat_base.h"
  10. #include "luat_keyboard.h"
  11. #include "luat_msgbus.h"
  12. //----------------------
  13. static int l_keyboard_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 keyboard
  18. 键盘矩阵消息
  19. KB_INC
  20. @number port, keyboard id 当前固定为0, 可以无视
  21. @number data, keyboard 按键 需要配合init的map进行解析
  22. @number state, 按键状态 1 为按下, 0 为 释放
  23. @usage
  24. sys.subscribe("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, "KB_INC");
  32. lua_pushinteger(L, msg->arg1);
  33. lua_pushinteger(L, msg->arg2);
  34. lua_pushinteger(L, (uint32_t)msg->ptr);
  35. lua_call(L, 4, 0);
  36. return 0;
  37. }
  38. static void l_keyboard_irq_cb(luat_keyboard_ctx_t* ctx) {
  39. rtos_msg_t msg = {0};
  40. msg.handler = l_keyboard_handler;
  41. msg.arg1 = ctx->port;
  42. msg.arg2 = ctx->pin_data;
  43. msg.ptr = (void*)ctx->state;
  44. luat_msgbus_put(&msg, 0);
  45. }
  46. //----------------------
  47. /**
  48. 初始化键盘矩阵
  49. @api keyboard.init(port, conf, map, debounce)
  50. @int 预留, 当前填0
  51. @int 启用的keyboard管脚掩码, 例如使用keyboard0~9, 则掩码为 0x1FF, 若使用 0~3 则 0xF
  52. @int keyboard管脚方向映射, 其中输入为0,输出为1, 按位设置. 例如 keyboard0~3作为输入, keyboard4~7为输入, 则 0xF0
  53. @int 消抖配置,预留,可以不填
  54. @usage
  55. -- 做一个 4*4 键盘矩阵, 使用 keyboard0~7, 其中0~3做输入, 4~7做输出
  56. -- 使用 keyboard0~7, 对应conf为 0xFF
  57. -- 其中0~3做输入, 4~7做输出, 对应map 为 0xF0
  58. keyboard.init(0, 0xFF, 0xF0)
  59. -- 做一个 2*3 键盘矩阵, 使用 keyboard0~4, 其中0~1做输入, 2~4做输出
  60. -- 使用 keyboard0~4, 二进制为 11111, 对应conf的十六进制表达为 0x1F
  61. -- 其中0~1做输入, 2~4做输出, 二进制为 11100 对应map 为 0x14
  62. -- keyboard.init(0, 0xFF, 0x14)
  63. sys.subscribe("KB_INC", function(port, data, state)
  64. -- port 当前固定为0, 可以无视
  65. -- data, 需要配合init的map进行解析
  66. -- state, 1 为按下, 0 为 释放
  67. -- TODO 详细介绍
  68. end)
  69. */
  70. static int l_keyboard_init(lua_State *L) {
  71. luat_keyboard_conf_t conf = {0};
  72. conf.port = luaL_checkinteger(L, 1);
  73. conf.pin_conf = luaL_checkinteger(L, 2);
  74. conf.pin_map = luaL_checkinteger(L, 3);
  75. conf.debounce = luaL_optinteger(L, 4, 1);
  76. conf.cb = l_keyboard_irq_cb;
  77. int ret = luat_keyboard_init(&conf);
  78. lua_pushboolean(L, ret == 0 ? 1 : 0);
  79. return 1;
  80. }
  81. static int l_keyboard_deinit(lua_State *L) {
  82. luat_keyboard_conf_t conf = {0};
  83. conf.port = luaL_checkinteger(L, 1);
  84. conf.pin_conf = luaL_checkinteger(L, 2);
  85. conf.pin_map = luaL_checkinteger(L, 3);
  86. conf.debounce = luaL_optinteger(L, 4, 1);
  87. int ret = luat_keyboard_deinit(&conf);
  88. lua_pushboolean(L, ret == 0 ? 1 : 0);
  89. return 1;
  90. }
  91. #include "rotable2.h"
  92. static const rotable_Reg_t reg_keyboard[] =
  93. {
  94. { "init" , ROREG_FUNC(l_keyboard_init)},
  95. { "deinit" , ROREG_FUNC(l_keyboard_deinit)},
  96. { NULL, ROREG_INT(0) }
  97. };
  98. LUAMOD_API int luaopen_keyboard( lua_State *L ) {
  99. luat_newlib2(L, reg_keyboard);
  100. return 1;
  101. }