/*
Codigo alterado do site: https://www.upesy.com/blogs/tutorials/rotary-encoder-esp32-with-arduino-code#
(Updated at 01/20/2023)

Modificado por: Mario Parente
*/

#include "AiEsp32RotaryEncoder.h"
#define CLK 25
#define DT 26
#define SW 27
#define VCC_PIN -1
#define Passos 4 //Para aceleração de passos (setAcceleration)

AiEsp32RotaryEncoder Encoder = AiEsp32RotaryEncoder(DT, CLK, SW, VCC_PIN, Passos);

void rotary_onButtonClick(){
  static unsigned long lastTimePressed = 0; // Soft debouncing
  if (millis() - lastTimePressed < 500)
  {
    return;
  }
  lastTimePressed = millis();
  Serial.print("botão pressionado ");
  Serial.print(millis());
  Serial.println(" milissegundos após reiniciar");
}

void rotary_loop(){
  //não imprime nada a menos que o valor seja alterado
  if (Encoder.encoderChanged()){
    Serial.print("Valor: ");
    Serial.println(Encoder.readEncoder());
  }
  if (Encoder.isEncoderButtonClicked()){
    rotary_onButtonClick();
  }
}

void IRAM_ATTR readEncoderISR(){
  Encoder.readEncoder_ISR();
}

void setup(){
  Serial.begin(115200);

  //Inicinando o rotary encoder
  Encoder.begin();
  Encoder.setup(readEncoderISR);

  //definir limites e se os valores devem circular ou não

  int ValorMin = 0;    //Valor Minino do encoder
  int ValorMax = 10;   //Valor Maximo do encoder
  bool Circular = true; //true|false  Se o valor vai circular ou para no valor maximo/minino 
                   //(Se ativadovamor Maximo sera o mesmo do minino )
  Encoder.setBoundaries(ValorMin, ValorMax, Circular);

  /*Rotary acceleration introduced 25.2.2021.
  caso o intervalo a selecionar seja grande, por exemplo - selecione um valor entre 0 e 1000 e queremos 785
  sem aceleração você precisa de muito tempo para chegar a esse número
  Usando a aceleração, quanto mais rápido você virar, mais rápido o valor aumentará.
  Para ajuste fino, diminua a velocidade.*/
  
  //rotaryEncoder.disableAcceleration(); //a aceleração agora está habilitada por padrão - desative se não precisar
  Encoder.setAcceleration(250); //ou defina o valor - número maior = mais aceleração; 0 ou 1 significa aceleração desabilitada
}

void loop(){
  //in loop call your custom function which will process rotary encoder values
  rotary_loop();
  delay(50); //or do whatever you need to do...
}