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

add Timer() class For PikaStdDevice, not tested yet

Lyon 2 жил өмнө
parent
commit
bfda7828ee

+ 44 - 1
package/PikaStdDevice/PikaStdDevice.pyi

@@ -108,7 +108,50 @@ class GPIO(BaseDev):
 
 
 def Time() -> time:
-    """ use time module instead """
+    """ deprecated use time module instead """
+
+
+class Timer:
+    def __init__(self): ...
+
+    def setPeriod(self, period_ms: int):
+        """Set the period of the timer."""
+
+    def setMode(self, mode: str):
+        """ 
+        Set the mode of the timer. 
+        Example: `"continuous"`, `"oneshot"` ...
+        """
+
+    SIGNAL_TIMEOUT: int
+    SIGNAL_ANY: int
+
+    def setCallback(self, callback: any, filter: int):
+        """
+        Add a callback function to the timer.
+        The callback function will be called when the timer is triggered.
+        """
+
+    def enable(self):
+        """Enable the timer."""
+
+    def disable(self):
+        """Disable the timer."""
+
+    def setName(self, name: str):
+        """Set the name of the timer."""
+
+    def setId(self, id: int):
+        """Set the id of the timer."""
+
+    def getName(self) -> str:
+        """Get the name of the timer."""
+
+    def getId(self) -> int:
+        """Get the id of the timer."""
+
+    def close(self):
+        """Close the timer."""
 
 
 class ADC(BaseDev):

+ 1 - 0
package/PikaStdDevice/PikaStdDevice_PWM.c

