Эх сурвалжийг харах

patch for modbus network lvgl

lyon 2 жил өмнө
parent
commit
d317da20c2

+ 28 - 8
package/pika_lvgl/pika_lvgl.c

@@ -1,4 +1,4 @@
-#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
 #include "lvgl.h"
 #else
 #include "../../lvgl.h"
@@ -13,9 +13,9 @@
 #include "pika_lvgl_FLEX_ALIGN.h"
 #include "pika_lvgl_FLEX_FLOW.h"
 #include "pika_lvgl_LAYOUT_FLEX.h"
-#include "pika_lvgl_SIZE.h"
 #include "pika_lvgl_OPA.h"
 #include "pika_lvgl_PALETTE.h"
+#include "pika_lvgl_SIZE.h"
 #include "pika_lvgl_STATE.h"
 #include "pika_lvgl_TEXT_DECOR.h"
 #include "pika_lvgl_arc.h"
@@ -27,11 +27,14 @@
 
 PikaObj* pika_lv_event_listener_g;
 Args* pika_lv_id_register_g;
+pika_platform_thread_mutex_t pika_lv_global_mutex_g = {0};
 
-#if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 11, 7)
-#error "pikascript version must be greater than 1.11.7"
+#if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 13, 1)
+#error "pikascript version must be greater than 1.13.1"
 #endif
 
