#ifndef _MRBC_GPIO_H #define _MRBC_GPIO_H #include "mrbc_api.h" #include "mrubyc.h" typedef struct GPIO_HANDLE { uint8_t pin_num; } GPIO_HANDLE; static void c_gpio_new(mrb_vm *vm, mrb_value *v, int argc){ v[0] = mrbc_instance_new(vm, v[0].cls, sizeof(GPIO_HANDLE)); GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; if(argc>0){ handle->pin_num = GET_INT_ARG(1); } if(argc>1) mrbcPinMode( handle->pin_num, GET_INT_ARG(2) ); } static void c_gpio_setmode(mrb_vm *vm, mrb_value *v, int argc){ uint8_t pin=0xff; uint8_t mode; if( v[0].tt == MRBC_TT_OBJECT ){ //Instance method mode. GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; if(argc>0){ pin=handle->pin_num; mode=GET_INT_ARG(1); } }else{ // Class method mode. if(argc>1){ pin=GET_INT_ARG(1); mode=GET_INT_ARG(2); } } if(pin!=0xff) mrbcPinMode( pin, mode ); } static void c_gpio_write(mrb_vm *vm, mrb_value *v, int argc){ GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; if(argc>0) mrbcDigitalWrite( handle->pin_num, GET_INT_ARG(1) ); } static void c_gpio_read(mrb_vm *vm, mrb_value *v, int argc){ GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; SET_INT_RETURN( mrbcDigitalRead(handle->pin_num) ); } #if MRBC_USE_FLOAT || MRBC_USE_STRING static void c_gpio_write_at(mrb_vm *vm, mrb_value *v, int argc){ if(argc>1) mrbcDigitalWrite( GET_INT_ARG(1), GET_INT_ARG(2) ); } static void c_gpio_high(mrb_vm *vm, mrb_value *v, int argc){ GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; SET_BOOL_RETURN( mrbcDigitalRead(handle->pin_num) >0 ); } static void c_gpio_low(mrb_vm *vm, mrb_value *v, int argc){ GPIO_HANDLE *handle = (GPIO_HANDLE *)v[0].instance->data; SET_BOOL_RETURN( mrbcDigitalRead(handle->pin_num) ==0 ); } static void c_gpio_read_at(mrb_vm *vm, mrb_value *v, int argc){ if(argc>0) SET_INT_RETURN( mrbcDigitalRead( GET_INT_ARG(1) ) ); } static void c_gpio_high_at(mrb_vm *vm, mrb_value *v, int argc) { if(argc>0) SET_BOOL_RETURN( mrbcDigitalRead( GET_INT_ARG(1) ) >0 ); } static void c_gpio_low_at(mrb_vm *vm, mrb_value *v, int argc) { if(argc>0) SET_BOOL_RETURN( mrbcDigitalRead( GET_INT_ARG(1) ) ==0 ); } #endif void mrbc_init_class_digital(void){ mrb_class *gpio = mrbc_define_class(0, "GPIO", mrbc_class_object); mrbc_define_method(0, gpio, "new", c_gpio_new); mrbc_define_method(0, gpio, "setmode", c_gpio_setmode); mrbc_define_method(0, gpio, "write", c_gpio_write); mrbc_define_method(0, gpio, "read", c_gpio_read); #if MRBC_USE_FLOAT || MRBC_USE_STRING mrbc_define_method(0, gpio, "write_at", c_gpio_write_at); mrbc_define_method(0, gpio, "high?", c_gpio_high); mrbc_define_method(0, gpio, "low?", c_gpio_low); mrbc_define_method(0, gpio, "read_at", c_gpio_read_at); mrbc_define_method(0, gpio, "high_at?", c_gpio_high_at); mrbc_define_method(0, gpio, "low_at?", c_gpio_low_at); #endif mrb_value mrbc_gpio_in=mrbc_integer_value(MRBC_GPIO_IN); mrb_value mrbc_gpio_out=mrbc_integer_value(MRBC_GPIO_OUT); mrb_value mrbc_gpio_in_pu=mrbc_integer_value(MRBC_GPIO_IN_PU); mrb_value mrbc_gpio_in_pd=mrbc_integer_value(MRBC_GPIO_IN_PD); mrb_value mrbc_gpio_out_od=mrbc_integer_value(MRBC_GPIO_OUT_OD); mrbc_set_class_const(gpio, mrbc_str_to_symid("IN"), &mrbc_gpio_in); mrbc_set_class_const(gpio, mrbc_str_to_symid("OUT"), &mrbc_gpio_out); mrbc_set_class_const(gpio, mrbc_str_to_symid("IN_PU"), &mrbc_gpio_in_pu); mrbc_set_class_const(gpio, mrbc_str_to_symid("IN_PD"), &mrbc_gpio_in_pd); mrbc_set_class_const(gpio, mrbc_str_to_symid("OUT_OD"), &mrbc_gpio_out_od); } #endif