ソースを参照

add: yhm27xx,支持异步获取寄存器数据,reqinfo函数

Wendal Chen 9 ヶ月 前
コミット
1c2b0562e3

+ 1 - 0
components/airlink/include/luat_airlink_drv_gpio.h

@@ -13,5 +13,6 @@ int luat_airlink_drv_gpio_set(int pin, int level);
 int luat_airlink_drv_gpio_open(luat_gpio_cfg_t* gpio);
 int luat_airlink_drv_gpio_get(int pin, int* val);
 int luat_airlink_drv_gpio_driver_yhm27xx(uint32_t Pin, uint8_t ChipID, uint8_t RegAddress, uint8_t IsRead, uint8_t *Data);
+int luat_airlink_drv_gpio_driver_yhm27xx_reqinfo(uint8_t Pin, uint8_t ChipID);
 
 #endif

+ 21 - 0
components/airlink/src/driver/luat_airlink_drv_gpio.c

@@ -116,3 +116,24 @@ int luat_airlink_drv_gpio_driver_yhm27xx(uint32_t Pin, uint8_t ChipID, uint8_t R
     return 0;
 }
 
+int luat_airlink_drv_gpio_driver_yhm27xx_reqinfo(uint8_t Pin, uint8_t ChipID)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = 5 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x305, 2 + 8) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    uint8_t* data = cmd->data + 8;
+    data[0] = Pin;
+    data[1] = ChipID;
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+

+ 32 - 1
components/airlink/src/exec/luat_airlink_cmd_exec_gpio.c

@@ -70,7 +70,7 @@ int luat_airlink_cmd_exec_gpio_get(luat_airlink_cmd_t* cmd, void* userdata) {
 }
 
 int luat_airlink_cmd_exec_gpio_driver_yhm27xx(luat_airlink_cmd_t* cmd, void* userdata) {
-    LLOGE("收到yhm27xx的GPIO设置指令!!!");
+    // LLOGE("收到yhm27xx的GPIO设置指令!!!");
 
     uint8_t params[5];
     memcpy(params, cmd->data + 8, 5);
@@ -81,3 +81,34 @@ int luat_airlink_cmd_exec_gpio_driver_yhm27xx(luat_airlink_cmd_t* cmd, void* use
     
     return 0;
 }
+
+int luat_airlink_cmd_exec_gpio_driver_yhm27xx_reqinfo(luat_airlink_cmd_t* cmd, void* userdata) {
+    // LLOGE("收到yhm27xx的GPIO设置指令!!!");
+
+    uint8_t pin = cmd->data[8];
+    uint8_t chip_id = cmd->data[9];
+    uint8_t params[9] = {0};
+    for (uint8_t i = 0; i < 9; i++)
+    {
+        luat_gpio_driver_yhm27xx(pin, chip_id, i, 1, &(params[i]));
+    }
+    
+    // 反馈数据, 走sys_pub
+    uint8_t buff[256] = {0};
+    int ret = 0;
+    int remain = 256;
+    uint8_t *ptr = buff;
+
+    ret = luat_airlink_syspub_addstring("YHM27XX_REG", strlen("YHM27XX_REG"), ptr, remain);
+    ptr += ret;
+    remain -= ret;
+        
+    ret = luat_airlink_syspub_addstring((const char*)params, 9, ptr, remain);
+    ptr += ret;
+    remain -= ret;
+
+    luat_airlink_syspub_send(buff, ptr - buff);
+    
+    return 0;
+}
+

+ 2 - 0
components/airlink/src/luat_airlink_cmds.c

@@ -58,6 +58,7 @@ CMD_DEFINE(gpio_set);
 CMD_DEFINE(gpio_get);
 CMD_DEFINE(gpio_get_result);
 CMD_DEFINE(gpio_driver_yhm27xx);
+CMD_DEFINE(gpio_driver_yhm27xx_reqinfo);
 
 // UART指令, 0x400开始
 CMD_DEFINE(uart_setup);
@@ -116,6 +117,7 @@ __USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     CMD_REG(0x301, gpio_set),
     // CMD_REG(0x302, gpio_get),
     CMD_REG(0x304, gpio_driver_yhm27xx),
+    CMD_REG(0x305, gpio_driver_yhm27xx_reqinfo),
 #endif
 
 #ifdef LUAT_USE_AIRLINK_EXEC_UART

+ 1 - 1
components/drv/include/luat/drv_gpio.h

@@ -9,5 +9,5 @@ int luat_drv_gpio_set(int pin, int level);
 int luat_drv_gpio_setup(luat_gpio_t* gpio);
 int luat_drv_gpio_get(int pin, int* val);
 int luat_drv_gpio_driver_yhm27xx(uint32_t Pin, uint8_t ChipID, uint8_t RegAddress, uint8_t IsRead, uint8_t *Data);
-
+int luat_drv_gpio_driver_yhm27xx_reqinfo(uint8_t Pin, uint8_t ChipID);
 #endif

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

@@ -72,3 +72,7 @@ int luat_drv_gpio_driver_yhm27xx(uint32_t Pin, uint8_t ChipID, uint8_t RegAddres
 {
     return luat_airlink_drv_gpio_driver_yhm27xx(Pin, ChipID, RegAddress, IsRead, Data);
 }
+
+int luat_drv_gpio_driver_yhm27xx_reqinfo(uint8_t Pin, uint8_t ChipID) {
+    return luat_airlink_drv_gpio_driver_yhm27xx_reqinfo(Pin, ChipID);
+}

+ 41 - 0
components/yhm27xx/binding/luat_lib_yhm27xx.c

@@ -15,6 +15,7 @@
 #include "luat_mem.h"
 #include "luat_gpio.h"
 #include "luat_zbuff.h"
+#include "luat_msgbus.h"
 
 #define LUAT_LOG_TAG "yhm27xx"
 #include "luat_log.h"
@@ -48,7 +49,11 @@ static int l_yhm27xx_cmd(lua_State *L)
     is_read = 0;
     data = luaL_checkinteger(L, 4);
   }
+  #ifdef LUAT_USE_DRV_GPIO
+  if(luat_drv_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data))
+  #else
   if(luat_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data))
