diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index ba3ebfe..202b165 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -37,6 +37,7 @@ typedef struct { mraa_result_t (*gpio_init_post) (mraa_gpio_context dev); mraa_result_t (*gpio_close_pre) (mraa_gpio_context dev); + mraa_result_t (*gpio_close_replace) (mraa_gpio_context dev); mraa_result_t (*gpio_mode_replace) (mraa_gpio_context dev, mraa_gpio_mode_t mode); mraa_result_t (*gpio_mode_pre) (mraa_gpio_context dev, mraa_gpio_mode_t mode); diff --git a/src/firmata/firmata_mraa.c b/src/firmata/firmata_mraa.c index 8c1b911..80f2494 100644 --- a/src/firmata/firmata_mraa.c +++ b/src/firmata/firmata_mraa.c @@ -414,6 +414,13 @@ mraa_firmata_gpio_dir_replace(mraa_gpio_context dev, mraa_gpio_dir_t dir) return MRAA_SUCCESS; } +static mraa_result_t +mraa_firmata_gpio_close_replace(mraa_gpio_context dev) +{ + free(dev); + return MRAA_SUCCESS; +} + static mraa_pwm_context mraa_firmata_pwm_init_internal_replace(void* func_table, int pin) { @@ -575,6 +582,7 @@ mraa_firmata_plat_init(const char* uart_dev) b->adv_func->gpio_dir_replace = &mraa_firmata_gpio_dir_replace; b->adv_func->gpio_read_replace = &mraa_firmata_gpio_read_replace; b->adv_func->gpio_write_replace = &mraa_firmata_gpio_write_replace; + b->adv_func->gpio_close_replace = &mraa_firmata_gpio_close_replace; b->adv_func->aio_init_internal_replace = &mraa_firmata_aio_init_internal_replace; b->adv_func->aio_read_replace = &mraa_firmata_aio_read; diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index 163cf79..b944ac6 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -705,6 +705,11 @@ mraa_gpio_close(mraa_gpio_context dev) { mraa_result_t result = MRAA_SUCCESS; + if (IS_FUNC_DEFINED(dev, gpio_close_replace)) { + return dev->advance_func->gpio_close_replace(dev); + } + + if (IS_FUNC_DEFINED(dev, gpio_close_pre)) { result = dev->advance_func->gpio_close_pre(dev); }