#include <LiquidCrystal_I2C.h>
#include "SevSeg.h"
// ------ Displays ------ //
SevSeg ss1; // 2 digitos time branco
SevSeg ss2; // 1 digito time branco
SevSeg ss3; // 2 digitos time azul
SevSeg ss4; // 1 digito time azul

// ------ Leds ------ //
// --- Time Branco --- //
#define led_Branco 8
#define led_Azul 9

// ------ Botões ------ //
// --- Time Branco --- //
#define botaoVd_Branco 2
#define botaoVr_Branco 3

// --- Reset --- //
#define botao_Reset 4

// --- Time Azul --- //
#define botaoVd_Azul 6
#define botaoVr_Azul 5

// ------ Encoder ------ //
#define pinoCLK A0 //PINO DIGITAL (CLK)
#define pinoDT A1  //PINO DIGITAL (DT)
#define pinoSW A2 //PINO DIGITAL (SW)


// ------ Váriaveis ------ //

unsigned long tempo = 0;

int ultPosicao;
int leituraCLK;

int pontuacao_Branco = 0;
int set_Branco = 0;

int pontuacao_Azul = 0;
int set_Azul = 0;

int pontuacao_temp;
int set_temp;

bool flag = true;
bool flag2 = true;
bool flag3 = false;
bool area;
bool troca;

bool LbotaoVd_Branco;
bool LbotaoVr_Branco;

bool LbotaoVd_Azul;
bool LbotaoVr_Azul;


LiquidCrystal_I2C lcd(0x27, 16, 2);

void analisar(bool area, bool tiebreak) {
  if (area == false) { // quadra
    if (tiebreak == false) {
      if (pontuacao_Branco >= 25 or pontuacao_Azul >= 25) {
        if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
              if (pontuacao_Branco > pontuacao_Azul) {
                set_Branco++;
                pontuacao_Branco = 0;
                pontuacao_Azul = 0;
              } else {
                set_Azul++;
                pontuacao_Branco = 0;
                pontuacao_Azul = 0;}}}
    } else {
      if ((pontuacao_Branco == 8 or pontuacao_Azul == 8) and flag3 == false){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Troca de lados");
        delay(1000);
              
        pontuacao_temp = pontuacao_Azul;
        pontuacao_Azul = pontuacao_Branco;
        pontuacao_Branco = pontuacao_temp;

        set_temp = set_Azul;
        set_Azul = set_Branco;
        set_Branco = set_temp;

        flag3 = true;} 
        if (pontuacao_Branco >= 5 or pontuacao_Azul >= 25) {
          if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
            if (pontuacao_Branco > pontuacao_Azul) {
              set_Branco++;
              pontuacao_Branco = 0;
              pontuacao_Azul = 0;
            } else {
              set_Azul++;
              pontuacao_Branco = 0;
              pontuacao_Azul = 0;}}}}
  
  } else { // areia
    if(tiebreak == false) {
      if (pontuacao_Branco >= 21 or pontuacao_Azul >= 21) {
        if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
          if (pontuacao_Branco > pontuacao_Azul) {
                set_Branco++;
                pontuacao_Branco = 0;
                pontuacao_Azul = 0;
              } else {
                set_Azul++;
                pontuacao_Branco = 0;
                pontuacao_Azul = 0;}}}
    } else {
      if ((pontuacao_Branco + pontuacao_Azul) != 0 and (pontuacao_Branco + pontuacao_Azul) % 7 == 0 and flag3 == false){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Troca de lados");
        delay(1000);
              
        pontuacao_temp = pontuacao_Azul;
        pontuacao_Azul = pontuacao_Branco;
        pontuacao_Branco = pontuacao_temp;

        set_temp = set_Azul;
        set_Azul = set_Branco;
        set_Branco = set_temp;
        flag3=true;} 

        if (pontuacao_Branco >= 15 or pontuacao_Azul >= 15) {
          if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
            if (pontuacao_Branco > pontuacao_Azul) {
              set_Branco++;
              pontuacao_Branco = 0;
              pontuacao_Azul = 0;
            } else {
              set_Azul++;
              pontuacao_Branco = 0;
              pontuacao_Azul = 0;}}}}
    }
  }


void quadra() {
  troca = false;
  while (digitalRead(botao_Reset) != 0){
    if(millis()-tempo >= 2500) {
      tempo  = millis();
      if(troca == true) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Area selecionada");
        lcd.setCursor(5, 1);
        lcd.print("Quadra");
        troca = false;
      
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Para reiniciar:");
        lcd.setCursor(1, 1);
        lcd.print("Botao cinza");
        troca = true;

      }
    }

    if (digitalRead(botaoVd_Branco) == 0) {
      pontuacao_Branco++;
      delay(250);
    }
    
    if (digitalRead(botaoVr_Branco) == 0) {
      pontuacao_Branco--;
      if (pontuacao_Branco < 0){
        pontuacao_Branco++;
      }
      delay(250);
    }

    if (digitalRead(botaoVd_Azul) == 0) {
      pontuacao_Azul++;
      delay(250);
    }

    if (digitalRead(botaoVr_Azul) == 0) {
      pontuacao_Azul--;
      if (pontuacao_Azul < 0){
        pontuacao_Azul++;
      }
      delay(250);
    }
    
    if (set_Branco == 2 and set_Azul == 2){
      analisar(false, true);
    } else {
      analisar(false, false);
    }
    
    
    atualizar_Displays();
  }
}


