#include <WiFi.h>
#include <SevSeg.h>

#define DEBUG      false       // Modo de depuração
#define SSID      "SCOREBOARD" // Nome da rede Wi-Fi
#define PASSWORD  "1234567890" // Senha da rede Wi-Fi
#define NUM_DIGIT 4            // Define o número de digitos
#define DIG_1_PIN 14           // Define o pino seletor do 1° digito
#define DIG_2_PIN 15           // Define o pino seletor do 2° digito
#define DIG_3_PIN 2            // Define o pino seletor do 3° digito
#define DIG_4_PIN 5            // Define o pino seletor do 4° digito
#define SEG_A_PIN 12           // Define o pino do segmento a
#define SEG_B_PIN 4            // Define o pino do segmento b
#define SEG_C_PIN 19           // Define o pino do segmento c
#define SEG_D_PIN 26           // Define o pino do segmento d
#define SEG_E_PIN 27           // Define o pino do segmento e
#define SEG_F_PIN 13           // Define o pino do segmento f
#define SEG_G_PIN 18           // Define o pino do segmento g
#define SEG_P_PIN 25           // Define o pino do segmento dot point
#define DELAY_COUNTER 40       // Define o tempo de incremento do contador (ms)
#define MAX_COUNTER   9999     // Degine o número máximo do score

uint16_t counter = 0;

unsigned long currentTime = 0;
unsigned long previousTime = 0;

SevSeg sevseg;

// Define o número da porta do servidor web para 80
// WiFiServer server(80);

void setup() {
#if DEBUG
  Serial.begin(115200);
#endif

  // Define os pinos do segmentos (1..4)
  uint8_t digitPins[] = {DIG_1_PIN, DIG_2_PIN, DIG_3_PIN, DIG_4_PIN};

  // Define os pinos dos digitos (a..g,dp)
  uint8_t segmentPins[] = {
    SEG_A_PIN, SEG_B_PIN, SEG_C_PIN, SEG_D_PIN, SEG_E_PIN, SEG_F_PIN,
    SEG_G_PIN, SEG_P_PIN
  };

  // 'false' significa que os resistores estão em pinos digitais
  bool resistorsOnSegments = true;

  uint8_t hardwareConfig = COMMON_ANODE; // Define como anodo comum

  // O padrão 'falso' é recomendado
  bool updateWithDelays = true;

  // Use 'true' se quiser manter os zeros à esquerda
  bool leadingZeros = true;

  // Use 'true' se o seu ponto decimal não existir ou não estiver conectado
  // Então, você só precisa especificar 7 segmentPins []
  bool disableDecPoint = false;

  sevseg.begin(hardwareConfig, NUM_DIGIT, digitPins, segmentPins,
               resistorsOnSegments, updateWithDelays, leadingZeros,
               disableDecPoint);

  // Inicializa a rede WiFi no modo de estação
  // WiFi.disconnect();
  // WiFi.mode(WIFI_AP_STA);
  // WiFi.softAP(SSID, PASSWORD);

#if DEBUG
  // Serial.println("\nStarting Wi-Fi " + String(SSID) + "...");

  // Obtendo o endereco IP do servidor
  // IPAddress ip = WiFi.softAPIP();
  // Serial.print("Server IP: ");
  // Serial.println(ip);
#endif

  // Inicia o servidor Web
  // server.begin();

#if DEBUG
  // Serial.println("Server Ok");
#endif
}

void loop() {
  // Atualiza o valor no display
  sevseg.setNumber(counter);
  sevseg.refreshDisplay();

  currentTime = millis();

  // Verifica se ultrapassou 1 segundo
  if (currentTime - previousTime >= DELAY_COUNTER) {
    previousTime = millis();
#if DEBUG
    Serial.print(counter);
    Serial.print(' ');
#endif
    counter++;

    if (counter > MAX_COUNTER) {
      counter = 0;
#if DEBUG
      Serial.println();
#endif
    }
  }
}