/*
 * MODDER: @RED9030
*/
/*
 * ESP32 version
 * Ténica de multiplexación con ESP (CHARLIEPLEXING)
*/
/*       A       B      C
 * LED	PIN26	 PIN25  PIN14
 * 1	  LOW	   HIGH	  INPUT
 * 2	  HIGH	 LOW	  INPUT
 * 3	  INPUT  LOW	  HIGH
 * 4	  INPUT  HIGH	  LOW
 * 5	  LOW	   INPUT  HIGH
 * 6	  HIGH	 INPUT  LOW
 * 
 * Pins ESP32 34,35,36,39 no output
*/
/*
 *****************************************************
 *    LIBRERIAS
 *****************************************************
*/


/*
 *****************************************************
 *    VARIABLES
 *****************************************************
*/

const int leds_numbers = 6; //Números de leds a colocar para multiplexar de la ecuacion #leds=#pines(#pines-1).
const int timew = 1000;

// Definimos los pines a utilizar
//ESP32 PINS plexing 12bits resolution
#define PIN_A 26      // Pin A 
#define PIN_B 25      // Pin B
#define PIN_C 14      // Pin C

//ESP8266 PINS plexing 10bits resolution
//#define PIN_A 4     // Pin A D2 
//#define PIN_B 5     // Pin B D1
//#define PIN_C 0     // Pin C D0

/*
 *****************************************************
 *    INICIO
 *****************************************************
*/
void setup() {
}
/*
 *****************************************************
 *    REPETICIÓN
 *****************************************************
*/
void loop() {
    // Bucle para encender los LEDs de menor a mayor
    for(int i=1; i<=leds_numbers; i++)
    {
        encenderLed(i);
        delay(timew);
    }
    
    // Bucle para encender los LEDs de mayor a menor eliminando lo extremos
    for(int i=(leds_numbers-1); i>1; i--)
    {
        encenderLed(i);
        delay(timew);
    }
}

/*
 *****************************************************
 *    FUNCIONES
 *****************************************************
*/

// Función que pondrá en los estados correctos para encender un LED (HIGH, LOW e INPUT)
void ponerEstados(int pinHigh, int pinLow, int pinInput)
{
    pinMode(pinHigh,OUTPUT);
    digitalWrite(pinHigh,HIGH);
    pinMode(pinLow,OUTPUT);
    digitalWrite(pinLow,LOW);
    pinMode(pinInput,INPUT);
}
 
// Esta función se va a encargar de aplicar la lógica dependiendo del LED que queramos encender
void encenderLed(int led_num)
{
    switch(led_num)
    {
        case 1:
            ponerEstados(PIN_B,PIN_A,PIN_C);
            break;
        case 2:
            ponerEstados(PIN_A,PIN_B,PIN_C);
            break;
        case 3:
            ponerEstados(PIN_C,PIN_B,PIN_A);
            break;
        case 4:
            ponerEstados(PIN_B,PIN_C,PIN_A);
            break;
        case 5:
            ponerEstados(PIN_C,PIN_A,PIN_B);
            break;
        case 6:
            ponerEstados(PIN_A,PIN_C,PIN_B);
            break;
    }
    
}