/*
 * 
 * NOMBRE: Cristian Valdez Bideplan
 * 
 * Entrgar con nombre archivo: usr_p1.ino (val_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 1 segundo
 *  b) 1 Toque corto de botón
 *  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 PIN_LED_TEST 8
 
#define CONFIGURAR_BOTON  pinMode (9, INPUT)
#define BOT_PRESIONADO    digitalRead(9)
    
#define CONFIGURAR_LED_TEST  pinMode(PIN_LED_TEST, OUTPUT)
#define ENCENDER_LED_TEST    digitalWrite(PIN_LED_TEST, HIGH)
#define APAGAR_LED_TEST      digitalWrite(PIN_LED_TEST, LOW)

#define TPO_LED_TEST_ON   50
#define TPO_LED_TEST_OFF  950

void setup() 
  {
   CONFIGURAR_LED_TEST; 
   CONFIGURAR_BOTON; 
   PUERTO_LEDS=1;
  }

void loop(){
  SupervisaPulsador();
  LedTest();
  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_ant1=0;
    static unsigned long millis_ant=0;
    
    if(BOT_PRESIONADO==bot_presionado_ant1) return;
      bot_presionado_ant1=BOT_PRESIONADO;
  
    if(!BOT_PRESIONADO) return;
      PUERTO_LEDS<<=1;
     
  }
  }
  
void LedTest(void)
  {
     static bool led_encendido=false;
     static unsigned long millis_ant=0;
     static unsigned long tpo_espera_caracter=950;
     
     if(millis()- millis_ant<tpo_espera_caracter) return;
         millis_ant=millis();
         led_encendido=!led_encendido;
         if(led_encendido) ENCENDER_LED_TEST; 
         else APAGAR_LED_TEST;
         tpo_espera_caracter= led_encendido ? TPO_LED_TEST_ON : TPO_LED_TEST_OFF; 
  }

void Efectos(void)
  {
     
  }
