pikapython/package/PikaStdDevice/PikaStdDevice_GPIO.c

157 lines
4.8 KiB
C
Raw Normal View History

2021-10-01 20:00:15 +08:00
#include "PikaStdDevice_GPIO.h"
2022-12-23 20:23:40 +08:00
#include "PikaStdDevice_common.h"
2021-10-01 20:00:15 +08:00
2024-02-12 23:10:49 +08:00
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = PIKA_HAL_OBJ2DEV(self);
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
2021-10-01 20:00:15 +08:00
void PikaStdDevice_GPIO_init(PikaObj* self) {
obj_setInt(self, "isEnable", 0);
2022-03-19 09:49:19 +08:00
obj_setStr(self, "pin", "none");
2021-10-01 20:00:15 +08:00
obj_setStr(self, "mode", "out");
obj_setInt(self, "isOn", 0);
2021-10-25 20:16:08 +08:00
obj_setStr(self, "pull", "none");
2022-03-19 09:49:19 +08:00
obj_setInt(self, "id", -999);
2022-11-21 02:03:01 +08:00
obj_setPtr(self, "pika_dev", NULL);
2022-03-19 09:49:19 +08:00
}
int PikaStdDevice_GPIO_getId(PikaObj* self) {
return obj_getInt(self, "id");
}
void PikaStdDevice_GPIO_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
2021-10-01 20:00:15 +08:00
}
2021-12-10 23:02:40 +08:00
void PikaStdDevice_GPIO___init__(PikaObj* self) {
PikaStdDevice_GPIO_init(self);
2022-12-23 18:16:53 +08:00
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);
2021-12-10 23:02:40 +08:00
}
2021-10-01 20:00:15 +08:00
void PikaStdDevice_GPIO_disable(PikaObj* self) {
obj_setInt(self, "isEnable", 0);
2024-02-12 23:10:49 +08:00
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
2021-10-01 20:00:15 +08:00
}
void PikaStdDevice_GPIO_enable(PikaObj* self) {
obj_setInt(self, "isEnable", 1);
2024-02-12 23:10:49 +08:00
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
2021-10-01 20:00:15 +08:00
}
char* PikaStdDevice_GPIO_getMode(PikaObj* self) {
return obj_getStr(self, "mode");
}
char* PikaStdDevice_GPIO_getPin(PikaObj* self) {
return obj_getStr(self, "pin");
}
void PikaStdDevice_GPIO_low(PikaObj* self) {
obj_setInt(self, "isOn", 0);
2024-02-12 23:10:49 +08:00
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_write(dev, &val, sizeof(val));
2021-10-01 20:00:15 +08:00
}
void PikaStdDevice_GPIO_high(PikaObj* self) {
obj_setInt(self, "isOn", 1);
2024-02-12 23:10:49 +08:00
pika_dev* dev = _get_dev(self);
uint32_t val = 1;
pika_hal_write(dev, &val, sizeof(val));
2021-10-01 20:00:15 +08:00
}
2022-02-26 14:40:56 +08:00
int PikaStdDevice_GPIO_read(PikaObj* self) {
2024-02-12 23:10:49 +08:00
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_read(dev, &val, sizeof(val));
obj_setInt(self, "readBuff", val);
2021-10-25 20:16:08 +08:00
return obj_getInt(self, "readBuff");
}
2021-10-01 20:00:15 +08:00
void PikaStdDevice_GPIO_setMode(PikaObj* self, char* mode) {
2022-02-26 14:40:56 +08:00
if (strEqu(mode, "out") || strEqu(mode, "in")) {
obj_setStr(self, "mode", mode);
2024-02-12 23:10:49 +08:00
pika_hal_GPIO_config cfg = {0};
if (strEqu(mode, "in")) {
cfg.dir = PIKA_HAL_GPIO_DIR_IN;
} else {
cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
}
pika_dev* dev = _get_dev(self);
char* pull = obj_getStr(self, "pull");
if (strEqu(pull, "up")) {
cfg.pull = PIKA_HAL_GPIO_PULL_UP;
}
if (strEqu(pull, "down")) {
cfg.pull = PIKA_HAL_GPIO_PULL_DOWN;
}
if (strEqu(pull, "none")) {
cfg.pull = PIKA_HAL_GPIO_PULL_NONE;
}
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
2022-02-26 14:40:56 +08:00
} else {
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error] GPIO mode should be 'out' or 'in'.");
}
2021-10-01 20:00:15 +08:00
}
2022-02-26 14:40:56 +08:00
void PikaStdDevice_GPIO_setPull(PikaObj* self, char* pull) {
if (strEqu(pull, "up") || strEqu(pull, "down") || strEqu(pull, "none")) {
2021-10-25 20:16:08 +08:00
obj_setStr(self, "pull", pull);
2022-02-26 14:40:56 +08:00
} else {
2021-10-25 20:16:08 +08:00
obj_setErrorCode(self, 1);
2022-02-26 14:40:56 +08:00
obj_setSysOut(self,
"[error] GPIO pull should be 'up', 'down' or 'none'.");
2021-10-25 20:16:08 +08:00
}
}
2022-02-26 14:40:56 +08:00
void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) {
2021-10-01 20:00:15 +08:00
obj_setStr(self, "pin", pinName);
}
2023-08-08 21:03:13 +08:00
void PikaStdDevice_GPIO_setCallback(PikaObj* self,
2022-12-23 20:23:40 +08:00
Arg* eventCallback,
int filter) {
2022-12-23 18:16:53 +08:00
#if PIKA_EVENT_ENABLE
2023-02-27 19:47:46 +08:00
pika_dev* dev = _get_dev(self);
2023-08-08 21:03:13 +08:00
_PikaStdDevice_setCallback(self, eventCallback, (uintptr_t)dev);
2022-12-23 18:16:53 +08:00
/* regist event to pika_hal */
pika_hal_GPIO_config cfg_cb = {0};
2024-03-02 14:19:44 +08:00
cfg_cb.event_callback = _PikaStdDevice_GPIO_event_handler;
2022-12-23 18:16:53 +08:00
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
}
2022-12-28 06:41:36 +08:00
2023-08-08 21:03:13 +08:00
void PikaStdDevice_GPIO_setCallBack(PikaObj* self,
Arg* eventCallback,
int filter) {
pika_platform_printf(
"Warning: setCallBack is deprecated, use "
"setCallback instead.\r\n");
PikaStdDevice_GPIO_setCallback(self, eventCallback, filter);
}
2023-07-15 14:59:56 +08:00
void PikaStdDevice_GPIO_close(PikaObj* self) {
2022-12-28 06:41:36 +08:00
pika_dev* dev = _get_dev(self);
pika_hal_close(dev);
}