!182 PikaStdDevice_v2.1.0_1669548707250

Merge pull request !182 from pikabot/PikaStdDevice_v2.1.0_1669548707250
This commit is contained in:
李昂 2022-11-27 11:35:08 +00:00 committed by Gitee
commit 0ee5fc93f3
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
7 changed files with 229 additions and 71 deletions

View File

@ -27,14 +27,43 @@ void PikaStdDevice_ADC_setPin(PikaObj* self, char* pin) {
obj_setStr(self, "pin", pin);
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_ADC, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open ADC '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_ADC_platformEnable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
pika_dev* dev = _get_dev(self);
if (NULL == dev) {
__platform_printf("Error: open ADC '%s' failed.\r\n",
obj_getStr(self, "pin"));
return;
}
pika_hal_ADC_config cfg = {0};
cfg.continue_or_single = PIKA_HAL_ADC_SINGLE;
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_ADC_platformDisable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_ADC_platformRead(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
pika_dev* dev = _get_dev(self);
pika_hal_ADC_config* cfg = (pika_hal_ADC_config*)dev->ioctl_config;
uint32_t val_i = 0;
pika_hal_read(dev, &val_i, sizeof(val_i));
pika_float val = (pika_float)val_i / (pika_float)cfg->max * cfg->vref;
val = val_i * obj_setFloat(self, "val", val);
}

View File

@ -77,17 +77,18 @@ void PikaStdDevice_GPIO_setPull(PikaObj* self, char* pull) {
}
}
static pika_dev* _get_dev(PikaObj* self){
pika_dev* dev = obj_getPtr(self, "pika_dev");
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;
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
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;
}
void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) {
@ -95,41 +96,41 @@ void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) {
}
void PikaStdDevice_GPIO_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_GPIO_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_GPIO_platformLow(PikaObj* self) {
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_write(dev, &val, sizeof(val));
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_write(dev, &val, sizeof(val));
}
void PikaStdDevice_GPIO_platformHigh(PikaObj* self) {
pika_dev* dev = _get_dev(self);
uint32_t val = 1;
pika_hal_write(dev, &val, sizeof(val));
pika_dev* dev = _get_dev(self);
uint32_t val = 1;
pika_hal_write(dev, &val, sizeof(val));
}
void PikaStdDevice_GPIO_platformSetMode(PikaObj* self) {
char* mode = obj_getStr(self, "mode");
pika_hal_GPIO_config cfg = {0};
if(strEqu(mode, "in")){
if (strEqu(mode, "in")) {
cfg.dir = PIKA_HAL_GPIO_DIR_IN;
}else{
} else {
cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
}
pika_dev* dev = _get_dev(self);
char* pull = obj_getStr(self, "pull");
if (strEqu(pull, "up")){
if (strEqu(pull, "up")) {
cfg.pull = PIKA_HAL_GPIO_PULL_UP;
}
if (strEqu(pull, "down")){
if (strEqu(pull, "down")) {
cfg.pull = PIKA_HAL_GPIO_PULL_DOWN;
}
if (strEqu(pull, "none")) {

View File

@ -44,20 +44,6 @@ int PikaStdDevice_PWM_getFrequency(PikaObj* self) {
return obj_getInt(self, "freq");
}
void PikaStdDevice_PWM_platformEnable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_PWM_platformSetDuty(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_PWM_platformSetFrequency(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_PWM_platformDisable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
char* PikaStdDevice_PWM_getName(PikaObj* self) {
return obj_getStr(self, "name");
}
@ -77,3 +63,46 @@ int PikaStdDevice_PWM_getChannel(PikaObj* self) {
void PikaStdDevice_PWM_setFreq(PikaObj* self, int freq) {
PikaStdDevice_PWM_setFrequency(self, freq);
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_PWM, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open PWM '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_PWM_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_PWM_platformSetDuty(PikaObj* self) {
pika_float duty = obj_getFloat(self, "duty"); // 0.0 ~ 1.0
uint32_t freq = obj_getInt(self, "freq"); // Hz
pika_hal_PWM_config cfg = {0};
/* ns */
cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
}
void PikaStdDevice_PWM_platformSetFrequency(PikaObj* self) {
uint32_t freq = obj_getInt(self, "freq"); // Hz
pika_float duty = obj_getFloat(self, "duty"); // 0.0 ~ 1.0
pika_hal_PWM_config cfg = {0};
/* ns */
cfg.period = (uint32_t)(1000000000.0f / freq);
cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
}
void PikaStdDevice_PWM_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}

View File

@ -27,20 +27,23 @@ static size_t _pika_hal_dev_config_size(PIKA_HAL_DEV_TYPE dev_type) {
pika_dev* pika_hal_open(PIKA_HAL_DEV_TYPE dev_type, char* name) {
int ret = -1;
pika_dev* dev = NULL;
if (dev_type >= _PIKA_DEV_TYPE_MAX) {
__platform_printf("Error: dev_type invalied.\r\n");
goto __exit;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev_type);
pika_dev* dev = (pika_dev*)pikaMalloc(sizeof(pika_dev));
dev = (pika_dev*)pikaMalloc(sizeof(pika_dev));
if (dev == NULL) {
goto __exit;
}
memset(dev, 0, sizeof(pika_dev));
dev->type = dev_type;
dev->ioctl_config = pikaMalloc(_pika_hal_dev_config_size(dev_type));
if (dev->ioctl_config == NULL) {
goto __exit;
}
memset(dev->ioctl_config, 0, _pika_hal_dev_config_size(dev_type));
ret = impl->open(dev, name);
__exit:
if (0 == ret) {
@ -142,11 +145,19 @@ int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
config_in = va_arg(args, void*);
ret = _pika_hal_ioctl_merge_config(dev, config_in);
va_end(args);
}
if (0 != ret) {
return ret;
if (0 != ret) {
return ret;
}
}
ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
if (ret == 0) {
if (cmd_origin == PIKA_HAL_IOCTL_ENABLE) {
dev->is_enabled = 1;
}
if (cmd_origin == PIKA_HAL_IOCTL_DISABLE) {
dev->is_enabled = 0;
}
}
return ret;
}
@ -160,12 +171,14 @@ int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
} \
} else { \
/* use input value */ \
src->item = dst->item; \
dst->item = src->item; \
}
int pika_hal_GPIO_ioctl_merge_config(pika_hal_GPIO_config* dst,
pika_hal_GPIO_config* src) {
// printf("before merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
_IOCTL_CONFIG_USE_DEFAULT(dir, PIKA_HAL_GPIO_DIR_IN);
// printf("after merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
_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_rising, NULL);
@ -195,22 +208,37 @@ int pika_hal_SPI_ioctl_merge_config(pika_hal_SPI_config* dst,
int pika_hal_IIC_ioctl_merge_config(pika_hal_IIC_config* dst,
pika_hal_IIC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(addr, 0);
_IOCTL_CONFIG_USE_DEFAULT(address_width, PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT);
_IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_IIC_MASTER);
_IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_ena, PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_size, PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT);
dst->mem_addr = src->mem_addr;
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_IIC_SPEED_100K);
_IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_IIC_TIMEOUT_1000MS);
return 0;
}
int pika_hal_PWM_ioctl_merge_config(pika_hal_PWM_config* dst,
pika_hal_PWM_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(channel, PIKA_HAL_PWM_CHANNEL_0);
_IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_PWM_PERIOD_1MS * 10);
_IOCTL_CONFIG_USE_DEFAULT(duty, PIKA_HAL_PWM_PERIOD_1MS * 5);
// _IOCTL_CONFIG_USE_DEFAULT(duty, 0);
dst->duty = src->duty;
return 0;
}
int pika_hal_ADC_ioctl_merge_config(pika_hal_ADC_config* dst,
pika_hal_ADC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(channel, PIKA_HAL_ADC_CHANNEL_0);
_IOCTL_CONFIG_USE_DEFAULT(resolution, PIKA_HAL_ADC_RESOLUTION_12);
_IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_ADC_RESOLUTION_12);
_IOCTL_CONFIG_USE_DEFAULT(sampling_freq, PIKA_HAL_ADC_SAMPLING_FREQ_100);
_IOCTL_CONFIG_USE_DEFAULT(continue_or_single, PIKA_HAL_ADC_SINGLE);
_IOCTL_CONFIG_USE_DEFAULT(vref, (pika_float)3.3);
_IOCTL_CONFIG_USE_DEFAULT(max, 8192);
return 0;
}
int pika_hal_DAC_ioctl_merge_config(pika_hal_DAC_config* dst,
pika_hal_DAC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_DAC_RESOLUTION_12);
return 0;
}

