Explorar o código

update: airlink,细化统计信息,把ip包的统计也加上

Wendal Chen hai 11 meses
pai
achega
433641d3fc

+ 37 - 10
components/airlink/binding/luat_lib_airlink.c

@@ -14,6 +14,7 @@
 #include "luat_log.h"
 
 extern airlink_statistic_t g_airlink_statistic;
+extern uint32_t g_airlink_spi_task_mode;
 
 static int l_airlink_init(lua_State *L) {
     LLOGD("初始化AirLink");
@@ -67,21 +68,43 @@ static int l_airlink_test(lua_State *L) {
     return 0;
 }
 
-static void print_stat(const char* tag, airlink_statistic_part_t* part) {
-    LLOGD("统计信息 %s %lld %lld %lld %lld", tag, part->total, part->ok, part->err, part->drop);
+static void print_stat(const char* tag, airlink_statistic_part_t* part, int is_full) {
+    if (is_full) {
+        LLOGD("统计信息 %s %lld %lld %lld %lld", tag, part->total, part->ok, part->err, part->drop);
+    }
+    else {
+        LLOGD("统计信息 %s %lld", tag, part->total);
+    }
 }
 
 static int l_airlink_statistics(lua_State *L) {
     airlink_statistic_t tmp;
     memcpy(&tmp, &g_airlink_statistic, sizeof(airlink_statistic_t));
-    print_stat("发送总包", &tmp.tx_pkg);
-    // print_stat("接收总包", &tmp.rx_pkg);
-    // print_stat("发送IP", &tmp.tx_ip);
-    // print_stat("接收IP", &tmp.rx_ip);
-    print_stat("等待从机", &tmp.wait_rdy);
-    print_stat("Task超时事件", &tmp.event_timeout);
-    print_stat("Task新数据事件", &tmp.event_new_data);
-    print_stat("Task从机通知事件", &tmp.event_rdy_irq);
+    print_stat("收发总包", &tmp.tx_pkg, 1);
+    
+    print_stat("发送IP包",   &tmp.tx_ip, 1);
+    print_stat("发送IP字节", &tmp.tx_bytes, 1);
+    print_stat("接收IP包",   &tmp.rx_ip, 1);
+    print_stat("接收IP字节", &tmp.rx_bytes, 1);
+    if (g_airlink_spi_task_mode == 0) {
+
+    }
+    else {
+        print_stat("等待从机", &tmp.wait_rdy, 0);
+        print_stat("Task超时事件", &tmp.event_timeout, 0);
+        print_stat("Task新数据事件", &tmp.event_new_data, 0);
+        // print_stat("Task从机通知事件", &tmp.event_rdy_irq, 0);
+    }
+    return 0;
+}
+
+static int l_airlink_slave_reboot(lua_State *L) {
+    LLOGD("重启从机");
+    luat_airlink_cmd_t* cmd = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, sizeof(luat_airlink_cmd_t) + 4);
+    cmd->cmd = 0x03;
+    cmd->len = 4;
+    luat_airlink_send2slave(cmd);
+    luat_heap_opt_free(AIRLINK_MEM_TYPE, cmd);
     return 0;
 }
 
@@ -93,6 +116,10 @@ static const rotable_Reg_t reg_airlink[] =
     { "stop" ,         ROREG_FUNC(l_airlink_stop )},
     { "test",          ROREG_FUNC(l_airlink_test )},
     { "statistics",    ROREG_FUNC(l_airlink_statistics )},
+    { "slave_reboot",   ROREG_FUNC(l_airlink_slave_reboot )},
+
+    // 测试用的fota指令
+    // { "fota",          ROREG_FUNC(l_airlink_fota )},
 	{ NULL,            ROREG_INT(0) }
 };
 

+ 12 - 0
components/airlink/include/luat_airlink.h

