/*
 * 
 * NOMBRE:[Ariel Alexis Lorda Barrabasqui]
 * 
 * Entrgar con nombre archivo: usr_p1.ino
 * 
 * 24/06/21 - Requerimientos
* 2) Implementar un Lector de Pulsador, que permita diferenciar entre
 *  a) Botón presiondo durante más de 500ms --> 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) 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 Pulsador PORTB.0  
 
#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 
int estado = 1;
int cont = 0;

void setup() {
  CONFIGURAR_BOTON;
  CONFIGURAR_LED_TEST;
  Serial.begin(9600);
  }

void loop() {
  LedTest();
  SupervisaPulsador();
  Efectos();  
  }

void SupervisaPulsador(void)
  {
  static unsigned long millis_ant_bot=0;
  static unsigned long millis_act_bot=0;
  
  if(!BOT_PRESIONADO) return;     // NO se presionó el botón, vuelve al loop
  millis_ant_bot = millis();      //Se presionó el botón
  
  while(BOT_PRESIONADO){
     LedTest();
     Efectos();   
  }
  millis_act_bot = millis();
  
  if(millis_act_bot - millis_ant_bot > 500){
    estado = 0 ;
    return;
  }
  cont++;
  if(millis_act_bot - millis_ant_bot < 500){
   if(cont == 1){
      estado = 1;
    }else{
      estado = 2;
      cont = 0;
    }
  }
  }
  
void LedTest(void)
  {
  static bool led_encendido=false;
  static unsigned long millis_ant=0;

  if(led_encendido && millis()-millis_ant>=TPO_LED_TEST_ON){
     APAGAR_LED_TEST;
     millis_ant=millis();
     led_encendido= false;
     }
  
  if(!led_encendido && millis()-millis_ant>=TPO_LED_TEST_OFF){
     ENCENDER_LED_TEST;
     millis_ant=millis();
     led_encendido= true;
    }
  }
  

void Efectos(void)
  {
  static unsigned long millis_ant_estado=0;
  
  switch(estado){
    case 0:
      PUERTO_LEDS = 0X00;
      return;
    case 1:
      if(millis()-millis_ant_estado <100)return;
      millis_ant_estado = millis();
      PUERTO_LEDS<<=1;
      PUERTO_LEDS = PUERTO_LEDS | 1;
      return;
    case 2:
      if(millis()-millis_ant_estado <100)return;
      millis_ant_estado = millis();
      PUERTO_LEDS>>=1;
      PUERTO_LEDS=PUERTO_LEDS | 0;
      return;  
  }
  }