View File

@ -2,6 +2,7 @@
#define _PIKA_DEV_HAL_H
#include <stddef.h>
#include <stdint.h>
#include "PikaObj.h"
/*
* pika_hal is a C Device HAL lib for PikaScript modules.
@ -15,6 +16,7 @@ typedef enum {
typedef struct {
PIKA_HAL_DEV_TYPE type;
PIKA_BOOL is_enabled;
void* ioctl_config;
void* platform_data;
} pika_dev;
@ -105,6 +107,21 @@ typedef struct {
} pika_hal_UART_config;
typedef uint32_t PIKA_HAL_IIC_SLAVE_ADDR;
typedef uint32_t PIKA_HAL_IIC_MEM_ADDR;
typedef enum PIKA_HAL_IIC_MEM_ADDR_SIZE {
_PIKA_HAL_IIC_MEM_ADDR_SIZE_UNUSED = 0,
PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT = 1,
PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT = 2,
PIKA_HAL_IIC_MEM_ADDR_SIZE_24BIT = 3,
PIKA_HAL_IIC_MEM_ADDR_SIZE_32BIT = 4,
} PIKA_HAL_IIC_MEM_ADDR_SIZE;
typedef enum PIKA_HAL_IIC_MEM_ADDR_ENA {
_PIKA_HAL_IIC_MEM_ADDR_ENA_UNUSED = 0,
PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE,
PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE,
} PIKA_HAL_IIC_MEM_ADDR_ENA;
typedef enum {
_PIKA_HAL_IIC_SPEED_UNUSED = 0,
@ -113,9 +130,41 @@ typedef enum {
PIKA_HAL_IIC_SPEED_1M = 1000000,
} PIKA_HAL_IIC_SPEED;
typedef enum PIKA_HAL_IIC_MASTER_OR_SLAVE {
_PIKA_HAL_IIC_MASTER_OR_SLAVE_UNUSED = 0,
PIKA_HAL_IIC_MASTER,
PIKA_HAL_IIC_SLAVE,
} PIKA_HAL_IIC_MASTER_OR_SLAVE;
typedef enum PIKA_HAL_IIC_ADDRESS_WIDTH {
_PIKA_HAL_IIC_ADDRESS_WIDTH_UNUSED = 0,
PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT = 7,
PIKA_HAL_IIC_ADDRESS_WIDTH_10BIT = 10,
} PIKA_HAL_IIC_ADDRESS_WIDTH;
typedef enum PIKA_HAL_IIC_TIMEOUT {
_PIKA_HAL_IIC_TIMEOUT_UNUSED = 0,
PIKA_HAL_IIC_TIMEOUT_1MS = 1,
PIKA_HAL_IIC_TIMEOUT_2MS = 2,
PIKA_HAL_IIC_TIMEOUT_5MS = 5,
PIKA_HAL_IIC_TIMEOUT_10MS = 10,
PIKA_HAL_IIC_TIMEOUT_20MS = 20,
PIKA_HAL_IIC_TIMEOUT_50MS = 50,
PIKA_HAL_IIC_TIMEOUT_100MS = 100,
PIKA_HAL_IIC_TIMEOUT_200MS = 200,
PIKA_HAL_IIC_TIMEOUT_500MS = 500,
PIKA_HAL_IIC_TIMEOUT_1000MS = 1000,
} PIKA_HAL_IIC_TIMEOUT;
typedef struct {
PIKA_HAL_IIC_SLAVE_ADDR addr;
PIKA_HAL_IIC_ADDRESS_WIDTH address_width;
PIKA_HAL_IIC_MASTER_OR_SLAVE master_or_slave;
PIKA_HAL_IIC_SLAVE_ADDR slave_addr;
PIKA_HAL_IIC_MEM_ADDR_ENA mem_addr_ena;
PIKA_HAL_IIC_MEM_ADDR mem_addr;
PIKA_HAL_IIC_MEM_ADDR_SIZE mem_addr_size;
PIKA_HAL_IIC_SPEED speed;
PIKA_HAL_IIC_TIMEOUT timeout;
} pika_hal_IIC_config;
typedef enum {
@ -163,20 +212,6 @@ typedef struct {
PIKA_HAL_SPI_SPEED speed;
} pika_hal_SPI_config;
typedef enum {
_PIKA_HAL_ADC_CHANNEL_UNUSED = 0,
PIKA_HAL_ADC_CHANNEL_0,
PIKA_HAL_ADC_CHANNEL_1,
PIKA_HAL_ADC_CHANNEL_2,
PIKA_HAL_ADC_CHANNEL_3,
PIKA_HAL_ADC_CHANNEL_4,
PIKA_HAL_ADC_CHANNEL_5,
PIKA_HAL_ADC_CHANNEL_6,
PIKA_HAL_ADC_CHANNEL_7,
PIKA_HAL_ADC_CHANNEL_TEMP,
PIKA_HAL_ADC_CHANNEL_VBAT,
} PIKA_HAL_ADC_CHANNEL;
typedef enum {
_PIKA_HAL_ADC_RESOLUTION_UNUSED = 0,
PIKA_HAL_ADC_RESOLUTION_8 = 8,
@ -186,11 +221,46 @@ typedef enum {
PIKA_HAL_ADC_RESOLUTION_16 = 16,
} PIKA_HAL_ADC_RESOLUTION;
typedef enum PIKA_HAL_ADC_SAMPLING_FREQ {
_PIKA_HAL_ADC_SAMPLING_FREQ_UNUSED = 0,
PIKA_HAL_ADC_SAMPLING_FREQ_100 = 100,
PIKA_HAL_ADC_SAMPLING_FREQ_1K = 1000,
PIKA_HAL_ADC_SAMPLING_FREQ_10K = 10000,
PIKA_HAL_ADC_SAMPLING_FREQ_100K = 100000,
PIKA_HAL_ADC_SAMPLING_FREQ_1M = 1000000,
PIKA_HAL_ADC_SAMPLING_FREQ_10M = 10000000,
} PIKA_HAL_ADC_SAMPLING_FREQ;
typedef enum PIKA_HAL_ADC_CONTINUOU_OR_SINGLE {
_PIKA_HAL_ADC_CONTINUOU_OR_SINGLE_UNUSED = 0,
PIKA_HAL_ADC_SINGLE,
PIKA_HAL_ADC_CONTINUOU,
} PIKA_HAL_ADC_CONTINUOU_OR_SINGLE;
typedef pika_float PIKA_HAL_ADC_VREF;
typedef uint32_t PIKA_HAL_ADC_MAX;
typedef struct {
PIKA_HAL_ADC_CHANNEL channel;
PIKA_HAL_ADC_RESOLUTION resolution;
PIKA_HAL_ADC_RESOLUTION sampling_resolution;
PIKA_HAL_ADC_SAMPLING_FREQ sampling_freq;
PIKA_HAL_ADC_CONTINUOU_OR_SINGLE continue_or_single;
PIKA_HAL_ADC_MAX max;
PIKA_HAL_ADC_VREF vref;
} pika_hal_ADC_config;
typedef enum {
_PIKA_HAL_DAC_RESOLUTION_UNUSED = 0,
PIKA_HAL_DAC_RESOLUTION_8 = 8,
PIKA_HAL_DAC_RESOLUTION_10 = 10,
PIKA_HAL_DAC_RESOLUTION_12 = 12,
PIKA_HAL_DAC_RESOLUTION_14 = 14,
PIKA_HAL_DAC_RESOLUTION_16 = 16,
} PIKA_HAL_DAC_RESOLUTION;
typedef struct pika_hal_DAC_config {
PIKA_HAL_DAC_RESOLUTION sampling_resolution;
} pika_hal_DAC_config;
typedef enum {
_PIKA_HAL_DAC_UNUSED = 0,
PIKA_HAL_PWM_CHANNEL_0,
@ -218,7 +288,6 @@ typedef enum {
} PIKA_HAL_PWM_DUTY;
typedef struct {
PIKA_HAL_PWM_CHANNEL channel;
PIKA_HAL_PWM_PERIOD period;
PIKA_HAL_PWM_DUTY duty;
} pika_hal_PWM_config;

View File

@ -7,6 +7,7 @@ pika_hal_table_add(UART)
pika_hal_table_add(IIC)
pika_hal_table_add(SPI)
pika_hal_table_add(ADC)
pika_hal_table_add(DAC)
pika_hal_table_add(PWM)
/* clang-format on */

View File

@ -167,7 +167,8 @@ releases = [
"v1.11.2 95642575a3e17e4c52e28cdbfbef900e02db61e0",
"v1.11.7 b7112610bb29109fd7268bf7162004561d73daa1",
"v1.11.8 58ff9fe16688be2e77ed220604aa8b1271b72d80",
"v2.0.0 e89c585f46ee98811611ea56d5abfc618a41ee3b"
"v2.0.0 e89c585f46ee98811611ea56d5abfc618a41ee3b",
"v2.1.0 852daad3c9a95dbce54dbf1d2cdb5b2321826b4f"
]
[[packages]]