lyon 3 лет назад
Родитель
Сommit
262bc09f1e

+ 6 - 0
examples/network/network_scan.py

@@ -0,0 +1,6 @@
+import network
+
+wlan = network.WLAN(network.STA_IF)
+wlan.active(True)
+wlan.scan()
+wlan.close()

+ 13 - 8
package/PikaStdDevice/pika_hal.c

@@ -118,10 +118,7 @@ static const int _pika_hal_cmd_arg_cnt[] = {
     (sizeof _pika_hal_cmd_arg_cnt / sizeof _pika_hal_cmd_arg_cnt[0])
 
 static int _pika_hal_get_arg_cnt(PIKA_HAL_IOCTL_CMD cmd) {
-    if (cmd >= _PIKA_HAL_CMD_ARG_CNT_MAX) {
-        return -1;
-    }
-    return _pika_hal_cmd_arg_cnt[cmd];
+    return _pika_hal_cmd_arg_cnt[PIKA_HAL_IOCTL_CONFIG];
 }
 
 int _pika_hal_ioctl_merge_config(pika_dev* dev, void* config_in) {
@@ -144,18 +141,26 @@ int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
     if (impl->ioctl == NULL) {
         return -1;
     }
-    void* config_in = NULL;
+    void* arg_in = NULL;
     if (cmd != 0) {
         va_list args;
         va_start(args, cmd);
-        config_in = va_arg(args, void*);
-        ret = _pika_hal_ioctl_merge_config(dev, config_in);
+        arg_in = va_arg(args, void*);
+        if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
+            ret = _pika_hal_ioctl_merge_config(dev, arg_in);
+        } else {
+            ret = 0;
+        }
         va_end(args);
         if (0 != ret) {
             return ret;
         }
     }
-    ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
+    if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
+        ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
+    } else {
+        ret = impl->ioctl(dev, cmd_origin, arg_in);
+    }
     if (ret == 0) {
         if (cmd_origin == PIKA_HAL_IOCTL_ENABLE) {
             dev->is_enabled = 1;

+ 3 - 1
package/PikaStdDevice/pika_hal_table_rule.h

@@ -86,7 +86,9 @@
     int pika_hal_platform_##dev_name##_ioctl_enable(pika_dev* dev);     \
     int pika_hal_platform_##dev_name##_ioctl_disable(pika_dev* dev);    \
     int pika_hal_platform_##dev_name##_ioctl_config(                    \
-        pika_dev* dev, pika_hal_##dev_name##_config* cfg);
+        pika_dev* dev, pika_hal_##dev_name##_config* cfg);              \
+    int pika_hal_platform_##dev_name##_ioctl_others(                    \
+        pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* arg);
 #endif
 
 #if defined(PIKA_HAL_TABLE_DEV_CONFIG_SIZE)

+ 2 - 0
package/network/_network.pyi

@@ -37,5 +37,7 @@ class WLAN:
 
     def scan(self) -> list: ...
 
+    def close(self): ...
+
 
 def __init__(): ...

+ 8 - 0
package/network/_network_WLAN.c

@@ -209,3 +209,11 @@ PikaObj* _network_WLAN_scan(PikaObj* self) {
     pika_platform_free(result);
     return scan_list;
 }
+
+void _network_WLAN_close(PikaObj* self) {
+    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    if (hal_wifi == NULL) {
+        return;
+    }
+    pika_hal_close(hal_wifi);
+}

+ 2 - 0
port/linux/package/pikascript/_network.pyi

@@ -37,5 +37,7 @@ class WLAN:
 
     def scan(self) -> list: ...
 
+    def close(self): ...
+
 
 def __init__(): ...

+ 13 - 8
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/pika_hal.c

@@ -118,10 +118,7 @@ static const int _pika_hal_cmd_arg_cnt[] = {
     (sizeof _pika_hal_cmd_arg_cnt / sizeof _pika_hal_cmd_arg_cnt[0])
 
 static int _pika_hal_get_arg_cnt(PIKA_HAL_IOCTL_CMD cmd) {
-    if (cmd >= _PIKA_HAL_CMD_ARG_CNT_MAX) {
-        return -1;
-    }
-    return _pika_hal_cmd_arg_cnt[cmd];
+    return _pika_hal_cmd_arg_cnt[PIKA_HAL_IOCTL_CONFIG];
 }
 
 int _pika_hal_ioctl_merge_config(pika_dev* dev, void* config_in) {
@@ -144,18 +141,26 @@ int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
     if (impl->ioctl == NULL) {
         return -1;
     }
-    void* config_in = NULL;
+    void* arg_in = NULL;
     if (cmd != 0) {
         va_list args;
         va_start(args, cmd);
-        config_in = va_arg(args, void*);
-        ret = _pika_hal_ioctl_merge_config(dev, config_in);
+        arg_in = va_arg(args, void*);
+        if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
+            ret = _pika_hal_ioctl_merge_config(dev, arg_in);
+        } else {
+            ret = 0;
+        }
         va_end(args);
         if (0 != ret) {
             return ret;
         }
     }
-    ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
+    if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
+        ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
+    } else {
+        ret = impl->ioctl(dev, cmd_origin, arg_in);
+    }
     if (ret == 0) {
         if (cmd_origin == PIKA_HAL_IOCTL_ENABLE) {
             dev->is_enabled = 1;

+ 3 - 1
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/pika_hal_table_rule.h

@@ -86,7 +86,9 @@
     int pika_hal_platform_##dev_name##_ioctl_enable(pika_dev* dev);     \
     int pika_hal_platform_##dev_name##_ioctl_disable(pika_dev* dev);    \
     int pika_hal_platform_##dev_name##_ioctl_config(                    \
-        pika_dev* dev, pika_hal_##dev_name##_config* cfg);
+        pika_dev* dev, pika_hal_##dev_name##_config* cfg);              \
+    int pika_hal_platform_##dev_name##_ioctl_others(                    \
+        pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* arg);
 #endif
 
 #if defined(PIKA_HAL_TABLE_DEV_CONFIG_SIZE)

+ 8 - 0
port/linux/package/pikascript/pikascript-lib/network/_network_WLAN.c

@@ -209,3 +209,11 @@ PikaObj* _network_WLAN_scan(PikaObj* self) {
     pika_platform_free(result);
     return scan_list;
 }
+
+void _network_WLAN_close(PikaObj* self) {
+    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    if (hal_wifi == NULL) {
+        return;
+    }
+    pika_hal_close(hal_wifi);
+}

+ 6 - 0
test/python/network/network_scan.py

@@ -0,0 +1,6 @@
+import network
+
+wlan = network.WLAN(network.STA_IF)
+wlan.active(True)
+wlan.scan()
+wlan.close()