#include <stdio.h>
#include "pico/stdlib.h"
//#include "pico/cyw43_arch.h"
//#include "button.h"

//Definições relacioadas ao LED
#define Led_Pin 2
uint8_t led_value=0;
#define pino_led 3
#define Led_Pin2 5
#define Led_Pin3 6

//Pino de interrupção
#define button_1 1
#define button_2 4
uint8_t conta_botao = 0, conta_repeticao =0, frequencia=0, reduz_Hz=0, habilita_mudanca=0;


//funções relacionadas ao timer
struct repeating_timer timer;
bool repeating_timer_callback(struct repeating_timer *t);

static void gpio_irq_handler(uint gpio, uint32_t events);

int main()
{
    //stdio_init_all();
    
//Configura o botão 1 de entrada botão utilizado para relizar a contagem dos pulsos
//para ativação da função que faz o led vermelho piscar
    gpio_init(button_1);
    gpio_set_dir(button_1, 0);

//Configura o botão 2 de entrada que altera a frequencia do led vermelho
    gpio_init(button_2);
    gpio_set_dir(button_2, 0);

//Configura o Led vermelho de referência que pisca conforme a frequência
    gpio_init(Led_Pin);
    gpio_set_dir(Led_Pin, 1);

//Configura o Led Azul
//Led azul ativo significa que é possivel alterar a frequencia do led
    gpio_init(Led_Pin2);
    gpio_set_dir(Led_Pin2, 1);
    gpio_put(Led_Pin2,1);
//Configura o Led branco
//Led branco ativo significa que a frequencia é de 1Hz, desativado 10Hz
    gpio_init(Led_Pin3);
    gpio_set_dir(Led_Pin3, 1);
    gpio_put(Led_Pin3,0);

//Configura o Led verde, led que demonstra o funcionamento do botão 1
    gpio_init(pino_led);
    gpio_set_dir(pino_led, 1);

//habilita resistor de pullup na entrado digital 1
    gpio_pull_up(button_1);
//habilita interrupção no pino digital 1
    gpio_set_irq_enabled_with_callback(button_1,GPIO_IRQ_EDGE_FALL,true,&gpio_irq_handler);

//habilita resistor de pullup na entrado digital 4
    gpio_pull_up(button_2);
  //habilita interrupção no pino digital 4 na borda de descida
    gpio_set_irq_enabled(button_2,GPIO_IRQ_EDGE_FALL,true);


    //adiciona uma interrupção que se repete
    add_repeating_timer_ms(100, repeating_timer_callback, NULL, &timer);

    while (true) {

    }
}

bool repeating_timer_callback(struct repeating_timer *t) {
      if(conta_botao>=5){
        habilita_mudanca=1;
        gpio_put(Led_Pin2,0);
      if(frequencia!=1){
        if(conta_repeticao<=99){
          led_value=1-led_value;
          gpio_put(Led_Pin,led_value);
          conta_repeticao++;
    }
     if(conta_repeticao>99){
        conta_botao=0;
        conta_repeticao=0;
        habilita_mudanca=0;
        gpio_put(Led_Pin2,1);
      }
   }
    if(frequencia==1){
        reduz_Hz++;
        if(reduz_Hz==10){
        if(conta_repeticao<=9){
          led_value=1-led_value;
          gpio_put(Led_Pin,led_value);
          conta_repeticao++;
    }
      if(conta_repeticao>9){
        conta_botao=0;
        conta_repeticao=0;
        habilita_mudanca=0;
        gpio_put(Led_Pin2,1);
      }
    reduz_Hz=0;
    }
   }
  }    
    return true;
}

void gpio_irq_handler(uint gpio, uint32_t events){
    if(gpio==button_1){
        conta_botao++;
      if(conta_botao%2==0){
        gpio_put(pino_led,0);
    }
      else if(conta_botao%2!=0){
        gpio_put(pino_led,1);
    }
  }
      if(gpio==button_2){
        if(habilita_mudanca==0 && frequencia!=1){
          frequencia=1;
          //habilita_mudanca=1;
          gpio_put(Led_Pin3,1);
      }
        else if(habilita_mudanca==0 && frequencia==1){
          frequencia=10;
          //habilita_mudanca=1;
           gpio_put(Led_Pin3,0);
      }
  }
}
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT