Просмотр исходного кода

add: 添加keyboard库,当前仅air105支持

Wendal Chen 4 лет назад
Родитель
Сommit
2fc007bfea
3 измененных файлов с 129 добавлено и 0 удалено
  1. 27 0
      luat/include/luat_keyboard.h
  2. 2 0
      luat/include/luat_libs.h
  3. 100 0
      luat/modules/luat_lib_keyboard.c

+ 27 - 0
luat/include/luat_keyboard.h

@@ -0,0 +1,27 @@
+#include "luat_base.h"
+
+
+typedef struct luat_keyboard_ctx
+{
+    uint16_t port;      // 为多keyboard预留,默认为0
+    uint16_t pin_data;  // pin数据, 需要根据pin_map反推按键
+    uint16_t state;     // 1 pressed, 0 release
+    void* userdata;
+}luat_keyboard_ctx_t;
+
+typedef void(*luat_keyboard_irq_cb)(luat_keyboard_ctx_t* ctx);
+
+typedef struct luat_keyboard_conf {
+    uint16_t port;       // 为多keyboard预留,默认为0
+    uint16_t pin_conf;   // 需要启用的pin的掩码
+    uint16_t pin_map;    // 需要启用的pin的输入/输出配置
+    uint16_t debounce;   // 消抖配置
+    luat_keyboard_irq_cb cb;
+    void* userdata;
+}luat_keyboard_conf_t;
+
+int luat_keyboard_init(luat_keyboard_conf_t *conf);
+
+
+
+int luat_keyboard_deinit(luat_keyboard_conf_t *conf);

+ 2 - 0
luat/include/luat_libs.h

@@ -91,3 +91,5 @@ LUAMOD_API int luaopen_vmx( lua_State *L );
 LUAMOD_API int luaopen_lcdseg( lua_State *L );
 
 LUAMOD_API int luaopen_fdb( lua_State *L );
+
+LUAMOD_API int luaopen_keyboard( lua_State *L );

+ 100 - 0
luat/modules/luat_lib_keyboard.c

@@ -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;
+}