VersionFinal

Dependencies:   mbed tsi_sensor

Revision:
0:9475a54ade9e
diff -r 000000000000 -r 9475a54ade9e main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 16 01:19:26 2019 +0000
@@ -0,0 +1,331 @@
+/*
+                FERNANDEZ-CLERICI
+                  EJER03 - TP01
+
+PTB0 -- Pulsador Verde (CONECTADO A GND)
+PTB1 -- Pulsador Azul  (CONECTADO A GND)
+PTB3 -- Pulsador Rojo  (CONECTADO A GND)
+
+*/
+
+/*Librerias*/
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "DebouncedIn.h"
+
+/* This defines will be replaced by PinNames soon */
+#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
+#define ELEC0 9
+#define ELEC1 10
+#elif defined (TARGET_KL05Z)
+#define ELEC0 9
+#define ELEC1 8
+#else
+#error TARGET NOT DEFINED
+#endif
+
+#define ESTADO_COMENZAR     0
+#define ESTADO_REINICIO     1
+#define ESTADO_MUESTREO     2
+#define ESTADO_JUEGO        3
+#define ESTADO_PERDER       4
+#define ESTADO_GANAR        5
+
+#define NIVELES 25
+
+
+TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+//Definimos que el puerto serie se llama pc
+Serial pc(USBTX, USBRX);
+//Variable donde se guarda lo leido
+char   c = '\0';
+unsigned int semilla = 0;
+//bit usado como flag para procesar datos
+bool newdata = false;   //Se pone en true cuando hay nuevos datos
+//Creamos los tres leds pra usar
+DigitalOut Rojo(LED1);
+DigitalOut Verde(LED2);
+DigitalOut Azul(LED3);
+
+void invierte();
+void simon();
+char Pulsador ();
+void leds(int num); // led(0b000) = apagados,  led(0b100) = rojo, led(0b010) = Verde, led(0b001) = Azul, led(0b111) = Blanco,
+
+char sec[50] = {0};
+char nivelSec = 1;
+char posSec = 0;
+char posJuego = 0;
+int times = 0, espera = 0;;
+bool flagPulsador = 0;
+char pulsador = 0;
+char estado = ESTADO_COMENZAR;
+
+bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1;
+bool st1= 0, st2 = 0, st3 = 0, loop = 1, apagado = 0;
+
+
+DebouncedIn PV(PTB1);
+DebouncedIn PA(PTB0);
+DebouncedIn PR(PTB2);
+Ticker ti;
+
+//Callback cuando se detecta una entrada
+void onCharReceived()
+{
+    //Copiamos lo leido en c
+    c = pc.getc();
+    newdata = true;
+}
+
+int main()
+{
+    ti.attach(&invierte, 0.1);
+
+//Prendemos los LEDS
+    leds(0b111);
+    printf("Toque cualquier pulsador para comenzar: \r\n");
+
+    while(true) {
+        //Cambio el estado de los pulsadores
+        Pulsador();
+        //Ejecuto la funcion principal
+        simon();
+        //Aseguro el reset de la habilitacion del pulsador
+        flagPulsador = 0;
+    }
+}
+void simon()
+{
+    static int i;
+    switch(estado) {
+        case ESTADO_COMENZAR:
+            //Espero que pulsen un pulsador para empezar
+            times = 0;
+            if(pulsador != 0 && flagPulsador == 1) {
+                leds(0b000);
+                printf("Comencemos: \r\n\n");
+                estado = ESTADO_REINICIO;
+                flagPulsador = 0;
+            }
+            break;
+
+        case ESTADO_REINICIO:
+            //Seteo la semilla
+            srand (semilla*4920*1912);
+            //Genero la secuencia
+            for(i = 0; i <= NIVELES ; i ++) {
+                sec[i] = rand() % 3 + 1;
+            }
+            nivelSec = 1;
+            posSec = 0;
+            posJuego = 0;
+            estado = ESTADO_MUESTREO;
+            times = 0;
+            loop = 0;
+            break;
+
+        case ESTADO_MUESTREO:
+            //Muestro la secuencia generada
+            if(loop) {
+                //Cada vez que termino de mostrar un LED
+                if (apagado == 0) {
+                    //Evaluo si mostre la cantidad de LEDs segun el nivel
+                    if(posSec >= nivelSec) {
+                        estado = ESTADO_JUEGO;
+                        printf("\nA jugar Bro :) \r");
+                        printf("\r\n\n");
+                        espera = 0;
+                        break;
+                    }
+                    switch(sec[posSec]) {
+                        case 1:
+                            //Muestro LED rojo
+                            leds(0b100);
+                            if(times > 5) {
+                                times = 0;
+                                printf("ROJO\r\n");
+                                apagado = 1;
+                                posSec++;
+                            }
+                            break;
+                        case 2:
+                            //Muestro LED verde
+                            leds(0b010);
+                            if(times > 5) {
+                                apagado = 1;
+                                times = 0;
+                                printf("VERDE\r\n");
+                                posSec++;
+                            }
+                            break;
+                        case 3:
+                            //Muestro LED azul
+                            leds(0b001);
+                            if(times > 5) {
+                                apagado = 1;
+                                times = 0;
+                                printf("AZUL\r\n");
+                                posSec++;
+                            }
+                            break;
+                    }
+                } else {
+                    //Dejo un espacio apagado entre los colores de las secuencias
+                    leds(0b000);
+                    if (times > 5) {
+                        times = 0;
+                        apagado = 0;
+                    }
+                }
+            } else {
+                //Espero 5 times el ultimo LED encendido y lo apago
+                if (times > 5)
+                    leds(0b000);
+                //Espero 5 times mas para separar el final de muestreo con el inicio del Juego
+                if (times > 10) {
+                    loop = 1;
+                    times = 0;
+                }
+            }
+            break;
+        case ESTADO_JUEGO:
+            //Detecto si el jugador tarda mucho tiempo en apretar un boton
+            if (espera > 50) {
+                printf("Tardaste demaciado tiempo en elegir\r\n");
+                estado = ESTADO_PERDER;
+                break;
+            }
+            //Detecto un cambio en los pulsadores
+            if(flagPulsador) {
+                espera = 0;
+                flagPulsador = 0;
+                times = 0;
+                //Detecto que pulsador precionaron y enciendo el LED
+                switch(pulsador) {
+                    case 1:
+                        printf("ROJO \r\n");
+                        leds(0b100);
+                        break;
+                    case 2:
+                        printf("VERDE \r\n");
+                        leds(0b010);
+                        break;
+                    case 3:
+                        printf("AZUL \r\n");
+                        leds(0b001);
+                        break;
+                }
+                //Comparo si el pulsador apretado es el correcto segun la secuencia
+                if(pulsador == sec[posJuego]) {
+                    posJuego++;
+                    //Si alcancé el nivel en el que estoy paso de nivel
+                    if(posJuego == nivelSec) {
+                        nivelSec++;
+                        printf("\n\t--------------------------------\r");
+                        //Si alcancé el máximo nivel paso al estado GANAR
+                        if (nivelSec == NIVELES + 1) {
+                            estado = ESTADO_GANAR;
+                        } else {
+                            //Si no llegué al máximo nivel paso de nivel
+                            printf("\nPasaste al nivel %d!\r\n\n", nivelSec);
+                            posSec = 0;
+                            posJuego = 0;
+                            estado = ESTADO_MUESTREO;
+                            loop = 0;
+                            times = 0;
+                        }
+                    }
+                } else {
+                    //Si el pulsador no corresponde con la secuencia paso al estado PERDER
+                    estado = ESTADO_PERDER;
+                }
+            }
+            //Espero 5 times el LED encendido
+            if (times > 5) {
+                leds(0b000);
+
+            }
+            break;
+        case ESTADO_PERDER:
+            //Prendo el LED blanco para mostrar que termino el juego y vuelvo al estado COMENZAR
+            printf("\nPerdiste Bro :(\r\n");
+            printf("Apreta cualquier boton para reiniciar!\r\n\n");
+            leds(0b111);
+            estado = ESTADO_COMENZAR;
+            break;
+
+        case ESTADO_GANAR:
+            //Mustro el LED blanco para mostrar que termino el juego y aviso que completo la secuencia
+            printf("\nGANASTE!!! :)\r\n\n");
+            printf("Apreta cualquier boton para reiniciar!\r\n\n");
+            leds(0b111);
+            estado = ESTADO_COMENZAR;
+            break;
+    }
+}
+void leds(int num)
+{
+    //Funcion que codifica el encendido y apagado de los LEDs
+    switch(num) {
+        case 0:
+            Rojo = 1;
+            Verde = 1;
+            Azul = 1;
+            break;
+        case 4:
+            Rojo = 0;
+            Verde = 1;
+            Azul = 1;
+            break;
+        case 2:
+            Rojo = 1;
+            Verde = 0;
+            Azul = 1;
+            break;
+        case 1:
+            Rojo = 1;
+            Verde = 1;
+            Azul = 0;
+            break;
+        case 7:
+            Rojo = 0;
+            Verde = 0;
+            Azul = 0;
+            break;
+    }
+}
+
+char Pulsador()
+{
+    //Funcion que aciva un flag con el cambio del pulsador y guarda el pulsado en una variable
+    pulsador = 0;
+
+    if (PR.rising()) {
+        flagPulsador = 1;
+        pulsador = 1;
+        return 0;
+    }
+    if (PV.rising()) {
+        flagPulsador = 1;
+        pulsador = 2;
+        return 0;
+    }
+    if (PA.rising()) {
+        flagPulsador = 1;
+        pulsador = 3;
+        return 0;
+    }
+
+    pulsador = 0;
+    flagPulsador = 0;
+    return 0;
+}
+
+void invierte()
+{
+    //Funcion que detecta las interrupciones del timer
+    times++;
+    semilla ++;
+    espera++;
+}
\ No newline at end of file