Ejercicio realizado por: HU, Julian y LOPEZ, Gabriel.

Dependencies:   mbed

Revision:
2:2aa02cd60b0b
Parent:
1:06553fdedc7e
diff -r 06553fdedc7e -r 2aa02cd60b0b main.cpp
--- a/main.cpp	Wed Jun 26 16:00:03 2019 +0000
+++ b/main.cpp	Thu Jun 27 21:36:35 2019 +0000
@@ -1,294 +1,314 @@
-//Incluyo las librerias a utilizar.
 #include "mbed.h"
 
-//Se cambia el nombre de "0" y de "1" por NO, SI, ON y OFF para que el progama sea mas facil de leer.
-#define NO  0
-#define SI  1
-#define ON  1
-#define OFF 0
+#define ON  0
+#define OFF 1
 
-//Lo mismo que en el caso anterior, pero con el led.
 #define LED_ON  0
 #define LED_OFF 1
-
-//Lo mismo que en el caso anterior, pero con el pulsador.
-#define PULS_ON  0
-#define PULS_OFF 1
-
-//Se definen las entradas digitales para los tres pulsadores.
-DigitalIn pulsador_1 (PTC12);
-DigitalIn pulsador_2 (PTC13);
-DigitalIn pulsador_3 (PTC16);
-
-//Se definen como salidas digitales los 3 leds para podes jugar.
-DigitalOut ledrojo(LED_RED);
-DigitalOut ledazul(LED_BLUE);
-DigitalOut ledverde(LED_GREEN);
+#define NADA    99
+//------------------------------SALIDA DE LEDS--------------------------------//
+DigitalOut led_r(LED_RED);
+DigitalOut led_a(LED_BLUE);
+DigitalOut led_v(LED_GREEN);
+//---------------------------ENTRADA DE PULSADORES----------------------------//
+DigitalIn boton_0 (PTC12);
+DigitalIn boton_1 (PTC13);
+DigitalIn boton_2 (PTC16);
+//----------------------------MAQUINA PRINCIPAL-------------------------------//
+enum {
+    INICIO,
+    SECUENCIA_LED,
+    MUESTRA_SECUENCIA,
+    DETECCION
+} maq_principal;
+//------------------------MAQUINA DE MUESTRA DE LEDS--------------------------//
+enum {
+    MUESTRA_LED,
+    LED_R_ON,
+    LED_V_ON,
+    LED_A_ON
+} maq_leds;
+//---------------------MAQUINA DE DETTECION DE PULSADORES---------------------//
+enum {
+    DETT_PULS,
+    BOTON_0_ON,
+    BOTON_1_ON,
+    BOTON_2_ON
+} maq_botones;
+//----------------MAQUINA DE DETECCION DE PULSADOR DE INICIO------------------//
+enum {
+    DETT,
+    ESP
+} encendido;
+//-------------------------------FUNCIONES------------------------------------//
+void pulsador_on();
+void muestra_de_leds();
+void deteccion_de_puls();
+//---------------------------FUNCION PARA TIMER-------------------------------//
+void timer();
+Ticker ti;
+int t_juego = 0;
+bool toff = false;
+bool errores = false;
+bool a = false;
 
-//Se definen todos los Tickers.
-Ticker pulsos;
-Ticker aviso;
-Ticker colores;
-Ticker ti;
-Ticker random;
+uint8_t boton = NADA,random;
+uint8_t turno = 0, turno_acciones = 0;
+int t_led = 0, t_espera=0, t_juego = 0;// VARIABLES PARA TEMPORIZADORES
+uint8_t secuencia[24];
 
