// Pines del driver L293D
// Se definen los pines del driver L293D que controlan los motores DC, 
// en el shield que usamos están conectados por defecto a los pines 5, 6, 7, 9, 10 y 11. 
const int ENA  = 11; // velocidad del motor izquierdo.
const int AIN1 = 10; // dirección del motor izquierdo.
const int AIN2 = 9; // dirección del motor izquierdo.
const int ENB  = 5; // velocidad del motor derecho.
const int BIN1 = 7; // dirección del motor derecho.
const int BIN2 = 6; // dirección del motor derecho.

// Pines LEDs ojos

const int OJO_D = 12; // LED ojo derecho.
const int OJO_I = 13; // LED ojo izquierdo.

// Se crea una variable booleana estado_ojos, para guardar si los ojos están encendidos o apagados, 
// permitiendo alternar su estado.

bool estado_ojos = false;

void setup() {
  // Inicialización de pines de los motores DC
  pinMode(ENA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(ENB, OUTPUT);

  // Inicialización de pines de los ojos
  pinMode(OJO_D, OUTPUT);
  pinMode(OJO_I, OUTPUT);

  digitalWrite(OJO_D, LOW);
  digitalWrite(OJO_I, LOW);

  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    char comando = Serial.read();
    Serial.println(comando);

    switch (comando) {
      case 'A':  // Avanzar
        adelante();
        break;
      case 'R':  // Retroceder
        atras();
        break;
      case 'I':  // Girar a la izquierda
        izquierda();
        break;
      case 'D':  // Girar a la derecha
        derecha();
        break;
      case 'T':  // Detenerse
        detener();
        break;
      case 'O':  // Encender/apagar ojos
        cambiarEstadoOjos();
        break;
      default:
        break;
    }
  }
}

/********** MOVIMIENTOS DE LAS RUEDAS **********/

void adelante() {
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, LOW);
  digitalWrite(BIN2, HIGH);
  analogWrite(ENA, 150);  // Velocidad
  analogWrite(ENB, 150);  // Velocidad
}

void atras() {
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, HIGH);
  digitalWrite(BIN1, HIGH);
  digitalWrite(BIN2, LOW);
  analogWrite(ENA, 150);  // Velocidad
  analogWrite(ENB, 150);  // Velocidad
}

void izquierda() {
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, HIGH);
  digitalWrite(BIN1, LOW);
  digitalWrite(BIN2, HIGH);
  analogWrite(ENA, 100);  // Velocidad
  analogWrite(ENB, 100);  // Velocidad
}

void derecha() {
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, HIGH);
  digitalWrite(BIN2, LOW);
  analogWrite(ENA, 100);  // Velocidad
  analogWrite(ENB, 100);  // Velocidad
}

void detener() {
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, LOW);
  digitalWrite(BIN2, LOW);
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
}

/********** ENCENDER/APAGAR OJOS **********/

void cambiarEstadoOjos() {
  estado_ojos = !estado_ojos;
  digitalWrite(OJO_D, estado_ojos ? HIGH : LOW);
  digitalWrite(OJO_I, estado_ojos ? HIGH : LOW);
}
// alterna los pines 12 y 13 entre HIGH y LOW para encender o apagar los LEDs de los ojos.