EJERCICIO SIMON: Axel Oropeza Matias Rodriguez

Dependencies:   mbed tsi_sensor

Revision:
1:f6ea213ed382
Parent:
0:fd466ee999a6
Child:
2:90667b428ce6
diff -r fd466ee999a6 -r f6ea213ed382 main.cpp
--- a/main.cpp	Wed May 22 23:04:17 2019 +0000
+++ b/main.cpp	Wed May 22 23:40:43 2019 +0000
@@ -18,16 +18,19 @@
 numeros enteros con la funcion "enum{}"
 */
 
+//Maquina "MAQ_SECUENCIA()"
 enum {ESPERO_USUARIO,
       MUESTRO_SECUENCIA,
       COMPARO_SECUENCIA
      };
 
+//Maquina "MAQ_MUESTREO()"
 enum {ESPERO_HAB,
       MUESTRO,
       APAGO
      };
 
+//Maquina "MAQ_COMPARO()"
 enum {ESPERAR_HAB,
       ESPERAR_USUARIO,
       COMPARO
@@ -46,13 +49,9 @@
 void MAQ_lecturaTSI();
 
 void LEER_TSI();    //Prototipo funcion de lectura del TSI
-
-void LED_1SEG();
-
+void LED_1SEG();    //Prototipo funcion para prender y apagar led cada 1 segundo
 
-void pulsacion_TSI();
-
-
+void pulsacion_TSI();   //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg
 
 void genero_secuencia(); // Funcion que utilizo para generar la secuencia aleatoria.
 
@@ -72,43 +71,43 @@
 int fin_comparo = 0;
 
 //Variables que acumulan datos
-
 int color[25]; //Esta variable contendrá toda la secuencia aleatoria de 24 valores (no voy a usar el valor 0).
-int nivel = 0;
-int tiempo_muestreo = 0;
-int color_teclado = NADA;
-int ingreso = NADA;
+int nivel = 0;  //Esta variable me indica el nivel actual
+int tiempo_muestreo = 0;    // Variable para contar el 1 segundo para el encendido y apagado de leds
+int var_pulsacion = 25;     // Variable para contar los 2.5mseg de la funcion pulsacion_TSI()
 
-int var_pulsacion = 25;
+int color_teclado = NADA;   // Variable que contiene el valor del TSI en todo momento
+int ingreso = NADA;         // Variable que contiene el color presionado en el TSI, que se lee y luego es borrado
 
-Ticker lectura;
-Ticker temporizador;
-
-Ticker pulsacion;
+Ticker lectura; // Ticker lectura del TSI
+Ticker temporizador;    // Ticker para contar 1 segundo en los leds
+Ticker pulsacion;   // Ticker para usar la funcion pulsacion_TSI()
 
 // DEFINO SALIDAS
-
 DigitalOut ledrojo(LED_RED);
 DigitalOut ledverde(LED_GREEN);
 DigitalOut ledazul(LED_BLUE);
-AnalogIn noise(PTB0);
+
+AnalogIn noise(PTB0);   // Entrada que usaré para generar la secuencia aleatoria con el ruido que me genere
 
 
 int main(void)
 {
 
+// Uno las funciones con el ticker correspondiente
     lectura.attach(LEER_TSI,0.1);
     pulsacion.attach(pulsacion_TSI,0.001);
-
     temporizador.attach(LED_1SEG,0.01);
 
-
+// Apago los leds al iniciar
     ledrojo = 1;
     ledverde= 1;
     ledazul = 1;
 
     while (true) {
 
+// Constantemente uso las maquinas de estados
+
         MAQ_lecturaTSI();
 
         MAQ_SECUENCIA();
@@ -123,7 +122,9 @@
 void LEER_TSI()
 {
     float auxiliar = 0;
-    auxiliar = tsi.readPercentage();
+    auxiliar = tsi.readPercentage();    //Guardo de manera auxiliar el valor entre 0 y 1 del TSI
+
+// Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1)
 
     if(auxiliar == 0) {
         color_teclado = NADA;
@@ -151,11 +152,14 @@
 
 void MAQ_lecturaTSI()
 {
-    if(var_pulsacion < 1) {
-        var_pulsacion = 25;
+    if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms:
+        var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo
         switch(estado_maq_tsi) {
             case NADA:
-                ingreso = NADA;
+                ingreso = NADA; // La variable ingreso, salvo en los casos especificos, siempre se encontrará en NADA
+
+                // En vez de usar cadenas de if en las transiciones, utilizo un switch
+
                 switch(color_teclado) {
                     case ROJO:
                         estado_maq_tsi = ROJO;
@@ -171,6 +175,7 @@
                         break;
                 }
                 break;
+
             case ROJO:
                 switch(color_teclado) {
                     case NADA:
@@ -186,6 +191,7 @@
                         break;
                 }
                 break;
+
             case VERDE:
                 switch(color_teclado) {
                     case NADA:
@@ -201,6 +207,7 @@
                         break;
                 }
                 break;
+
             case AZUL:
                 switch(color_teclado) {
                     case NADA:
@@ -234,33 +241,51 @@
     switch(estado_maq_sec) {    //El switch variará entre los distintos estados de mi maquina (los numeros correspondientes se encuentran en el "enum{}" al inicio del codigo)
 
         case ESPERO_USUARIO:
-            if(ingreso != NADA) {
-                genero_secuencia();
-                nivel++;
-                hab_mostrar = 1;
-                estado_maq_sec = MUESTRO_SECUENCIA;
-                ingreso = NADA;
+            if(ingreso != NADA) {   // Si se presiona algo:
+                genero_secuencia(); // Genero la secuencia
+                nivel++;    // Sumo 1 a "nivel" asi comienzo por el nivel 1
+                hab_mostrar = 1;    // Habilito la maquina de estados que muestra los colores
+                estado_maq_sec = MUESTRO_SECUENCIA; // Cambio de estado
+                ingreso = NADA; // Reseteo la variable que contenia el color presionado
+                ledrojo=1;
+                ledazul=1;
+                ledverde=1;
             }
             break;
 
         case MUESTRO_SECUENCIA:
 
-            if(fin_mostrar == 1) {
-                fin_mostrar = 0;
-                estado_maq_sec = COMPARO_SECUENCIA;
-                hab_comparo = 1;
+            if(fin_mostrar == 1) {  // Si se terminó la maquina de estados que muestra:
+                fin_mostrar = 0;    // Vacio la variable que me lo indicó,
+                estado_maq_sec = COMPARO_SECUENCIA; // cambio de estado y
+                hab_comparo = 1;    // habilito la maquina que compara
             }
 
             break;
 
         case COMPARO_SECUENCIA:
 
-            if(fin_comparo == 1) {
+            if(fin_comparo == CORRECTO) {   // Si el usuario no se equivocó:
+                if(nivel == 25) {   // y se llego al maximo de niveles:
+                    fin_comparo = 0;    // Vacio la variable
+                    estado_maq_sec = ESPERO_USUARIO;    // Cambio al estado de inicio
+                    nivel = 0;  // y reseteo todos los niveles
+                    ledverde=0; //Prendo leds para indicar que gané
+                    ledazul=0;
+                }
+                if(nivel < 25) {    // Si en cambio faltan niveles:
+                    fin_comparo = 0;    // Vacio la variable
+                    estado_maq_sec = MUESTRO_SECUENCIA; // Vuelvo al estado de mostrar
+                    hab_mostrar = 1;    // Habilito esa maquina
+                    nivel++;    // Y subo 1 nivel
+                }
+            }
+            if(fin_comparo == ERROR) {
                 fin_comparo = 0;
-                estado_maq_sec = MUESTRO_SECUENCIA;
-                hab_mostrar = 1;
-                nivel++;
-
+                estado_maq_sec = ESPERO_USUARIO;
+                nivel = 0;
+                ledrojo=0;  // Prendo el leds para indicar que se perdió
+                ledazul = 0;
             }
             break;
     }
@@ -321,23 +346,19 @@
                     ledazul = 1;
                     break;
             }
-            if(tiempo_muestreo == 0) {
-                if(nivel_mostrado == nivel) {
-                    nivel_mostrado = 1;
-                    estado_maq_mues = ESPERO_HAB;
-                    fin_mostrar = 1;
+            if(tiempo_muestreo == 0) {  // Si paso el tiempo
+                if(nivel_mostrado == nivel) {   // Y no faltan niveles
+                    nivel_mostrado = 1; // Reseteo el nivel a mostrar
+                    estado_maq_mues = ESPERO_HAB;   // Vuelvo a esperar la habilitacion
+                    fin_mostrar = 1; // Y marco que termino la maquina de estados
                 } else {
-                    estado_maq_mues = MUESTRO;
-                    nivel_mostrado++;
-                    tiempo_muestreo = 100;
+                    estado_maq_mues = MUESTRO;  // Si en cambio faltan niveles, vuelvo a mostrar
+                    nivel_mostrado++;   // Y muestro el siguiente
+                    tiempo_muestreo = 100;  // Reseteo el tiempo (1 segundo)
                 }
             }
             break;
-
-
     }
-
-
 }
 
 void MAQ_COMPARO()
@@ -345,7 +366,7 @@
 
 
     static int nivel_comparado; // Variable que voy a usar para comparar todos los niveles sucesivamente, con lo que se vaya ingresando en el TSI
-    static int obtenido = NADA;
+    static int obtenido = NADA; // En esta variable voy a guardar lo que se ingrese para poder resetear la variable que me lo indica y no perder la informacion
 
     switch(estado_maq_comp) {
         case ESPERAR_HAB:
@@ -361,9 +382,9 @@
 
         case ESPERAR_USUARIO:
 
-            if(ingreso != NADA) { // Si se ingresa algo en el TSI, lo guardo en la variable "teclado"
+            if(ingreso != NADA) { // Si se ingresa algo en el TSI, lo guardo en la variable "obtenido"
                 obtenido = ingreso;
-                ingreso = NADA;
+                ingreso = NADA; // Reseteo la variable que guarda el valor del TSI
                 estado_maq_comp = COMPARO;
             }
 
@@ -371,36 +392,36 @@
 
         case COMPARO:   //Estado donde comparo el valor que se ingresó con el valor que corresponde
 
-            if(obtenido == color[nivel_comparado]) {
+            if(obtenido == color[nivel_comparado]) {    // Si el resultado es igual a lo que deberia:
+
+                // Imprimo en pantalla el valor que se ingresó para comprobar
                 switch(color[nivel_comparado]) {
                     case ROJO:
-                        printf("rojo\n");
+                        printf("Rojo\n");
                         break;
                     case VERDE:
 
-                        printf("verde\n");
+                        printf("Verde\n");
                         break;
                     case AZUL:
-                        printf("azul\n");
+                        printf("Azul\n");
                         break;
 
 
                 }
-
-
-                obtenido = NADA;
-                if(nivel_comparado <= nivel) {
+                obtenido = NADA;    // Reseteo la variable
+                if(nivel_comparado <= nivel) {  // Si quedan niveles
                     estado_maq_comp = ESPERAR_USUARIO;  //Vuelvo al estado de esperar que el usuario ingrese algo y
                     nivel_comparado++;  // Paso al siguiente nivel.
                 }
-                if(nivel_comparado > nivel) {
+                if(nivel_comparado > nivel) { // Si no quedan niveles
                     estado_maq_comp = ESPERAR_HAB;  // Reseteo la maquina
-                    fin_comparo = 1;
+                    fin_comparo = CORRECTO; // Indico que todo lo ingresado hasta este nivel es correcto
                 }
-
-            } else {
+            } else {    // Si, en cambio, se ingreso algo incorrecto
                 estado_maq_comp = ESPERAR_HAB;  // Reseteo la maquina
-                fin_comparo = 1;    // Marco error
+                fin_comparo = ERROR;    // Marco error
+                //Imprimo en pantalla que hubo error para comprobar
                 printf("ERROR");
                 printf("ERROR");
                 printf("ERROR");