diff --git a/components/interrupt/example/main/interrupt_example.cpp b/components/interrupt/example/main/interrupt_example.cpp index 1024cd30c..e582c0705 100644 --- a/components/interrupt/example/main/interrupt_example.cpp +++ b/components/interrupt/example/main/interrupt_example.cpp @@ -25,18 +25,18 @@ extern "C" void app_main(void) { .interrupts = { { - .gpio_num = GPIO_NUM_12, + .gpio_num = GPIO_NUM_0, .callback = callback, .active_level = espp::Interrupt::ActiveLevel::LOW, .interrupt_type = espp::Interrupt::Type::ANY_EDGE, - .pullup_enabled = false, + .pullup_enabled = true, .pulldown_enabled = false, .enable_pin_glitch_filter = true, }, }, .task_config = { - .name = "Interrupt 12 task", + .name = "Interrupt task", .stack_size_bytes = 6192, .priority = 5, }, @@ -52,18 +52,18 @@ extern "C" void app_main(void) { .interrupts = { { - .gpio_num = GPIO_NUM_12, + .gpio_num = GPIO_NUM_0, .callback = callback, .active_level = espp::Interrupt::ActiveLevel::LOW, .interrupt_type = espp::Interrupt::Type::ANY_EDGE, - .pullup_enabled = false, + .pullup_enabled = true, .pulldown_enabled = false, .enable_pin_glitch_filter = true, }, }, .task_config = { - .name = "Interrupt 12 task", + .name = "Interrupt task", .stack_size_bytes = 6192, .priority = 5, }, @@ -74,11 +74,11 @@ extern "C" void app_main(void) { .interrupts = { { - .gpio_num = GPIO_NUM_0, + .gpio_num = GPIO_NUM_12, .callback = callback, .active_level = espp::Interrupt::ActiveLevel::LOW, .interrupt_type = espp::Interrupt::Type::ANY_EDGE, - .pullup_enabled = false, + .pullup_enabled = true, .pulldown_enabled = false, .enable_pin_glitch_filter = true, }, @@ -98,16 +98,16 @@ extern "C" void app_main(void) { // make a single interrupt for multiple GPIOs // make an interrupt for a single gpio { - // Register for interrupts on a few pins (GPIO_NUM_12, GPIO_NUM_0) + // Register for interrupts on a few pins (GPIO_NUM_0, GPIO_NUM_12) espp::Interrupt interrupt({ .interrupts = { { - .gpio_num = GPIO_NUM_12, + .gpio_num = GPIO_NUM_0, .callback = callback, .active_level = espp::Interrupt::ActiveLevel::LOW, .interrupt_type = espp::Interrupt::Type::ANY_EDGE, - .pullup_enabled = false, + .pullup_enabled = true, .pulldown_enabled = false, .enable_pin_glitch_filter = true, }, @@ -123,11 +123,11 @@ extern "C" void app_main(void) { // use the add_interrupt method to add another interrupt interrupt.add_interrupt({ - .gpio_num = GPIO_NUM_0, + .gpio_num = GPIO_NUM_12, .callback = callback, .active_level = espp::Interrupt::ActiveLevel::LOW, .interrupt_type = espp::Interrupt::Type::ANY_EDGE, - .pullup_enabled = false, + .pullup_enabled = true, .pulldown_enabled = false, .enable_pin_glitch_filter = true, }); diff --git a/components/interrupt/include/interrupt.hpp b/components/interrupt/include/interrupt.hpp index 9c8e158af..7221b5a42 100644 --- a/components/interrupt/include/interrupt.hpp +++ b/components/interrupt/include/interrupt.hpp @@ -172,18 +172,24 @@ class Interrupt : public BaseComponent { } logger_.info("Received interrupt for GPIO {}", event_data.gpio_num); std::lock_guard lock(interrupt_mutex_); - for (const auto &interrupt : interrupts_) { - if (interrupt.gpio_num == event_data.gpio_num) { - if (interrupt.callback) { - logger_.debug("Calling interrupt callback for GPIO {}", event_data.gpio_num); - bool active = is_active_level(event_data.gpio_num, interrupt.active_level); - logger_.debug("GPIO {} is {}", event_data.gpio_num, active ? "active" : "inactive"); - Event event = {static_cast(event_data.gpio_num), active}; - interrupt.callback(event); - } - break; - } + // use std::find_if to find the interrupt with the matching gpio_num + auto predicate = [event_data](const InterruptConfig &interrupt) { + return interrupt.gpio_num == event_data.gpio_num; + }; + auto interrupt = std::find_if(interrupts_.begin(), interrupts_.end(), predicate); + if (interrupt == interrupts_.end()) { + logger_.error("No interrupt found for GPIO {}", event_data.gpio_num); + return false; + } + if (!interrupt->callback) { + logger_.error("No callback registered for GPIO {}", event_data.gpio_num); + return false; } + logger_.debug("Calling interrupt callback for GPIO {}", event_data.gpio_num); + bool active = is_active_level(event_data.gpio_num, interrupt->active_level); + logger_.debug("GPIO {} is {}", event_data.gpio_num, active ? "active" : "inactive"); + Event event = {static_cast(event_data.gpio_num), active}; + interrupt->callback(event); } // we don't want to stop the task, so return false return false; @@ -192,6 +198,11 @@ class Interrupt : public BaseComponent { void configure_interrupt(const InterruptConfig &interrupt) { logger_.info("Configuring interrupt for GPIO {}", interrupt.gpio_num); logger_.debug("Config: {}", interrupt); + if (interrupt.callback == nullptr) { + logger_.error("No callback provided for GPIO {}, not registering interrupt", + interrupt.gpio_num); + return; + } gpio_config_t io_conf; memset(&io_conf, 0, sizeof(io_conf)); io_conf.pin_bit_mask = 1ULL << interrupt.gpio_num;