+  #endif
   {
     lua_pushboolean(L, 0);
     return 1;
@@ -62,9 +67,45 @@ static int l_yhm27xx_cmd(lua_State *L)
   return 1;
 }
 
+static uint8_t reg_infos[9] = {0};
+
+static int l_yhm_27xx_cb(lua_State *L, void *ptr) {
+  lua_getglobal(L, "sys_pub");
+  if (lua_isfunction(L, -1)) {
+    lua_pushstring(L, "YHM27XX_REG");
+    lua_pushlstring(L, (const char*)reg_infos, 9);
+    lua_call(L, 2, 0);
+  }
+  return 0;
+}
+
+static void luat_gpio_driver_yhm27xx_reqinfo(uint8_t pin, uint8_t chip_id) {
+  
+  for (uint8_t i = 0; i < 9; i++)
+  {
+    luat_gpio_driver_yhm27xx(pin, chip_id, i, 1, &(reg_infos[i]));
+  }
+  rtos_msg_t msg = {0};
+  msg.handler = l_yhm_27xx_cb;
+  luat_msgbus_put(&msg, 0);
+}
+
+static int l_yhm27xx_reqinfo(lua_State *L)
+{
+  uint8_t pin = luaL_checkinteger(L, 1);
+  uint8_t chip_id = luaL_checkinteger(L, 2);
+  #ifdef LUAT_USE_DRV_GPIO
+  luat_drv_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
+  #else
+  luat_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
+  #endif
+  return 0;
+}
+
 #include "rotable2.h"
 static const rotable_Reg_t reg_yhm27xx[] = {
         {"cmd",     ROREG_FUNC(l_yhm27xx_cmd)},
+        {"reqinfo", ROREG_FUNC(l_yhm27xx_reqinfo)},
         {NULL,          ROREG_INT(0)}
 };