Przeglądaj źródła

add: airlink,air8000添加GPIO输出操作及demo

Wendal Chen 1 rok temu
rodzic
commit
f0386a8c39

+ 5 - 1
components/airlink/include/luat_airlink.h

@@ -113,6 +113,10 @@ luat_airlink_cmd_t* luat_airlink_cmd_new(uint16_t cmd, uint16_t data_len);
 
 void luat_airlink_cmd_free(luat_airlink_cmd_t* cmd);
 
-
+// GPIO 操作, 临时放这里
+#include "luat_gpio.h"
+int luat_airlink_drv_gpio_setup(luat_gpio_t* gpio);
+int luat_airlink_drv_gpio_set(int pin, int level);
+int luat_airlink_drv_gpio_open(luat_gpio_cfg_t* gpio);
 
 #endif

+ 8 - 4
components/airlink/src/driver/luat_airlink_drv_gpio.c

@@ -14,7 +14,11 @@
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 
+#undef LLOGD
+#define LLOGD(...) 
+
 int luat_airlink_drv_gpio_setup(luat_gpio_t* gpio) {
+    // LLOGD("执行GPIO配置指令!!! pin %d mode %d pull %d", gpio->pin, gpio->mode, gpio->pull);
     uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = sizeof(luat_gpio_t) + sizeof(luat_airlink_cmd_t) + 8
@@ -26,16 +30,16 @@ int luat_airlink_drv_gpio_setup(luat_gpio_t* gpio) {
     memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
     memcpy(cmd->data + 8, gpio, sizeof(luat_gpio_t));
     item.cmd = cmd;
-    luat_airlink_queue_send(0, &item);
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
     return 0;
 }
 
-int luat_airlink_drv_luat_gpio_set(int pin, int level) {
+int luat_airlink_drv_gpio_set(int pin, int level) {
     uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 2 + sizeof(luat_airlink_cmd_t) + 8
     };
-    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x300, 2 + 8) ;
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x301, 2 + 8) ;
     if (cmd == NULL) {
         return -101;
     }
@@ -44,6 +48,6 @@ int luat_airlink_drv_luat_gpio_set(int pin, int level) {
     data[0] = (uint8_t)pin;
     data[1] = (uint8_t)level;
     item.cmd = cmd;
-    luat_airlink_queue_send(0, &item);
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
     return 0;
 }

+ 45 - 7
components/airlink/src/exec/luat_airlink_cmd_exec_basic.c

@@ -2,7 +2,6 @@
 #include "luat_spi.h"
 #include "luat_airlink.h"
 
-
 #include "luat_rtos.h"
 #include "luat_debug.h"
 #include "luat_spi.h"
@@ -10,44 +9,83 @@
 #include "luat_gpio.h"
 #include "luat_airlink.h"
 #include "luat_fota.h"
