Added GPIO constants.
Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
parent
e6814df601
commit
3e175303e5
|
@ -1,43 +1,116 @@
|
|||
#include <mruby.h>
|
||||
#include <mruby/data.h>
|
||||
#include <mruby/hash.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Private */
|
||||
#include "gpio.h"
|
||||
|
||||
static void mrb_gpio_free(mrb_state *mrb, void *ptr);
|
||||
|
||||
typedef struct {
|
||||
uint32_t pin;
|
||||
mrbgems_machine_gpio_mode_t mode;
|
||||
bool value;
|
||||
uint32_t pin;
|
||||
machine_gpio_config_t cfg;
|
||||
} mrb_gpio_t;
|
||||
|
||||
static mrb_value mrb_gpio_initialize(mrb_state *mrb, mrb_value self) {
|
||||
mrb_gpio_t *pin = mrb_malloc(mrb, sizeof(mrb_gpio_t));
|
||||
const struct mrb_data_type mrb_gpio_type = {
|
||||
.struct_name = "GPIO",
|
||||
.dfree = mrb_gpio_free,
|
||||
};
|
||||
|
||||
static void mrb_gpio_free(mrb_state *mrb, void *ptr) {
|
||||
mrb_free(mrb, ptr);
|
||||
}
|
||||
|
||||
static mrb_value mrb_gpio_initialize(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value init_cfg = mrb_get_arg1(mrb);
|
||||
mrb_ensure_hash_type(mrb, init_cfg);
|
||||
|
||||
printf("Hash check passed.\n");
|
||||
|
||||
machine_gpio_mode_t init_mode = MACHINE_GPIO_MODE_INPUT;
|
||||
machine_gpio_value_t init_value = MACHINE_GPIO_LOW;
|
||||
machine_gpio_pull_t init_pull = MACHINE_GPIO_PULL_NONE;
|
||||
|
||||
mrb_value pin_num = mrb_hash_get(mrb, init_cfg, mrb_str_new_cstr(mrb, "pin"));
|
||||
mrb_ensure_integer_type(mrb, pin_num);
|
||||
|
||||
printf("Pin: %ld\n", mrb_integer(pin_num));
|
||||
|
||||
/* Optional parameters, use default if not received from hash */
|
||||
mrb_value pin_mode = mrb_hash_get(mrb, init_cfg, mrb_str_new_cstr(mrb, "mode"));
|
||||
if (!mrb_nil_p(pin_mode)) {
|
||||
mrb_ensure_integer_type(mrb, pin_mode);
|
||||
init_mode = mrb_integer(pin_mode);
|
||||
if (init_mode >= MACHINE_GPIO_MODE_END) {
|
||||
mrb_raise(mrb, mrb->object_class, "Invalid GPIO mode");
|
||||
}
|
||||
}
|
||||
|
||||
mrb_value pin_pull = mrb_hash_get(mrb, init_cfg, mrb_str_new_cstr(mrb, "pull"));
|
||||
if (!mrb_nil_p(pin_pull)) {
|
||||
mrb_ensure_integer_type(mrb, pin_pull);
|
||||
init_pull = mrb_integer(pin_pull);
|
||||
if (init_pull >= MACHINE_GPIO_PULL_END) {
|
||||
mrb_raise(mrb, mrb->object_class, "Invalid GPIO pull");
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: Allocate mrb_gpio_t and store configuration */
|
||||
mrb_gpio_t *pin = mrb_malloc(mrb, sizeof(mrb_gpio_t));
|
||||
|
||||
pin->pin = mrb_integer(pin_num);
|
||||
pin->cfg.initial_value = 0;
|
||||
pin->cfg.mode = init_mode;
|
||||
pin->cfg.pull = init_pull;
|
||||
|
||||
/* TODO: Initialize GPIO */
|
||||
mrb_machine_impl_gpio_init(0, MRBGEMS_MACHINE_GPIO_MODE_INPUT);
|
||||
mrb_machine_gpio_impl_config(pin->pin, &pin->cfg);
|
||||
|
||||
DATA_PTR(self) = pin;
|
||||
DATA_TYPE(self) = &mrb_gpio_type;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static mrb_value mrb_gpio_on(mrb_state *mrb, mrb_value self) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
static mrb_value mrb_gpio_off(mrb_state *mrb, mrb_value self) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
void mrb_machine_gpio_gem_init(mrb_state *mrb) {
|
||||
/**
|
||||
* Example:
|
||||
* pin_led = Machine::GPIO.new({pin: 10, mode: Machine::GPIO::OUTPUT_OD})
|
||||
* pin_led = Machine::GPIO.new({pin: 10, mode: Machine::GPIO::OUTPUT_OD, pull: Machine::GPIO::PULLUP })
|
||||
* pin_btn = Machine::GPIO.new({pin: 2}) # Default mode is Machine::GPIO::INPUT
|
||||
* pin_led.on # Set to logical high
|
||||
* pin_led.off # Set to logical low
|
||||
* pin_led.toggle # Toggle.
|
||||
*/
|
||||
|
||||
|
||||
struct RClass *module_machine = mrb_define_module(mrb, "Machine");
|
||||
struct RClass *class_gpio = mrb_define_class_under(mrb, module_machine, "GPIO", mrb->object_class);
|
||||
|
||||
/* Machine::GPIO::OFF / Machine::GPIO::ON */
|
||||
mrb_define_const(mrb, class_gpio, "OFF", mrb_fixnum_value(MACHINE_GPIO_LOW));
|
||||
mrb_define_const(mrb, class_gpio, "ON", mrb_fixnum_value(MACHINE_GPIO_HIGH));
|
||||
|
||||
/* Machine::GPIO::PULL_NONE / Machine::GPIO::PULL_UP / Machine::GPIO::PULL_DOWN */
|
||||
mrb_define_const(mrb, class_gpio, "PULL_NONE", mrb_fixnum_value(MACHINE_GPIO_PULL_NONE));
|
||||
mrb_define_const(mrb, class_gpio, "PULL_UP", mrb_fixnum_value(MACHINE_GPIO_PULL_UP));
|
||||
mrb_define_const(mrb, class_gpio, "PULL_DOWN", mrb_fixnum_value(MACHINE_GPIO_PULL_DOWN));
|
||||
|
||||
/* Machine::GPIO::MODE_INPUT / Machine::GPIO::MODE_OUTPUT_PP / Machine::GPIO::MODE_OUTPUT_OD */
|
||||
mrb_define_const(mrb, class_gpio, "MODE_INPUT", mrb_fixnum_value(MACHINE_GPIO_MODE_INPUT));
|
||||
mrb_define_const(mrb, class_gpio, "MODE_OUTPUT_PP", mrb_fixnum_value(MACHINE_GPIO_MODE_OUTPUT_PUSHPULL));
|
||||
mrb_define_const(mrb, class_gpio, "MODE_OUTPUT_OD", mrb_fixnum_value(MACHINE_GPIO_MODE_OUTPUT_OPENDRAIN));
|
||||
|
||||
mrb_define_method(mrb, class_gpio, "initialize", mrb_gpio_initialize, MRB_ARGS_ARG(1, 0));
|
||||
mrb_define_method(mrb, class_gpio, "on", mrb_gpio_on, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, class_gpio, "off", mrb_gpio_off, MRB_ARGS_NONE());
|
||||
}
|
||||
|
||||
void mrb_machine_gpio_gem_final(mrb_state *mrb) {
|
||||
|
|
|
@ -4,12 +4,32 @@
|
|||
#include <stdint.h>
|
||||
|
||||
typedef enum {
|
||||
MRBGEMS_MACHINE_GPIO_MODE_DISABLED,
|
||||
MRBGEMS_MACHINE_GPIO_MODE_INPUT,
|
||||
MRBGEMS_MACHINE_GPIO_MODE_OUTPUT_PUSHPULL,
|
||||
MRBGEMS_MACHINE_GPIO_MODE_OUTPUT_OPENDRAIN,
|
||||
} mrbgems_machine_gpio_mode_t;
|
||||
MACHINE_GPIO_LOW,
|
||||
MACHINE_GPIO_HIGH,
|
||||
MACHINE_GPIO_END,
|
||||
} machine_gpio_value_t;
|
||||
|
||||
int mrb_machine_impl_gpio_init(uint32_t pin, mrbgems_machine_gpio_mode_t mode);
|
||||
typedef enum {
|
||||
MACHINE_GPIO_MODE_DISABLED,
|
||||
MACHINE_GPIO_MODE_INPUT,
|
||||
MACHINE_GPIO_MODE_OUTPUT_PUSHPULL,
|
||||
MACHINE_GPIO_MODE_OUTPUT_OPENDRAIN,
|
||||
MACHINE_GPIO_MODE_END,
|
||||
} machine_gpio_mode_t;
|
||||
|
||||
typedef enum {
|
||||
MACHINE_GPIO_PULL_NONE,
|
||||
MACHINE_GPIO_PULL_UP,
|
||||
MACHINE_GPIO_PULL_DOWN,
|
||||
MACHINE_GPIO_PULL_END
|
||||
} machine_gpio_pull_t;
|
||||
|
||||
typedef struct {
|
||||
machine_gpio_value_t initial_value;
|
||||
machine_gpio_mode_t mode;
|
||||
machine_gpio_pull_t pull;
|
||||
} machine_gpio_config_t;
|
||||
|
||||
int mrb_machine_gpio_impl_config(uint32_t pin, machine_gpio_config_t *cfg);
|
||||
|
||||
#endif // MRBGEMS_MACHINE_GPIO_GPIO_H
|
||||
|
|
Loading…
Reference in New Issue