/*
 * 
 * NOMBRE: Ezequiel Adonis Gallemi Cruseño
 * 
 * Entrgar con nombre archivo: usr_p1.ino
 * 
 * 24/06/21 - Requerimientos
 * 1) Implementar un LED TEST que tenga un destello de 50ms cada 1000ms (50ms ENCENDIDO / 950ms APAGADO)
 * 2) Implementar un Lector de Pulsador, que permita diferenciar entre
 *  a) Botón presiondo durante más de 500 segundo --> APAGA EL MODULO DE EFECTOS
 *  b) 1 Toque corto de botón                     HABILITA EFECTO A / Invierte el sentido
 *  c) 2 Toques cortos de botón (un tiempo inferior a 500ms entre toques)    HABILITA EFECTO B / Invierte el sentido
 * 3) Módulo de Leds con múltiples efectos
 *  Efecto a: Un punto que se va corriendo
 *  b: Una barra de leds que se va completando
 *  
 *  PORTD --> 8 LEDs
 *  PORTB.0 --> Pulsador
 *  PORTB.5 --> LED_TEST
/ */
#define PUERTO_LEDS             PORTD
#define CONFIGURAR_LEDS         DDRD=0XFF
 
#define CONFIGURAR_BOTON       pinMode(8, INPUT)
#define BOT_PRESIONADO         digitalRead(8)

#define CONFIGURAR_LED_TEST     pinMode(13, OUTPUT)
#define ENCENDER_LED_TEST       digitalWrite(13, HIGH)
#define APAGAR_LED_TEST         digitalWrite(13, LOW)


#define TPO_LED_TEST_ON        50
#define TPO_LED_TEST_OFF       950 

bool encenderEfectoA = 0;

void setup() 
  {
    CONFIGURAR_LEDS;
    PUERTO_LEDS=0;
    CONFIGURAR_BOTON; 
    CONFIGURAR_LED_TEST; 
  }

void loop() {
  LedTest();
  SupervisaPulsador();
  Efectos();  
  }

void SupervisaPulsador(void)
  {
  /* Eventos
   *  Se presionó el botón
   *  Se superaron los 500ms con el botón presionado
   *  Se liberó el botón antes de los 500ms
   *  Se liberó el botón después de los 500ms
   *  Pasaron más de 500ms desde que se liberó el botón
   */
   static bool bot_presionado_ant=0;
   
  if(BOT_PRESIONADO==bot_presionado_ant) return;
  bot_presionado_ant=BOT_PRESIONADO;
  
  if(!BOT_PRESIONADO) return;
    encenderEfectoA = ! encenderEfectoA;
  
  }
  
void LedTest(void)
  {
    const unsigned int t_off = TPO_LED_TEST_OFF , t_on = TPO_LED_TEST_ON;
    static bool estado=0;
    static unsigned long millis_ant=0;  
    static unsigned long tpo_espera = t_off;
  
      
    if(millis() - millis_ant < tpo_espera ) return;

     millis_ant =  millis(); 
     estado = !estado;
    
    if (estado)
    {
      ENCENDER_LED_TEST;
      tpo_espera =t_on;
    }
    else
    {
       APAGAR_LED_TEST;
       tpo_espera = t_off;
    } 
   }

void Efectos(void)
  {
    /*PUERTO_LEDS<<=1;
    PUERTO_LEDS=PUERTO_LEDS | 1; 
    */
    static unsigned long millis_ant=0; 
    
     if(millis() - millis_ant < 250 ) return;
     millis_ant =  millis();

     
    if(encenderEfectoA){
    if(PUERTO_LEDS != 0XFF)
    PUERTO_LEDS<<=1;
    PUERTO_LEDS=PUERTO_LEDS | 1;
    }
    else{
      PUERTO_LEDS>>=1;
    PUERTO_LEDS=PUERTO_LEDS | 0;
    }
    }
