Almaraz Bettig TP1_Ejer2: Simon

Dependencies:   mbed

Committer:
nicoalmaraz
Date:
Tue Jun 11 18:56:41 2019 +0000
Revision:
0:9498d6ad334c
Child:
1:7c6b9d2b09bb
Trabajo Practico 1 - Ejercicio 2: Simon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nicoalmaraz 0:9498d6ad334c 1 //Almaraz y Bettig
nicoalmaraz 0:9498d6ad334c 2 //TP1 Ejercicio 2: Simon
nicoalmaraz 0:9498d6ad334c 3 #include "mbed.h"
nicoalmaraz 0:9498d6ad334c 4
nicoalmaraz 0:9498d6ad334c 5 char elementos=0; //Cada elemento es cada posicion del vector del patron
nicoalmaraz 0:9498d6ad334c 6 char patron[23]; //vector con el patron que hay que seguir
nicoalmaraz 0:9498d6ad334c 7 char repeticiones_secuencia_inicio=0; //cuenta las veces que repeti la secuencia antes de que comience el juego
nicoalmaraz 0:9498d6ad334c 8 char leds[4]= {0,0,0,0}; //leds de salida
nicoalmaraz 0:9498d6ad334c 9 char nivel=1; //Indica por que nivel vas. En total hay 23 niveles
nicoalmaraz 0:9498d6ad334c 10 char usuario[23]; //vector con los datos que ingresa el usuario
nicoalmaraz 0:9498d6ad334c 11 char mostrado=0; //cuenta cuantos elementos del vector "patron" mostre
nicoalmaraz 0:9498d6ad334c 12 char ingreso=0; //es el numero de elemento que ingresó el usuario
nicoalmaraz 0:9498d6ad334c 13 char pulsador_rojo=1; //pulsador sin rebote
nicoalmaraz 0:9498d6ad334c 14 char pulsador_azul=1; //pulsador sin rebote
nicoalmaraz 0:9498d6ad334c 15 char pulsador_verde=1; //pulsador sin rebote
nicoalmaraz 0:9498d6ad334c 16 char pulsador_amarillo=1; //pulsador sin rebote
nicoalmaraz 0:9498d6ad334c 17 char lectura_pulsador_valida=0; //flag que indica si se guardó un dato ingresado por el usuario correctamente
nicoalmaraz 0:9498d6ad334c 18 char ruido=0; //flag que indica que la medicion fue ruido
nicoalmaraz 0:9498d6ad334c 19 int tiempo_pulsadores=0; //variable de tiempo
nicoalmaraz 0:9498d6ad334c 20 int tiempo_secuencia_inicio=0; //variable de tiempo
nicoalmaraz 0:9498d6ad334c 21 int tiempo_patron=0; //variable de tiempo
nicoalmaraz 0:9498d6ad334c 22 int tiempo_mostrar=0; //variable de tiempo
nicoalmaraz 0:9498d6ad334c 23 char estado_secuencia_inicio=0; //estado de la maquina de estados "secuencia_inicio"
nicoalmaraz 0:9498d6ad334c 24
nicoalmaraz 0:9498d6ad334c 25 void reset_leds();
nicoalmaraz 0:9498d6ad334c 26 void timer();
nicoalmaraz 0:9498d6ad334c 27 void secuencia_inicio();
nicoalmaraz 0:9498d6ad334c 28 void generar_patron();
nicoalmaraz 0:9498d6ad334c 29 void mostrar();
nicoalmaraz 0:9498d6ad334c 30 void pulsadores();
nicoalmaraz 0:9498d6ad334c 31 void ingresar();
nicoalmaraz 0:9498d6ad334c 32
nicoalmaraz 0:9498d6ad334c 33 DigitalOut led_rojo(PTB0);
nicoalmaraz 0:9498d6ad334c 34 DigitalOut led_azul(PTB1);
nicoalmaraz 0:9498d6ad334c 35 DigitalOut led_verde(PTB2);
nicoalmaraz 0:9498d6ad334c 36 DigitalOut led_amarillo(PTB3);
nicoalmaraz 0:9498d6ad334c 37
nicoalmaraz 0:9498d6ad334c 38 DigitalIn pulsador_rojo_con_rebote(PTE23);
nicoalmaraz 0:9498d6ad334c 39 DigitalIn pulsador_azul_con_rebote(PTE22);
nicoalmaraz 0:9498d6ad334c 40 DigitalIn pulsador_verde_con_rebote(PTE21);
nicoalmaraz 0:9498d6ad334c 41 DigitalIn pulsador_amarillo_con_rebote(PTE20);
nicoalmaraz 0:9498d6ad334c 42 DigitalIn reset(PTC1);
nicoalmaraz 0:9498d6ad334c 43
nicoalmaraz 0:9498d6ad334c 44 Ticker ticker;
nicoalmaraz 0:9498d6ad334c 45
nicoalmaraz 0:9498d6ad334c 46 int main()
nicoalmaraz 0:9498d6ad334c 47 {
nicoalmaraz 0:9498d6ad334c 48 ticker.attach(&timer, 0.001);
nicoalmaraz 0:9498d6ad334c 49 char simon=0;
nicoalmaraz 0:9498d6ad334c 50 char fin=0;
nicoalmaraz 0:9498d6ad334c 51 long i=0;
nicoalmaraz 0:9498d6ad334c 52 printf("Presione el pulsador Inicio para iniciar el juego\r\n");
nicoalmaraz 0:9498d6ad334c 53 while(1) {
nicoalmaraz 0:9498d6ad334c 54 switch(simon) {
nicoalmaraz 0:9498d6ad334c 55 default:
nicoalmaraz 0:9498d6ad334c 56 case 0:
nicoalmaraz 0:9498d6ad334c 57 i++;
nicoalmaraz 0:9498d6ad334c 58 if(reset==0) {
nicoalmaraz 0:9498d6ad334c 59 srand(i);
nicoalmaraz 0:9498d6ad334c 60 simon=1;
nicoalmaraz 0:9498d6ad334c 61 tiempo_secuencia_inicio=0;
nicoalmaraz 0:9498d6ad334c 62 }
nicoalmaraz 0:9498d6ad334c 63 break;
nicoalmaraz 0:9498d6ad334c 64 case 1: //Hago la secuencia que hace el simon antes de arrancar 4 veces y genero el patron
nicoalmaraz 0:9498d6ad334c 65 secuencia_inicio();
nicoalmaraz 0:9498d6ad334c 66 generar_patron();
nicoalmaraz 0:9498d6ad334c 67 if((repeticiones_secuencia_inicio==5)&&(elementos==25)) {
nicoalmaraz 0:9498d6ad334c 68 simon=2;
nicoalmaraz 0:9498d6ad334c 69 tiempo_mostrar=0;
nicoalmaraz 0:9498d6ad334c 70 reset_leds();
nicoalmaraz 0:9498d6ad334c 71 }
nicoalmaraz 0:9498d6ad334c 72 break;
nicoalmaraz 0:9498d6ad334c 73 case 2: //Tomo el "patron" y muestro la cantidad de colores que indica "nivel"
nicoalmaraz 0:9498d6ad334c 74 mostrar();
nicoalmaraz 0:9498d6ad334c 75 if(mostrado==nivel) {
nicoalmaraz 0:9498d6ad334c 76 simon=3;
nicoalmaraz 0:9498d6ad334c 77 mostrado=0;
nicoalmaraz 0:9498d6ad334c 78 printf("Realice la secuencia\r\n");
nicoalmaraz 0:9498d6ad334c 79 }
nicoalmaraz 0:9498d6ad334c 80 break;
nicoalmaraz 0:9498d6ad334c 81 case 3: //Espero a que el usuario ingrese un color
nicoalmaraz 0:9498d6ad334c 82 ingresar();
nicoalmaraz 0:9498d6ad334c 83 if(lectura_pulsador_valida==1) {
nicoalmaraz 0:9498d6ad334c 84 simon=4;
nicoalmaraz 0:9498d6ad334c 85 lectura_pulsador_valida=0;
nicoalmaraz 0:9498d6ad334c 86 }
nicoalmaraz 0:9498d6ad334c 87 break;
nicoalmaraz 0:9498d6ad334c 88 case 4: //Analizo el datoingresado
nicoalmaraz 0:9498d6ad334c 89 if(usuario[ingreso]!=patron[ingreso]) { //me fijo si ingresé algo distintinto a lo que corresponde y lo indico con el flag "fin"
nicoalmaraz 0:9498d6ad334c 90 printf("Perdiste!\n");
nicoalmaraz 0:9498d6ad334c 91 printf("Presione el pulsador Reset para reiniciar el juego\r\n");
nicoalmaraz 0:9498d6ad334c 92 fin=1;
nicoalmaraz 0:9498d6ad334c 93 }
nicoalmaraz 0:9498d6ad334c 94 if ((usuario[ingreso]==patron[ingreso])&&(ingreso<nivel)) {//Si ingresé un valor correcto vuelvo al estado de ingresar datos y sumo la variable "ingreso"
nicoalmaraz 0:9498d6ad334c 95 ingreso++;
nicoalmaraz 0:9498d6ad334c 96 simon=3;
nicoalmaraz 0:9498d6ad334c 97 }
nicoalmaraz 0:9498d6ad334c 98 if((ingreso==nivel)&&(ingreso<24)) { //me fijo si llegué a ingresar la cantidad de cosas que mostré (sin completar el patrón completo)
nicoalmaraz 0:9498d6ad334c 99 ingreso=0;
nicoalmaraz 0:9498d6ad334c 100 printf("Nivel %d completado!\r\n",nivel);
nicoalmaraz 0:9498d6ad334c 101 tiempo_mostrar=0;
nicoalmaraz 0:9498d6ad334c 102 nivel++;
nicoalmaraz 0:9498d6ad334c 103 simon=2;
nicoalmaraz 0:9498d6ad334c 104 }
nicoalmaraz 0:9498d6ad334c 105 if(ingreso==24) { //me fijo si llegué a ingresar 24 cosas y lo indico con el flag "fin"
nicoalmaraz 0:9498d6ad334c 106 printf("Ganaste!\r\n");
nicoalmaraz 0:9498d6ad334c 107 printf("Presione el pulsador Reset para reiniciar el juego\r\n");
nicoalmaraz 0:9498d6ad334c 108 fin=1;
nicoalmaraz 0:9498d6ad334c 109 }
nicoalmaraz 0:9498d6ad334c 110 if(fin) //Si perdí o gané reinicio las variables para comenzar un juego nuevo
nicoalmaraz 0:9498d6ad334c 111 {
nicoalmaraz 0:9498d6ad334c 112 simon=0;
nicoalmaraz 0:9498d6ad334c 113 repeticiones_secuencia_inicio=0;
nicoalmaraz 0:9498d6ad334c 114 estado_secuencia_inicio=0;
nicoalmaraz 0:9498d6ad334c 115 elementos=0;
nicoalmaraz 0:9498d6ad334c 116 ingreso=0;
nicoalmaraz 0:9498d6ad334c 117 nivel=1;
nicoalmaraz 0:9498d6ad334c 118 fin=0;
nicoalmaraz 0:9498d6ad334c 119 printf("Presione el pulsador de inicio para volcer a jugar");
nicoalmaraz 0:9498d6ad334c 120 }
nicoalmaraz 0:9498d6ad334c 121 break;
nicoalmaraz 0:9498d6ad334c 122 }
nicoalmaraz 0:9498d6ad334c 123 //Enciendo los leds correspondientes
nicoalmaraz 0:9498d6ad334c 124 led_rojo=leds[0];
nicoalmaraz 0:9498d6ad334c 125 led_azul=leds[1];
nicoalmaraz 0:9498d6ad334c 126 led_verde=leds[2];
nicoalmaraz 0:9498d6ad334c 127 led_amarillo=leds[3];
nicoalmaraz 0:9498d6ad334c 128 }
nicoalmaraz 0:9498d6ad334c 129 }
nicoalmaraz 0:9498d6ad334c 130
nicoalmaraz 0:9498d6ad334c 131 void reset_leds()
nicoalmaraz 0:9498d6ad334c 132 //Apaga todos los leds
nicoalmaraz 0:9498d6ad334c 133 {
nicoalmaraz 0:9498d6ad334c 134 leds[0]=0;
nicoalmaraz 0:9498d6ad334c 135 leds[1]=0;
nicoalmaraz 0:9498d6ad334c 136 leds[2]=0;
nicoalmaraz 0:9498d6ad334c 137 leds[3]=0;
nicoalmaraz 0:9498d6ad334c 138 }
nicoalmaraz 0:9498d6ad334c 139
nicoalmaraz 0:9498d6ad334c 140 void timer()
nicoalmaraz 0:9498d6ad334c 141 //Incrementa los contadores cada 1ms
nicoalmaraz 0:9498d6ad334c 142 {
nicoalmaraz 0:9498d6ad334c 143 tiempo_pulsadores++;
nicoalmaraz 0:9498d6ad334c 144 tiempo_secuencia_inicio++;
nicoalmaraz 0:9498d6ad334c 145 tiempo_patron++;
nicoalmaraz 0:9498d6ad334c 146 tiempo_mostrar++;
nicoalmaraz 0:9498d6ad334c 147 }
nicoalmaraz 0:9498d6ad334c 148
nicoalmaraz 0:9498d6ad334c 149 void secuencia_inicio()
nicoalmaraz 0:9498d6ad334c 150 //Hace una secuencia introductoria al juego que el Simon original hace
nicoalmaraz 0:9498d6ad334c 151 {
nicoalmaraz 0:9498d6ad334c 152 if(tiempo_secuencia_inicio==300) {
nicoalmaraz 0:9498d6ad334c 153 switch(estado_secuencia_inicio) {
nicoalmaraz 0:9498d6ad334c 154 default:
nicoalmaraz 0:9498d6ad334c 155 case 0: //rojo
nicoalmaraz 0:9498d6ad334c 156 reset_leds();
nicoalmaraz 0:9498d6ad334c 157 leds[0]=1;
nicoalmaraz 0:9498d6ad334c 158 estado_secuencia_inicio=0;
nicoalmaraz 0:9498d6ad334c 159 repeticiones_secuencia_inicio++;
nicoalmaraz 0:9498d6ad334c 160 break;
nicoalmaraz 0:9498d6ad334c 161 case 1: //azul
nicoalmaraz 0:9498d6ad334c 162 reset_leds();
nicoalmaraz 0:9498d6ad334c 163 leds[1]=1;
nicoalmaraz 0:9498d6ad334c 164 break;
nicoalmaraz 0:9498d6ad334c 165 case 2: //verde
nicoalmaraz 0:9498d6ad334c 166 reset_leds();
nicoalmaraz 0:9498d6ad334c 167 leds[2]=1;
nicoalmaraz 0:9498d6ad334c 168 break;
nicoalmaraz 0:9498d6ad334c 169 case 3: //amarillo
nicoalmaraz 0:9498d6ad334c 170 reset_leds();
nicoalmaraz 0:9498d6ad334c 171 leds[3]=1;
nicoalmaraz 0:9498d6ad334c 172 break;
nicoalmaraz 0:9498d6ad334c 173 }
nicoalmaraz 0:9498d6ad334c 174 estado_secuencia_inicio++;
nicoalmaraz 0:9498d6ad334c 175 tiempo_secuencia_inicio=0;
nicoalmaraz 0:9498d6ad334c 176 }
nicoalmaraz 0:9498d6ad334c 177 }
nicoalmaraz 0:9498d6ad334c 178
nicoalmaraz 0:9498d6ad334c 179 void generar_patron()
nicoalmaraz 0:9498d6ad334c 180 //Genera el patron de 23 colores y los guarda en el vector "patron"
nicoalmaraz 0:9498d6ad334c 181 {
nicoalmaraz 0:9498d6ad334c 182 if(elementos>24)
nicoalmaraz 0:9498d6ad334c 183 return;
nicoalmaraz 0:9498d6ad334c 184 patron[elementos]=rand()%4;
nicoalmaraz 0:9498d6ad334c 185 elementos++;
nicoalmaraz 0:9498d6ad334c 186 }
nicoalmaraz 0:9498d6ad334c 187
nicoalmaraz 0:9498d6ad334c 188 void mostrar()
nicoalmaraz 0:9498d6ad334c 189 //Muestra la secuencia guardada en "patron" y la variable "mostrado" indica cuantos colores mostré
nicoalmaraz 0:9498d6ad334c 190 {
nicoalmaraz 0:9498d6ad334c 191 static char estado_mostrar;
nicoalmaraz 0:9498d6ad334c 192 switch (estado_mostrar) {
nicoalmaraz 0:9498d6ad334c 193 default:
nicoalmaraz 0:9498d6ad334c 194 case 0:
nicoalmaraz 0:9498d6ad334c 195 if(tiempo_mostrar==400) {//espero 0.4s para volver a encender los leds
nicoalmaraz 0:9498d6ad334c 196 estado_mostrar=1;
nicoalmaraz 0:9498d6ad334c 197 tiempo_mostrar=0;
nicoalmaraz 0:9498d6ad334c 198 leds[patron[mostrado]]=1; //enciendo el led que corresponde
nicoalmaraz 0:9498d6ad334c 199 }
nicoalmaraz 0:9498d6ad334c 200 break;
nicoalmaraz 0:9498d6ad334c 201 case 1:
nicoalmaraz 0:9498d6ad334c 202 if(tiempo_mostrar==1000) {//espero 1s para apagar los leds
nicoalmaraz 0:9498d6ad334c 203 estado_mostrar=0;
nicoalmaraz 0:9498d6ad334c 204 tiempo_mostrar=0;
nicoalmaraz 0:9498d6ad334c 205 mostrado++; //indico que mostré un elemento más
nicoalmaraz 0:9498d6ad334c 206 reset_leds();
nicoalmaraz 0:9498d6ad334c 207 }
nicoalmaraz 0:9498d6ad334c 208 break;
nicoalmaraz 0:9498d6ad334c 209 }
nicoalmaraz 0:9498d6ad334c 210 }
nicoalmaraz 0:9498d6ad334c 211
nicoalmaraz 0:9498d6ad334c 212 void pulsadores(char pulsador_con_rebote, char valor_salida)
nicoalmaraz 0:9498d6ad334c 213 // leo el pulsador, le quito el rebote y guardo el dato ingresado en el vector "usuario". Además distingo entre ruido o una lectura valida
nicoalmaraz 0:9498d6ad334c 214 {
nicoalmaraz 0:9498d6ad334c 215 static char estado_pulsadores;
nicoalmaraz 0:9498d6ad334c 216 switch(estado_pulsadores) {
nicoalmaraz 0:9498d6ad334c 217 default:
nicoalmaraz 0:9498d6ad334c 218 case 0: //Espero a que se apreten pulsadores y los prendo cuando lo hacen
nicoalmaraz 0:9498d6ad334c 219 reset_leds();
nicoalmaraz 0:9498d6ad334c 220 if(pulsador_con_rebote==0) {
nicoalmaraz 0:9498d6ad334c 221 tiempo_pulsadores=0;
nicoalmaraz 0:9498d6ad334c 222 estado_pulsadores=1;
nicoalmaraz 0:9498d6ad334c 223 }
nicoalmaraz 0:9498d6ad334c 224 break;
nicoalmaraz 0:9498d6ad334c 225 case 1: //Espero 50ms para quitar el rebote rise y analizo si fue ruido o realmente presionaron
nicoalmaraz 0:9498d6ad334c 226 if(tiempo_pulsadores>=50) {
nicoalmaraz 0:9498d6ad334c 227 if(pulsador_con_rebote==0) {
nicoalmaraz 0:9498d6ad334c 228 estado_pulsadores=2;
nicoalmaraz 0:9498d6ad334c 229 usuario[ingreso]=valor_salida;
nicoalmaraz 0:9498d6ad334c 230 leds[valor_salida]=1;
nicoalmaraz 0:9498d6ad334c 231 } else {
nicoalmaraz 0:9498d6ad334c 232 estado_pulsadores=0;
nicoalmaraz 0:9498d6ad334c 233 ruido=1;
nicoalmaraz 0:9498d6ad334c 234 }
nicoalmaraz 0:9498d6ad334c 235 }
nicoalmaraz 0:9498d6ad334c 236 break;
nicoalmaraz 0:9498d6ad334c 237 case 2: //Si se habia apretado espero a que se suelte
nicoalmaraz 0:9498d6ad334c 238 if(pulsador_con_rebote==1) {
nicoalmaraz 0:9498d6ad334c 239 reset_leds();
nicoalmaraz 0:9498d6ad334c 240 tiempo_pulsadores=0;
nicoalmaraz 0:9498d6ad334c 241 estado_pulsadores=3;
nicoalmaraz 0:9498d6ad334c 242 }
nicoalmaraz 0:9498d6ad334c 243 break;
nicoalmaraz 0:9498d6ad334c 244 case 3: //Espero 50ms para quitar el rebote fall y analizo si ya se fue o debo darle más tiempo
nicoalmaraz 0:9498d6ad334c 245 if(tiempo_pulsadores>=50) {
nicoalmaraz 0:9498d6ad334c 246 if(pulsador_con_rebote==1) {
nicoalmaraz 0:9498d6ad334c 247 estado_pulsadores=0;
nicoalmaraz 0:9498d6ad334c 248 lectura_pulsador_valida=1;
nicoalmaraz 0:9498d6ad334c 249 } else
nicoalmaraz 0:9498d6ad334c 250 tiempo_pulsadores=0; // si todavia no se fue el rebote espero más tiempo
nicoalmaraz 0:9498d6ad334c 251 }
nicoalmaraz 0:9498d6ad334c 252 break;
nicoalmaraz 0:9498d6ad334c 253 }
nicoalmaraz 0:9498d6ad334c 254 }
nicoalmaraz 0:9498d6ad334c 255
nicoalmaraz 0:9498d6ad334c 256 void ingresar()
nicoalmaraz 0:9498d6ad334c 257 //Espera a que un pulsador se presione y analiza el dato ingresado con la función "pulsadores"
nicoalmaraz 0:9498d6ad334c 258 {
nicoalmaraz 0:9498d6ad334c 259 static char estado_ingresar;
nicoalmaraz 0:9498d6ad334c 260 switch(estado_ingresar) {
nicoalmaraz 0:9498d6ad334c 261 default:
nicoalmaraz 0:9498d6ad334c 262 case 0:
nicoalmaraz 0:9498d6ad334c 263 if(pulsador_rojo_con_rebote==0)
nicoalmaraz 0:9498d6ad334c 264 estado_ingresar=1;
nicoalmaraz 0:9498d6ad334c 265 if(pulsador_azul_con_rebote==0)
nicoalmaraz 0:9498d6ad334c 266 estado_ingresar=2;
nicoalmaraz 0:9498d6ad334c 267 if(pulsador_verde_con_rebote==0)
nicoalmaraz 0:9498d6ad334c 268 estado_ingresar=3;
nicoalmaraz 0:9498d6ad334c 269 if(pulsador_amarillo_con_rebote==0)
nicoalmaraz 0:9498d6ad334c 270 estado_ingresar=4;
nicoalmaraz 0:9498d6ad334c 271 break;
nicoalmaraz 0:9498d6ad334c 272 case 1:
nicoalmaraz 0:9498d6ad334c 273 pulsadores(pulsador_rojo_con_rebote,0);
nicoalmaraz 0:9498d6ad334c 274 break;
nicoalmaraz 0:9498d6ad334c 275 case 2:
nicoalmaraz 0:9498d6ad334c 276 pulsadores(pulsador_azul_con_rebote,1);
nicoalmaraz 0:9498d6ad334c 277 break;
nicoalmaraz 0:9498d6ad334c 278 case 3:
nicoalmaraz 0:9498d6ad334c 279 pulsadores(pulsador_verde_con_rebote,2);
nicoalmaraz 0:9498d6ad334c 280 break;
nicoalmaraz 0:9498d6ad334c 281 case 4:
nicoalmaraz 0:9498d6ad334c 282 pulsadores(pulsador_amarillo_con_rebote,3);
nicoalmaraz 0:9498d6ad334c 283 break;
nicoalmaraz 0:9498d6ad334c 284 }
nicoalmaraz 0:9498d6ad334c 285 if(lectura_pulsador_valida==1) {
nicoalmaraz 0:9498d6ad334c 286 estado_ingresar=0;
nicoalmaraz 0:9498d6ad334c 287 printf("Ingreso valido\r\n");
nicoalmaraz 0:9498d6ad334c 288 }
nicoalmaraz 0:9498d6ad334c 289 if(ruido==1) {
nicoalmaraz 0:9498d6ad334c 290 estado_ingresar=0;
nicoalmaraz 0:9498d6ad334c 291 ruido=0;
nicoalmaraz 0:9498d6ad334c 292 printf("Deteccion de ruido\r\n");
nicoalmaraz 0:9498d6ad334c 293 }
nicoalmaraz 0:9498d6ad334c 294 }