+#include "luat_mem.h"
 
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 
-int luat_airlink_cmd_exec_ping(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_ping(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到ping指令,返回pong");
     // TODO 返回PONG
     return 0;
 }
 
-int luat_airlink_cmd_exec_pong(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_pong(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到pong指令,检查数据是否匹配!!");
     return 0;
 }
 
-int luat_airlink_cmd_exec_reset(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_reset(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到reset指令!!!");
     luat_pm_reset();
     return 0;
 }
 
-int luat_airlink_cmd_exec_fota_init(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_fota_init(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到FOTA初始化指令!!!");
     int ret = luat_fota_init(0, 0, NULL, NULL, 0);
     LLOGD("fota_init ret %d", ret);
     return 0;
 }
 
-int luat_airlink_cmd_exec_fota_write(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_fota_write(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到FOTA数据!!!");
     int ret = luat_fota_write(cmd->data, cmd->len);
     LLOGD("fota_write ret %d", ret);
     return 0;
 }
 
-int luat_airlink_cmd_exec_fota_done(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_fota_done(luat_airlink_cmd_t *cmd, void *userdata)
+{
     LLOGD("收到FOTA传输完毕指令!!!");
     int ret = luat_fota_done();
     LLOGD("fota_write ret %d", ret);
     return 0;
 }
+
+#ifdef __LUATOS__
+#include "luat_msgbus.h"
+
+static int sdata_cb(lua_State *L, void *ptr)
+{
+    rtos_msg_t *msg = (rtos_msg_t *)lua_topointer(L, -1);
+    lua_getglobal(L, "sys_pub");
+    lua_pushstring(L, "AIRLINK_SDATA");
+    lua_pushlstring(L, msg->ptr, msg->arg1);
+    luat_heap_opt_free(LUAT_HEAP_PSRAM, msg->ptr);
+    lua_call(L, 2, 0);
+    return 0;
+}
+
+int luat_airlink_cmd_exec_sdata(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    LLOGD("收到sdata指令!!!");
+    rtos_msg_t msg = {0};
+    msg.handler = sdata_cb;
+    msg.ptr = luat_heap_opt_malloc(LUAT_HEAP_PSRAM, cmd->len);
+    if (msg.ptr == NULL)
+    {
+        LLOGE("sdata_cb malloc fail!!! %d", cmd->len);
+        return 0;
+    }
+    memcpy(msg.ptr, cmd->data, cmd->len);
+    msg.arg1 = cmd->len;
+    luat_msgbus_put(&msg, 0);
+    return 0;
+}
+#endif

+ 6 - 3
components/airlink/src/exec/luat_airlink_cmd_exec_gpio.c

@@ -13,6 +13,8 @@
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 
+#undef LLOGD
+#define LLOGD(...) 
 
 // 前8字节是指令id, 用于返回执行结果, 待定.
 
@@ -20,7 +22,7 @@ static int airlink_gpio_irq_cb(int pin, void* args) {
     return 0;
 }
 
-int luat_airlink_cmd_gpio_setup(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_gpio_setup(luat_airlink_cmd_t* cmd, void* userdata) {
     luat_gpio_t conf = {0};
     // 后面是配置参数,是luat_gpio_t结构体
     memcpy(&conf, cmd->data + 8, sizeof(luat_gpio_t));
@@ -30,6 +32,7 @@ int luat_airlink_cmd_gpio_setup(luat_airlink_cmd_t* cmd, void* userdata) {
     LLOGD("收到GPIO配置指令!!! pin %d", conf.pin);
     if (conf.mode == Luat_GPIO_IRQ) {
         conf.irq_cb = airlink_gpio_irq_cb;
+        conf.irq_args = NULL;
     }
     else {
         conf.irq_cb = NULL;
@@ -39,7 +42,7 @@ int luat_airlink_cmd_gpio_setup(luat_airlink_cmd_t* cmd, void* userdata) {
     return 0;
 }
 
-int luat_airlink_cmd_gpio_set(luat_airlink_cmd_t* cmd, void* userdata) {
+int luat_airlink_cmd_exec_gpio_set(luat_airlink_cmd_t* cmd, void* userdata) {
     LLOGD("收到GPIO设置指令!!!");
     uint8_t params[2];
     memcpy(params, cmd->data + 8, 2);
@@ -47,6 +50,6 @@ int luat_airlink_cmd_gpio_set(luat_airlink_cmd_t* cmd, void* userdata) {
         params[0] -= 100;
     }
     int ret = luat_gpio_set(params[0], params[1]);
-    LLOGD("收到GPIO置指令!!! pin %d level %d ret %d", params[0], params[1], ret);
+    LLOGD("收到GPIO置指令!!! pin %d level %d ret %d", params[0], params[1], ret);
     return 0;
 }

+ 12 - 3
components/airlink/src/luat_airlink_cmds.c

@@ -25,6 +25,7 @@ CMD_DEFINE(fota_init);
 CMD_DEFINE(fota_write);
 CMD_DEFINE(fota_done);
 CMD_DEFINE(dev_info);
+CMD_DEFINE(sdata);
 
 // MAC和IP包指令, 0x100开始
 CMD_DEFINE(ip_pkg);
@@ -44,23 +45,26 @@ CMD_DEFINE(wlan_scan_result);
 // GPIO指令, 0x300开始
 CMD_DEFINE(gpio_setup);
 CMD_DEFINE(gpio_set);
-CMD_DEFINE(gpio_get);
+// CMD_DEFINE(gpio_get);
 
 const luat_airlink_cmd_reg_t airlink_cmds[] = {
     // 最常用的放前面
     CMD_REG(0x10,  dev_info),
     CMD_REG(0x100, ip_pkg),
     CMD_REG(0x03,  reset),
+#ifdef LUAT_USE_AIRLINK_EXEC_SDATA
+    CMD_REG(0x20,  sdata),
+#endif
 
     // CMD_REG(0x01, ping),
     // CMD_REG(0x02, pong),
-#ifdef LUAT_USE_AIRLINK_FOTA    
+#ifdef LUAT_USE_AIRLINK_EXEC_FOTA
     CMD_REG(0x04, fota_init),
     CMD_REG(0x05, fota_write),
     CMD_REG(0x06, fota_done),
 #endif
 
-#ifdef LUAT_USE_AIRLINK_WIFI
+#ifdef LUAT_USE_AIRLINK_EXEC_WIFI
     CMD_REG(0x200, wlan_init),
     CMD_REG(0x201, wlan_sta_connect),
     CMD_REG(0x202, wlan_sta_disconnect),
@@ -70,5 +74,10 @@ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     CMD_REG(0x206, wlan_scan_result),
 #endif
 
+#ifdef LUAT_USE_AIRLINK_EXEC_GPIO
+    CMD_REG(0x300, gpio_setup),
+    CMD_REG(0x301, gpio_set),
+#endif
+
     {0, NULL}
 };

+ 3 - 0
components/airlink/src/task/luat_airlink_task.c

@@ -60,6 +60,9 @@ static int luat_airlink_task(void *param) {
                 }
                 cmd_reg ++;
             }
+            if (cmd_reg == NULL) {
+                LLOGW("找不到CMD执行程序 %d", ptr->cmd);
+            }
 
             // 处理完成, 释放内存
             luat_heap_opt_free(LUAT_HEAP_PSRAM, ptr);

+ 11 - 0
components/drv/include/luat/drv_gpio.h

@@ -0,0 +1,11 @@
+
+#ifndef LUAT_DRV_GPIO_H
+#define LUAT_DRV_GPIO_H
+
+
+#include "luat_gpio.h"
+int luat_drv_gpio_open(luat_gpio_cfg_t* gpio);
+int luat_drv_gpio_set(int pin, int level);
+int luat_drv_gpio_setup(luat_gpio_t* gpio);
+
+#endif

+ 54 - 0
components/drv/src/luat_drv_gpio.c

@@ -0,0 +1,54 @@
+#include "luat_base.h"
+#include "luat_gpio.h"
+#include "luat_mem.h"
+#include "luat/drv_gpio.h"
+#include "luat_airlink.h"
+
+#define LUAT_LOG_TAG "drv.gpio"
+#include "luat_log.h"
+
+#undef LLOGD
+#define LLOGD(...) 
+
+int luat_drv_gpio_open(luat_gpio_cfg_t* gpio) {
+    if (gpio == NULL) {
+        return -1;
+    }
+    if (gpio->pin < 0 || gpio->pin >= 255) {
+        return -2;
+    }
+    if (gpio->pin < 100) {
+        return luat_gpio_open(gpio);
+    }
+    else {
+        return luat_airlink_drv_gpio_open(gpio);
+    }
+}
+
+int luat_drv_gpio_set(int pin, int level) {
+    if (pin < 0 || pin >= 255) {
+        return -1;
+    }
+    if (pin < 100) {
+        return luat_gpio_set(pin, level);
+    }
+    else {
+        return luat_airlink_drv_gpio_set(pin, level);
+    }
+}
+
+int luat_drv_gpio_setup(luat_gpio_t* gpio) {
+    LLOGD("执行luat_drv_gpio_setup pin %d mode %d", gpio->pin, gpio->mode);
+    if (gpio == NULL) {
+        return -1;
+    }
+    if (gpio->pin < 0 || gpio->pin >= 255) {
+        return -2;
+    }
+    if (gpio->pin < 100) {
+        return luat_gpio_setup(gpio);
+    }
+    else {
+        return luat_airlink_drv_gpio_setup(gpio);
+    }
+}

+ 37 - 0
demo/airlink/air8000_gpio/main.lua

@@ -0,0 +1,37 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_gpio_ext"
+VERSION = "1.0.5"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+PWR8000S = gpio.setup(23, 0, gpio.PULLUP) -- 关闭Air8000S的LDO供电
+
+sys.taskInit(function()
+    -- 稍微缓一下
+    sys.wait(10)
+    -- 初始化airlink
+    airlink.init()
+    -- 启动底层线程, 从机模式
+    airlink.start(1)
+    PWR8000S(1)
+
+    -- 闪灯开始
+    sys.wait(100)
+    while 1 do
+        gpio.setup(109, 0, gpio.PULLUP)
+        gpio.setup(108, 1, gpio.PULLUP)
+        sys.wait(500)
+        gpio.setup(109, 1, gpio.PULLUP)
+        gpio.setup(108, 0, gpio.PULLUP)
+        sys.wait(500)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!