|
|
@@ -0,0 +1,100 @@
|
|
|
+
|
|
|
+/*
|
|
|
+@module keyboard
|
|
|
+@summary 键盘矩阵(当前仅air105支持)
|
|
|
+@version 1.0
|
|
|
+@date 2021.11.24
|
|
|
+*/
|
|
|
+
|
|
|
+#include "luat_base.h"
|
|
|
+#include "luat_keyboard.h"
|
|
|
+#include "luat_msgbus.h"
|
|
|
+
|
|
|
+//----------------------
|
|
|
+
|
|
|
+
|
|
|
+static int l_keyboard_handler(lua_State *L, void* ptr) {
|
|
|
+ rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
|
|
|
+ lua_getglobal(L, "sys_pub");
|
|
|
+ lua_pushstring(L, "KB_INC");
|
|
|
+ lua_pushinteger(L, msg->arg1);
|
|
|
+ lua_pushinteger(L, msg->arg2);
|
|
|
+ lua_pushinteger(L, (uint32_t)msg->ptr);
|
|
|
+ lua_call(L, 4, 0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void l_keyboard_irq_cb(luat_keyboard_ctx_t* ctx) {
|
|
|
+ rtos_msg_t msg = {0};
|
|
|
+ msg.handler = l_keyboard_handler;
|
|
|
+ msg.arg1 = ctx->port;
|
|
|
+ msg.arg2 = ctx->pin_data & ((ctx->state & 0x1) << 15);
|
|
|
+ msg.ptr = (void*)ctx->state;
|
|
|
+ luat_msgbus_put(&msg, 0);
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------
|
|
|
+
|
|
|
+/**
|
|
|
+初始化键盘矩阵
|
|
|
+@api keyboard.init(port, conf, map, debounce)
|
|
|
+@int 预留, 当前填0
|
|
|
+@int 启用的keyboard管脚掩码, 例如使用keyboard0~9, 则掩码为 0x1FF, 若使用 0~3 则 0xF
|
|
|
+@int keyboard管脚方向映射, 其中输入为0,输出为1, 按位设置. 例如 keyboard0~3作为输入, keyboard4~7为输入, 则 0xF0
|
|
|
+@int 消抖配置,预留,可以不填
|
|
|
+@usage
|
|
|
+-- 做一个 4*4 键盘矩阵, 使用 keyboard0~7, 其中0~3做输入, 4~7做输出
|
|
|
+-- 使用 keyboard0~7, 对应conf为 0xFF
|
|
|
+-- 其中0~3做输入, 4~7做输出, 对应map 为 0xF0
|
|
|
+keyboard.init(0, 0xFF, 0xF0)
|
|
|
+
|
|
|
+-- 做一个 2*3 键盘矩阵, 使用 keyboard0~4, 其中0~1做输入, 2~4做输出
|
|
|
+-- 使用 keyboard0~4, 二进制为 11111, 对应conf的十六进制表达为 0x1F
|
|
|
+-- 其中0~1做输入, 2~4做输出, 二进制为 11100 对应map 为 0x14
|
|
|
+-- keyboard.init(0, 0xFF, 0x14)
|
|
|
+
|
|
|
+sys.subscribe("KB_INC", function(port, data, state)
|
|
|
+ -- port 当前固定为0, 可以无视
|
|
|
+ -- data, 需要配合init的map进行解析
|
|
|
+ -- state, 1 为按下, 0 为 释放
|
|
|
+ -- TODO 详细介绍
|
|
|
+end)
|
|
|
+ */
|
|
|
+static int l_keyboard_init(lua_State *L) {
|
|
|
+ luat_keyboard_conf_t conf = {0};
|
|
|
+ conf.port = luaL_checkinteger(L, 1);
|
|
|
+ conf.pin_conf = luaL_checkinteger(L, 2);
|
|
|
+ conf.pin_map = luaL_checkinteger(L, 3);
|
|
|
+ conf.debounce = luaL_optinteger(L, 4, 1);
|
|
|
+ conf.cb = l_keyboard_irq_cb;
|
|
|
+ int ret = luat_keyboard_init(&conf);
|
|
|
+
|
|
|
+ lua_pushboolean(L, ret == 0 ? 1 : 0);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static int l_keyboard_deinit(lua_State *L) {
|
|
|
+ luat_keyboard_conf_t conf = {0};
|
|
|
+ conf.port = luaL_checkinteger(L, 1);
|
|
|
+ conf.pin_conf = luaL_checkinteger(L, 2);
|
|
|
+ conf.pin_map = luaL_checkinteger(L, 3);
|
|
|
+ conf.debounce = luaL_optinteger(L, 4, 1);
|
|
|
+
|
|
|
+ int ret = luat_keyboard_deinit(&conf);
|
|
|
+
|
|
|
+ lua_pushboolean(L, ret == 0 ? 1 : 0);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+#include "rotable.h"
|
|
|
+static const rotable_Reg reg_keyboard[] =
|
|
|
+{
|
|
|
+ { "init" , l_keyboard_init ,0},
|
|
|
+ { "deinit" , l_keyboard_deinit, 0 },
|
|
|
+ { NULL, NULL , 0}
|
|
|
+};
|
|
|
+
|
|
|
+LUAMOD_API int luaopen_keyboard( lua_State *L ) {
|
|
|
+ luat_newlib(L, reg_keyboard);
|
|
|
+ return 1;
|
|
|
+}
|