Skip to content

Commit

Permalink
update interrupt to use find_if for cleaner task code
Browse files Browse the repository at this point in the history
  • Loading branch information
finger563 committed Mar 11, 2024
1 parent 811136a commit d04fa57
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 24 deletions.
26 changes: 13 additions & 13 deletions components/interrupt/example/main/interrupt_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
Expand All @@ -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,
},
Expand All @@ -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,
},
Expand All @@ -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,
},
Expand All @@ -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,
});
Expand Down
33 changes: 22 additions & 11 deletions components/interrupt/include/interrupt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,18 +172,24 @@ class Interrupt : public BaseComponent {
}
logger_.info("Received interrupt for GPIO {}", event_data.gpio_num);
std::lock_guard<std::recursive_mutex> 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<uint8_t>(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<uint8_t>(event_data.gpio_num), active};
interrupt->callback(event);
}
// we don't want to stop the task, so return false
return false;
Expand All @@ -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;
Expand Down

0 comments on commit d04fa57

Please sign in to comment.