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

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

马亚丹 3 месяцев назад
Родитель
Сommit
254c878462
63 измененных файлов с 963 добавлено и 126 удалено
  1. 1 1
      components/airlink/include/luat_airlink.h
  2. 41 15
      components/airlink/src/driver/luat_airlink_drv_uart.c
  3. 1 1
      components/airlink/src/luat_airlink_fota.c
  4. 84 30
      components/airlink/src/task/luat_airlink_spi_master_task.c
  5. 2 2
      components/io_queue/luat_lib_io_queue.c
  6. 1 1
      components/network/adapter/luat_network_adapter.c
  7. 10 1
      components/wlan/luat_lib_wlan.c
  8. 9 0
      luat/modules/luat_lib_rtos.c
  9. 16 1
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua
  10. 20 5
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/gpio_app.lua
  11. 1 1
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/main.lua
  12. 20 8
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/readme.md
  13. 2 2
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirKEY_1000/readme.md
  14. 7 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirSHT30_1000/readme.md
  15. 16 1
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua
  16. 1 1
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/main.lua
  17. 14 5
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/readme.md
  18. 14 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/voc_app.lua
  19. 1 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/lbsLoc2/lbsloc2_app.lua
  20. 4 4
      module/Air780EHM_Air780EHV_Air780EGH/demo/luatos_framework/hello_luatos/readme.md
  21. 4 4
      module/Air780EHM_Air780EHV_Air780EGH/demo/luatos_framework/luatos_task/readme.md
  22. 14 0
      module/Air780EPM/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua
  23. 14 0
      module/Air780EPM/demo/accessory_board/AirGPIO_1000/gpio_app.lua
  24. 1 1
      module/Air780EPM/demo/accessory_board/AirGPIO_1000/main.lua
  25. 12 3
      module/Air780EPM/demo/accessory_board/AirGPIO_1000/readme.md
  26. 7 0
      module/Air780EPM/demo/accessory_board/AirSHT30_1000/readme.md
  27. 15 0
      module/Air780EPM/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua
  28. 1 1
      module/Air780EPM/demo/accessory_board/AirVOC_1000/main.lua
  29. 10 1
      module/Air780EPM/demo/accessory_board/AirVOC_1000/readme.md
  30. 14 0
      module/Air780EPM/demo/accessory_board/AirVOC_1000/voc_app.lua
  31. 1 0
      module/Air780EPM/demo/lbsLoc2/lbsloc2_app.lua
  32. 1 1
      module/Air780EPM/demo/luatos_framework/hello_luatos/readme.md
  33. 1 1
      module/Air780EPM/demo/luatos_framework/luatos_task/readme.md
  34. 14 0
      module/Air8000/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua
  35. 18 4
      module/Air8000/demo/accessory_board/AirGPIO_1000/gpio_app.lua
  36. 10 1
      module/Air8000/demo/accessory_board/AirGPIO_1000/readme.md
  37. 52 0
      module/Air8000/demo/accessory_board/AirKEY_1000/AirKEY_1000.lua
  38. 138 0
      module/Air8000/demo/accessory_board/AirKEY_1000/key_app.lua
  39. 63 0
      module/Air8000/demo/accessory_board/AirKEY_1000/main.lua
  40. 119 0
      module/Air8000/demo/accessory_board/AirKEY_1000/readme.md
  41. 7 0
      module/Air8000/demo/accessory_board/AirSHT30_1000/readme.md
  42. 15 1
      module/Air8000/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua
  43. 1 1
      module/Air8000/demo/accessory_board/AirVOC_1000/main.lua
  44. 10 1
      module/Air8000/demo/accessory_board/AirVOC_1000/readme.md
  45. 14 0
      module/Air8000/demo/accessory_board/AirVOC_1000/voc_app.lua
  46. 1 1
      module/Air8000/demo/ble/peripheral/ble_server_main.lua
  47. 1 1
      module/Air8000/demo/gpio/GPIO中断(触发)模式/main.lua
  48. 6 5
      module/Air8000/demo/lbsLoc2/lbsloc2_app.lua
  49. 39 1
      module/Air8000/demo/xxtea/main.lua
  50. 1 2
      module/Air8000/demo/xxtea/readme.md
  51. 0 8
      module/Air8000/demo/xxtea/xxtea_demo.lua
  52. 14 0
      module/Air8101/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua
  53. 14 0
      module/Air8101/demo/accessory_board/AirGPIO_1000/gpio_app.lua
  54. 10 2
      module/Air8101/demo/accessory_board/AirGPIO_1000/readme.md
  55. 7 0
      module/Air8101/demo/accessory_board/AirSHT30_1000/readme.md
  56. 15 0
      module/Air8101/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua
  57. 10 1
      module/Air8101/demo/accessory_board/AirVOC_1000/readme.md
  58. 14 0
      module/Air8101/demo/accessory_board/AirVOC_1000/voc_app.lua
  59. 1 1
      module/Air8101/demo/ble/peripheral/ble_server_main.lua
  60. 1 1
      module/Air8101/demo/luatos_framework/hello_luatos/readme.md
  61. 1 1
      module/Air8101/demo/luatos_framework/luatos_task/readme.md
  62. 1 1
      olddemo/http/main.lua
  63. 6 2
      script/corelib/sys.lua

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

@@ -79,7 +79,7 @@ void luat_airlink_task_start(void);
 void luat_airlink_print_buff(const char* tag, uint8_t* buff, size_t len);
 void luat_airlink_on_data_recv(uint8_t *data, size_t len);
 
-void airlink_wait_for_slave_ready(size_t timeout_ms);
+void airlink_wait_for_slave_reply(size_t timeout_ms);
 void airlink_transfer_and_exec(uint8_t *txbuff, uint8_t *rxbuff);
 void airlink_wait_and_prepare_data(uint8_t *txbuff);
 

+ 41 - 15
components/airlink/src/driver/luat_airlink_drv_uart.c

@@ -37,22 +37,48 @@ int luat_airlink_drv_uart_setup(luat_uart_t* conf) {
 }
 
 int luat_airlink_drv_uart_write(int uart_id, void* data, size_t length) {
-    // LLOGD("执行uart write %d %p %d", uart_id, data, length);
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
-    size_t total_len = length + sizeof(luat_airlink_cmd_t) + 8 + 1;
-    airlink_queue_item_t item = {.len = total_len};
-    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x401, length + 1 + 8);
-    if (cmd == NULL) {
-        LLOGE("内存分配失败!!");
-        return 0;
+    if(length <= 1536) {
+        // LLOGD("执行uart write %d %p %d", uart_id, data, length);
+        uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+        size_t total_len = length + sizeof(luat_airlink_cmd_t) + 8 + 1;
+        airlink_queue_item_t item = {.len = total_len};
+        luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x401, length + 1 + 8);
+        if (cmd == NULL) {
+            LLOGE("内存分配失败!!");
+            return 0;
+        }
+        memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+        uint8_t tmp = (uint8_t)uart_id;
+        memcpy(cmd->data + 8, &tmp, 1);
+        memcpy(cmd->data + 9, data, length);
+        item.cmd = cmd;
+        int ret = luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+        return ret == 0 ? length : 0;
+    } else {
+        // 如果数据长度大于1536,分段发送
+        size_t segment_size = 1535;  // 使用1535避免无限递归
+        const char* segment_data = (const char*)data;
+        size_t remaining = length;
+        size_t sent_total = 0;
+
+        while (remaining > 0) {
+            size_t current_segment = (remaining > segment_size) ? segment_size : remaining;
+
+            int ret = luat_airlink_drv_uart_write(uart_id, (void*)segment_data, current_segment);
+            if (ret <= 0) {
+                return sent_total;
+            }
+            sent_total += ret;
+            segment_data += ret;
+            remaining -= ret;
+
+            if (ret < current_segment) {
+                break;
+            }
+        }
+
+        return sent_total;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t tmp = (uint8_t)uart_id;
-    memcpy(cmd->data + 8, &tmp, 1);
-    memcpy(cmd->data + 9, data, length);
-    item.cmd = cmd;
-    int ret = luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
-    return ret == 0 ? length : 0;
 }
 
 int luat_airlink_drv_uart_close(int uart_id) {

+ 1 - 1
components/airlink/src/luat_airlink_fota.c

@@ -60,7 +60,7 @@ static void pack_and_send(uint16_t cmd_id, uint8_t *data, size_t len)
     luat_airlink_data_pack(cmd, sizeof(luat_airlink_cmd_t) + len, s_airlink_fota_txbuff);
     // LLOGD("发送sFOTA %d %d", cmd->cmd, cmd->len);
     airlink_transfer_and_exec(s_airlink_fota_txbuff, s_airlink_fota_rxbuff);
-    airlink_wait_for_slave_ready(5000); // 等待从机回复完成接收
+    airlink_wait_for_slave_reply(5000); // 等待从机回复完成接收
 
     memset(s_airlink_fota_txbuff, 0, AIRLINK_SFOTA_BUFF_SIZE);
 }

