//definimos el tamaño del arreglo
#define in_x 8
#define out_x 8
#define LED_SecPan 3
byte A_LED_A = 0;
byte A_LED_B = 0;
byte A_LED_C = 0;
byte arr_SecPan[LED_SecPan] = { A_LED_A, A_LED_B, A_LED_C};
//definimos el orden de los LEDs y Sensores
byte arr_In[in_x] = {10,11,12,13,14,15,16,17};
byte arr_Out[out_x] = {9,8,7,6,5,4,3,2};	
bool transicion = false;
bool test = true;
bool game = false;
byte ronda = 2;
byte blinkA = 5;
int time_test = 100;

void setup () { 
	// setup the serial for debugging 
	Serial.begin(9600) ;  
	//definir dentro del array los pines de entrada para los sensores
	for (int i = 0; i < in_x; i++) {	pinMode(arr_In[i], INPUT);}
	//definir dentro del arraylos pines de salida para los Leds
	for (int i = 0; i < out_x; i++) {	pinMode(arr_Out[i], OUTPUT);}
	pinMode(1, INPUT_PULLUP);
}
 
void loop () {
	  int button = digitalRead(1) ; //setup the button's value to be used			
 		Serial.print("Button "); 
		Serial.println(button); 
	  if (test) {	delay(time_test);}
	  
    //presionamos el boton para Iniciar el juego 
		if (button == 0) {	
    //iniciamos la secuencia Random 
    encender_leds_Panel_1(true);
     //inicio(); 
    game = true;
    transicion = false;
    ronda = 2;
    
   	delay(50);
	   } else {
     // si no se ha iniciado el juego, mostramos una animacion en los leds
     
      if (!game) {
      Luces_random();
      }     
     }

	//verificar si existen led encendidos
	bool led_on_x = false;
	for (int i = 0; i < out_x; i++){ 

		if (digitalRead(arr_Out[i])==1) {
			delay(250);
      //si existen leds encendidos, activamos una variable
			led_on_x = true; 

      Serial.print("led_on_x  "); 
      Serial.println(true); 
			} else {
		//Serial.print("led OFF  "); 
		//	Serial.println(arr_Out[i]);
	  }
	}
	//si existen leds encendidos, esperar la respuesta de los sensores para apagar los led
	if (test) {delay(time_test);}
	if (game && led_on_x) { 

		for (int i = 0; i < in_x; i++) {
			
			if (digitalRead(arr_In[i])==0) {
				Serial.print("Sensor Activado "); 
				Serial.println(arr_In[i]); 
				digitalWrite(arr_Out[i], LOW);
				Serial.print("Apagar Pin  "); 
				Serial.println(arr_Out[i]); 
				delay(25);
			} else { 
			//Serial.print("Sensor Apagado "); 
			//	Serial.println(arr_In[i]); 
			}
		}
	  // debug 
	  if (test) {	delay(time_test);}
	}
  //si se completo trayecto de IDA (Blink A)
     
  if (test) {
  
      Serial.print("transicion "); 
			Serial.println(transicion); 
      Serial.print("game "); 
			Serial.println(game);
      Serial.print("led_on_x "); 
			Serial.println(led_on_x);
      Serial.print("ronda "); 
			Serial.println(ronda);
  }
 
  if (game && !led_on_x && ronda >0) {
  
     blink_Camino();
    //si se completo trayecto de Ida (Blink A)
      if (blinkA == 0 && !transicion) {
      Camino_ON();
      blinkA = 2;
      transicion = true;
      ronda--;
      Camino_ON();
      }
     //si se completo trayecto de Regreso (Blink A)
      if (blinkA == 0 && transicion) {
      Camino_ON();
      blinkA = 2;
      transicion = false;
      ronda--;
      Camino_ON();
      }
  }
  
  if (ronda ==0 ) {
    Camino_OFF();
    game = false;

  }
}


//funciones
void encender_leds_Panel_1(bool powerOn)
{
  Leds_OFF();
	//leds aleatorios
	A_LED_A = random(7, 9) ;
	A_LED_B = random(4, 7) ;
	A_LED_C = random(2, 4) ;

	arr_SecPan[0] = A_LED_A;
	arr_SecPan[1] = A_LED_B;
	arr_SecPan[2] = A_LED_C;

// encender LED camino
	for (int i = 0; i < 3; i++) {
		if ( powerOn) {
			digitalWrite(arr_SecPan[i], HIGH);
			Serial.print("Encender led ");
			Serial.println(arr_SecPan[i]);
		}
	}
}
/*
	int randomTime = random(500, 3000) ; 
	Serial.println(randomTime); 
	delay(randomTime) ; 
	*/ 


void Leds_ON()
{
	Serial.println("Leds ON "); 
	for (int i = 0; i < out_x; i++) {
		digitalWrite(arr_Out[i], HIGH);
		delay(5);
	}
	// debug 
	if (test) {	delay(time_test);}
}

void Leds_OFF()
{
	Serial.println("Leds OFF "); 
	for (int i = 0; i < out_x; i++) {
		digitalWrite(arr_Out[i], LOW);
		delay(5);
	}
	// debug 
	if (test) {	delay(time_test);}
}

void Camino_ON()
{
	Serial.println("Camino OK on"); 
	for (int i = 0; i < LED_SecPan; i++) {
		digitalWrite(arr_SecPan[i], HIGH);
		delay(5);
	}
	// debug 
	if (test) {	delay(time_test);}
}
void Camino_OFF()
{
	Serial.println("Camino OK off "); 
	for (int i = 0; i < LED_SecPan; i++) {
		digitalWrite(arr_SecPan[i], LOW);
		delay(5);
	}
	// debug 
	if (test) {	delay(time_test);}
}
void Luces_random()
{
   if (!game) {
    int ledran= random(2, 10);
    digitalWrite(ledran, HIGH);
		delay(20);
    digitalWrite(ledran, LOW);
  }
}
void blink_Camino()
{
  
	if (blinkA > 0) {
    Camino_ON();
	  // debug 
	  if (test) {	delay(time_test);}
	  Camino_OFF();
	  // debug 
	  if (test) {	delay(time_test);}
    blinkA--;
  }
 
}

void inicio()
{
    Leds_ON();
    Leds_OFF(); 
    Camino_ON();
    Camino_OFF();
    Camino_ON();
    Camino_OFF();
    
    //transicion_x--;
}