-//Se definen todos los prototipos de las funciones.
-void pulsador();
-void timer();
-void detector();
-void muestra();
-void mostrar();
-void intermitencia();
-void obtengorandom();
-
-//Se definen todas las variables a utilizar
-uint8_t secuencia[25], turno=0,toff=0;                          //Estas son uint8_t para ocupar menos espacio
-uint8_t juego=OFF,a=0,empieza=NO,ocupado=NO,interaccion=NO;     //Estas son uint8_t para ocupar menos espacio
-uint8_t pulso_1=OFF,pulso_2=OFF,pulso_3=OFF;                    //Estas son uint8_t para ocupar menos espacio
-int tiempo=0, valorrandom;
 
 int main()
 {
-    //Habilito las interrupciones.
     __enable_irq();
-    //Defino la semilla para los numero random.
-    srand(valorrandom);
-    //Llamo a la funcion obtengorandom cada 10ms.
-    random.attach(&obtengorandom,0.01);
-    //Activo las R Pull-UP internas de los 3 pulsadores.
-    pulsador_1.mode(PullUp);
-    pulsador_2.mode(PullUp);
-    pulsador_3.mode(PullUp);
-    //Llamo a la funcion pulsador cada 10ms.
-    pulsos.attach(&pulsador,0.01);
-    //Al empezar el programa, se apagan todos los leds.
-    ledrojo = LED_OFF;
-    ledverde= LED_OFF;
-    ledazul = LED_OFF;
+//-----------------------PULL UP PARA LOS PULSADORES--------------------------//
+    boton_0.mode(PullUp);
+    boton_1.mode(PullUp);
+    boton_2.mode(PullUp);
+//----------------------------------------------------------------------------//
+    encendido = DETT;
+    maq_botones = DETT_PULS;
+    maq_principal = INICIO;
+    maq_leds = MUESTRA_LED;
+    srand(random);
 
-    while (true) {
-        if (juego == OFF) {
-            if (a == 0) {
-                aviso.attach(&intermitencia, 1);
-                printf("--------------------------------------------------------\n"); //Decoracion
-                printf("------------------------ATENCION------------------------\n"); //Decoracion
-                printf("--------------------------------------------------------\n"); //Decoracion
-                printf("        Presione cualquier pulsador para comenzar       \n"); //Decoracion
-                a = 1;
-            }
-            if (pulso_2 == ON || pulso_1 == ON || pulso_3 == ON) {
-                pulso_1 = OFF;
-                pulso_3 = OFF;
-                pulso_2 = OFF;
-                ledrojo = LED_OFF;
-                ledazul = LED_OFF;
-                ledverde = LED_OFF;
-                juego = ON;
-            }
-        }
-        if (turno == 25 && ocupado == NO) {
-            printf("Congratulations, you won the game!");
-            a = 0,turno = 0;
-            juego = OFF,empieza = NO,ocupado = NO;
-            ledrojo = LED_OFF;
-            ledazul = LED_OFF;
-            ledverde= LED_OFF;
-        }
-        if (juego == ON && empieza == SI && ocupado == NO && turno < 25) {
-            secuencia[turno] = rand () % 3;
-            turno++;
-            ocupado = SI;
-            colores.attach(&mostrar,0.1);
-        }
-        if (interaccion == SI) {
-            pulsos.attach(&pulsador,0.01);
-            ti.attach(&timer,0.01);
-            tiempo = 1001;
-            interaccion = NO;
+    ti.attach(&timer,0.01);
+/*
+    EL PROGRAMA EMPIEZA ESPERANDO LA SEÑAL DEL PULSADOR DE INICIO.
+    UNA VEZ PULSADO, EMPIEZA EL JUEGO, ENTRE CADA PULSO HAY 5 SEGUNDOS DE ESPERA
+    SI LLEGA A LOS 5 SEGUNDOS Y NO SE PRESIONO NINGUN BOTON, PIERDES Y EL JUEGO
+    SE REINICIA.
+    LA SECUENCIA SE VA A IR GENERANDO A MEDIDA QUE VA AVANZANDO EL JUEGO.
+*/
+    while(1) {
+        switch (maq_principal) {
+            case INICIO:
+                if (a == false) {
+                    printf("toque el primer boton para comenzar\n");
+                    a = true;
+                }
+                pulsador_on();
+                led_r = LED_ON;
+                led_a = LED_ON;
+                led_v = LED_ON;
+                if (boton == 5) {
+                    boton = NADA;
+                    turno = 0;
+                    maq_principal = SECUENCIA_LED;
+                }
+                break;
+            case SECUENCIA_LED:
+                if (turno == 24) {
+                    maq_principal = INICIO;
+                    printf("you won \n");
+                }
+                if (turno < 24) {
+                    secuencia[turno] = rand () % 3;
+                    t_led = 50;
+                    maq_principal = MUESTRA_SECUENCIA;
+                }
+                break;
+            case MUESTRA_SECUENCIA:
+                muestra_de_leds();
+                if (t_led == 0 && turno_acciones > turno) {
+                    turno_acciones = 0;
+                    t_juego = 500;
+                    maq_principal = DETECCION;
+                }
+                break;
+            case DETECCION:
+                deteccion_de_puls();
+                if (errores == true) {
+                    printf("you lose\n");
+                    maq_principal = INICIO;
+                }
+                if (t_juego == 0) {
+                    printf("se acabo el tiempo\n");
+                    maq_principal = INICIO;
+                }
+                if (turno_acciones > turno) {
+                    turno_acciones = 0;
+                    turno++;
+                    maq_principal = SECUENCIA_LED;
+                }
         }
     }
 }
-void timer()
+
+void pulsador_on()
 {
-    static uint8_t c=0;
-    tiempo--;
-    if(pulso_2 == ON && secuencia[c] == 1) {
-        //printf("correcto\n");
-        pulso_2 = OFF;
-        ledverde = LED_OFF;
-        tiempo = 1001;
-        c++;
-    }
-    if(pulso_1 == ON && secuencia[c] == 0) {
-        //printf("correcto\n");
-        pulso_1 = OFF;
-        ledrojo = LED_OFF;
-        tiempo = 1001;
-        c++;
-    }
-    if(pulso_3 == ON && secuencia[c] == 2) {
-        //printf("correcto\n");
-        pulso_3 = OFF;
-        ledazul = LED_OFF;
-        tiempo = 1001;
-        c++;
+    switch(encendido) {
+        case DETT:
+            if (boton_0 == ON && t_espera == 0) {
+                t_espera = 5;
+                toff = false;
+                encendido = ESP;
+            }
+            break;
+        case ESP:
+            if (t_espera == 0 && toff == false && boton_0 == OFF) {
+                t_espera = 5;
+                toff = true;
+            }
+            if(t_espera == 0 && toff == true) {
+                boton = 5;
+                encendido = DETT;
+            }
+            break;
     }
-    if (c == turno) {
-        printf("--------------------------------------------------------\n");   //Decoracion
-        printf("--------------------Nivel %d superado-------------------\n",c); //Decoracion
-        printf("--------------------------------------------------------\n");   //Decoracion
-
-        ocupado=NO;
-        pulsos.detach();
-        ti.detach();
-        c=0;
-        toff=6;
-    }
-    if (pulso_3 == ON && secuencia[c] != 2 ||
-            pulso_1 == ON && secuencia[c] != 0 ||
-            pulso_2 == ON && secuencia[c] != 1 ||
-            tiempo==0) {
-        printf("--------------------------------------------------------\n");   //Decoracion
-        printf("--------------------------------------------------------\n");   //Decoracion
-        printf("-----------------------YOU LOSE-------------------------\n");   //Decoracion
-        printf("--------------------------------------------------------\n");   //Decoracion
-        printf("--------------------------------------------------------\n");   //Decoracion
-
-        ti.detach();
-        a = 0,turno = 0;
-        juego = OFF,empieza = NO,ocupado = NO;
-        ledrojo = LED_OFF;
-        ledazul = LED_OFF;
-        ledverde= LED_OFF;
-        pulso_1 = OFF;
-        pulso_2 = OFF;
-        pulso_3 = OFF;
+}
+/*
+    SE VAN MOSTRANDO LA SECUENCIA DE LOS LED, SE VA A MOSTRAR POR 1 SEGUNDO Y
+    VA A ESTAR APAGADO POR 0.5 SEGUNDOS, DE ESTA FORMA SE LO PUEDE DIFERENCIAR
+    DE OTRA SECUENCIA CON EL MISMO COLOR.
+*/
+void muestra_de_leds()
+{
+    switch (maq_leds) {
+        case MUESTRA_LED:
+            led_r = LED_OFF;
+            led_a = LED_OFF;
+            led_v = LED_OFF;
+            if (t_led == 0 && turno_acciones <= turno) {
+                if(secuencia[turno_acciones] == 0) {
+                    maq_leds = LED_R_ON;
+                    t_led = 100;
+                }
+                if(secuencia[turno_acciones] == 1) {
+                    maq_leds = LED_V_ON;
+                    t_led = 100;
+                }
+                if(secuencia[turno_acciones] == 2) {
+                    maq_leds = LED_A_ON;
+                    t_led = 100;
+                }
+            }
+            break;
+        case LED_R_ON:
+            led_r = LED_ON;
+            led_a = LED_OFF;
+            led_v = LED_OFF;
+            if (t_led == 0) {
+                turno_acciones++;
+                t_led = 50;
+                maq_leds = MUESTRA_LED;
+            }
+            break;
+        case LED_V_ON:
+            led_r = LED_OFF;
+            led_a = LED_OFF;
+            led_v = LED_ON;
+            if (t_led == 0) {
+                turno_acciones++;
+                t_led = 50;
+                maq_leds = MUESTRA_LED;
+            }
+            break;
+        case LED_A_ON:
+            led_r = LED_OFF;
+            led_a = LED_ON;
+            led_v = LED_OFF;
+            if (t_led == 0) {
+                turno_acciones++;
+                t_led = 50;
+                maq_leds = MUESTRA_LED;
+            }
+            break;
     }
 }
-
-void mostrar()
-{
-    muestra();
-}
-
-void muestra()
+/*
+    LOS BOTONES ESTAN PROGRAMADOS PARA QUE SE ACTIVEN CON FLANCO DESCENDENTE,
+    ENTONCES SI LOS PRESIONAN, PRIMERO VA A CONTAR 50MS DE ANTIREBOTE Y ESPERA
+    A QUE SUELTEN EL BOTON, UNA VEZ SOLTADO EL BOTON, VA A ESPERAR OTROS 50MS 
+    DE ANTIRREBOTE Y ES ESE PUNTO DETECTA EL BOTON.
+*/
+void deteccion_de_puls()
 {
-    static uint8_t i=0,ton=0;
-    uint8_t color;//tf=turno+1;
-    if (ton == 0 && toff == 0) {
-        if (i == turno) {
-            colores.detach();
-            interaccion = SI;
-            i = 99;
-        }
-        color=secuencia[i];
-        if (i == 99)
-            color = 3;
-        switch (color) {
-            case 3:
-                i = 99;
-                break;
-            case 0:
-                ledrojo = LED_ON;
-                ledverde= LED_OFF;
-                ledazul = LED_OFF;
-                ton=11;
-                break;
-
-            case 1:
-                ledrojo = LED_OFF;
-                ledverde= LED_ON;
-                ledazul = LED_OFF;
-                ton=11;
-                break;
-
-            case 2:
-                ledrojo = LED_OFF;
-                ledverde= LED_OFF;
-                ledazul = LED_ON;
-                ton=11;
-                break;
-        }//switch
-        i++;
-        if(i == 100)
-            i = 0;
-    }//if ton/toff=0
-    if (ton > 0) {
-        ton--;
-        toff = 6;
-    }
-    if (ton == 0 && toff > 0) {
-        toff--;
-        ledrojo = LED_OFF;
-        ledverde= LED_OFF;
-        ledazul = LED_OFF;
-    }
-}//final
-void pulsador()
-{
-    detector();
-}
-void detector()
-{
-    static uint8_t verificacion_1=OFF,verificacion_2=OFF,verificacion_3=OFF, antirebote=0;
-    //pulsador 1
-    if (pulsador_1 == PULS_ON && pulso_1 == OFF && verificacion_1 == OFF) {
-        antirebote = 4;
-        verificacion_1 = ON;
-        ledrojo = LED_ON;
-    }
-    //pulsador 2
-    if (pulsador_2 == PULS_ON && pulso_2 == OFF && verificacion_2 == OFF) {
-        antirebote = 4;
-        verificacion_2 = ON;
-        ledverde= LED_ON;
-    }
-    //pulsador 3
-    if (pulsador_3 == PULS_ON && pulso_3 == OFF && verificacion_3 == OFF) {
-        antirebote = 4;
-        verificacion_3 = ON;
-        ledazul = LED_ON;
-    }
-    if (antirebote==0) {
-        if (pulsador_1 == PULS_OFF && verificacion_1 == ON) {
-            verificacion_1 = OFF;
-            pulso_1 = ON;
-            //printf("pulsador 1 on\n");
-        }
-        if (pulsador_2 == PULS_OFF && verificacion_2 == ON) {
-            verificacion_2 = OFF;
-            pulso_2 = ON;
-            //printf("pulsador 2 on\n");
-        }
-        if (pulsador_3 == PULS_OFF && verificacion_3 == ON) {
-            verificacion_3 = OFF;
-            pulso_3 = ON;
-            //printf("pulsador 3 on\n");
-        }
-    }
-    if (antirebote>0)
-        antirebote--;
-}
-
-void intermitencia()
-{
-    if (juego == OFF) {
-        ledrojo = !ledrojo;
-        ledazul = !ledazul;
-        ledverde= !ledverde;
-    }
-    if (juego == ON) {
-        printf("--------------------------------------------------------\n"); //Decoracion
-        printf("-----------------------ATENCION-------------------------\n"); //Decoracion
-        printf("                QUE COMIENCE EL JUEGO                   \n"); //Decoracion
-        empieza = SI;
-        aviso.detach();
-        pulsos.detach();
+    switch(maq_botones) {
+        case DETT_PULS:
+            led_r = LED_OFF;
+            led_a = LED_OFF;
+            led_v = LED_OFF;
+            if (t_juego > 0 && turno_acciones <= turno && errores == false) {
+                if (boton_0 == ON && t_espera == 0) {
+                    t_espera = 5;
+                    toff = false;
+                    led_r = LED_ON;
+                    maq_botones = BOTON_0_ON;
+                }
+                if (boton_1 == ON && t_espera == 0) {
+                    t_espera = 5;
+                    toff = false;
+                    led_v = LED_ON;
+                    maq_botones = BOTON_1_ON;
+                }
+                if (boton_2 == ON && t_espera == 0) {
+                    t_espera = 5;
+                    toff = false;
+                    led_a = LED_ON;
+                    maq_botones = BOTON_2_ON;
+                }
+            }
+            break;
+        case BOTON_0_ON:
+            if (t_espera == 0 && toff == false && boton_0 == OFF) {
+                t_espera = 5;
+                toff = true;
+            }
+            if (t_espera == 0 && toff == true) {
+                boton = 0;
+                if (boton == secuencia[turno_acciones]) {
+                    turno_acciones++;
+                    t_juego = 500;
+                } else {
+                    errores = true;
+                }
+                maq_botones = DETT_PULS;
+                boton = NADA;
+            }
+            break;
+        case BOTON_1_ON:
+            if (t_espera == 0 && toff == false && boton_1 == OFF) {
+                t_espera = 5;
+                toff = true;
+            }
+            if (t_espera == 0 && toff == true) {
+                boton = 1;
+                if (boton == secuencia[turno_acciones]) {
+                    turno_acciones++;
+                    t_juego = 500;
+                } else {
+                    errores = true;
+                }
+                maq_botones = DETT_PULS;
+                boton = NADA;
+            }
+            break;
+        case BOTON_2_ON:
+            if (t_espera == 0 && toff == false && boton_2 == OFF) {
+                t_espera = 5;
+                toff = true;
+            }
+            if (t_espera == 0 && toff == true) {
+                boton = 2;
+                if (boton == secuencia[turno_acciones]) {
+                    turno_acciones++;
+                    t_juego = 500;
+                } else {
+                    errores = true;
+                }
+                maq_botones = DETT_PULS;
+                boton = NADA;
+            }
+            break;
     }
 }
-
-void obtengorandom ()
+void timer ()
 {
-    valorrandom++;
-    srand(valorrandom);
+    if(t_led > 0)
+        t_led--;
+    if(t_espera > 0)
+        t_espera--;
+    if(t_juego > 0)
+        t_juego--;
 }
\ No newline at end of file