+ 84 - 30
components/airlink/src/task/luat_airlink_spi_master_task.c

@@ -41,11 +41,15 @@ static uint8_t thread_rdy;
 static uint8_t spi_rdy;
 static luat_rtos_task_handle spi_task_handle;
 
+#if defined(LUAT_USE_AIRLINK_EXEC_MOBILE)
+extern luat_airlink_dev_info_t g_airlink_self_dev_info;
+#endif
 static uint8_t basic_info[256];
 
 // static uint32_t is_waiting_queue = 0;
 
 static luat_rtos_queue_t evt_queue;
+static luat_rtos_queue_t rdy_evt_queue;  // 专门用于RDY事件(id=6)的队列
 
 extern luat_airlink_irq_ctx_t g_airlink_irq_ctx;
 extern luat_airlink_irq_ctx_t g_airlink_wakeup_irq_ctx;
@@ -53,6 +57,25 @@ extern luat_airlink_irq_ctx_t g_airlink_wakeup_irq_ctx;
 luat_airlink_irq_ctx_t g_airlink_irq_ctx;
 luat_airlink_irq_ctx_t g_airlink_wakeup_irq_ctx;
 
+// RDY引脚中断等待相关变量
+static volatile uint8_t rdy_ready_flag = 0;           // RDY就绪标志
+
+// RDY引脚下降沿中断处理函数,设置就绪标志并发送事件
+__USER_FUNC_IN_RAM__ static int rdy_pin_irq_handler(void* param)
+{
+    // 设置RDY就绪标志
+    if (rdy_evt_queue == NULL) {
+        return 0;
+    }
+    rdy_ready_flag = 1;
+    // 发送通知事件,告知任务RDY已就绪
+    luat_event_t evt = {.id = 6};
+    luat_rtos_queue_send(rdy_evt_queue, &evt, sizeof(evt), 0);
+    
+    // LLOGD("RDY中断触发,设置就绪标志");
+    return 0;
+}
+
 __USER_FUNC_IN_RAM__ static int slave_irq_cb(void *data, void *args)
 {
     uint32_t len = 0;
@@ -116,22 +139,31 @@ void luat_airlink_spi_master_pin_setup(void)
         .CPHA = 1,
         .CPOL = 1,
         .dataw = 8,
-        .bit_dict = 0,
+        .bit_dict = 1, // MSB, 大部分平台也只支持MSB
         .master = 1,
         .mode = 1, // mode设置为1,全双工
         .bandrate = g_airlink_spi_conf.speed > 0 ? g_airlink_spi_conf.speed : 31000000,
         .cs = 255};
-    luat_pm_iovolt_ctrl(0, 3300);
+    // luat_pm_iovolt_ctrl(0, 3300);
 
     luat_spi_setup(&spi_conf);
     luat_gpio_cfg_t gpio_cfg = {0};
 
     // 从机准备好脚
+    // luat_gpio_set_default_cfg(&gpio_cfg);
+    // gpio_cfg.pin = AIRLINK_SPI_RDY_PIN;
+    // gpio_cfg.mode = LUAT_GPIO_INPUT;
+    // gpio_cfg.irq_type = LUAT_GPIO_FALLING_IRQ;
+    // gpio_cfg.pull = 0;
+    // luat_gpio_open(&gpio_cfg);
+
+    // 设置RDY引脚中断,
     luat_gpio_set_default_cfg(&gpio_cfg);
     gpio_cfg.pin = AIRLINK_SPI_RDY_PIN;
-    gpio_cfg.mode = LUAT_GPIO_INPUT;
-    gpio_cfg.irq_type = LUAT_GPIO_FALLING_IRQ;
-    gpio_cfg.pull = 0;
+    gpio_cfg.mode = LUAT_GPIO_IRQ;
+    gpio_cfg.irq_type = LUAT_GPIO_FALLING_IRQ;  // 下降沿中断
+    gpio_cfg.pull = LUAT_GPIO_PULLUP;
+    gpio_cfg.irq_cb = rdy_pin_irq_handler;
     luat_gpio_open(&gpio_cfg);
 
     // CS片选脚
@@ -187,7 +219,21 @@ __USER_FUNC_IN_RAM__ void airlink_transfer_and_exec(uint8_t *txbuff, uint8_t *rx
     airlink_link_data_t *link = NULL;
 
     g_airlink_statistic.tx_pkg.total++;
+    // 拉低片选, 准备发送数据
+    luat_gpio_set(AIRLINK_SPI_CS_PIN, 0);
+    // 发送数据
     luat_spi_transfer(MASTER_SPI_ID, (const char *)txbuff, TEST_BUFF_SIZE, (char *)rxbuff, TEST_BUFF_SIZE);
+    // 拉高片选之前,先检查一下是否有RDY事件未处理,如果有,则全部清除
+    size_t qlen = 0;
+    luat_rtos_queue_get_cnt(rdy_evt_queue, &qlen);
+    if (qlen > 0) {
+        // LLOGW("发送数据后发现有%d个RDY事件未处理", (int)qlen);
+        // 清除掉这些冗余的RDY事件
+        luat_event_t evt = {0};
+        luat_rtos_queue_recv(rdy_evt_queue, &evt, sizeof(evt), 0);
+    }
+    rdy_ready_flag = 0;
+    // 拉高片选, 数据发送完毕
     luat_gpio_set(AIRLINK_SPI_CS_PIN, 1);
     // luat_airlink_print_buff("RX", rxbuff, 32);
     // 对接收到的数据进行解析
@@ -209,30 +255,16 @@ __USER_FUNC_IN_RAM__ void airlink_transfer_and_exec(uint8_t *txbuff, uint8_t *rx
     }
 }
 
-__USER_FUNC_IN_RAM__ void airlink_wait_for_slave_ready(size_t timeout_ms)
+__USER_FUNC_IN_RAM__ void airlink_wait_for_slave_reply(size_t timeout_ms)
 {
-    luat_gpio_set(AIRLINK_SPI_CS_PIN, 0); // 拉低片选, 等待从机就绪
-    int tmpval = 0;
-    for (size_t i = 0; i < timeout_ms; i++)
+    luat_event_t event = {0};
+    while (1)
     {
-        tmpval = luat_gpio_get(AIRLINK_SPI_RDY_PIN);
-        if (tmpval == 1)
-        {
-            g_airlink_statistic.wait_rdy.total++;
-            if (g_airlink_debug)
-            {
-                tnow = luat_mcu_tick64_ms();
-                if (tnow - warn_slave_no_ready > 1000)
-                {
-                    warn_slave_no_ready = tnow;
-                    LLOGD("从机未就绪,等1ms");
-                }
-            }
-            luat_rtos_task_sleep(1);
-            continue;
+        event.id = 0;
+        luat_rtos_queue_recv(rdy_evt_queue, &event, sizeof(luat_event_t), 10);
+        if (event.id != 0) {
+            break;
         }
-        // LLOGD("从机已就绪!! %s %s", __DATE__, __TIME__);
-        break;
     }
 }
 
@@ -321,6 +353,9 @@ __USER_FUNC_IN_RAM__ void airlink_wait_and_prepare_data(uint8_t *txbuff)
     else
     {
         // LLOGD("填充PING数据");
+        #if defined(LUAT_USE_AIRLINK_EXEC_MOBILE)
+        memcpy(basic_info + sizeof(luat_airlink_cmd_t), &g_airlink_self_dev_info, sizeof(g_airlink_self_dev_info));
+        #endif
         luat_airlink_data_pack(basic_info, sizeof(basic_info), txbuff);
         queue_emtry_counter ++;
     }
@@ -334,11 +369,27 @@ __USER_FUNC_IN_RAM__ static void on_link_data_notify(airlink_link_data_t* link)
     }
 }
 
+#if defined(LUAT_USE_AIRLINK_EXEC_MOBILE)
+static void send_devinfo_update_evt(void) {
+    airlink_queue_item_t item = {0};
+    // 发送空消息, 会自动转为devinfo消息
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item); 
+}
+#endif
 
 __USER_FUNC_IN_RAM__ static void spi_master_task(void *param)
 {
     // int i;
     // luat_event_t event = {0};
+    #if defined(LUAT_USE_AIRLINK_EXEC_MOBILE)
+    luat_airlink_cmd_t *cmd = (luat_airlink_cmd_t *)basic_info;
+    cmd->cmd = 0x10;
+    cmd->len = 128;
+
+    extern void luat_airlink_devinfo_init();
+    luat_airlink_devinfo_init(send_devinfo_update_evt);
+    #endif
+
     luat_rtos_task_sleep(5); // 等5ms
     luat_airlink_spi_master_pin_setup();
     g_airlink_newdata_notify_cb = on_newdata_notify;
@@ -355,13 +406,13 @@ __USER_FUNC_IN_RAM__ static void spi_master_task(void *param)
 
         memset(s_txbuff, 0, TEST_BUFF_SIZE);
         airlink_wait_and_prepare_data(s_txbuff);
-        // slave_rdy = 0;
-        airlink_wait_for_slave_ready(1000); // 最多等1秒
 
+        // 立即发送数据给从机
         airlink_transfer_and_exec(s_txbuff, s_rxbuff);
-
         memset(s_rxbuff, 0, TEST_BUFF_SIZE);
-        // start = 0;
+
+        // 发送完成后,等待从机的响应/确认
+        airlink_wait_for_slave_reply(5000);
     }
 }
 
