diff options
Diffstat (limited to 'buttons.cpp')
-rw-r--r-- | buttons.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/buttons.cpp b/buttons.cpp index 1b92aa6..bc0ba74 100644 --- a/buttons.cpp +++ b/buttons.cpp @@ -10,19 +10,32 @@ extern Api app_api; //const uint BUTTON_PINS[] = {BUTTON_HOME, BUTTON_SELECT, BUTTON_MODE, BUTTON_UP, BUTTON_DOWN}; +// Rising edge and falling edge are "inverted" as every button is set to be pulled up. This means that the falling edge is done when the button is pressed and the rising edge when the button is released. + void gpio_interrupt_cb(uint gpio, uint32_t events) { auto delta_since_press = time_since_button_press(); if (delta_since_press > g_s.button_delay_time) { if (app_api.m_interpret_button_press) { - if (gpio == BUTTON_HOME && (g_s.foreground_app->app_get_attributes().id != 0)) // Home app - app_mgr::app_switch_request(0); - else - app_mgr::app_btnpressed(g_s.foreground_app, gpio, delta_since_press); + switch (events) { + case GPIO_IRQ_EDGE_FALL: + if (gpio == BUTTON_HOME && (g_s.foreground_app->app_get_attributes().id != 0)) // Home app + app_mgr::app_switch_request(0); + else + app_mgr::app_btnpressed(g_s.foreground_app, gpio, delta_since_press); + break; + + case GPIO_IRQ_EDGE_RISE: + if (gpio != BUTTON_HOME) // For simplicity's sake + app_mgr::app_btnreleased(g_s.foreground_app, gpio, delta_since_press); + break; + } + } - app_api.button_last_set(gpio); + if (events == GPIO_IRQ_EDGE_FALL) + app_api.button_last_set(gpio); g_s.button_last_pressed_time = to_ms_since_boot(get_absolute_time()); } } @@ -35,19 +48,19 @@ unsigned long time_since_button_press() { void init_buttons() { gpio_init(BUTTON_HOME); gpio_pull_up(BUTTON_HOME); - gpio_set_irq_enabled_with_callback(BUTTON_HOME, GPIO_IRQ_EDGE_FALL , true, &gpio_interrupt_cb); + gpio_set_irq_enabled_with_callback(BUTTON_HOME, GPIO_IRQ_EDGE_FALL|GPIO_IRQ_EDGE_RISE, true, &gpio_interrupt_cb); gpio_init(BUTTON_SELECT); gpio_pull_up(BUTTON_SELECT); - gpio_set_irq_enabled_with_callback(BUTTON_SELECT, GPIO_IRQ_EDGE_FALL , true, &gpio_interrupt_cb); + gpio_set_irq_enabled_with_callback(BUTTON_SELECT, GPIO_IRQ_EDGE_FALL|GPIO_IRQ_EDGE_RISE, true, &gpio_interrupt_cb); gpio_init(BUTTON_MODE); gpio_pull_up(BUTTON_MODE); - gpio_set_irq_enabled_with_callback(BUTTON_MODE, GPIO_IRQ_EDGE_FALL , true, &gpio_interrupt_cb); + gpio_set_irq_enabled_with_callback(BUTTON_MODE, GPIO_IRQ_EDGE_FALL|GPIO_IRQ_EDGE_RISE, true, &gpio_interrupt_cb); gpio_init(BUTTON_DOWN); gpio_pull_up(BUTTON_DOWN); - gpio_set_irq_enabled_with_callback(BUTTON_DOWN, GPIO_IRQ_EDGE_FALL , true, &gpio_interrupt_cb); + gpio_set_irq_enabled_with_callback(BUTTON_DOWN, GPIO_IRQ_EDGE_FALL|GPIO_IRQ_EDGE_RISE, true, &gpio_interrupt_cb); gpio_init(BUTTON_UP); gpio_pull_up(BUTTON_UP); - gpio_set_irq_enabled_with_callback(BUTTON_UP, GPIO_IRQ_EDGE_FALL , true, &gpio_interrupt_cb); + gpio_set_irq_enabled_with_callback(BUTTON_UP, GPIO_IRQ_EDGE_FALL|GPIO_IRQ_EDGE_RISE, true, &gpio_interrupt_cb); /* For some reason for loop does not work… TODO for (int i=0; i < NUMBER_OF_BUTTONS; i++) { |