@@ -51,6 +51,10 @@ typedef struct airlink_statistic {
     airlink_statistic_part_t wait_rdy;
     airlink_statistic_part_t rx_ip;
     airlink_statistic_part_t tx_ip;
+    airlink_statistic_part_t rx_bytes;
+    airlink_statistic_part_t tx_bytes;
+    airlink_statistic_part_t rx_napt_ip;
+    airlink_statistic_part_t rx_napt_bytes;
 
     // Task等待事件
     airlink_statistic_part_t event_timeout;
@@ -211,4 +215,12 @@ int luat_airlink_drv_wlan_get_ap_gateway(char* buff);
 int luat_airlink_drv_wlan_ap_start(luat_wlan_apinfo_t *apinfo);
 int luat_airlink_drv_wlan_ap_stop(void);
 
+#ifdef TYPE_EC718M
+#include "platform_def.h"
+#endif
+
+#ifndef __USER_FUNC_IN_RAM__
+#define __USER_FUNC_IN_RAM__ 
+#endif
+
 #endif

+ 1 - 1
components/airlink/src/exec/luat_airlink_cmd_exec_basic.c

@@ -14,7 +14,7 @@
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 
-int luat_airlink_cmd_exec_nop(luat_airlink_cmd_t *cmd, void *userdata)
+__USER_FUNC_IN_RAM__ int luat_airlink_cmd_exec_nop(luat_airlink_cmd_t *cmd, void *userdata)
 {
     return 0;
 }

+ 1 - 1
components/airlink/src/exec/luat_airlink_cmd_exec_info.c

@@ -21,7 +21,7 @@
 
 luat_airlink_dev_info_t airlink_ext_dev_info;
 
-int luat_airlink_cmd_exec_dev_info(luat_airlink_cmd_t* cmd, void* userdata) {
+__USER_FUNC_IN_RAM__ int luat_airlink_cmd_exec_dev_info(luat_airlink_cmd_t* cmd, void* userdata) {
     luat_airlink_dev_info_t* dev = cmd->data;
     luat_netdrv_t* drv = NULL;
     // LLOGD("收到设备信息通知 类型 %d", dev->tp);

+ 11 - 1
components/airlink/src/exec/luat_airlink_cmd_exec_ippkg.c

@@ -17,8 +17,12 @@
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 
-int luat_airlink_cmd_exec_ip_pkg(luat_airlink_cmd_t* cmd, void* userdata) {
+extern airlink_statistic_t g_airlink_statistic;
+
+__USER_FUNC_IN_RAM__ int luat_airlink_cmd_exec_ip_pkg(luat_airlink_cmd_t* cmd, void* userdata) {
     uint8_t adapter_id = cmd->data[0];
+    g_airlink_statistic.rx_ip.total += 1;
+    g_airlink_statistic.rx_bytes.total += cmd->len - 1;
     // LLOGD("收到IP包 长度 %d 适配器 %d", cmd->len - 1, adapter_id);
     // luat_airlink_print_mac_pkg(cmd->data + 1, cmd->len - 1);
     // luat_airlink_hexdump("收到IP包", cmd->data + 1, cmd->len - 1);
@@ -28,14 +32,20 @@ int luat_airlink_cmd_exec_ip_pkg(luat_airlink_cmd_t* cmd, void* userdata) {
 
     ret = luat_netdrv_napt_pkg_input(adapter_id, cmd->data + 1, cmd->len - 1);
     if (ret != 0) {
+        g_airlink_statistic.rx_napt_ip.total += 1;
+        g_airlink_statistic.rx_napt_bytes.total += cmd->len - 1;
         // LLOGD("NAPT说已经处理完成, 不需要转发给具体的netdrv了");
         return 0;
     }
     drv = luat_netdrv_get(adapter_id);
     if (drv == NULL || drv->netif == NULL) {
+        g_airlink_statistic.rx_ip.drop += 1;
+        g_airlink_statistic.rx_bytes.drop += cmd->len - 1;
         LLOGD("没有找到适配器 %d, 无法处理其IP包", adapter_id);
         return 0;
     }
+    g_airlink_statistic.rx_ip.ok += 1;
+    g_airlink_statistic.rx_bytes.ok += cmd->len - 1;
     
     // 这里开始就复杂了
     // 首先, 如果是平台的包, 那就直接交给平台处理

+ 21 - 0
components/airlink/src/luat_airlink.c

@@ -28,6 +28,7 @@ extern int luat_airlink_start_master(void);
 luat_airlink_newdata_notify_cb g_airlink_newdata_notify_cb;
 luat_airlink_spi_conf_t g_airlink_spi_conf;
 airlink_statistic_t g_airlink_statistic;
+uint32_t g_airlink_spi_task_mode;
 
 int luat_airlink_init(void)
 {
@@ -47,10 +48,12 @@ int luat_airlink_start(int id)
     }
     if (id == 0)
     {
+        g_airlink_spi_task_mode = 0;
         luat_airlink_start_slave();
     }
     else
     {
+        g_airlink_spi_task_mode = 1;
         luat_airlink_start_master();
     }
     return 0;
@@ -159,14 +162,20 @@ int luat_airlink_cmd_recv(int tp, airlink_queue_item_t *item, size_t timeout)
 int luat_airlink_queue_send_ippkg(uint8_t adapter_id, uint8_t *data, size_t len)
 {
     int ret = 0;
+    g_airlink_statistic.tx_ip.total ++;
+    g_airlink_statistic.tx_bytes.total += len;
     if (len < 8)
     {
         LLOGE("数据包太小了, 抛弃掉");
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -1;
     }
     luat_netdrv_t* netdrv = luat_netdrv_get(adapter_id);
     if (netdrv == NULL || netdrv->netif == NULL) {
         LLOGW("应该是BUG了, netdrv为空或者没有netif %d", adapter_id);
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -2;
     }
     struct eth_hdr* eth = (struct eth_hdr*)data;
@@ -176,6 +185,8 @@ int luat_airlink_queue_send_ippkg(uint8_t adapter_id, uint8_t *data, size_t len)
         }
         else {
             // LLOGD("不是ARP/IP包,丢弃掉");
+            g_airlink_statistic.tx_ip.drop ++;
+            g_airlink_statistic.tx_bytes.drop += len;
             return -3;
         }
     }
@@ -186,11 +197,15 @@ int luat_airlink_queue_send_ippkg(uint8_t adapter_id, uint8_t *data, size_t len)
     luat_meminfo_opt_sys(AIRLINK_MEM_TYPE, &total, &used, &max_used);
     if (total - used < 32*1024 && len > 512) {
         LLOGW("内存相对不足(%d), 丢弃掉大包(%d)", total - used, len);
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -3;
     }
     else if (total - used < 8*1024) {
         // 内存严重不足, 抛弃所有的包
         LLOGW("内存严重不足(%d), 丢弃掉所有包(%d)", total - used, len);
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -4;
     }
 
@@ -200,6 +215,8 @@ int luat_airlink_queue_send_ippkg(uint8_t adapter_id, uint8_t *data, size_t len)
     };
     if (item.cmd == NULL)
     {
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -2;
     }
     memcpy(item.cmd->data + 1, data, len);
@@ -210,8 +227,12 @@ int luat_airlink_queue_send_ippkg(uint8_t adapter_id, uint8_t *data, size_t len)
     if (ret != 0) {
         luat_heap_free(item.cmd);
         LLOGD("发送消息失败 长度 %d ret %d", len, ret);
+        g_airlink_statistic.tx_ip.drop ++;
+        g_airlink_statistic.tx_bytes.drop += len;
         return -4;
     }
+    g_airlink_statistic.tx_ip.ok ++;
+    g_airlink_statistic.tx_bytes.ok += len;
     return 0;
 }
 

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

@@ -48,7 +48,7 @@ CMD_DEFINE(gpio_setup);
 CMD_DEFINE(gpio_set);
 // CMD_DEFINE(gpio_get);
 
-const luat_airlink_cmd_reg_t airlink_cmds[] = {
+__USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     // 最常用的放前面
     CMD_REG(0x10,  dev_info),
     CMD_REG(0x100, ip_pkg),
@@ -83,4 +83,4 @@ const luat_airlink_cmd_reg_t airlink_cmds[] = {
 
     CMD_REG(0x21, nop),
     {0, NULL}
-};
+};

+ 0 - 8
components/airlink/src/luat_airlink_linkdata.c

@@ -12,14 +12,6 @@ airlink数据打包解包,数据链路层
 #include "luat_netdrv_whale.h"
 #include "lwip/prot/ethernet.h"
 
-#ifdef TYPE_EC718M
-#include "platform_def.h"
-#endif
-
-#ifndef __USER_FUNC_IN_RAM__
-#define __USER_FUNC_IN_RAM__ 
-#endif
-
 #define LUAT_LOG_TAG "airlink"
 #include "luat_log.h"
 

+ 1 - 1
components/airlink/src/task/luat_airlink_spi_master_task.c

@@ -199,7 +199,7 @@ __USER_FUNC_IN_RAM__ static void spi_master_task(void *param)
             if (tmpval == 1) {
                 g_airlink_statistic.wait_rdy.total ++;
                 tnow = luat_mcu_tick64_ms();
-                if (tnow - warn_slave_no_ready > 100) {
+                if (tnow - warn_slave_no_ready > 1000) {
                     warn_slave_no_ready = tnow;
                     LLOGD("从机未就绪,等1ms");
                 }

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

@@ -14,7 +14,7 @@ extern const luat_airlink_cmd_reg_t airlink_cmds[];
 
 extern int luat_airlink_cmd_exec_ip_pkg(luat_airlink_cmd_t* cmd, void* userdata);
 
-void luat_airlink_on_data_recv(uint8_t *data, size_t len) {
+__USER_FUNC_IN_RAM__ void luat_airlink_on_data_recv(uint8_t *data, size_t len) {
     luat_airlink_cmd_t* cmd = (luat_airlink_cmd_t*)data;
     // if (cmd->cmd == 0x100) {
     //     // IP数据直接处理,不走线程
@@ -30,8 +30,8 @@ void luat_airlink_on_data_recv(uint8_t *data, size_t len) {
     luat_rtos_event_send(airlink_task_handle, 1, (uint32_t)ptr, len, 0, 0);
 }
 
-static int luat_airlink_task(void *param) {
-    LLOGD("处理线程启动");
+__USER_FUNC_IN_RAM__ static int luat_airlink_task(void *param) {
+    // LLOGD("处理线程启动");
     luat_event_t event;
     luat_airlink_cmd_t* ptr = NULL;
     // size_t len = 0;