// ------------------ LEDs ------------------
const int led1 = 14;   // par
const int led2 = 25;   // impar
const int led3 = 26;   // par
const int led4 = 27;   // impar

// ------------------ Botones ------------------
const int btnBarrido = 33;
const int btnTodos   = 32;
const int btnKitt    = 13;

// ------------------ Modo ------------------
volatile int modo = 0;
// 0 = apagado
// 1 = barrido
// 2 = alternancia total
// 3 = coche fantastico (pares / impares)

// ------------------ Utilidad ------------------
void apagarLeds() {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
}

// ------------------ Interrupciones ------------------
void IRAM_ATTR isrBarrido() {
  modo = 1;
}

void IRAM_ATTR isrTodos() {
  modo = 2;
}

void IRAM_ATTR isrKitt() {
  modo = 3;
}

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

  pinMode(btnBarrido, INPUT_PULLUP);
  pinMode(btnTodos,   INPUT_PULLUP);
  pinMode(btnKitt,    INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(btnBarrido), isrBarrido, FALLING);
  attachInterrupt(digitalPinToInterrupt(btnTodos),   isrTodos,   FALLING);
  attachInterrupt(digitalPinToInterrupt(btnKitt),    isrKitt,    FALLING);

  apagarLeds();
}

void loop() {

  const int ESPERA = 200; // velocidad visible

  switch (modo) {

    case 0:  // apagado
      apagarLeds();
      delay(50);
      break;

    case 1: { // barrido
      static int paso = 0;

      apagarLeds();
      switch (paso) {
        case 0: digitalWrite(led1, HIGH); break;
        case 1: digitalWrite(led2, HIGH); break;
        case 2: digitalWrite(led3, HIGH); break;
        case 3: digitalWrite(led4, HIGH); break;
        case 4: digitalWrite(led3, HIGH); break;
        case 5: digitalWrite(led2, HIGH); break;
      }

      paso++;
      if (paso > 5) paso = 0;

      delay(ESPERA);
      break;
    }

    case 2: { // alternancia total
      static bool estado = false;

      estado = !estado;

      if (estado) {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
      } else {
        apagarLeds();
      }

      delay(ESPERA);
      break;
    }

    case 3: { // coche fantastico (pares / impares)
      static bool estado = false;

      estado = !estado;

      if (estado) {
        // pares ON
        digitalWrite(led1, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led2, LOW);
        digitalWrite(led4, LOW);
      } else {
        // impares ON
        digitalWrite(led1, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led2, HIGH);
        digitalWrite(led4, HIGH);
      }

      delay(ESPERA);
      break;
    }
  }
}
