//App Bluetooth
#include <DabbleESP32.h>
#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE

//Esp32 - Servo
#include <ESP32Servo.h>
Servo Angulo; // Nomeia o Servo

// Variáveis
char contador;

//Pinos dos Componentes
#define F1 36 // Farol Esquerdo
#define F2 22 // Farol Direito 
#define FR1 3 // Farolete Direito 1
#define FR2 21 // Farolete Direito 2
#define FR3 34 // Farolete Esquerdo 1
#define FR4 35 // Farolete Esquerdo 2
#define L1 32 // Lanterna Esquerda
#define L2 19 // Lanterna Direita
#define LR1 33 // Lanterna Ré Esquerda
#define LR2 18 // Lanterna Ré Direita
#define PA1 39 // Pisca Alerta Frente Esquerda
#define PA2 1 // Pisca Alerta Frente Direita
#define PA3 25 // Pisca Alerta Atrás Esquerda
#define PA4 5 // Pisca Alerta Atrás Direita
#define BZ 23 // Buzina
#define A1A 14 // Ponte H: Motor A - Esquerdo - Vermelho
#define A1B 12 // Ponte H: Motor A - Esquerdo - Preto
#define B1A 4  // Ponte H: Motor B - Direito - Vermelho
#define B1B 2 // Ponte H: Motor B - Direito - Preto

void setup () {
  Serial.begin(115200); // Inicia o Monitor Serial
  Dabble.begin("MEL");


  Angulo.attach(15); // Pino de conexão do servo Motor
  Angulo.write(90); // Posiciona o Servo Motor a noventa graus 

  pinMode (F1,OUTPUT);
  pinMode (F2,OUTPUT);
  pinMode (FR1,OUTPUT);
  pinMode (FR2,OUTPUT);
  pinMode (FR3,OUTPUT);
  pinMode (FR4,OUTPUT);
  pinMode (L1,OUTPUT);
  pinMode (L2,OUTPUT);
  pinMode (LR1,OUTPUT);
  pinMode (LR2,OUTPUT);
  pinMode (PA1,OUTPUT);
  pinMode (PA2,OUTPUT);
  pinMode (PA3,OUTPUT);
  pinMode (PA4,OUTPUT);
  pinMode (BZ,OUTPUT);
  pinMode (A1A,OUTPUT);
  pinMode (A1B,OUTPUT);
  pinMode (B1A,OUTPUT);
  pinMode (B1B,OUTPUT);
}

void loop () {
  Dabble.processInput(); // Limpa os dados recebidos do Celular
  Serial.print("KeyPressed: ");

  if (GamePad.isUpPressed()) // Carro avança
  {
    Serial.print("Up");
    digitalWrite(F1, 1);
    digitalWrite(F2, 1);
    digitalWrite(L1, 1);
    digitalWrite(L2, 1);
    digitalWrite(A1A, 1);
    digitalWrite(A1B, 0);
    digitalWrite(B1A, 1);
    digitalWrite(B1A, 0);
  }

  if (GamePad.isDownPressed()) // Carro recua
  {
    Serial.print("Down");
    digitalWrite(F1, 1);
    digitalWrite(F2, 1);
    digitalWrite(L1, 1);
    digitalWrite(L2, 1);
    digitalWrite(LR1, 1);
    digitalWrite(LR2, 1);
    digitalWrite(A1A, 0);
    digitalWrite(A1B, 1);
    digitalWrite(B1A, 0);
    digitalWrite(B1A, 1);
  }

  if (GamePad.isLeftPressed()) // Liga Farolete
  {
    digitalWrite(FR1, 1);
    digitalWrite(FR2, 1);
    digitalWrite(FR3, 1);
    digitalWrite(FR4, 1);
    Serial.print("Left");
  }

  if (GamePad.isRightPressed()) // Liga Pisca Alerta
  {
    for(contador=0;contador<6;contador++){
      digitalWrite(PA1, 1);
      digitalWrite(PA2, 1);
      digitalWrite(PA3, 1);
      digitalWrite(PA4, 1);
      delay(300);
      digitalWrite(PA1, 0);
      digitalWrite(PA2, 0);
      digitalWrite(PA3, 0);
      digitalWrite(PA4, 0);
      delay(300);
    }
    Serial.print("Right");
  }

  if (GamePad.isSquarePressed()) // Vira para Esquerda
  {
    Angulo.write(135);
    digitalWrite(PA1, 1);
    digitalWrite(PA3, 1);
    Serial.print("Square");
  }

  if (GamePad.isCirclePressed()) // Vira para Direita
  {
    Angulo.write(45);
    digitalWrite(PA2, 1);
    digitalWrite(PA4, 1);
    Serial.print("Circle");
  }

  if (GamePad.isCrossPressed()) // Alarme 
  {
    digitalWrite(BZ, 1); 
    for(contador=0;contador<6;contador++){
      digitalWrite(PA1, 1);
      digitalWrite(PA2, 1);
      digitalWrite(PA3, 1);
      digitalWrite(PA4, 1);
      delay(300);
      digitalWrite(PA1, 0);
      digitalWrite(PA2, 0);
      digitalWrite(PA3, 0);
      digitalWrite(PA4, 0);
      delay(300);
    }
    Serial.print("Cross");
  }

  if (GamePad.isTrianglePressed()) // Endireita o eixo
  {
    Angulo.write(90);
    Serial.print("Triangle");
  }

  if (GamePad.isStartPressed()) // Contingência
  {
    Angulo.write(90);
    digitalWrite(A1A, 0);
    digitalWrite(A1B, 0);
    digitalWrite(B1A, 0);
    digitalWrite(B1A, 0);
    digitalWrite(F1, 1);
    digitalWrite(F2, 1);
    digitalWrite(FR1, 1);
    digitalWrite(FR2, 1);
    digitalWrite(FR3, 1);
    digitalWrite(FR4, 1);
    digitalWrite(L1, 1);
    digitalWrite(L2, 1);
    digitalWrite(LR1, 1);
    digitalWrite(LR2, 1);
    digitalWrite(PA1, 1);
    digitalWrite(PA2, 1);
    digitalWrite(PA3, 1);
    digitalWrite(PA4, 1);
    Serial.print("Start");
  }

  if (GamePad.isSelectPressed())
  {
    Angulo.write(90);
    digitalWrite(A1A, 0);
    digitalWrite(A1B, 0);
    digitalWrite(B1A, 0);
    digitalWrite(B1A, 0);
    digitalWrite(F1, 0);
    digitalWrite(F2, 0);
    digitalWrite(L1, 0);
    digitalWrite(L2, 0);
    digitalWrite(FR1, 0);
    digitalWrite(FR2, 0);
    digitalWrite(FR3, 0);
    digitalWrite(FR4, 0);
    digitalWrite(LR1, 0);
    digitalWrite(LR2, 0);
    digitalWrite(PA1, 0);
    digitalWrite(PA2, 0);
    digitalWrite(PA3, 0);
    digitalWrite(PA4, 0);
    Serial.print("Select");
  }
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
bz1:1
bz1:2
servo1:GND
servo1:V+
servo1:PWM
led15:A
led15:C
led16:A
led16:C
led17:A
led17:C
led18:A
led18:C