update port linux std

fix baseDev.addEventCallBack

use setCallBack in std

update std

support flow control for uart

add flowcontrol API for std.uart
This commit is contained in:
lyon 2022-12-23 18:19:16 +08:00
parent 90c7ed066d
commit 256319e035
16 changed files with 211 additions and 29 deletions

View File

@ -9,7 +9,7 @@ Document: https://pikadoc.readthedocs.io/en/latest/PikaStdDevice%20%E6%A0%87%E5%
from PikaObj import *
class GPIO:
class GPIO(BaseDev):
def __init__(self): ...
def setPin(self, pinName: str):
@ -72,14 +72,14 @@ class GPIO:
SIGNAL_FALLING: int
SIGNAL_ANY: int
def addEventCallBack(self, eventCallBack: any, filter: int):
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print("cb1", signal)
io.addEventCallBack(cb1, io.SIGNAL_RISING)
io.setCallBack(cb1, io.SIGNAL_RISING)
```
"""
@ -202,6 +202,14 @@ class UART:
def setId(self, id: int):
"""Set the id of the UART."""
FLOW_CONTROL_NONE: int
FLOW_CONTROL_RTS: int
FLOW_CONTROL_CTS: int
FLOW_CONTROL_RTS_CTS: int
def setFlowControl(self, flowControl: int):
"""Set the flow control of the UART."""
def enable(self):
"""Enable the UART."""
@ -225,14 +233,14 @@ class UART:
SIGNAL_RX: int
SIGNAL_TX: int
def addEventCallBack(self, eventCallBack: any, filter: int):
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print(uart.read(-1))
io.addEventCallBack(cb1, uart.SIGNAL_RX)
io.setCallBack(cb1, uart.SIGNAL_RX)
```
"""

View File

@ -153,13 +153,13 @@ extern PikaEventListener* g_pika_device_event_listener;
void _pika_hal_GPIO_event_callback(pika_dev* dev,
PIKA_HAL_GPIO_EVENT_SIGNAL signal) {
pks_eventLisener_sendSignal(g_pika_device_event_listener, (uint32_t)dev,
pks_eventLisener_sendSignal(g_pika_device_event_listener, (uintptr_t)dev,
signal);
}
void PikaStdDevice_GPIO_addEventCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {
void PikaStdDevice_GPIO_setCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {
pika_dev* dev = _get_dev(self);
#if PIKA_EVENT_ENABLE
obj_setArg(self, "eventCallBack", eventCallBack);
@ -168,7 +168,7 @@ void PikaStdDevice_GPIO_addEventCallBack(PikaObj* self,
pks_eventLisener_init(&g_pika_device_event_listener);
}
/* use the pointer of dev as the event id */
uint32_t eventId = (uint32_t)dev;
uint32_t eventId = (uintptr_t)dev;
/* regist event to event listener */
pks_eventLicener_registEvent(g_pika_device_event_listener, eventId, self);

View File

@ -14,6 +14,12 @@ void PikaStdDevice_UART_init(PikaObj* self) {
obj_setInt(self, "baudRate", 115200);
obj_setInt(self, "id", 1);
obj_setStr(self, "readBuff", "");
obj_setInt(self, "FLOW_CONTROL_NONE", PIKA_HAL_UART_FLOW_CONTROL_NONE);
obj_setInt(self, "FLOW_CONTROL_RTS", PIKA_HAL_UART_FLOW_CONTROL_RTS);
obj_setInt(self, "FLOW_CONTROL_CTS", PIKA_HAL_UART_FLOW_CONTROL_CTS);
obj_setInt(self, "FLOW_CONTROL_RTS_CTS",
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS);
obj_setInt(self, "flowControl", PIKA_HAL_UART_FLOW_CONTROL_NONE);
}
void PikaStdDevice_UART___init__(PikaObj* self) {
@ -35,9 +41,15 @@ Arg* PikaStdDevice_UART_readBytes(PikaObj* self, int length) {
void PikaStdDevice_UART_setBaudRate(PikaObj* self, int baudRate) {
obj_setInt(self, "baudRate", baudRate);
}
void PikaStdDevice_UART_setFlowControl(PikaObj *self, int flowControl){
obj_setInt(self, "flowControl", flowControl);
}
void PikaStdDevice_UART_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_UART_write(PikaObj* self, char* data) {
obj_setStr(self, "writeData", data);
obj_runNativeMethod(self, "platformWrite", NULL);
@ -73,6 +85,7 @@ void PikaStdDevice_UART_platformEnable(PikaObj* self) {
}
pika_hal_UART_config cfg = {0};
cfg.baudrate = obj_getInt(self, "baudRate");
cfg.flow_control = obj_getInt(self, "flowControl");
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
@ -118,6 +131,6 @@ void PikaStdDevice_UART_platformWriteBytes(PikaObj* self) {
pika_hal_write(dev, data, len);
}
void PikaStdDevice_UART_addEventCallBack(PikaObj *self, Arg* eventCallBack, int filter){
}
void PikaStdDevice_UART_setCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {}

View File

@ -197,6 +197,7 @@ int pika_hal_UART_ioctl_merge_config(pika_hal_UART_config* dst,
_IOCTL_CONFIG_USE_DEFAULT(data_bits, PIKA_HAL_UART_DATA_BITS_8);
_IOCTL_CONFIG_USE_DEFAULT(stop_bits, PIKA_HAL_UART_STOP_BITS_1);
_IOCTL_CONFIG_USE_DEFAULT(parity, PIKA_HAL_UART_PARITY_NONE);
_IOCTL_CONFIG_USE_DEFAULT(flow_control, PIKA_HAL_UART_FLOW_CONTROL_NONE);
_IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
PIKA_HAL_UART_EVENT_SIGNAL_RX);

View File

@ -120,11 +120,20 @@ typedef enum {
PIKA_HAL_UART_EVENT_SIGNAL_ANY,
} PIKA_HAL_UART_EVENT_SIGNAL;
typedef enum {
_PIKA_HAL_UART_FLOW_CONTROL_UNUSED = 0,
PIKA_HAL_UART_FLOW_CONTROL_NONE,
PIKA_HAL_UART_FLOW_CONTROL_RTS,
PIKA_HAL_UART_FLOW_CONTROL_CTS,
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS,
} PIKA_HAL_UART_FLOW_CONTROL;
typedef struct {
PIKA_HAL_UART_BAUDRATE baudrate;
PIKA_HAL_UART_DATA_BITS data_bits;
PIKA_HAL_UART_STOP_BITS stop_bits;
PIKA_HAL_UART_PARITY parity;
PIKA_HAL_UART_FLOW_CONTROL flow_control;
void (*event_callback)(pika_dev* dev, PIKA_HAL_UART_EVENT_SIGNAL signal);
PIKA_HAL_UART_EVENT_SIGNAL event_callback_filter;
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;

View File

@ -10,6 +10,7 @@ class GPIO(PikaStdDevice.GPIO):
def platformSetMode(self): ...
def platformRead(self): ...
def platformGetEventId(self): ...
def eventTest(self): ...
class Time(PikaStdDevice.Time):

View File

@ -14,3 +14,15 @@ void TemplateDevice_GPIO_platformGetEventId(PikaObj* self) {
obj_setInt(self, "eventId", GPIO_PA8_EVENT_ID);
}
}
extern PikaEventListener* g_pika_device_event_listener;
#define EVENT_SIGNAL_IO_RISING_EDGE 0x01
#define EVENT_SIGNAL_IO_FALLING_EDGE 0x02
#define GPIO_PA8_EVENT_ID 0x08
void TemplateDevice_GPIO_eventTest(PikaObj* self) {
pks_eventLisener_sendSignal(g_pika_device_event_listener, GPIO_PA8_EVENT_ID,
EVENT_SIGNAL_IO_FALLING_EDGE);
pks_eventLisener_sendSignal(g_pika_device_event_listener, GPIO_PA8_EVENT_ID,
EVENT_SIGNAL_IO_RISING_EDGE);
}

View File

@ -93,7 +93,8 @@
"__instruction_def.h": "c",
"pika_hal_def.h": "c",
"pika_hal_table.h": "c",
"pika_hal_table_rule.h": "c"
"pika_hal_table_rule.h": "c",
"pikastddevice_uart.h": "c"
},
"python.formatting.provider": "autopep8",
"C_Cpp.errorSquiggles": "Disabled"

View File

@ -68,6 +68,21 @@ class GPIO(BaseDev):
def read(self) -> int:
"""Read the pin value."""
SIGNAL_RISING: int
SIGNAL_FALLING: int
SIGNAL_ANY: int
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print("cb1", signal)
io.setCallBack(cb1, io.SIGNAL_RISING)
```
"""
@abstractmethod
def platformHigh(self): ...
@ -175,10 +190,11 @@ class DAC(BaseDev):
def disable(self):
"""Disable the DAC."""
def write(self, val:float):
def write(self, val: float):
"""write the DAC value."""
class UART(BaseDev):
class UART:
def __init__(self): ...
def setBaudRate(self, baudRate: int):
@ -186,6 +202,14 @@ class UART(BaseDev):
def setId(self, id: int):
"""Set the id of the UART."""
FLOW_CONTROL_NONE: int
FLOW_CONTROL_RTS: int
FLOW_CONTROL_CTS: int
FLOW_CONTROL_RTS_CTS: int
def setFlowControl(self, flowControl: int):
"""Set the flow control of the UART."""
def enable(self):
"""Enable the UART."""
@ -205,6 +229,21 @@ class UART(BaseDev):
def readBytes(self, length: int) -> bytes:
"""Read bytes from the UART."""
SIGNAL_RX: int
SIGNAL_TX: int
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print(uart.read(-1))
io.setCallBack(cb1, uart.SIGNAL_RX)
```
"""
@abstractmethod
def platformEnable(self): ...
@ -436,7 +475,7 @@ class CAN(BaseDev):
def readBytes(self, length: int) -> bytes:
"""Read bytes from the CAN."""
def addFilter(self, id: int, ide: int, rtr: int, mode: int, mask: int, hdr: int):
def addFilter(self, id: int, ide: int, rtr: int, mode: int, mask: int, hdr: int):
"""Add a filter."""
@abstractmethod
@ -460,7 +499,7 @@ class CAN(BaseDev):
class BaseDev:
@PIKA_C_MACRO_IF("PIKA_EVENT_ENABLE")
def addEventCallBack(self, eventCallback: any):
def addEventCallBack(self, eventCallback: any):
""" Add an event callback. """
@abstractmethod

View File

@ -22,6 +22,9 @@ void PikaStdDevice_GPIO_setId(PikaObj* self, int id) {
void PikaStdDevice_GPIO___init__(PikaObj* self) {
PikaStdDevice_GPIO_init(self);
obj_setInt(self, "SIGNAL_RISING", PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
obj_setInt(self, "SIGNAL_FALLING", PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING);
obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_GPIO_EVENT_SIGNAL_ANY);
}
void PikaStdDevice_GPIO_disable(PikaObj* self) {
@ -145,3 +148,38 @@ void PikaStdDevice_GPIO_platformRead(PikaObj* self) {
pika_hal_read(dev, &val, sizeof(val));
obj_setInt(self, "readBuff", val);
}
extern PikaEventListener* g_pika_device_event_listener;
void _pika_hal_GPIO_event_callback(pika_dev* dev,
PIKA_HAL_GPIO_EVENT_SIGNAL signal) {
pks_eventLisener_sendSignal(g_pika_device_event_listener, (uintptr_t)dev,
signal);
}
void PikaStdDevice_GPIO_setCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {
pika_dev* dev = _get_dev(self);
#if PIKA_EVENT_ENABLE
obj_setArg(self, "eventCallBack", eventCallBack);
/* init event_listener for the first time */
if (NULL == g_pika_device_event_listener) {
pks_eventLisener_init(&g_pika_device_event_listener);
}
/* use the pointer of dev as the event id */
uint32_t eventId = (uintptr_t)dev;
/* regist event to event listener */
pks_eventLicener_registEvent(g_pika_device_event_listener, eventId, self);
/* regist event to pika_hal */
pika_hal_GPIO_config cfg_cb = {0};
cfg_cb.event_callback = _pika_hal_GPIO_event_callback;
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
}

View File

@ -14,6 +14,12 @@ void PikaStdDevice_UART_init(PikaObj* self) {
obj_setInt(self, "baudRate", 115200);
obj_setInt(self, "id", 1);
obj_setStr(self, "readBuff", "");
obj_setInt(self, "FLOW_CONTROL_NONE", PIKA_HAL_UART_FLOW_CONTROL_NONE);
obj_setInt(self, "FLOW_CONTROL_RTS", PIKA_HAL_UART_FLOW_CONTROL_RTS);
obj_setInt(self, "FLOW_CONTROL_CTS", PIKA_HAL_UART_FLOW_CONTROL_CTS);
obj_setInt(self, "FLOW_CONTROL_RTS_CTS",
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS);
obj_setInt(self, "flowControl", PIKA_HAL_UART_FLOW_CONTROL_NONE);
}
void PikaStdDevice_UART___init__(PikaObj* self) {
@ -35,9 +41,15 @@ Arg* PikaStdDevice_UART_readBytes(PikaObj* self, int length) {
void PikaStdDevice_UART_setBaudRate(PikaObj* self, int baudRate) {
obj_setInt(self, "baudRate", baudRate);
}
void PikaStdDevice_UART_setFlowControl(PikaObj *self, int flowControl){
obj_setInt(self, "flowControl", flowControl);
}
void PikaStdDevice_UART_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_UART_write(PikaObj* self, char* data) {
obj_setStr(self, "writeData", data);
obj_runNativeMethod(self, "platformWrite", NULL);
@ -55,7 +67,7 @@ static pika_dev* _get_dev(PikaObj* self) {
}
int id = obj_getInt(self, "id");
char id_str[32] = {0};
sprintf(id_str, "%d", id);
sprintf(id_str, "UART%d", id);
dev = pika_hal_open(PIKA_HAL_UART, id_str);
if (NULL == dev) {
__platform_printf("Error: open UART '%s' failed.\r\n", id_str);
@ -73,6 +85,7 @@ void PikaStdDevice_UART_platformEnable(PikaObj* self) {
}
pika_hal_UART_config cfg = {0};
cfg.baudrate = obj_getInt(self, "baudRate");
cfg.flow_control = obj_getInt(self, "flowControl");
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
@ -117,3 +130,7 @@ void PikaStdDevice_UART_platformWriteBytes(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_write(dev, data, len);
}
void PikaStdDevice_UART_setCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {}

View File

@ -184,7 +184,9 @@ int pika_hal_GPIO_ioctl_merge_config(pika_hal_GPIO_config* dst,
_IOCTL_CONFIG_USE_DEFAULT(pull, PIKA_HAL_GPIO_PULL_NONE);
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_GPIO_SPEED_10M);
_IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_enable,
_IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
return 0;
}
@ -195,8 +197,11 @@ int pika_hal_UART_ioctl_merge_config(pika_hal_UART_config* dst,
_IOCTL_CONFIG_USE_DEFAULT(data_bits, PIKA_HAL_UART_DATA_BITS_8);
_IOCTL_CONFIG_USE_DEFAULT(stop_bits, PIKA_HAL_UART_STOP_BITS_1);
_IOCTL_CONFIG_USE_DEFAULT(parity, PIKA_HAL_UART_PARITY_NONE);
_IOCTL_CONFIG_USE_DEFAULT(flow_control, PIKA_HAL_UART_FLOW_CONTROL_NONE);
_IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_enable,
_IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
PIKA_HAL_UART_EVENT_SIGNAL_RX);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
return 0;
}

View File

@ -65,8 +65,10 @@ typedef enum {
} PIKA_HAL_EVENT_CALLBACK_ENA;
typedef enum {
_PIKA_HAL_GPIO_EVENT_SIGNAL_UNUSED = 0,
PIKA_HAL_GPIO_EVENT_SIGNAL_RISING,
PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING,
PIKA_HAL_GPIO_EVENT_SIGNAL_ANY,
} PIKA_HAL_GPIO_EVENT_SIGNAL;
typedef struct {
@ -74,7 +76,8 @@ typedef struct {
PIKA_HAL_GPIO_PULL pull;
PIKA_HAL_GPIO_SPEED speed;
void (*event_callback)(pika_dev* dev, PIKA_HAL_GPIO_EVENT_SIGNAL signal);
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_enable;
PIKA_HAL_GPIO_EVENT_SIGNAL event_callback_filter;
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
} pika_hal_GPIO_config;
typedef enum {
@ -100,6 +103,7 @@ typedef enum {
_PIKA_HAL_UART_STOP_BITS_UNUSED = 0,
PIKA_HAL_UART_STOP_BITS_1 = 1,
PIKA_HAL_UART_STOP_BITS_2 = 2,
PIKA_HAL_UART_STOP_BITS_1_5 = 3,
} PIKA_HAL_UART_STOP_BITS;
typedef enum {
@ -110,16 +114,29 @@ typedef enum {
} PIKA_HAL_UART_PARITY;
typedef enum {
_PIKA_HAL_UART_EVENT_SIGNAL_UNUSED = 0,
PIKA_HAL_UART_EVENT_SIGNAL_RX,
PIKA_HAL_UART_EVENT_SIGNAL_TX,
PIKA_HAL_UART_EVENT_SIGNAL_ANY,
} PIKA_HAL_UART_EVENT_SIGNAL;
typedef enum {
_PIKA_HAL_UART_FLOW_CONTROL_UNUSED = 0,
PIKA_HAL_UART_FLOW_CONTROL_NONE,
PIKA_HAL_UART_FLOW_CONTROL_RTS,
PIKA_HAL_UART_FLOW_CONTROL_CTS,
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS,
} PIKA_HAL_UART_FLOW_CONTROL;
typedef struct {
PIKA_HAL_UART_BAUDRATE baudrate;
PIKA_HAL_UART_DATA_BITS data_bits;
PIKA_HAL_UART_STOP_BITS stop_bits;
PIKA_HAL_UART_PARITY parity;
PIKA_HAL_UART_FLOW_CONTROL flow_control;
void (*event_callback)(pika_dev* dev, PIKA_HAL_UART_EVENT_SIGNAL signal);
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_enable;
PIKA_HAL_UART_EVENT_SIGNAL event_callback_filter;
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
} pika_hal_UART_config;
typedef uint32_t PIKA_HAL_IIC_SLAVE_ADDR;

View File

@ -1635,11 +1635,11 @@ void pks_eventLisener_sendSignal(PikaEventListener* self,
#else
/* push event handler to vm event list */
if (PIKA_RES_OK != VMSignal_pushEvent(self, eventId, eventSignal)) {
__platform_printf(
"OverflowError: event list is full, please use bigger "
"PIKA_EVENT_LIST_SIZE\r\n");
while (1) {
}
// __platform_printf(
// "OverflowError: event list is full, please use bigger "
// "PIKA_EVENT_LIST_SIZE\r\n");
// while (1) {
// }
}
if (0 == VMSignal_getVMCnt()) {
/* no vm running, pick up event imediately */

View File

@ -7,7 +7,7 @@ TEST(event, gpio) {
/* init */
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
/* run */
pikaVM_runSingleFile(pikaMain, "../../examples/TemplateDevice/gpio_cb.py");
pikaVM_runSingleFile(pikaMain, "test/python/TemplateDevice/gpio_cb.py");
#define EVENT_SIGAL_IO_RISING_EDGE 0x01
#define EVENT_SIGAL_IO_FALLING_EDGE 0x02

View File

@ -0,0 +1,21 @@
import TemplateDevice
io1 = TemplateDevice.GPIO()
io1.setPin('PA8')
io1.setMode('in')
io1.enable()
EVENT_SIGAL_IO_RISING_EDGE = 0x01
EVENT_SIGAL_IO_FALLING_EDGE = 0x02
def callBack1(signal):
if signal == EVENT_SIGAL_IO_RISING_EDGE:
print('get rising edge!')
elif signal == EVENT_SIGAL_IO_FALLING_EDGE:
print('get falling edge!')
else:
return signal
io1.addEventCallBack(callBack1)