/*
 * 
 * NOMBRE: Cordoba Gustavo
 * 
 * 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 ms ---apaga el modulo de efectos
 *  b) 1 Toque corto de botón(menos de 500ms)----habilita efecto A/invierte el sentido
 *  c) 2 Toques cortos de botón (un tiempo inferior a 500ms entre toques)
 * 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 Pulsador            PORTB.0
#define LED_TEST            PORTB.5
//PB0
#define CONFIGURAR_BOTON     pinMode(8, INPUT)
#define BOT_PRESIONADO       digitalRead(8)
//PB5
#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

int efecto = 0; //variable global efecto
void setup() {
  CONFIGURAR_BOTON;
  CONFIGURAR_LED_TEST;
  Serial.begin(9600);
  }

void loop() {
  LedTest();
  SupervisaPulsador();
  Efectos();  
  }

void SupervisaPulsador(void)
  {
    static unsigned long tpo_ant=0;
    static unsigned long btn_accionado=0;
    
  /* 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
   */
    if(!BOT_PRESIONADO)return;
      tpo_ant=millis();
      btn_accionado=millis();
     while(BOT_PRESIONADO)
      {
        Efectos();
      }
      
    if(tpo_ant-btn_accionado < 500)
      efecto=1;//variable global
    if(tpo_ant-btn_accionado >500)
      efecto=0;// variable global
      
      
  }
  
void LedTest(void)
  {
  static bool led_encendido=false;
  static unsigned long millis_ant=0;

  if(led_encendido && millis()-millis_ant > TPO_LED_TEST_ON)
    {
      millis_ant=millis();
      APAGAR_LED_TEST;
      led_encendido=false;
    }
  if (!led_encendido && millis()-millis_ant >= TPO_LED_TEST_OFF) 
    {
     millis_ant=millis();
     ENCENDER_LED_TEST;
     led_encendido=true;
    }
  
  }
void Efectos(void)
  {
    static unsigned long tpo_ant=0;

    if(efecto==1){
     if(millis()-tpo_ant < 200)return;
        tpo_ant=millis();
       PUERTO_LEDS<<=1;
       PUERTO_LEDS=PUERTO_LEDS | 1;
    } 
  
    if(efecto==0){
      if(millis()-tpo_ant < 200)return;
        tpo_ant=millis();
       PUERTO_LEDS>>=1;
       PUERTO_LEDS=PUERTO_LEDS | 0;
      }
  }


  
