#include <Encoder.h>

#define encoderA 2
#define encoderB 3
#define encoderButton 4

Encoder myEncoder(encoderA, encoderB);

boolean buttonState = false;
boolean lastButtonState = false;
boolean fineAdjustMode = false;

byte encoderPassos = 4;
byte mode = 0;
float modes[] = {0.01, 0.10, 1.00};

float corrente = 0.00, salvo = 0.00;
int value, oldValue;
int contadorCliques = 0;


class Botao {
  private:
    byte pino;
    bool estadoAnterior;
    unsigned long tempoAnterior;

  public:
    Botao(byte pino) {
      this->pino = pino;
      pinMode(pino, INPUT_PULLUP);
      estadoAnterior = false;
      tempoAnterior = 0;
    }

 int press(void (*press)(),void (*longPress)()) {
    bool estadoBotao = !digitalRead(pino);
    unsigned long tempoAtual = millis();

    if (estadoBotao && !estadoAnterior && (tempoAtual - tempoAnterior) > 25) {
      tempoAnterior = tempoAtual;
      //Serial.println("Down");
      //press();
    }
    else if (!estadoBotao && estadoAnterior && (tempoAtual - tempoAnterior) > 25) {
      tempoAnterior = tempoAtual;
      //Serial.println("Up");
      press();
    }
    else if (estadoBotao ) {
      if(tempoAtual - tempoAnterior > 2000){
        tempoAnterior = tempoAtual;
        //Serial.println("5sec");
        longPress();
        return;
      }
    }
    estadoAnterior = estadoBotao;
  }
};

void inc() {
  contadorCliques++;
  // Serial.print("Contagem: ");
  // Serial.println(contadorCliques);
  Serial.println(  modes[contadorCliques] );
}

void dec() {
  contadorCliques--;
  // Serial.print("Contagem: ");
  // Serial.println(contadorCliques);
}

void rst(){
  //contadorCliques = -1;
  // Serial.print("Contagem: 0");
  // Serial.println();
  salvo = corrente;
  Serial.print("salvo ");
  Serial.println(salvo);
}

void setup() {
  Serial.begin(9600);
}

Botao Ok(encoderButton);

void loop() {
  Ok.press(inc, rst);
  if(contadorCliques >= 3) contadorCliques = 0;
  //Serial.println(  modes[contadorCliques] );

  value = myEncoder.read();
  if(oldValue != value){
    oldValue = value;
    corrente = ((value/encoderPassos) * modes[contadorCliques] );
    
    Serial.println(corrente);

    delay(50);
  }

  
  
}