#include <stdio.h>
#include "pico/stdlib.h"
#define BUTTON_A_PIN 5
#define BUTTON_B_PIN 6
#define LED_RED_PIN 13
#define DEBOUNCE_TIME_MS 200
#define TIMES_TO_PRESS 5
volatile uint8_t button_count = 0;
volatile bool blinking = false;
volatile uint8_t blink_iterations = 0;
volatile uint8_t max_iterations = 0;
struct repeating_timer blink_timer;
bool blink_led(struct repeating_timer *t)
{
gpio_xor_mask(1u << LED_RED_PIN);
blink_iterations++;
printf("Blinking red led %d times.\n", blink_iterations);
printf("Max iterations: %d\n", max_iterations);
if (blink_iterations >= max_iterations)
{
blink_iterations = 0;
blinking = false;
gpio_put(LED_RED_PIN, 0);
return false;
}
return true;
}
void reset_blinking(uint8_t _max_iterations)
{
max_iterations = _max_iterations;
blinking = false;
blink_iterations = 0;
gpio_put(LED_RED_PIN, 0);
}
void irq_callback(uint gpio, uint32_t events)
{
printf("IRQ callback triggered.\n");
static absolute_time_t last_press_time_b = 0;
static absolute_time_t last_press_time_a = 0;
absolute_time_t current_time = get_absolute_time();
switch (gpio)
{
case BUTTON_A_PIN:
if (!blinking && absolute_time_diff_us(last_press_time_a, current_time) > DEBOUNCE_TIME_MS * 1000)
{
last_press_time_a = current_time;
button_count++;
printf("Button A pressed %d times.\n", button_count);
if (button_count >= TIMES_TO_PRESS)
{
reset_blinking(100);
printf("Blinking red led on 10Hz for 10 secs...\n");
add_repeating_timer_ms(100, blink_led, NULL, &blink_timer);
}
}
break;
case BUTTON_B_PIN:
if (absolute_time_diff_us(last_press_time_b, current_time) > DEBOUNCE_TIME_MS * 1000)
{
printf("Button B pressed.\n");
last_press_time_b = current_time;
reset_blinking(10);
button_count = 0;
cancel_repeating_timer(&blink_timer);
add_repeating_timer_ms(1000, blink_led, NULL, &blink_timer);
}
break;
default:
break;
}
}
void setup_gpios()
{
stdio_init_all();
sleep_ms(1000);
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_up(BUTTON_B_PIN);
gpio_init(LED_RED_PIN);
gpio_set_dir(LED_RED_PIN, GPIO_OUT);
gpio_put(LED_RED_PIN, 0);
gpio_set_irq_enabled_with_callback(BUTTON_A_PIN, GPIO_IRQ_EDGE_RISE, true, irq_callback);
gpio_set_irq_enabled(BUTTON_B_PIN, GPIO_IRQ_EDGE_RISE, true);
}
int main()
{
setup_gpios();
for (;;) {
tight_loop_contents();
}
return 0;
}