@@ -109,4 +109,5 @@ void PikaStdDevice_PWM_platformDisable(PikaObj* self) {
 void PikaStdDevice_PWM_close(PikaObj* self) {
     pika_dev* dev = _get_dev(self);
     pika_hal_close(dev);
+    obj_setPtr(self, "pika_dev", NULL);
 }

+ 135 - 0
package/PikaStdDevice/PikaStdDevice_Timer.c

@@ -0,0 +1,135 @@
+#include "PikaStdDevice_Timer.h"
+#include "pika_hal.h"
+#include "PikaStdDevice_common.h"
+
+extern PikaEventListener* g_pika_device_event_listener;
+
+static pika_dev* _get_dev(PikaObj* self) {
+    pika_dev* dev = obj_getPtr(self, "pika_dev");
+    if (NULL != dev) {
+        return dev;
+    }
+    int id = obj_getInt(self, "id");
+    if (id != -1) {
+        char id_str[32] = {0};
+        sprintf(id_str, "TIM%d", id);
+        dev = pika_hal_open(PIKA_HAL_TIM, id_str);
+        if (NULL == dev) {
+            __platform_printf("Error: open TIM '%s' failed.\r\n", id_str);
+        }
+        obj_setPtr(self, "pika_dev", dev);
+        return dev;
+    }
+    char* name = obj_getStr(self, "name");
+    if (!strEqu(name, "none")) {
+        dev = pika_hal_open(PIKA_HAL_TIM, name);
+        if (NULL == dev) {
+            __platform_printf("Error: open TIM '%s' failed.\r\n", name);
+        }
+        obj_setPtr(self, "pika_dev", dev);
+        return dev;
+    }
+    return dev;
+}
+
+void PikaStdDevice_Timer___init__(PikaObj* self) {
+    obj_setInt(self, "id", -1);
+    obj_setStr(self, "name", "none");
+    obj_setInt(self, "period", PIKA_HAL_TIM_PERIOD_1S);
+    obj_setInt(self, "SIGNAL_TIMEOUT", PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT);
+    obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
+    obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_TIM_EVENT_SIGNAL_ANY);
+}
+
+void PikaStdDevice_Timer_disable(PikaObj* self) {
+    pika_dev* dev = _get_dev(self);
+    if (NULL == dev) {
+        __platform_printf("Error: open TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
+}
+
+void PikaStdDevice_Timer_enable(PikaObj* self) {
+    pika_dev* dev = _get_dev(self);
+    if (NULL == dev) {
+        __platform_printf("Error: open TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    pika_hal_TIM_config cfg = {0};
+    cfg.period = obj_getInt(self, "period");
+    int err = -1;
+    err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
+    if (err != 0) {
+        __platform_printf("Error: config TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
+    if (err != 0) {
+        __platform_printf("Error: enable TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+}
+
+void PikaStdDevice_Timer_setCallback(PikaObj* self, Arg* callback, int filter) {
+#if PIKA_EVENT_ENABLE
+    pika_dev* dev = _get_dev(self);
+    _PikaStdDevice_setCallback(self, callback, (uintptr_t)dev);
+    /* regist event to pika_hal */
+    pika_hal_TIM_config cfg_cb = {0};
+    cfg_cb.event_callback = (void*)_PikaStdDevice_event_handler;
+    cfg_cb.event_callback_filter = filter;
+    cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
+#else
+    obj_setErrorCode(self, 1);
+    obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
+#endif
+}
+
+void PikaStdDevice_Timer_setPeriod(PikaObj* self, int period_ms) {
+    obj_setInt(self, "period", period_ms * PIKA_HAL_TIM_PERIOD_1MS);
+    pika_hal_TIM_config cfg = {0};
+    cfg.period = obj_getInt(self, "period");
+    pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
+}
+
+void PikaStdDevice_Timer_close(PikaObj* self) {
+    pika_hal_close(_get_dev(self));
+    obj_setPtr(self, "pika_dev", NULL);
+}
+
+void PikaStdDevice_Timer_setId(PikaObj* self, int id) {
+    obj_setInt(self, "id", id);
+}
+
+void PikaStdDevice_Timer_setName(PikaObj* self, char* name) {
+    obj_setStr(self, "name", name);
+}
+
+int PikaStdDevice_Timer_getId(PikaObj* self) {
+    return obj_getInt(self, "id");
+}
+
+char* PikaStdDevice_Timer_getName(PikaObj* self) {
+    return obj_getStr(self, "name");
+}
+
+void PikaStdDevice_Timer_setMode(PikaObj* self, char* mode) {
+    if (strEqu(mode, "oneshot")) {
+        obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_ONESHOT);
+    } else if (strEqu(mode, "continuous")) {
+        obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
+    } else {
+        obj_setErrorCode(self, 1);
+        obj_setSysOut(self, "[error] mode is not supported.");
+    }
+    pika_dev* dev = _get_dev(self);
+    pika_hal_TIM_config cfg = {0};
+    cfg.mode = obj_getInt(self, "mode");
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
+}

+ 10 - 0
package/PikaStdDevice/pika_hal.c

@@ -323,3 +323,13 @@ int pika_hal_WIFI_ioctl_merge_config(pika_hal_WIFI_config* dst,
     _IOCTL_CONFIG_USE_DEFAULT_STR(ap_password, "pikapython.com");
     return 0;
 }
+
+int pika_hal_TIM_ioctl_merge_config(pika_hal_TIM_config* dst,
+                                    pika_hal_TIM_config* src) {
+    _IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_TIM_PERIOD_1S);
+    _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_TIM_MODE_CONTINUOUS);
+    _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
+                              PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
+    _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
+    return 0;
+}

+ 27 - 0
package/PikaStdDevice/pika_hal.h

@@ -480,6 +480,33 @@ typedef struct pika_hal_WIFI_scan_result {
     pika_hal_WIFI_record records[];
 } pika_hal_WIFI_scan_result;
 
+typedef enum {
+    PIKA_HAL_TIM_PERIOD_1NS = 1,
+    PIKA_HAL_TIM_PERIOD_1US = 1000,
+    PIKA_HAL_TIM_PERIOD_1MS = 1000000,
+    PIKA_HAL_TIM_PERIOD_1S = 1000000000,
+} PIKA_HAL_TIM_PERIOD;
+
+typedef enum {
+    _PIKA_HAL_TIM_MODE_UNUSED = 0,
+    PIKA_HAL_TIM_MODE_ONESHOT,
+    PIKA_HAL_TIM_MODE_CONTINUOUS,
+} PIKA_HAL_TIM_MODE;
+
+typedef enum {
+    _PIKA_HAL_TIM_EVENT_SIGNAL_UNUSED = 0,
+    PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT,
+    PIKA_HAL_TIM_EVENT_SIGNAL_ANY,
+} PIKA_HAL_TIM_EVENT_SIGNAL;
+
+typedef struct pika_hal_TIM_config {
+    PIKA_HAL_TIM_PERIOD period;
+    PIKA_HAL_TIM_MODE mode;
+    PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
+    PIKA_HAL_TIM_EVENT_SIGNAL event_callback_filter;
+    void (*event_callback)(pika_dev* dev, PIKA_HAL_TIM_EVENT_SIGNAL signal);
+} pika_hal_TIM_config;
+
 typedef struct pika_dev_impl {
     int (*open)(pika_dev* dev, char* name);
     int (*close)(pika_dev* dev);

+ 1 - 0
package/PikaStdDevice/pika_hal_table.h

@@ -12,4 +12,5 @@ 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(TIM)
 

+ 44 - 1
port/linux/package/pikascript/PikaStdDevice.pyi

@@ -108,7 +108,50 @@ class GPIO(BaseDev):
 
 
 def Time() -> time:
-    """ use time module instead """
+    """ deprecated use time module instead """
+
+
+class Timer:
+    def __init__(self): ...
+
+    def setPeriod(self, period_ms: int):
+        """Set the period of the timer."""
+
+    def setMode(self, mode: str):
+        """ 
+        Set the mode of the timer. 
+        Example: `"continuous"`, `"oneshot"` ...
+        """
+
+    SIGNAL_TIMEOUT: int
+    SIGNAL_ANY: int
+
+    def setCallback(self, callback: any, filter: int):
+        """
+        Add a callback function to the timer.
+        The callback function will be called when the timer is triggered.
+        """
+
+    def enable(self):
+        """Enable the timer."""
+
+    def disable(self):
+        """Disable the timer."""
+
+    def setName(self, name: str):
+        """Set the name of the timer."""
+
+    def setId(self, id: int):
+        """Set the id of the timer."""
+
+    def getName(self) -> str:
+        """Get the name of the timer."""
+
+    def getId(self) -> int:
+        """Get the id of the timer."""
+
+    def close(self):
+        """Close the timer."""
 
 
 class ADC(BaseDev):

+ 1 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_PWM.c

@@ -109,4 +109,5 @@ void PikaStdDevice_PWM_platformDisable(PikaObj* self) {
 void PikaStdDevice_PWM_close(PikaObj* self) {
     pika_dev* dev = _get_dev(self);
     pika_hal_close(dev);
+    obj_setPtr(self, "pika_dev", NULL);
 }

+ 135 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_Timer.c

@@ -0,0 +1,135 @@
+#include "PikaStdDevice_Timer.h"
+#include "pika_hal.h"
+#include "PikaStdDevice_common.h"
+
+extern PikaEventListener* g_pika_device_event_listener;
+
+static pika_dev* _get_dev(PikaObj* self) {
+    pika_dev* dev = obj_getPtr(self, "pika_dev");
+    if (NULL != dev) {
+        return dev;
+    }
+    int id = obj_getInt(self, "id");
+    if (id != -1) {
+        char id_str[32] = {0};
+        sprintf(id_str, "TIM%d", id);
+        dev = pika_hal_open(PIKA_HAL_TIM, id_str);
+        if (NULL == dev) {
+            __platform_printf("Error: open TIM '%s' failed.\r\n", id_str);
+        }
+        obj_setPtr(self, "pika_dev", dev);
+        return dev;
+    }
+    char* name = obj_getStr(self, "name");
+    if (!strEqu(name, "none")) {
+        dev = pika_hal_open(PIKA_HAL_TIM, name);
+        if (NULL == dev) {
+            __platform_printf("Error: open TIM '%s' failed.\r\n", name);
+        }
+        obj_setPtr(self, "pika_dev", dev);
+        return dev;
+    }
+    return dev;
+}
+
+void PikaStdDevice_Timer___init__(PikaObj* self) {
+    obj_setInt(self, "id", -1);
+    obj_setStr(self, "name", "none");
+    obj_setInt(self, "period", PIKA_HAL_TIM_PERIOD_1S);
+    obj_setInt(self, "SIGNAL_TIMEOUT", PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT);
+    obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
+    obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_TIM_EVENT_SIGNAL_ANY);
+}
+
+void PikaStdDevice_Timer_disable(PikaObj* self) {
+    pika_dev* dev = _get_dev(self);
+    if (NULL == dev) {
+        __platform_printf("Error: open TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
+}
+
+void PikaStdDevice_Timer_enable(PikaObj* self) {
+    pika_dev* dev = _get_dev(self);
+    if (NULL == dev) {
+        __platform_printf("Error: open TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    pika_hal_TIM_config cfg = {0};
+    cfg.period = obj_getInt(self, "period");
+    int err = -1;
+    err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
+    if (err != 0) {
+        __platform_printf("Error: config TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+    err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
+    if (err != 0) {
+        __platform_printf("Error: enable TIM '%d' failed.\r\n",
+                          (int)obj_getInt(self, "id"));
+        return;
+    }
+}
+
+void PikaStdDevice_Timer_setCallback(PikaObj* self, Arg* callback, int filter) {
+#if PIKA_EVENT_ENABLE
+    pika_dev* dev = _get_dev(self);
+    _PikaStdDevice_setCallback(self, callback, (uintptr_t)dev);
+    /* regist event to pika_hal */
+    pika_hal_TIM_config cfg_cb = {0};
+    cfg_cb.event_callback = (void*)_PikaStdDevice_event_handler;
+    cfg_cb.event_callback_filter = filter;
+    cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
+#else
+    obj_setErrorCode(self, 1);
+    obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
+#endif
+}
+
+void PikaStdDevice_Timer_setPeriod(PikaObj* self, int period_ms) {
+    obj_setInt(self, "period", period_ms * PIKA_HAL_TIM_PERIOD_1MS);
+    pika_hal_TIM_config cfg = {0};
+    cfg.period = obj_getInt(self, "period");
+    pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
+}
+
+void PikaStdDevice_Timer_close(PikaObj* self) {
+    pika_hal_close(_get_dev(self));
+    obj_setPtr(self, "pika_dev", NULL);
+}
+
+void PikaStdDevice_Timer_setId(PikaObj* self, int id) {
+    obj_setInt(self, "id", id);
+}
+
+void PikaStdDevice_Timer_setName(PikaObj* self, char* name) {
+    obj_setStr(self, "name", name);
+}
+
+int PikaStdDevice_Timer_getId(PikaObj* self) {
+    return obj_getInt(self, "id");
+}
+
+char* PikaStdDevice_Timer_getName(PikaObj* self) {
+    return obj_getStr(self, "name");
+}
+
+void PikaStdDevice_Timer_setMode(PikaObj* self, char* mode) {
+    if (strEqu(mode, "oneshot")) {
+        obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_ONESHOT);
+    } else if (strEqu(mode, "continuous")) {
+        obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
+    } else {
+        obj_setErrorCode(self, 1);
+        obj_setSysOut(self, "[error] mode is not supported.");
+    }
+    pika_dev* dev = _get_dev(self);
+    pika_hal_TIM_config cfg = {0};
+    cfg.mode = obj_getInt(self, "mode");
+    pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
+}

+ 10 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/pika_hal.c

@@ -323,3 +323,13 @@ int pika_hal_WIFI_ioctl_merge_config(pika_hal_WIFI_config* dst,
     _IOCTL_CONFIG_USE_DEFAULT_STR(ap_password, "pikapython.com");
     return 0;
 }
+
+int pika_hal_TIM_ioctl_merge_config(pika_hal_TIM_config* dst,
+                                    pika_hal_TIM_config* src) {
+    _IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_TIM_PERIOD_1S);
+    _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_TIM_MODE_CONTINUOUS);
+    _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
+                              PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
+    _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
+    return 0;
+}

+ 27 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdDevice/pika_hal.h

@@ -480,6 +480,33 @@ typedef struct pika_hal_WIFI_scan_result {
     pika_hal_WIFI_record records[];
 } pika_hal_WIFI_scan_result;
 
+typedef enum {
+    PIKA_HAL_TIM_PERIOD_1NS = 1,
+    PIKA_HAL_TIM_PERIOD_1US = 1000,
+    PIKA_HAL_TIM_PERIOD_1MS = 1000000,
+    PIKA_HAL_TIM_PERIOD_1S = 1000000000,
+} PIKA_HAL_TIM_PERIOD;
+
+typedef enum {
+    _PIKA_HAL_TIM_MODE_UNUSED = 0,
+    PIKA_HAL_TIM_MODE_ONESHOT,
+    PIKA_HAL_TIM_MODE_CONTINUOUS,
+} PIKA_HAL_TIM_MODE;
+
+typedef enum {
+    _PIKA_HAL_TIM_EVENT_SIGNAL_UNUSED = 0,
+    PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT,
+    PIKA_HAL_TIM_EVENT_SIGNAL_ANY,
+} PIKA_HAL_TIM_EVENT_SIGNAL;
+
+typedef struct pika_hal_TIM_config {
+    PIKA_HAL_TIM_PERIOD period;
+    PIKA_HAL_TIM_MODE mode;
+    PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
+    PIKA_HAL_TIM_EVENT_SIGNAL event_callback_filter;
+    void (*event_callback)(pika_dev* dev, PIKA_HAL_TIM_EVENT_SIGNAL signal);
+} pika_hal_TIM_config;
+
 typedef struct pika_dev_impl {
     int (*open)(pika_dev* dev, char* name);
     int (*close)(pika_dev* dev);

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

@@ -12,4 +12,5 @@ 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(TIM)
 

+ 2 - 4
src/PikaObj.c

@@ -481,8 +481,7 @@ static PikaObj* _pika_new_obj_with_args(PikaObj* (*constructor)(),
                 /* empty tuple */
                 return obj;
             }
-            PikaStdData_List_append(obj, arg);
-            arg_deinit(arg);
+            pikaList_append(obj, arg);
         }
     } else if (constructor == New_PikaStdData_Dict) {
         if (num_args == 1) {
@@ -493,9 +492,8 @@ static PikaObj* _pika_new_obj_with_args(PikaObj* (*constructor)(),
             Arg* aKey = va_arg(args, Arg*);
             char* sKey = arg_getStr(aKey);
             Arg* value = va_arg(args, Arg*);
-            PikaStdData_Dict_set(obj, sKey, value);
+            pikaDict_set(obj, sKey, value);
             arg_deinit(aKey);
-            arg_deinit(value);
         }
     }
 

+ 1 - 1
src/PikaVersion.h

@@ -2,4 +2,4 @@
 #define PIKA_VERSION_MINOR 12
 #define PIKA_VERSION_MICRO 5
 
-#define PIKA_EDIT_TIME "2023/08/08 22:10:05"
+#define PIKA_EDIT_TIME "2023/08/10 01:29:48"