From 403424e4c09eddcacca601c26e7e066e60e9527d Mon Sep 17 00:00:00 2001 From: Henry Bruce Date: Thu, 5 Feb 2015 15:48:42 -0800 Subject: [PATCH] examples/gpio.c: Added command to monitor pin level changes using ISR Signed-off-by: Henry Bruce Signed-off-by: Brendan Le Foll --- examples/gpio.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/examples/gpio.c b/examples/gpio.c index 37a0fa0..b4cab15 100644 --- a/examples/gpio.c +++ b/examples/gpio.c @@ -28,8 +28,14 @@ #include "mraa/gpio.h" +struct gpio_source { + int pin; + mraa_gpio_context context; +}; + char* board_name; + void print_version() { fprintf(stdout, "Version %s on %s\n", mraa_get_version(), board_name); @@ -40,16 +46,14 @@ print_help() { fprintf(stdout, "list List pins\n"); fprintf(stdout, "set pin level Set pin to level (0/1)\n"); fprintf(stdout, "get pin Get pin level\n"); + fprintf(stdout, "monitor pin Monitor pin level changes\n"); fprintf(stdout, "version Get mraa version and board name\n"); } void print_command_error() { fprintf(stdout, "Invalid command, options are:\n"); - fprintf(stdout, "list List pins\n"); - fprintf(stdout, "set pin level Set pin to level (0/1)\n"); - fprintf(stdout, "get pin Get pin level\n"); - fprintf(stdout, "version Get mraa version and board name\n"); + print_help(); } void @@ -63,15 +67,15 @@ list_pins() { for (i = 0; i < pin_count; ++i) { fprintf(stdout, "%02d ", i); if (mraa_pin_mode_test(i, MRAA_PIN_GPIO)) - fprintf(stdout, "GPIO"); + fprintf(stdout, "GPIO "); if (mraa_pin_mode_test(i, MRAA_PIN_I2C)) - fprintf(stdout, "I2C"); + fprintf(stdout, "I2C "); if (mraa_pin_mode_test(i, MRAA_PIN_SPI)) - fprintf(stdout, "SPI"); + fprintf(stdout, "SPI "); if (mraa_pin_mode_test(i, MRAA_PIN_PWM)) - fprintf(stdout, "PWM"); + fprintf(stdout, "PWM "); if (mraa_pin_mode_test(i, MRAA_PIN_UART)) - fprintf(stdout, "UART"); + fprintf(stdout, "UART "); fprintf(stdout, "\n"); } } @@ -98,6 +102,34 @@ gpio_get(int pin, int* level) { return MRAA_ERROR_INVALID_RESOURCE; } + +void gpio_isr_handler(void * args) { + struct gpio_source* gpio_info = (struct gpio_source*)args; + int level = mraa_gpio_read(gpio_info->context); + fprintf(stdout, "Pin %d = %d\n", gpio_info->pin, level); +} + +mraa_result_t +gpio_isr_start(struct gpio_source* gpio_info) { + gpio_info->context = mraa_gpio_init(gpio_info->pin); + if (gpio_info->context != NULL) { + mraa_result_t status = mraa_gpio_dir(gpio_info->context, MRAA_GPIO_IN); + if (status == MRAA_SUCCESS) + status = mraa_gpio_isr(gpio_info->context, MRAA_GPIO_EDGE_BOTH, &gpio_isr_handler, gpio_info); + return status; + } else + return MRAA_ERROR_INVALID_RESOURCE; +} + + +mraa_result_t +gpio_isr_stop(struct gpio_source* gpio_info) { + mraa_gpio_isr_exit(gpio_info->context); + mraa_gpio_close(gpio_info->context); + return MRAA_SUCCESS; +} + + int main(int argc, char **argv) { @@ -134,7 +166,22 @@ main(int argc, char **argv) fprintf(stdout, "Could not initialize gpio %d\n", pin); } else print_command_error(); - } else { + } else if (strcmp(argv[1], "monitor") == 0) { + if (argc == 3) { + int pin = atoi(argv[2]); + struct gpio_source gpio_info; + gpio_info.pin = pin; + if (gpio_isr_start(&gpio_info) == MRAA_SUCCESS) { + fprintf(stdout, "Monitoring level changes to pin %d. Press RETURN to exit.\n", pin); + gpio_isr_handler(&gpio_info); + getchar(); + gpio_isr_stop(&gpio_info); + } + else + fprintf(stdout, "Failed to register ISR for pin %d\n", pin); + } else + print_command_error(); + } else { print_command_error(); } } -- 2.7.4