Matias Rodriguez
/
TP1-EJERCICIO2
EJERCICIO SIMON: Axel Oropeza Matias Rodriguez
Diff: main.cpp
- 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");