+volatile int g_lvgl_inited = 0;
+
 void pika_lvgl_STATE___init__(PikaObj* self) {
     obj_setInt(self, "DEFAULT", LV_STATE_DEFAULT);
     obj_setInt(self, "CHECKED", LV_STATE_CHECKED);
@@ -49,6 +52,20 @@ void pika_lvgl_STATE___init__(PikaObj* self) {
     obj_setInt(self, "ANY", LV_STATE_ANY);
 }
 
+void pika_lvgl_lock(PikaObj* self) {
+    if (!g_lvgl_inited) {
+        return;
+    }
+    pika_platform_thread_mutex_lock(&pika_lv_global_mutex_g);
+}
+
+void pika_lvgl_unlock(PikaObj* self) {
+    if (!g_lvgl_inited) {
+        return;
+    }
+    pika_platform_thread_mutex_unlock(&pika_lv_global_mutex_g);
+}
+
 void pika_lvgl_flag_t___init__(PikaObj* self) {
     obj_setInt(self, "HIDDEN", LV_OBJ_FLAG_HIDDEN);
     obj_setInt(self, "CLICKABLE", LV_OBJ_FLAG_CLICKABLE);
@@ -201,9 +218,8 @@ PikaObj* pika_lvgl_scr_act(PikaObj* self) {
     return new_obj;
 }
 
-volatile int g_lvgl_inited = 0;
 void pika_lvgl___init__(PikaObj* self) {
-    if (!lv_is_initialized()){
+    if (!lv_is_initialized()) {
         pika_debug("Error: lvgl is not initialized");
         return;
     }
@@ -211,7 +227,11 @@ void pika_lvgl___init__(PikaObj* self) {
     pika_lv_event_listener_g = obj_getObj(self, "lv_event_listener");
     pika_lv_id_register_g = New_args(NULL);
     if (!g_lvgl_inited) {
+        pika_debug("Init pika_lv_global_mutex_g");
+        pika_platform_thread_mutex_init(&pika_lv_global_mutex_g);
+        pika_lvgl_lock(NULL);
         lv_png_init();
+        pika_lvgl_unlock(NULL);
         g_lvgl_inited = 1;
     }
 }
@@ -301,11 +321,11 @@ void pika_lvgl_LAYOUT_FLEX___init__(PikaObj* self) {
     obj_setInt(self, "value", LV_LAYOUT_FLEX);
 }
 
-void pika_lvgl_SIZE___init__(PikaObj *self){
+void pika_lvgl_SIZE___init__(PikaObj* self) {
     obj_setInt(self, "CONTENT", LV_SIZE_CONTENT);
 }
 
-int pika_lvgl_pct(PikaObj *self, int x){
+int pika_lvgl_pct(PikaObj* self, int x) {
     return LV_PCT(x);
 }
 

+ 7 - 1
package/pika_lvgl/pika_lvgl.pyi

@@ -8,6 +8,10 @@ def __init__(): ...
 def __del__(): ...
 
 
+def lock(): ...
+def unlock(): ...
+
+
 class EVENT:
     ALL: int
     PRESSED: int
@@ -383,7 +387,7 @@ class lv_obj:
     # def area_is_visible(self, area: lv_area_t) -> int: ...
     def is_visible(self) -> int: ...
     def set_ext_click_area(self, size: int): ...
-    def set_style_size(self, value:int, selector: int): ...
+    def set_style_size(self, value: int, selector: int): ...
     # def get_click_area(self, area: lv_area_t): ...
     def hit_test(self, point: point_t) -> int: ...
     def set_flex_flow(self, flow: int): ...
@@ -606,6 +610,7 @@ class canvas(lv_obj):
 class chart_series_t:
     ...
 
+
 class chart(lv_obj):
     def __init__(self, parent: lv_obj): ...
     def set_point_count(self, cnt: int): ...
@@ -617,6 +622,7 @@ class chart(lv_obj):
     def set_ext_y_array(self, ser: chart_series_t, array: any): ...
     def refresh(self): ...
 
+
 def scr_act() -> lv_obj: ...
 def pct(x: int) -> int: ...
 def timer_create_basic() -> lv_timer_t: ...

+ 1 - 1
package/pika_lvgl/pika_lvgl_lv_obj.c

@@ -1,4 +1,4 @@
-#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
 #include "lvgl.h"
 #else
 #include "../../lvgl.h"

+ 18 - 11
port/linux/package/pikascript/_network.pyi

@@ -7,23 +7,28 @@ STAT_NO_AP_FOUND: int
 STAT_CONNECT_FAIL: int
 STAT_GOT_IP: int
 
-
-class WLAN:
+class NET:
     def __init__(self, interface_id: int): ...
 
     def active(self, is_active: int): ...
 
     def checkActive(self) -> int: ...
 
-    def connect(self, ssid: str, key: str): ...
+    def status(self) -> int: ...
 
-    def connectWithBssid(self, ssid: str, key: str, bssid: str): ...
+    def statusWithParam(self, param: str) -> int: ...
+
+    def ifconfig(self, ip: str, mask: str, gateway: str, dns: str): ...
 
-    def disconnect(self): ...
+    def checkIfconfig(self) -> list: ...
 
-    def status(self) -> int: ...
+    def close(self): ...
 
-    def statusWithParam(self, param: str) -> int: ...
+
+class WLAN(NET):
+    def __init__(self, interface_id: int): ...
+
+    def connect(self, ssid: str, key: str): ...
 
     def isconnected(self) -> int: ...
 
@@ -31,13 +36,15 @@ class WLAN:
 
     def checkConfig(self, param: str) -> any: ...
 
-    def ifconfig(self, ip: str, mask: str, gateway: str, dns: str): ...
-
-    def checkIfconfig(self) -> list: ...
+    def connectWithBssid(self, ssid: str, key: str, bssid: str): ...
 
     def scan(self) -> list: ...
 
-    def close(self): ...
+
+class LAN(NET):
+    def __init__(self, interface_id: int): ...
+
+    def isconnected(self) -> int: ...
 
 
 def __init__(): ...

+ 2 - 1
port/linux/package/pikascript/modbus.py

@@ -378,7 +378,8 @@ class ModBusRTU(ModBus):
     
     def setUart(self, uart: PikaStdDevice.UART):
         self._uart = uart
-        uart.setCallBack(self.recvCallback, uart.SIGNAL_RX)
+        debug('set uart', uart)
+        uart.setCallback(self.recvCallback, uart.SIGNAL_RX)
 
     def recv(self, count: int = 10):
         """

+ 34 - 0
port/linux/package/pikascript/network.py

@@ -11,6 +11,40 @@ STAT_CONNECT_FAIL = _network.STAT_CONNECT_FAIL
 STAT_GOT_IP = _network.STAT_GOT_IP
 
 _instence:"WLAN" = None
+
+class LAN(_network.LAN):
+    def __init__(self, interface_id: int):
+        super().__init__(interface_id)
+
+    def active(self, is_active=None):
+        if is_active is None:
+            return super().checkActive()
+        else:
+            return super().active(is_active)
+            
+    def status(self, param=None):
+        if param is None:
+            return super().status()
+        else:
+            return super().statusWithParam(param)
+            
+    def isconnected(self) -> int:
+        return super().isconnected()
+        
+    def config(self, *para, **kwargs):
+        if len(para) == 1:
+            return super().checkConfig(para[0])
+        else:
+            return super().config(**kwargs)
+            
+    def ifconfig(self, config=None):
+        if config is None:
+            t = super().checkIfconfig()
+            return (t[0], t[1], t[2], t[3])
+        else:
+            return super().ifconfig(
+                config[0], config[1], config[2], config[3])
+
 class WLAN(_network.WLAN):
     def __init__(self, interface_id: int):
         global _instence

+ 1 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/pika_hal_table.h

@@ -12,6 +12,7 @@ pika_hal_table_add(PWM)
 pika_hal_table_add(SOFT_SPI)
 pika_hal_table_add(SOFT_IIC)
 pika_hal_table_add(WIFI)
+pika_hal_table_add(LAN)
 pika_hal_table_add(TIM)
 pika_hal_table_add(SOFT_TIM)
 pika_hal_table_add(CAM)

+ 45 - 139
port/linux/package/pikascript/pikascript-lib/network/_network_WLAN.c

@@ -1,13 +1,9 @@
 #include "_network_WLAN.h"
+#include "_network_NET.h"
 #include "../pikascript-lib/PikaStdDevice/pika_hal.h"
 #include "PikaStdData_List.h"
 #include "PikaStdData_Tuple.h"
-
-#define check_res(res)                                                       \
-    if (res != 0) {                                                          \
-        pika_platform_printf("check_res failed: %d, at %s:%d:%s()\r\n", res, \
-                             __FILE__, __LINE__, __FUNCTION__);              \
-    }
+#include "_network_common.h"
 
 void _network_WLAN___init__(PikaObj* self, int interface_id) {
     pika_dev* hal_wifi = pika_hal_open(PIKA_HAL_WIFI, "WLAN0");
@@ -16,78 +12,19 @@ void _network_WLAN___init__(PikaObj* self, int interface_id) {
     }
     pika_hal_WIFI_config cfg = {0};
     cfg.mode = interface_id;
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
-    obj_setPtr(self, "hal_wifi", hal_wifi);
-}
-
-void _network_WLAN_active(PikaObj* self, int is_active) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return;
-    }
-    if (is_active) {
-        check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_ENABLE));
-        return;
-    }
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_DISABLE));
-    return;
-}
-
-int _network_WLAN_checkActive(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return -1;
-    }
-    int is_active = 0;
-    check_res(
-        pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_ACTIVE, &is_active));
-    return is_active;
-}
-
-void _network_WLAN_config(PikaObj* self, PikaDict* kwargs) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return;
-    }
-    pika_hal_WIFI_config cfg = {0};
-    if (pikaDict_isArgExist(kwargs, "ssid")) {
-        strcpy(cfg.ap_ssid, pikaDict_getStr(kwargs, "ssid"));
-    }
-    if (pikaDict_isArgExist(kwargs, "password")) {
-        strcpy(cfg.ap_password, pikaDict_getStr(kwargs, "password"));
-    }
-    if (pikaDict_isArgExist(kwargs, "channel")) {
-        cfg.channel = pikaDict_getInt(kwargs, "channel") + 1;
-    }
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
-}
-
-Arg* _network_WLAN_checkConfig(PikaObj* self, char* param) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return NULL;
-    }
-    pika_hal_WIFI_config* cfg = hal_wifi->ioctl_config;
-    if (strcmp(param, "ssid") == 0) {
-        return arg_newStr(cfg->ap_ssid);
-    } else if (strcmp(param, "password") == 0) {
-        return arg_newStr(cfg->ap_password);
-    } else if (strcmp(param, "channel") == 0) {
-        return arg_newInt(cfg->channel - 1);
-    } else {
-        return NULL;
-    }
+    _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
+    obj_setPtr(self, "hal_dev", hal_wifi);
 }
 
 void _network_WLAN_connect(PikaObj* self, char* ssid, char* key) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
     if (hal_wifi == NULL) {
         return;
     }
     pika_hal_WIFI_connect_config conncfg = {0};
     strcpy(conncfg.ssid, ssid);
     strcpy(conncfg.password, key);
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
+    _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
     return;
 }
 
@@ -95,7 +32,7 @@ void _network_WLAN_connectWithBssid(PikaObj* self,
                                     char* ssid,
                                     char* key,
                                     char* bssid) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
     if (hal_wifi == NULL) {
         return;
     }
@@ -103,91 +40,32 @@ void _network_WLAN_connectWithBssid(PikaObj* self,
     strcpy(conncfg.ssid, ssid);
     strcpy(conncfg.password, key);
     strcpy(conncfg.bssid, bssid);
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
+    _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
 }
 
 void _network_WLAN_disconnect(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
     if (hal_wifi == NULL) {
         return;
     }
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_DISCONNECT));
-}
-
-int _network_WLAN_status(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return -1;
-    }
-    PIKA_HAL_WIFI_STATUS status = 0;
-    check_res(
-        pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_STATUS, &status));
-    return status;
+    _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_DISCONNECT));
 }
 
 int _network_WLAN_isconnected(PikaObj* self) {
-    if (_network_WLAN_status(self) == PIKA_HAL_WIFI_STATUS_GOT_IP) {
+    if (_network_NET_status(self) == PIKA_HAL_WIFI_STATUS_GOT_IP) {
         return 1;
     } else {
         return 0;
     }
 }
 
-int _network_WLAN_statusWithParam(PikaObj* self, char* param) {
-    return _network_WLAN_status(self);
-}
-
-PikaObj* _network_WLAN_checkIfconfig(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return NULL;
-    }
-    pika_hal_WIFI_ifconfig ifconfig = {0};
-    check_res(
-        pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_IFCONFIG, &ifconfig));
-    PikaObj* ifconfig_list = newNormalObj(New_PikaStdData_List);
-    PikaStdData_List___init__(ifconfig_list);
-    Arg* arg = arg_newStr(ifconfig.ip);
-    PikaStdData_List_append(ifconfig_list, arg);
-    arg_deinit(arg);
-    arg = arg_newStr(ifconfig.netmask);
-    PikaStdData_List_append(ifconfig_list, arg);
-    arg_deinit(arg);
-    arg = arg_newStr(ifconfig.gateway);
-    PikaStdData_List_append(ifconfig_list, arg);
-    arg_deinit(arg);
-    arg = arg_newStr(ifconfig.dns);
-    PikaStdData_List_append(ifconfig_list, arg);
-    arg_deinit(arg);
-    return ifconfig_list;
-}
-
-void _network_WLAN_ifconfig(PikaObj* self,
-                            char* ip,
-                            char* mask,
-                            char* gateway,
-                            char* dns) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
-        return;
-    }
-    pika_hal_WIFI_ifconfig ifconfig = {0};
-    strcpy(ifconfig.ip, ip);
-    strcpy(ifconfig.netmask, mask);
-    strcpy(ifconfig.gateway, gateway);
-    strcpy(ifconfig.dns, dns);
-    check_res(
-        pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SET_IFCONFIG, &ifconfig));
-    return;
-}
-
 PikaObj* _network_WLAN_scan(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
+    pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
     if (hal_wifi == NULL) {
         return NULL;
     }
     pika_hal_WIFI_scan_result* result = NULL;
-    check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SCAN, &result));
+    _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SCAN, &result));
     if (NULL == result) {
         return NULL;
     }
@@ -224,10 +102,38 @@ PikaObj* _network_WLAN_scan(PikaObj* self) {
     return scan_list;
 }
 
-void _network_WLAN_close(PikaObj* self) {
-    pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
-    if (hal_wifi == NULL) {
+
+void _network_WLAN_config(PikaObj* self, PikaDict* kwargs) {
+    pika_dev* hal_net = _NET_OBJ_2DEV(self);
+    if (hal_net == NULL) {
         return;
     }
-    check_res(pika_hal_close(hal_wifi));
+    pika_hal_WIFI_config cfg = {0};
+    if (pikaDict_isArgExist(kwargs, "ssid")) {
+        strcpy(cfg.ap_ssid, pikaDict_getStr(kwargs, "ssid"));
+    }
+    if (pikaDict_isArgExist(kwargs, "password")) {
+        strcpy(cfg.ap_password, pikaDict_getStr(kwargs, "password"));
+    }
+    if (pikaDict_isArgExist(kwargs, "channel")) {
+        cfg.channel = pikaDict_getInt(kwargs, "channel") + 1;
+    }
+    _net_check_res(pika_hal_ioctl(hal_net, PIKA_HAL_IOCTL_CONFIG, &cfg));
+}
+
+Arg* _network_WLAN_checkConfig(PikaObj* self, char* param) {
+    pika_dev* hal_net = _NET_OBJ_2DEV(self);
+    if (hal_net == NULL) {
+        return NULL;
+    }
+    pika_hal_WIFI_config* cfg = hal_net->ioctl_config;
+    if (strcmp(param, "ssid") == 0) {
+        return arg_newStr(cfg->ap_ssid);
+    } else if (strcmp(param, "password") == 0) {
+        return arg_newStr(cfg->ap_password);
+    } else if (strcmp(param, "channel") == 0) {
+        return arg_newInt(cfg->channel - 1);
+    } else {
+        return NULL;
+    }
 }

+ 8 - 2
src/PikaPlatform.c

@@ -715,7 +715,10 @@ PIKA_WEAK int pika_platform_thread_mutex_lock(pika_platform_thread_mutex_t* m) {
 #ifdef __linux
     return pthread_mutex_lock(&(m->mutex));
 #elif PIKA_FREERTOS_ENABLE
-    return xSemaphoreTake(m->mutex, portMAX_DELAY);
+    if (pdTRUE == xSemaphoreTake(m->mutex, portMAX_DELAY)){
+        return 0;
+    }
+    return -1;
 #elif PIKA_RTTHREAD_ENABLE
     return rt_mutex_take((m->mutex), RT_WAITING_FOREVER);
 #else
@@ -729,7 +732,10 @@ PIKA_WEAK int pika_platform_thread_mutex_trylock(
 #ifdef __linux
     return pthread_mutex_trylock(&(m->mutex));
 #elif PIKA_FREERTOS_ENABLE
-    return xSemaphoreTake(m->mutex, 0);
+    if (pdTRUE == xSemaphoreTake(m->mutex, 0)){
+        return 0;
+    }
+    return -1;
 #elif PIKA_RTTHREAD_ENABLE
     return rt_mutex_take((m->mutex), 0);
 #else