void areia() {
  troca = false;
  while (digitalRead(botao_Reset) != 0){
    if(millis()-tempo >= 2500) {
      tempo = millis();
      if(troca == true) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Area selecionada");
        lcd.setCursor(5, 1);
        lcd.print("Areia");
        troca = false;

      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Para reiniciar:");
        lcd.setCursor(1, 1);
        lcd.print("Botao cinza");
        troca = true;

      }
    }

    if (digitalRead(botaoVd_Branco) == 0) {
      pontuacao_Branco++;
      flag3=false;
      delay(250);
    }
    
    if (digitalRead(botaoVr_Branco) == 0) {
      pontuacao_Branco--;
      if (pontuacao_Branco < 0){
        pontuacao_Branco++;
      }
      flag3=false;
      delay(250);
    }

    if (digitalRead(botaoVd_Azul) == 0) {
      pontuacao_Azul++;
      flag3=false;
      delay(250);
    }

    if (digitalRead(botaoVr_Azul) == 0) {
      pontuacao_Azul--;
      if (pontuacao_Azul < 0){
        pontuacao_Azul++;
      }
      flag3=false;
      delay(250);
    }
    
    if (set_Branco == 1 and set_Azul == 1){
      analisar(true, true);
    } else {
      analisar(true, false);
    }
    
    
    atualizar_Displays();
  
  
  
  
  
  
  
  
  }
}

void atualizar_Displays () {
    ss1.setNumber(pontuacao_Branco, 2);
    ss1.refreshDisplay(); 

    ss2.setNumber(set_Branco, 1);
    ss2.refreshDisplay(); 
   
    ss3.setNumber(pontuacao_Azul, 2);
    ss3.refreshDisplay(); 

    ss4.setNumber(set_Azul, 1);
    ss4.refreshDisplay();

}

void initSevSeg() {
 
  // ---------------------- Time Branco ----------------------- //
  byte numDigits = 2;
  byte digitPins[] = {10, 11};
  byte segmentPins[] = {22, 23, 24, 25, 26, 27, 28};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

  ss1.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
           updateWithDelays, leadingZeros, disableDecPoint);
  
  byte numDigits2 = 1;
  byte digitPins2[] = {37};
  byte segmentPins2[] = {30, 31, 32, 33, 34, 35, 36};

  ss2.begin(hardwareConfig, numDigits2, digitPins2, segmentPins2, resistorsOnSegments,
           updateWithDelays, leadingZeros, disableDecPoint);
  // ---------------------------------------------------------- //
  
  // ----------------------- Time Azul ------------------------ //
  byte numDigits3 = 2;
  byte digitPins3[] = {12, 13};
  byte segmentPins3[] = {38, 39, 40, 41, 42, 43, 44};

  ss3.begin(hardwareConfig, numDigits3, digitPins3, segmentPins3, resistorsOnSegments,
           updateWithDelays, leadingZeros, disableDecPoint);
  
  byte numDigits4 = 1;
  byte digitPins4[] = {53};
  byte segmentPins4[] = {46, 47, 48, 49, 50, 51, 52};

  ss4.begin(hardwareConfig, numDigits4, digitPins4, segmentPins4, resistorsOnSegments,
           updateWithDelays, leadingZeros, disableDecPoint);
  // ---------------------------------------------------------- //
}


void setup() {
  lcd.init();
  lcd.init(); //initialize the lcd
  lcd.backlight(); //open the backlight 
  initSevSeg();

  pinMode(botaoVd_Branco, INPUT_PULLUP);
  pinMode(botaoVr_Branco, INPUT_PULLUP);

  pinMode(botao_Reset, INPUT_PULLUP);
  
  pinMode(botaoVd_Azul, INPUT_PULLUP);
  pinMode(botaoVr_Azul, INPUT_PULLUP);

  pinMode (pinoCLK,INPUT);
  pinMode (pinoDT,INPUT);
  pinMode (pinoSW,INPUT_PULLUP);
  ultPosicao = digitalRead(pinoCLK);

}

void loop() {
  pontuacao_Branco = 0;
  pontuacao_Azul = 0;
  set_Branco = 0;
  set_Azul = 0;
  flag3 = false;

  if (flag == true) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Iniciando...");
    delay(1500);
    lcd.clear();
    flag = false;
  }

  if (flag2 == true) {
    lcd.setCursor(0, 0);
    lcd.print("Selecione a area");
    delay(1500);
    lcd.setCursor(1, 1);
    lcd.print(">Quadra  Areia");
    flag2 = false;
    area = false;
  }
  
  //quadra();

  leituraCLK = digitalRead(pinoCLK); //VARIÁVEL RECEBE A LEITURA DO PINO CLK 
  if (leituraCLK != ultPosicao){ //SE VALOR DA VARIÁVEL FOR DIFERENTE DO VALOR DE "ultPosicao", FAZ
    if (digitalRead(pinoDT) != leituraCLK) {
      lcd.setCursor(1, 1);
      lcd.print(" Quadra >Areia");
      area = true; // Areia
    } else {
      lcd.setCursor(1, 1);
      lcd.print(">Quadra  Areia");
      area = false;} // Quadra
  }

  if(digitalRead(pinoSW) == LOW) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Area selecionada");
    delay(1500);
    flag = true;
    flag2 = true;
    if (area == true) {
      lcd.setCursor(5, 1);
      lcd.print("Areia");
      delay(1000);
      lcd.clear();
      areia();

    } else {
      lcd.setCursor(5, 1);
      lcd.print("Quadra");
      delay(1000);
      lcd.clear();
      quadra();
      
    }
  
  }


}
$abcdeabcde151015202530354045505560fghijfghij