@@ -376,7 +427,10 @@ void luat_airlink_start_master(void)
     s_txbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
     s_rxbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
 
+    // 创建通用事件队列 (id=2,3等)
     luat_rtos_queue_create(&evt_queue, 4 * 1024, sizeof(luat_event_t));
+    // 创建专门的RDY事件队列 (id=6)
+    luat_rtos_queue_create(&rdy_evt_queue, 1, sizeof(luat_event_t));
     luat_rtos_task_create(&spi_task_handle, 8 * 1024, 50, "spi", spi_master_task, NULL, 0);
 }
 

+ 2 - 2
components/io_queue/luat_lib_io_queue.c

@@ -211,13 +211,13 @@ static int l_io_queue_capture_pin(lua_State *L) {
 
 /*
 对io操作队列增加结束捕获某个IO命令
-@api  ioqueue.capend(hwtimer_id,pin)
+@api  ioqueue.cap_done(hwtimer_id,pin)
 @int  硬件定时器id
 @int  pin
 @return nil 无返回值
 @usage
 -- 结束捕获
-ioqueue.capend(0, 17)
+ioqueue.cap_done(0, 17)
 */
 static int l_io_queue_capture_end(lua_State *L) {
 	uint8_t timer_id = luaL_optinteger(L, 1, 0);

+ 1 - 1
components/network/adapter/luat_network_adapter.c

@@ -26,8 +26,8 @@ typedef struct
 {
 #ifdef LUAT_USE_LWIP
 	network_ctrl_t lwip_ctrl_table[LWIP_NUM_SOCKETS];
-	HANDLE network_mutex;
 #endif
+	HANDLE network_mutex;
 	int last_adapter_index;
 	int default_adapter_index;
 	llist_head dns_cache_head;

+ 10 - 1
components/wlan/luat_lib_wlan.c

@@ -237,7 +237,16 @@ static int l_wlan_scan_result(lua_State* L) {
     }
     memset(results, 0, sizeof(luat_wlan_scan_result_t) * ap_limit);
     #ifdef LUAT_USE_DRV_WLAN
-    int len = luat_drv_wlan_scan_get_result(results, ap_limit);
+    int len = 0;
+    #ifdef LUAT_USE_AIRLINK
+    if (luat_airlink_has_wifi()) {
+        len = luat_drv_wlan_scan_get_result(results, ap_limit);
+    }
+    else
+    {
+        len = luat_wlan_scan_get_result(results, ap_limit);
+    }
+    #endif
     #else
     int len = luat_wlan_scan_get_result(results, ap_limit);
     #endif

+ 9 - 0
luat/modules/luat_lib_rtos.c

@@ -248,6 +248,15 @@ local luatos_version = rtos.version()
 */
 static int l_rtos_version(lua_State *L) {
     lua_pushstring(L, luat_version_str());
+    // 当多传入一个参数时,且值为true,则返回数字版本号
+    if (lua_isboolean(L, 1) && lua_toboolean(L, 1)) {
+        #ifdef LUAT_CONF_FIRMWARE_TYPE_NUM
+        lua_pushinteger(L, LUAT_CONF_FIRMWARE_TYPE_NUM);
+        #else
+        lua_pushinteger(L, 0);
+        #endif
+        return 2;
+    }
     return 1;
 }
 

+ 16 - 1
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua

@@ -1,4 +1,19 @@
---本文件中的主机是指I2C主机,具体指Air780EHV
+--[[
+@module  AirGPIO_1000
+@summary AirGPIO_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirGPIO_1000驱动配置文件,核心业务逻辑为:
+1、配置主机和AirGPIO_1000之间的通信参数;
+2、配置AirGPIO_1000上的扩展GPIO管脚功能;支持配置为输出,输入和中断三种模式;
+
+本文件没有对外接口,直接require "AirGPIO_1000"就可以加载运行;
+]]
+
+
+--本文件中的主机是指I2C主机,具体指Air780EHM/Air780EHV/Air780EGH
 --本文件中的从机是指I2C从机,具体指AirGPIO_1000配件板上的IO扩展芯片
 
 local AirGPIO_1000 = 

+ 20 - 5
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/gpio_app.lua

@@ -1,3 +1,18 @@
+--[[
+@module  gpio_app
+@summary gpio_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为gpio_app应用功能模块,核心业务逻辑为:
+1、初始化Air780EHM/Air780EHV/Air780EGH和AirGPIO_1000之间的通信参数
+2、GPIO输出测试,输入测试,GPIO中断测试
+
+本文件没有对外接口,直接在main.lua中require "gpio_app"就可以加载运行;
+]]
+
+
 --加载AirGPIO_1000驱动文件
 local air_gpio = require "AirGPIO_1000"
 
@@ -73,11 +88,11 @@ local function gpio_int_task_func()
 end
 
 
---初始化Air780EHV和AirGPIO_1000之间的通信参数
---使用Air780EHV的I2C1
---使用Air780EHV的GPIO2做为中断引脚
---Air780EHV核心板和AirGPIO_1000配件板的接线方式如下
---Air780EHV核心板             AirGPIO_1000配件板
+--初始化Air780EHM/Air780EHV/Air780EGH和AirGPIO_1000之间的通信参数
+--使用Air780EHM/Air780EHV/Air780EGH的I2C1
+--使用Air780EHM/Air780EHV/Air780EGH的GPIO2做为中断引脚
+--Air780EHM/Air780EHV/Air780EGH核心板和AirGPIO_1000配件板的接线方式如下
+--Air780EHM/Air780EHV/Air780EGH核心板             AirGPIO_1000配件板
 --      3V3-----------------3V3
 --       GND-----------------GND
 --     66/I2C1SDA-----------------SDA

+ 1 - 1
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/main.lua

@@ -10,7 +10,7 @@ VERSION:项目版本号,ascii string类型
 
 AirGPIO_1000是合宙设计生产的一款I2C转16路扩展GPIO的配件板;
 本demo演示的核心功能为:
-Air8101核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
+Air780EHM/Air780EHV/Air780EGH核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 分输出、输入和中断三种应用场景来演示;
 更多说明参考本目录下的readme.md文件
 ]]

+ 20 - 8
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirGPIO_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gpio_app.lua:AirGPIO_1000扩展GPIO输出测试,输入测试,GPIO中断测试;
+
+3、AirGPIO_1000.lua:AirGPIO_1000驱动配置文件;
 
 ## 演示功能概述
 
@@ -5,28 +12,29 @@ AirGPIO_1000是合宙设计生产的一款I2C转16路扩展GPIO的配件板;
 
 本demo演示的核心功能为:
 
-Air780EHV核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
+Air780EHM/Air780EHV/Air780EGH核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 
 分输出、输入和中断三种应用场景来演示;
 
-
 ## 核心板+配件板资料
 
-[Air780EHV核心板+配件板相关资料](https://docs.openluat.com/air780ehv/product/shouce/)
+[Air780EHM/Air780EHV/Air780EGH](https://docs.openluat.com/air780ehv/product/shouce/)
+
+[AirGPIO_1000配件板相关资料](https://docs.openluat.com/accessory/AirGPIO_1000/)
 
 ## 演示硬件环境
 
 ![](https://docs.openluat.com/accessory/AirGPIO_1000/image/connect_Air780EHV.jpg)
 
-1、Air780EHV核心板
+1、Air780EHM/Air780EHV/Air780EGH核心板
 
 2、AirGPIO_1000配件板
 
 3、母对母的杜邦线8根
 
-4、Air780EHV核心板和AirGPIO_1000配件板的硬件接线方式为
+4、Air780EHM/Air780EHV/Air780EGH核心板和AirGPIO_1000配件板的硬件接线方式为
 
-| Air780EHV核心板 | AirGPIO_1000配件板 |
+| Air780EHM/Air780EHV/Air780EGH核心板 | AirGPIO_1000配件板 |
 | ------------ | ------------------ |
 |     3V3     |         3V3        |
 |     GND   |         GND        |
@@ -43,9 +51,13 @@ Air780EHV核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 
 ## 演示软件环境
 
-1、Luatools下载调试工具
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
+
+2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+3、[Air780EHV 最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
 
-2、[Air780EHV最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+4、[Air780EGH 最新版本的内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
 
 
 ## 演示操作步骤

+ 2 - 2
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirKEY_1000/readme.md

@@ -2,9 +2,9 @@
 
 1、main.lua:主程序入口;
 
-2、key_app.lua:使用核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态
+2、sht30_app.lua:每隔1秒读取一次温湿度数据
 
-3、AirKEY_1000.lua:配置主机和AirKEY_1000之间的控制参数
+3、AirSHT30_1000.lua:AirSHT30_1000驱动文件
 
 ## 用户消息介绍
 

+ 7 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirSHT30_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、key_app.lua:使用核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
+
+3、AirKEY_1000.lua:配置主机和AirKEY_1000之间的控制参数;
 
 ## 演示功能概述
 

+ 16 - 1
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua

@@ -1,4 +1,19 @@
---本文件中的主机是指I2C主机,具体指Air780EHV
+--[[
+@module  AirVOC_1000
+@summary AirVOC_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirVOC_1000驱动配置文件,核心业务逻辑为:
+1、打开AirVOC_1000;
+2、读取TVOC的空气质量等级;
+
+本文件没有对外接口,直接require "AirVOC_1000"就可以加载运行;
+]]
+
+
+--本文件中的主机是指I2C主机,具体指Air780EHM/Air780EHV/Air780EGH
 --本文件中的从机是指I2C从机,具体指AirVOC_1000配件板上的ags02ma VOC(挥发性有机化合物)气体传感器芯片
 
 local AirVOC_1000 = 

+ 1 - 1
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/main.lua

@@ -11,7 +11,7 @@ VERSION:项目版本号,ascii string类型
 AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合物)气体传感器配件板;
 主要用于检测甲醛、一氧化碳、可燃气体、酒精、氨气、硫化物、苯系蒸汽、烟雾、其它有害气体的监测;
 本demo演示的核心功能为:
-Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
+Air780EHM/Air780EHV/Air780EGH核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
 更多说明参考本目录下的readme.md文件
 ]]
 PROJECT = "AirVOC_1000"

+ 14 - 5
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、voc_app.lua:每隔1秒读取一次TVOC数据;
+
+3、AirVOC_1000.lua:AirVOC_1000驱动文件;
 
 ## 演示功能概述
 
@@ -7,27 +14,29 @@ AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合
 
 本demo演示的核心功能为:
 
-Air780EHV核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
+Air780EHM/Air780EHV/Air780EGH核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
 
 
 ## 核心板+配件板资料
 
-[Air780EHV核心板+配件板相关资料](https://docs.openluat.com/air780ehv/product/shouce/)
+[Air780EHM/Air780EHV/Air780EGH核心板](https://docs.openluat.com/air780ehv/product/shouce/)
+
+[AirVOC_1000配件板相关资料](https://docs.openluat.com/accessory/AirVOC_1000/)
 
 
 ## 演示硬件环境
 
 ![](https://docs.openluat.com/accessory/AirVOC_1000/image/connect_Air780ehv.jpg)
 
-1、Air780EHV核心板
+1、Air780EHM/Air780EHV/Air780EGH核心板
 
 2、AirVOC_1000配件板
 
 3、母对母的杜邦线4根
 
-4、Air780EHV核心板和AirVOC_1000配件板的硬件接线方式为
+4、Air780EHM/Air780EHV/Air780EGH核心板和AirVOC_1000配件板的硬件接线方式为
 
-| Air780EHV核心板 | AirVOC_1000配件板  |
+| Air780EHM/Air780EHV/Air780EGH核心板 | AirVOC_1000配件板  |
 | ------------ | ------------------ |
 |     3V3     |         3V3        |
 |     GND   |         GND        |

+ 14 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirVOC_1000/voc_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  voc_app
+@summary voc_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为voc_app应用功能模块,核心业务逻辑为:
+1、每隔1秒读取一次TVOC数据空气质量数据;
+
+本文件没有对外接口,直接在main.lua中require "voc_app"就可以加载运行;
+]]
+
+
 --加载AirVOC_1000驱动文件
 local air_voc = require "AirVOC_1000"
 

+ 1 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/lbsLoc2/lbsloc2_app.lua

@@ -35,6 +35,7 @@ local function lbsloc2_task_func()
     while true do 
         mobile.reqCellInfo(15)--进行基站扫描,超时时间为15s
         sys.waitUntil("CELL_INFO_UPDATE", 3000)--等到扫描成功,超时时间3S
+        log.info("扫描出的基站信息", json.encode(mobile.getCellInfo())) -- 打印基站信息
         local lat, lng, t = lbsLoc2.request(5000)--仅需要基站定位给出的经纬度
         --local lat, lng, t = lbsLoc2.request(5000,nil,nil,true)--需要经纬度和当前时间
         --(时间格式{"year":2024,"min":56,"month":11,"day":12,"sec":44,"hour":14})

+ 4 - 4
module/Air780EHM_Air780EHV_Air780EGH/demo/luatos_framework/hello_luatos/readme.md

@@ -8,19 +8,19 @@
 
 ## 演示硬件环境
 
-1、Air780EXX核心板一块
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
 
 2、TYPE-C USB数据线一根
 
-3、Air780EXX核心板和数据线的硬件接线方式为
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
 
-- Air780EXX核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
 - 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
 
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
 
 2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
 

+ 4 - 4
module/Air780EHM_Air780EHV_Air780EGH/demo/luatos_framework/luatos_task/readme.md

@@ -16,19 +16,19 @@
 
 ## 演示硬件环境
 
-1、Air780EXX核心板一块
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
 
 2、TYPE-C USB数据线一根
 
-4、Air780EXX核心板和数据线的硬件接线方式为
+4、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
 
-- Air780EXX核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
 - 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
 
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
 
 2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
 

+ 14 - 0
module/Air780EPM/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua

@@ -1,3 +1,17 @@
+--[[
+@module  AirGPIO_1000
+@summary AirGPIO_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirGPIO_1000驱动配置文件,核心业务逻辑为:
+1、配置主机和AirGPIO_1000之间的通信参数;
+2、配置AirGPIO_1000上的扩展GPIO管脚功能;支持配置为输出,输入和中断三种模式;
+
+本文件没有对外接口,直接require "AirGPIO_1000"就可以加载运行;
+]]
+
 --本文件中的主机是指I2C主机,具体指Air780epm
 --本文件中的从机是指I2C从机,具体指AirGPIO_1000配件板上的IO扩展芯片
 

+ 14 - 0
module/Air780EPM/demo/accessory_board/AirGPIO_1000/gpio_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  gpio_app
+@summary gpio_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为gpio_app应用功能模块,核心业务逻辑为:
+1、初始化Air780EHV和AirGPIO_1000之间的通信参数
+2、GPIO输出测试,输入测试,GPIO中断测试
+
+本文件没有对外接口,直接在main.lua中require "gpio_app"就可以加载运行;
+]]
+
 --加载AirGPIO_1000驱动文件
 local air_gpio = require "AirGPIO_1000"
 

+ 1 - 1
module/Air780EPM/demo/accessory_board/AirGPIO_1000/main.lua

@@ -10,7 +10,7 @@ VERSION:项目版本号,ascii string类型
 
 AirGPIO_1000是合宙设计生产的一款I2C转16路扩展GPIO的配件板;
 本demo演示的核心功能为:
-Air780EPM开发板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
+Air780EPM核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 分输出、输入和中断三种应用场景来演示;
 更多说明参考本目录下的readme.md文件
 ]]

+ 12 - 3
module/Air780EPM/demo/accessory_board/AirGPIO_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gpio_app.lua:AirGPIO_1000扩展GPIO输出测试,输入测试,GPIO中断测试;
+
+3、AirGPIO_1000.lua:AirGPIO_1000驱动配置文件;
 
 ## 演示功能概述
 
@@ -10,9 +17,11 @@ Air780EPM核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 分输出、输入和中断三种应用场景来演示;
 
 
-## 开发板+配件板资料
+## 核心板+配件板资料
+
+[Air780EPM核心板](https://docs.openluat.com/air780epm/product/shouce/)
 
-[Air780EPM核心板+配件板相关资料](https://docs.openluat.com/air780epm/product/shouce/)
+[AirGPIO_1000配件板相关资料](https://docs.openluat.com/accessory/AirGPIO_1000/)
 
 
 ## 演示硬件环境
@@ -25,7 +34,7 @@ Air780EPM核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 
 3、母对母的杜邦线8根
 
-4、Air780EPM开发板和AirGPIO_1000配件板的硬件接线方式为
+4、Air780EPM核心板和AirGPIO_1000配件板的硬件接线方式为
 
 | Air780EPM核心板 | AirGPIO_1000配件板 |
 | ------------ | ------------------ |

+ 7 - 0
module/Air780EPM/demo/accessory_board/AirSHT30_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、sht30_app.lua:每隔1秒读取一次温湿度数据;
+
+3、AirSHT30_1000.lua:AirSHT30_1000驱动文件;
 
 ## 演示功能概述
 

+ 15 - 0
module/Air780EPM/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua

@@ -1,3 +1,18 @@
+--[[
+@module  AirVOC_1000
+@summary AirVOC_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirVOC_1000驱动配置文件,核心业务逻辑为:
+1、打开AirVOC_1000;
+2、读取TVOC的空气质量等级;
+
+本文件没有对外接口,直接require "AirVOC_1000"就可以加载运行;
+]]
+
+
 --本文件中的主机是指I2C主机,具体指Air780EPM
 --本文件中的从机是指I2C从机,具体指AirVOC_1000配件板上的ags02ma VOC(挥发性有机化合物)气体传感器芯片
 

+ 1 - 1
module/Air780EPM/demo/accessory_board/AirVOC_1000/main.lua

@@ -11,7 +11,7 @@ VERSION:项目版本号,ascii string类型
 AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合物)气体传感器配件板;
 主要用于检测甲醛、一氧化碳、可燃气体、酒精、氨气、硫化物、苯系蒸汽、烟雾、其它有害气体的监测;
 本demo演示的核心功能为:
-Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
+Air780EPM开发板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
 更多说明参考本目录下的readme.md文件
 ]]
 PROJECT = "AirVOC_1000"

+ 10 - 1
module/Air780EPM/demo/accessory_board/AirVOC_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、voc_app.lua:每隔1秒读取一次TVOC数据;
+
+3、AirVOC_1000.lua:AirVOC_1000驱动文件;
 
 ## 演示功能概述
 
@@ -12,7 +19,9 @@ Air780EPM开发板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量
 
 ## 核心板+配件板资料
 
-[Air780EPM开发板+配件板相关资料](https://docs.openluat.com/air780epm/product/shouce/)
+[Air780EPM开发板](https://docs.openluat.com/air780epm/product/shouce/)
+
+[AirVOC_1000配件板相关资料](https://docs.openluat.com/accessory/AirVOC_1000/)
 
 
 ## 演示硬件环境

+ 14 - 0
module/Air780EPM/demo/accessory_board/AirVOC_1000/voc_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  voc_app
+@summary voc_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为voc_app应用功能模块,核心业务逻辑为:
+1、每隔1秒读取一次TVOC空气质量数据;
+
+本文件没有对外接口,直接在main.lua中require "voc_app"就可以加载运行;
+]]
+
+
 --加载AirVOC_1000驱动文件
 local air_voc = require "AirVOC_1000"
 

+ 1 - 0
module/Air780EPM/demo/lbsLoc2/lbsloc2_app.lua

@@ -35,6 +35,7 @@ local function lbsloc2_task_func()
     while true do 
         mobile.reqCellInfo(15)--进行基站扫描,超时时间为15s
         sys.waitUntil("CELL_INFO_UPDATE", 3000)--等到扫描成功,超时时间3S
+        log.info("扫描出的基站信息", json.encode(mobile.getCellInfo())) -- 打印基站信息
         local lat, lng, t = lbsLoc2.request(5000)--仅需要基站定位给出的经纬度
         --local lat, lng, t = lbsLoc2.request(5000,nil,nil,true)--需要经纬度和当前时间
         --(时间格式{"year":2024,"min":56,"month":11,"day":12,"sec":44,"hour":14})

+ 1 - 1
module/Air780EPM/demo/luatos_framework/hello_luatos/readme.md

@@ -20,7 +20,7 @@
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/luatos/common/download/)
 
 2、[Air780EPM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
 

+ 1 - 1
module/Air780EPM/demo/luatos_framework/luatos_task/readme.md

@@ -28,7 +28,7 @@
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/luatos/common/download/)
 
 2、[Air780EPM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
 

+ 14 - 0
module/Air8000/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua

@@ -1,3 +1,17 @@
+--[[
+@module  AirGPIO_1000
+@summary AirGPIO_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirGPIO_1000驱动配置文件,核心业务逻辑为:
+1、配置主机和AirGPIO_1000之间的通信参数;
+2、配置AirGPIO_1000上的扩展GPIO管脚功能;支持配置为输出,输入和中断三种模式;
+
+本文件没有对外接口,直接require "AirGPIO_1000"就可以加载运行;
+]]
+
 --本文件中的主机是指I2C主机,具体指Air8000
 --本文件中的从机是指I2C从机,具体指AirGPIO_1000配件板上的IO扩展芯片
 

+ 18 - 4
module/Air8000/demo/accessory_board/AirGPIO_1000/gpio_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  gpio_app
+@summary gpio_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为gpio_app应用功能模块,核心业务逻辑为:
+1、初始化Air780EHV和AirGPIO_1000之间的通信参数
+2、GPIO输出测试,输入测试,GPIO中断测试
+
+本文件没有对外接口,直接在main.lua中require "gpio_app"就可以加载运行;
+]]
+
 --加载AirGPIO_1000驱动文件
 local air_gpio = require "AirGPIO_1000"
 
@@ -74,10 +88,10 @@ end
 
 
 --初始化Air8000和AirGPIO_1000之间的通信参数
---使用Air8101的I2C0
---使用Air8101的GPIO2做为中断引脚
---Air8101核心板和AirGPIO_1000配件板的接线方式如下
---Air8101核心板             AirGPIO_1000配件板
+--使用Air8000的I2C0
+--使用Air8000的GPIO2做为中断引脚
+--Air8000核心板和AirGPIO_1000配件板的接线方式如下
+--Air8000核心板             AirGPIO_1000配件板
 --VDD_EXT(3.3V)-----------------3V3
 --       GND-----------------GND
 --     I2C1_SDA-----------------SDA

+ 10 - 1
module/Air8000/demo/accessory_board/AirGPIO_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gpio_app.lua:AirGPIO_1000扩展GPIO输出测试,输入测试,GPIO中断测试;
+
+3、AirGPIO_1000.lua:AirGPIO_1000驱动配置文件;
 
 ## 演示功能概述
 
@@ -12,7 +19,9 @@ Air8000核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 
 ## 核心板+配件板资料
 
-[Air8000核心板+配件板相关资料](https://docs.openluat.com/air8000/product/shouce/)
+[Air8000核心板](https://docs.openluat.com/air8000/product/shouce/)
+
+[AirGPIO_1000配件板相关资料](https://docs.openluat.com/accessory/AirGPIO_1000/)
 
 
 ## 演示硬件环境

+ 52 - 0
module/Air8000/demo/accessory_board/AirKEY_1000/AirKEY_1000.lua

@@ -0,0 +1,52 @@
+--本文件中的主机是指Air8000核心板
+--AirKEY_1000是合宙设计生产的一款8路独立按键的配件板
+
+local AirKEY_1000 = {}
+
+
+--配置主机和AirKEY_1000之间的控制参数;
+
+--key_id:number类型;
+--        AirKEY_1000的按键ID;
+--        取值范围:1到8;
+--        必须传入,不允许为空;
+--gpio_id:number类型;
+--         主机使用的中断引脚GPIO ID;
+--         AirKEY_1000上的一个按键引脚,和主机上的一个GPIO中断引脚相连;
+--         AirKEY_1000上的按键按下或者弹起,主机上的GPIO中断引脚输入电平发生变化,从而产生中断;
+--int_mode:number类型;
+--          表示主机GPIO中断触发类型;
+--          取值范围:gpio.RISING表示上升沿触发,gpio.FALLING表示下降沿触发;
+--          如果没有传入此参数,则默认为gpio.FALLING;
+--int_cbfunc:function类型;
+--          表示中断处理函数,函数的定义格式如下:
+--                           function cb_func(level, gpio_id)
+--                               --level:表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--                               --gpio_id:表示触发中断的主机中断引脚的GPIO ID;
+--                           end
+--          中断函数中不要直接执行耗时较长的动作,例如写fskv,写文件,延时等,可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+--          必须传入,不允许为空;
+
+--返回值:成功返回true,失败返回false
+function AirKEY_1000.setup(key_id, gpio_id, int_mode, int_cbfunc) 
+    --开启防抖,模式0-冷却,中断后马上上报,但200ms内只上报一次
+    gpio.debounce(gpio_id, 200)
+
+    if not (int_mode==gpio.RISING or int_mode==gpio.FALLING) then
+        log.error("AirKEY_1000.setup error", "invalid int_mode", int_mode)
+        return false
+    end
+
+    if type(int_cbfunc)~="function" then
+        log.error("AirKEY_1000.setup error", "invalid int_cbfunc", type(int_cbfunc))
+        return false
+    end
+
+    -- gpio.setup(gpio_id, int_cbfunc, int_mode==gpio.RISING and gpio.PULLDOWN or gpio.PULLUP, int_mode)
+    gpio.setup(gpio_id, int_cbfunc, gpio.PULLUP, int_mode)
+
+    return true
+end
+
+
+return AirKEY_1000

+ 138 - 0
module/Air8000/demo/accessory_board/AirKEY_1000/key_app.lua

@@ -0,0 +1,138 @@
+--[[
+本功能模块演示的内容为:
+使用Air8000核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态
+AirKEY_1000是合宙设计生产的一款8路独立按键的配件板
+]]
+
+
+--加载AirKEY_1000驱动文件
+local air_key = require "AirKEY_1000"
+
+--AirKEY_1000上8个按键对应的Air8000的GPIO ID
+local KEY1_GPIO_ID = 28
+local KEY2_GPIO_ID = 26
+local KEY3_GPIO_ID = 27
+local KEY4_GPIO_ID = 16
+local KEY5_GPIO_ID = 1
+local KEY6_GPIO_ID = 2
+local KEY7_GPIO_ID = 35
+local KEY8_GPIO_ID = 34
+
+
+--按键1的中断处理函数
+--int_level:number类型,表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--gpio_id:number类型,air_key.setup函数配置按键1时,对应的Air8000上的GPIO ID
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+local function key1_int_cbfunc(int_level, gpio_id)
+    log.info("key1_int_cbfunc pressup", gpio_id, int_level)
+
+    --如果需要执行耗时较长的动作,不要在这里直接执行
+    --而是使用以下代码,publish一个消息出去,给其他协程或者给订阅消息的处理函数去执行耗时动作
+    sys.publish("KEY1_PRESSUP_IND")
+end
+
+--按键2的中断处理函数
+--int_level:number类型,表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--gpio_id:number类型,air_key.setup函数配置按键2时,对应的Air8000上的GPIO ID
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+local function key2_int_cbfunc(int_level, gpio_id)
+    log.info("key2_int_cbfunc pressup", gpio_id, int_level)
+
+    --如果需要执行耗时较长的动作,不要在这里直接执行
+    --而是使用以下代码,publish一个消息出去,给其他协程或者给订阅消息的处理函数去执行耗时动作
+    sys.publish("KEY2_PRESSUP_IND")
+end
+
+--按键3的中断处理函数
+--int_level:number类型,表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--gpio_id:number类型,air_key.setup函数配置按键3时,对应的Air8000上的GPIO ID
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+local function key3_int_cbfunc(int_level, gpio_id)
+    log.info("key3_int_cbfunc pressup", gpio_id, int_level)
+
+    --如果需要执行耗时较长的动作,不要在这里直接执行
+    --而是使用以下代码,publish一个消息出去,给其他协程或者给订阅消息的处理函数去执行耗时动作
+    sys.publish("KEY3_PRESSUP_IND")
+end
+
+--按键4的中断处理函数
+--int_level:number类型,表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--gpio_id:number类型,air_key.setup函数配置按键4时,对应的Air8000上的GPIO ID
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+local function key4_int_cbfunc(int_level, gpio_id)
+    log.info("key4_int_cbfunc pressup", gpio_id, int_level)
+
+    --如果需要执行耗时较长的动作,不要在这里直接执行
+    --而是使用以下代码,publish一个消息出去,给其他协程或者给订阅消息的处理函数去执行耗时动作
+    sys.publish("KEY4_PRESSUP_IND")
+end
+
+
+--按键5、6、7、8的中断处理函数
+--int_level:number类型,表示触发中断后,某一时刻引脚的电平,1为高电平,0为低电平,并不一定是触发中断时的电平
+--gpio_id:number类型,air_key.setup函数配置按键5、6、7、8时,对应的Air8000上的GPIO ID
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+local function key5678_int_cbfunc(int_level, gpio_id)
+    log.info("key5678_int_cbfunc", gpio_id, int_level)
+
+    --如果需要执行耗时较长的动作,不要在这里直接执行
+    --而是使用以下代码,publish一个消息出去,给其他协程或者给订阅消息的处理函数去执行耗时动作
+    if gpio_id==KEY5_GPIO_ID then
+        log.info("key5 pressdown")
+        sys.publish("KEY5_PRESSDOWN_IND")
+    elseif gpio_id==KEY6_GPIO_ID then
+        log.info("key6 pressdown")
+        sys.publish("KEY6_PRESSDOWN_IND")
+    elseif gpio_id==KEY7_GPIO_ID then
+        log.info("key7 pressdown")
+        sys.publish("KEY7_PRESSDOWN_IND")
+    elseif gpio_id==KEY8_GPIO_ID then
+        log.info("key8 pressdown")
+        sys.publish("KEY8_PRESSDOWN_IND")
+    end    
+end
+
+
+
+--本demo中,Air8000核心板和AirKEY_1000配件板的接线方式如下
+--Air8000核心板             AirKEY_1000配件板
+--     CAN_RXD/GPIO28-----------------K1
+--     CAN_TXD/GPIO26-----------------K2
+--     CAN_STB/GPIO27-----------------K3
+--     GPIO16-----------------K4
+--     GPIO1-----------------K5
+--     GPIO2-----------------K6
+--     LCD_CS/GPIO35-----------------K7
+--     LCD_CLK/GPIO34-----------------K8
+--       GND-----------------G
+
+
+
+--AirKEY_1000上的1、2、3、4,四个按键的引脚
+--分别和Air8000的KEY1_GPIO_ID、KEY2_GPIO_ID、KEY3_GPIO_ID、KEY4_GPIO_ID四个引脚相连
+--GPIO配置为上升沿触发中断,可以实时检测到按键弹起的动作
+--按键弹起时,会执行对应的中断处理函数key1_int_cbfunc、key2_int_cbfunc、key3_int_cbfunc、key4_int_cbfunc
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+air_key.setup(1, KEY1_GPIO_ID, gpio.RISING, key1_int_cbfunc)
+air_key.setup(2, KEY2_GPIO_ID, gpio.RISING, key2_int_cbfunc)
+air_key.setup(3, KEY3_GPIO_ID, gpio.RISING, key3_int_cbfunc)
+air_key.setup(4, KEY4_GPIO_ID, gpio.RISING, key4_int_cbfunc)
+
+--AirKEY_1000上的5、6、7、8,四个按键的引脚
+--分别和Air8000的KEY5_GPIO_ID、KEY6_GPIO_ID、KEY7_GPIO_ID、KEY8_GPIO_ID四个引脚相连
+--GPIO配置为下降沿触发中断,可以实时检测到按键按下的动作
+--按键按下时,会执行对应的中断处理函数key5678_int_cbfunc
+--这四个按键共用了同一个中断处理函数,可以通过函数传入的GPIO ID来区分是哪一个按键被按下
+--在中断处理函数中,不要直接执行耗时较长的动作,例如写fskv,写文件,延时等
+--可以publish消息给其他协程或者给订阅消息的处理函数去执行耗时动作
+air_key.setup(5, KEY5_GPIO_ID, gpio.FALLING, key5678_int_cbfunc)
+air_key.setup(6, KEY6_GPIO_ID, gpio.FALLING, key5678_int_cbfunc)
+air_key.setup(7, KEY7_GPIO_ID, gpio.FALLING, key5678_int_cbfunc)
+air_key.setup(8, KEY8_GPIO_ID, gpio.FALLING, key5678_int_cbfunc)
+

+ 63 - 0
module/Air8000/demo/accessory_board/AirKEY_1000/main.lua

@@ -0,0 +1,63 @@
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+
+AirKEY_1000是合宙设计生产的一款支持8个独立按键的配件板;
+本demo演示的核心功能为:
+Air780EHV核心板+AirKEY_1000配件板,使用Air780EHV核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "AirKEY_1000"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+--  end, 3000)
+
+ -- 加载KEY应用模块
+ require "key_app"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 119 - 0
module/Air8000/demo/accessory_board/AirKEY_1000/readme.md

@@ -0,0 +1,119 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、key_app.lua:使用核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
+
+3、AirKEY_1000.lua:配置主机和AirKEY_1000之间的控制参数;
+
+## 用户消息介绍
+
+1、"KEY1_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+2、"KEY2_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+3、"KEY3_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+4、"KEY4_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+5、"KEY5_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+6、"KEY5_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+7、"KEY7_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+8、"KEY8_PRESSUP_IND":按键消息,publish该消息给其他协程或者给订阅消息的处理函数去执行耗时动作;
+
+## 演示功能概述
+
+AirKEY_1000是合宙设计生产的一款支持8个独立按键的配件板;
+
+本demo演示的核心功能为:
+
+Air8000核心板+AirKEY_1000配件板,使用Air8000核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
+
+
+## 核心板+配件板资料
+
+[Air8000核心板+配件板相关资料](https://docs.openluat.com/Air8000/product/shouce/)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/accessory/AirKEY_1000/image/Air8000_connection.jpg)
+
+![](https://docs.openluat.com/accessory/AirSHT30_1000/image/8000.png)
+
+1、Air8000核心板
+
+2、AirKEY_1000配件板
+
+3、母对母的杜邦线9根
+
+4、Air8000核心板和AirKEY_1000配件板的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 供电/充电 拨动开关 拨到供电一端;
+- 核心板背面的 USB ON/USB OFF 拨动开关 拨到USB ON一端;
+
+| Air8000核心板 |  AirKEY_1000配件板 |
+| ------------ | ------------------ |
+|    CAN_RXD/GPIO28    |         K1         |
+|    CAN_TXD/GPIO26    |         K2         |
+|    CAN_STB/GPIO27    |         K3         |
+|    GPIO16    |         K4         |
+|    GPIO1    |         K5         |
+|    GPIO2    |         K6         |
+|    LCD_CS/GPIO35    |         K7         |
+|    LCD_CLK/GPIO34    |         K8         |
+|     GND     |         G          |
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/common/Luatools/)
+
+2、[Air8000 最新版本的内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 按键1弹起时,Luatools的运行日志输出 key1_int_cbfunc pressup,表示按键1测试正常;
+
+   (2) 按键2弹起时,Luatools的运行日志输出 key2_int_cbfunc pressup,表示按键2测试正常;
+
+   (3) 按键3弹起时,Luatools的运行日志输出 key3_int_cbfunc pressup,表示按键3测试正常;
+
+   (4) 按键4弹起时,Luatools的运行日志输出 key4_int_cbfunc pressup,表示按键4测试正常;
+
+   (5) 按键5按下时,Luatools的运行日志输出 key5 pressdown,表示按键5测试正常;
+
+   (6) 按键6按下时,Luatools的运行日志输出 key6 pressdown,表示按键6测试正常;
+
+   (7) 按键7按下时,Luatools的运行日志输出 key7 pressdown,表示按键7测试正常;
+
+   (8) 按键8按下时,Luatools的运行日志输出 key8 pressdown,表示按键8测试正常;
+
+```
+[2025-10-20 10:39:08.283][000000006.310] I/user.key1_int_cbfunc pressup 28 1
+[2025-10-20 10:39:09.351][000000007.382] I/user.key2_int_cbfunc pressup 26 1
+[2025-10-20 10:39:10.818][000000008.855] I/user.key3_int_cbfunc pressup 27 1
+[2025-10-20 10:39:11.705][000000009.736] I/user.key4_int_cbfunc pressup 16 1
+[2025-10-20 10:39:12.900][000000010.930] I/user.key5678_int_cbfunc 1 0
+[2025-10-20 10:39:12.906][000000010.931] I/user.key5 pressdown
+[2025-10-20 10:39:13.989][000000012.026] I/user.key5678_int_cbfunc 2 0
+[2025-10-20 10:39:13.998][000000012.027] I/user.key6 pressdown
+[2025-10-20 10:39:15.457][000000013.491] I/user.key5678_int_cbfunc 35 0
+[2025-10-20 10:39:15.462][000000013.492] I/user.key7 pressdown
+[2025-10-20 10:39:16.790][000000014.829] I/user.key5678_int_cbfunc 34 0
+[2025-10-20 10:39:16.792][000000014.830] I/user.key8 pressdown
+```
+

+ 7 - 0
module/Air8000/demo/accessory_board/AirSHT30_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、sht30_app.lua:每隔1秒读取一次温湿度数据;
+
+3、AirSHT30_1000.lua:AirSHT30_1000驱动文件;
 
 ## 演示功能概述
 

+ 15 - 1
module/Air8000/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua

@@ -1,4 +1,18 @@
---本文件中的主机是指I2C主机,具体指Air780EHV
+--[[
+@module  AirVOC_1000
+@summary AirVOC_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirVOC_1000驱动配置文件,核心业务逻辑为:
+1、打开AirVOC_1000;
+2、读取TVOC的空气质量等级;
+
+本文件没有对外接口,直接require "AirVOC_1000"就可以加载运行;
+]]
+
+--本文件中的主机是指I2C主机,具体指Air8000
 --本文件中的从机是指I2C从机,具体指AirVOC_1000配件板上的ags02ma VOC(挥发性有机化合物)气体传感器芯片
 
 local AirVOC_1000 = 

+ 1 - 1
module/Air8000/demo/accessory_board/AirVOC_1000/main.lua

@@ -11,7 +11,7 @@ VERSION:项目版本号,ascii string类型
 AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合物)气体传感器配件板;
 主要用于检测甲醛、一氧化碳、可燃气体、酒精、氨气、硫化物、苯系蒸汽、烟雾、其它有害气体的监测;
 本demo演示的核心功能为:
-Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
+Air8000核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
 更多说明参考本目录下的readme.md文件
 ]]
 PROJECT = "AirVOC_1000"

+ 10 - 1
module/Air8000/demo/accessory_board/AirVOC_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、voc_app.lua:每隔1秒读取一次TVOC数据;
+
+3、AirVOC_1000.lua:AirVOC_1000驱动文件;
 
 ## 演示功能概述
 
@@ -12,7 +19,9 @@ Air8000核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数
 
 ## 核心板+配件板资料
 
-[Air8000核心板+配件板相关资料]([硬件手册和证书 - product@air8000 - 合宙模组资料中心](https://docs.openluat.com/air8000/product/shouce/#air8000_1))
+[Air8000核心板]([硬件手册和证书 - product@air8000 - 合宙模组资料中心](https://docs.openluat.com/air8000/product/shouce/#air8000_1))
+
+[AirVOC_1000配件板相关资料](https://docs.openluat.com/accessory/AirVOC_1000/)
 
 
 ## 演示硬件环境

+ 14 - 0
module/Air8000/demo/accessory_board/AirVOC_1000/voc_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  voc_app
+@summary voc_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为voc_app应用功能模块,核心业务逻辑为:
+1、每隔1秒读取一次TVOC空气质量数据;
+
+本文件没有对外接口,直接在main.lua中require "voc_app"就可以加载运行;
+]]
+
+
 --加载AirVOC_1000驱动文件
 local air_voc = require "AirVOC_1000"
 

+ 1 - 1
module/Air8000/demo/ble/peripheral/ble_server_main.lua

@@ -98,7 +98,7 @@ local function ble_init()
         intv_min = 120, -- 广播间隔最小值, 单位为0.625ms, 最小值为20, 最大值为10240
         intv_max = 120, -- 广播间隔最大值, 单位为0.625ms, 最小值为20, 最大值为10240
         adv_data = {    -- 支持表格形式, 也支持字符串形式(255字节以内)
-            {ble.FLAGS, string.char(0x06)}, -- 广播标志位, 0x06: 支持LE Limited Discoverable Mode, 0x04: 支持LE General Discoverable Mode
+            {ble.FLAGS, string.char(0x06)}, -- 广播标志位
             {ble.COMPLETE_LOCAL_NAME, config.device_name}, -- 广播本地名称
         },
         adv_prop = ble.ADV_PROP_CONNECTABLE | ble.ADV_PROP_SCANNABLE -- 广播属性, ble.ADV_PROP_CONNECTABLE(可被连接), ble.ADV_PROP_SCANNABLE(可被扫描)

+ 1 - 1
module/Air8000/demo/gpio/GPIO中断(触发)模式/main.lua

@@ -15,7 +15,7 @@ end
 
 -- 配置gpio27为中断模式,上升沿(gpio.RISING)和下降沿(gpio.FALLING)均触发(gpio.BOTH)
 -- 请根据实际需求更改gpio编号和触发模式
-local gpio_pin = 27
+local gpio_pin = 153
 gpio.debounce(gpio_pin, 100)
 gpio.setup(gpio_pin, function()
     log.info("gpio", gpio_pin, "被触发")

+ 6 - 5
module/Air8000/demo/lbsLoc2/lbsloc2_app.lua

@@ -33,12 +33,13 @@ local function lbsloc2_task_func()
     log.info("lbsloc2_task_func", "recv IP_READY", socket.dft())
 
     while true do 
-        mobile.reqCellInfo(15)--进行基站扫描,超时时间为15s
-        sys.waitUntil("CELL_INFO_UPDATE", 3000)--等到扫描成功,超时时间3S
-        local lat, lng, t = lbsLoc2.request(5000)--仅需要基站定位给出的经纬度
-        --local lat, lng, t = lbsLoc2.request(5000,nil,nil,true)--需要经纬度和当前时间
+        mobile.reqCellInfo(15) --进行基站扫描,超时时间为15s
+        sys.waitUntil("CELL_INFO_UPDATE", 3000) --等到扫描成功,超时时间3S
+        log.info("扫描出的基站信息", json.encode(mobile.getCellInfo())) -- 打印基站信息
+        local lat, lng, t = lbsLoc2.request(5000) --仅需要基站定位给出的经纬度
+        -- local lat, lng, t = lbsLoc2.request(5000,nil,nil,true) --需要经纬度和当前时间
         --(时间格式{"year":2024,"min":56,"month":11,"day":12,"sec":44,"hour":14})
-        log.info("lbsLoc2", lat, lng, (json.encode(t or {})))--打印经纬度和时间
+        log.info("lbsLoc2", lat, lng, (json.encode(t or {}))) --打印经纬度和时间
         sys.wait(60000) -- 1分钟定位一次
     end
 end

+ 39 - 1
module/Air8000/demo/xxtea/main.lua

@@ -23,10 +23,48 @@ VERSION:项目版本号,ascii string类型
 PROJECT = "xxtea"
 VERSION = "001.000.000"
 
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
 --加载xxtea_demo模块
 require "xxtea_demo"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 1 - 2
module/Air8000/demo/xxtea/readme.md

@@ -2,7 +2,6 @@
 
 使用Air8000整机开发板,本示例主要是展示xxtea核心库的使用,使用xxtea加密算法,对数据进行加密和解密
 
-## 演示软件使用说明
 
 ## 演示硬件环境
 
@@ -27,7 +26,7 @@
 
 1、搭建好硬件环境
 
-2、通过Luatools将demo与固件烧录到核心板中
+2、通过Luatools将demo与固件烧录到整机开发板中
 
 3、烧录好后,板子开机将会在Luatools上看到如下打印:
 

+ 0 - 8
module/Air8000/demo/xxtea/xxtea_demo.lua

@@ -9,14 +9,6 @@
 ]]
 
 function xxtea_fnc()
-    --判断xxtea库是否存在
-    if not xxtea then
-        while true do
-            sys.wait(1000)
-            -- 每隔1秒打印一条信息
-            log.info("testCrypto.xxteaTest","xxtea库不存在,请选择带xxtea的固件")
-        end
-    end
     while true do
         sys.wait(1000)
         --代加密数据

+ 14 - 0
module/Air8101/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua

@@ -1,3 +1,17 @@
+--[[
+@module  AirGPIO_1000
+@summary AirGPIO_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirGPIO_1000驱动配置文件,核心业务逻辑为:
+1、配置主机和AirGPIO_1000之间的通信参数;
+2、配置AirGPIO_1000上的扩展GPIO管脚功能;支持配置为输出,输入和中断三种模式;
+
+本文件没有对外接口,直接require "AirGPIO_1000"就可以加载运行;
+]]
+
 --本文件中的主机是指I2C主机,具体指Air8101
 --本文件中的从机是指I2C从机,具体指AirGPIO_1000配件板上的IO扩展芯片
 

+ 14 - 0
module/Air8101/demo/accessory_board/AirGPIO_1000/gpio_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  gpio_app
+@summary gpio_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为gpio_app应用功能模块,核心业务逻辑为:
+1、初始化Air780EHV和AirGPIO_1000之间的通信参数
+2、GPIO输出测试,输入测试,GPIO中断测试
+
+本文件没有对外接口,直接在main.lua中require "gpio_app"就可以加载运行;
+]]
+
 --加载AirGPIO_1000驱动文件
 local air_gpio = require "AirGPIO_1000"
 

+ 10 - 2
module/Air8101/demo/accessory_board/AirGPIO_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gpio_app.lua:AirGPIO_1000扩展GPIO输出测试,输入测试,GPIO中断测试;
+
+3、AirGPIO_1000.lua:AirGPIO_1000驱动配置文件;
 
 ## 演示功能概述
 
@@ -12,7 +19,9 @@ Air8101核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
 
 ## 核心板+配件板资料
 
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+[Air8101核心板](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+[AirGPIO_1000配件板相关资料](https://docs.openluat.com/accessory/AirGPIO_1000/)
 
 
 ## 演示硬件环境
@@ -70,5 +79,4 @@ Air8101核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
    (2) 通过观察Luatools的运行日志,首先打印 air_gpio.get(0x11) 0, 再隔一秒打印 air_gpio.get(0x11) 1,再隔一秒打印 air_gpio.get(0x11) 0,如此循环输出,表示GPIO输入测试正常;
 
    (3) 通过观察Luatools的运行日志,首先打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0, 再隔一秒打印  P04_int_cbfunc 4 1      P14_int_cbfunc 20 1,再隔一秒打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0,如此循环输出,表示GPIO中断测试正常;
-   
 

+ 7 - 0
module/Air8101/demo/accessory_board/AirSHT30_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、sht30_app.lua:每隔1秒读取一次温湿度数据;
+
+3、AirSHT30_1000.lua:AirSHT30_1000驱动文件;
 
 ## 演示功能概述
 

+ 15 - 0
module/Air8101/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua

@@ -1,3 +1,18 @@
+--[[
+@module  AirVOC_1000
+@summary AirVOC_1000应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为AirVOC_1000驱动配置文件,核心业务逻辑为:
+1、打开AirVOC_1000;
+2、读取TVOC的空气质量等级;
+
+本文件没有对外接口,直接require "AirVOC_1000"就可以加载运行;
+]]
+
+
 --本文件中的主机是指I2C主机,具体指Air8101
 --本文件中的从机是指I2C从机,具体指AirVOC_1000配件板上的ags02ma VOC(挥发性有机化合物)气体传感器芯片
 

+ 10 - 1
module/Air8101/demo/accessory_board/AirVOC_1000/readme.md

@@ -1,3 +1,10 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、voc_app.lua:每隔1秒读取一次TVOC数据;
+
+3、AirVOC_1000.lua:AirVOC_1000驱动文件;
 
 ## 演示功能概述
 
@@ -12,7 +19,9 @@ Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数
 
 ## 核心板+配件板资料
 
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+[Air8101核心板](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+[AirVOC_1000配件板相关资料](https://docs.openluat.com/accessory/AirVOC_1000/)
 
 
 ## 演示硬件环境

+ 14 - 0
module/Air8101/demo/accessory_board/AirVOC_1000/voc_app.lua

@@ -1,3 +1,17 @@
+--[[
+@module  voc_app
+@summary voc_app应用功能模块 
+@version 1.0
+@date    2025.10.21
+@author  沈园园
+@usage
+本文件为voc_app应用功能模块,核心业务逻辑为:
+1、每隔1秒读取一次TVOC空气质量数据;
+
+本文件没有对外接口,直接在main.lua中require "voc_app"就可以加载运行;
+]]
+
+
 --加载AirVOC_1000驱动文件
 local air_voc = require "AirVOC_1000"
 

+ 1 - 1
module/Air8101/demo/ble/peripheral/ble_server_main.lua

@@ -98,7 +98,7 @@ local function ble_init()
         intv_min = 120, -- 广播间隔最小值, 单位为0.625ms, 最小值为20, 最大值为10240
         intv_max = 120, -- 广播间隔最大值, 单位为0.625ms, 最小值为20, 最大值为10240
         adv_data = {    -- 支持表格形式, 也支持字符串形式(255字节以内)
-            {ble.FLAGS, string.char(0x06)}, -- 广播标志位, 0x06: 支持LE Limited Discoverable Mode, 0x04: 支持LE General Discoverable Mode
+            {ble.FLAGS, string.char(0x06)}, -- 广播标志位
             {ble.COMPLETE_LOCAL_NAME, config.device_name}, -- 广播本地名称
         }
     })

+ 1 - 1
module/Air8101/demo/luatos_framework/hello_luatos/readme.md

@@ -20,7 +20,7 @@
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
 
 2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
 

+ 1 - 1
module/Air8101/demo/luatos_framework/luatos_task/readme.md

@@ -29,7 +29,7 @@
 
 ## 演示软件环境
 
-1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
 
 2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
 

+ 1 - 1
olddemo/http/main.lua

@@ -26,7 +26,7 @@ require "test_gzip"
 
 
 sys.taskInit(function()
-    sys.wait(100)
+    -- sys.wait(100)
 
     -------------------------------------
     -------- HTTP 演示代码 --------------

+ 6 - 2
script/corelib/sys.lua

@@ -329,7 +329,11 @@ function sys.unsubscribe(id, callback)
         for _, v in pairs(id) do sys.unsubscribe(v, callback) end
         return
     end
-    if subscribers[id] then subscribers[id][callback] = nil end
+    if subscribers[id] then
+        subscribers[id][callback] = nil
+    else
+        return
+    end
     -- 判断消息是否无其他订阅
     for k, _ in pairs(subscribers[id]) do
         return
@@ -489,7 +493,7 @@ local taskList = {}
 -- @usage sys.taskInitEx(task1,'a',callback)
 function sys.taskInitEx(fun, taskName, cbFun, ...)
     if taskName == nil then
-        log.error("sys", "taskName is nil", fun)
+        log.error("sys", "taskName is nil", debug.traceback())
         return
     end
     taskList[taskName]={msgQueue={}, To=false, cb=cbFun}