Matias Rodriguez
/
TP1-EJERCICIO2
EJERCICIO SIMON: Axel Oropeza Matias Rodriguez
main.cpp@2:90667b428ce6, 2019-06-08 (annotated)
- Committer:
- matirodriguez
- Date:
- Sat Jun 08 15:22:16 2019 +0000
- Revision:
- 2:90667b428ce6
- Parent:
- 1:f6ea213ed382
Ejercicio "SIMON" terminado
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
matirodriguez | 0:fd466ee999a6 | 1 | #include "mbed.h" |
matirodriguez | 0:fd466ee999a6 | 2 | #include "tsi_sensor.h" |
matirodriguez | 0:fd466ee999a6 | 3 | |
matirodriguez | 0:fd466ee999a6 | 4 | #define ELEC0 9 |
matirodriguez | 0:fd466ee999a6 | 5 | #define ELEC1 10 |
matirodriguez | 0:fd466ee999a6 | 6 | |
matirodriguez | 0:fd466ee999a6 | 7 | /* Defino esas palabras que luego usaré para |
matirodriguez | 0:fd466ee999a6 | 8 | lo que se pulsa en el TSI como numeros usando la funcion |
matirodriguez | 0:fd466ee999a6 | 9 | "enum{}" |
matirodriguez | 0:fd466ee999a6 | 10 | */ |
matirodriguez | 0:fd466ee999a6 | 11 | enum {NADA, |
matirodriguez | 0:fd466ee999a6 | 12 | ROJO, |
matirodriguez | 0:fd466ee999a6 | 13 | VERDE, |
matirodriguez | 0:fd466ee999a6 | 14 | AZUL |
matirodriguez | 0:fd466ee999a6 | 15 | }; |
matirodriguez | 0:fd466ee999a6 | 16 | /* Defino los nombres de los estados como |
matirodriguez | 0:fd466ee999a6 | 17 | numeros enteros con la funcion "enum{}" |
matirodriguez | 0:fd466ee999a6 | 18 | */ |
matirodriguez | 0:fd466ee999a6 | 19 | |
matirodriguez | 1:f6ea213ed382 | 20 | //Maquina "MAQ_SECUENCIA()" |
matirodriguez | 0:fd466ee999a6 | 21 | enum {ESPERO_USUARIO, |
matirodriguez | 0:fd466ee999a6 | 22 | MUESTRO_SECUENCIA, |
matirodriguez | 0:fd466ee999a6 | 23 | COMPARO_SECUENCIA |
matirodriguez | 0:fd466ee999a6 | 24 | }; |
matirodriguez | 2:90667b428ce6 | 25 | |
matirodriguez | 1:f6ea213ed382 | 26 | //Maquina "MAQ_MUESTREO()" |
matirodriguez | 0:fd466ee999a6 | 27 | enum {ESPERO_HAB, |
matirodriguez | 0:fd466ee999a6 | 28 | MUESTRO, |
matirodriguez | 0:fd466ee999a6 | 29 | APAGO |
matirodriguez | 0:fd466ee999a6 | 30 | }; |
matirodriguez | 2:90667b428ce6 | 31 | |
matirodriguez | 1:f6ea213ed382 | 32 | //Maquina "MAQ_COMPARO()" |
matirodriguez | 0:fd466ee999a6 | 33 | enum {ESPERAR_HAB, |
matirodriguez | 0:fd466ee999a6 | 34 | ESPERAR_USUARIO, |
matirodriguez | 0:fd466ee999a6 | 35 | COMPARO |
matirodriguez | 0:fd466ee999a6 | 36 | }; |
matirodriguez | 2:90667b428ce6 | 37 | |
matirodriguez | 0:fd466ee999a6 | 38 | #define ERROR 15 |
matirodriguez | 0:fd466ee999a6 | 39 | #define CORRECTO 24 |
matirodriguez | 0:fd466ee999a6 | 40 | |
matirodriguez | 0:fd466ee999a6 | 41 | TSIAnalogSlider tsi(ELEC0, ELEC1, 40); |
matirodriguez | 0:fd466ee999a6 | 42 | |
matirodriguez | 0:fd466ee999a6 | 43 | // Prototipos de funciones de maquinas de estados |
matirodriguez | 0:fd466ee999a6 | 44 | void MAQ_SECUENCIA(); |
matirodriguez | 0:fd466ee999a6 | 45 | void MAQ_MUESTREO(); |
matirodriguez | 0:fd466ee999a6 | 46 | void MAQ_COMPARO(); |
matirodriguez | 0:fd466ee999a6 | 47 | |
matirodriguez | 0:fd466ee999a6 | 48 | void MAQ_lecturaTSI(); |
matirodriguez | 0:fd466ee999a6 | 49 | |
matirodriguez | 0:fd466ee999a6 | 50 | void LEER_TSI(); //Prototipo funcion de lectura del TSI |
matirodriguez | 1:f6ea213ed382 | 51 | void LED_1SEG(); //Prototipo funcion para prender y apagar led cada 1 segundo |
matirodriguez | 0:fd466ee999a6 | 52 | |
matirodriguez | 1:f6ea213ed382 | 53 | void pulsacion_TSI(); //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg |
matirodriguez | 0:fd466ee999a6 | 54 | |
matirodriguez | 0:fd466ee999a6 | 55 | void genero_secuencia(); // Funcion que utilizo para generar la secuencia aleatoria. |
matirodriguez | 0:fd466ee999a6 | 56 | |
matirodriguez | 2:90667b428ce6 | 57 | void apago_leds(); |
matirodriguez | 2:90667b428ce6 | 58 | |
matirodriguez | 2:90667b428ce6 | 59 | void cambio_estado(); |
matirodriguez | 2:90667b428ce6 | 60 | |
matirodriguez | 0:fd466ee999a6 | 61 | //Variables que indican el estado de las maquinas (empiezo en estado de reset) |
matirodriguez | 0:fd466ee999a6 | 62 | int estado_maq_sec = ESPERO_USUARIO; |
matirodriguez | 0:fd466ee999a6 | 63 | int estado_maq_mues = ESPERO_HAB; |
matirodriguez | 0:fd466ee999a6 | 64 | int estado_maq_comp = ESPERAR_HAB; |
matirodriguez | 0:fd466ee999a6 | 65 | |
matirodriguez | 0:fd466ee999a6 | 66 | int estado_maq_tsi = NADA; |
matirodriguez | 0:fd466ee999a6 | 67 | |
matirodriguez | 0:fd466ee999a6 | 68 | //Variables que habilitan maquinas de estados |
matirodriguez | 0:fd466ee999a6 | 69 | int hab_mostrar = 0; |
matirodriguez | 0:fd466ee999a6 | 70 | int hab_comparo = 0; |
matirodriguez | 0:fd466ee999a6 | 71 | |
matirodriguez | 0:fd466ee999a6 | 72 | //Variables que me indican el fin de una maquina de estados |
matirodriguez | 0:fd466ee999a6 | 73 | int fin_mostrar = 0; |
matirodriguez | 0:fd466ee999a6 | 74 | int fin_comparo = 0; |
matirodriguez | 0:fd466ee999a6 | 75 | |
matirodriguez | 0:fd466ee999a6 | 76 | //Variables que acumulan datos |
matirodriguez | 0:fd466ee999a6 | 77 | int color[25]; //Esta variable contendrá toda la secuencia aleatoria de 24 valores (no voy a usar el valor 0). |
matirodriguez | 1:f6ea213ed382 | 78 | int nivel = 0; //Esta variable me indica el nivel actual |
matirodriguez | 1:f6ea213ed382 | 79 | int tiempo_muestreo = 0; // Variable para contar el 1 segundo para el encendido y apagado de leds |
matirodriguez | 1:f6ea213ed382 | 80 | int var_pulsacion = 25; // Variable para contar los 2.5mseg de la funcion pulsacion_TSI() |
matirodriguez | 0:fd466ee999a6 | 81 | |
matirodriguez | 1:f6ea213ed382 | 82 | int color_teclado = NADA; // Variable que contiene el valor del TSI en todo momento |
matirodriguez | 1:f6ea213ed382 | 83 | int ingreso = NADA; // Variable que contiene el color presionado en el TSI, que se lee y luego es borrado |
matirodriguez | 0:fd466ee999a6 | 84 | |
matirodriguez | 1:f6ea213ed382 | 85 | Ticker lectura; // Ticker lectura del TSI |
matirodriguez | 1:f6ea213ed382 | 86 | Ticker temporizador; // Ticker para contar 1 segundo en los leds |
matirodriguez | 1:f6ea213ed382 | 87 | Ticker pulsacion; // Ticker para usar la funcion pulsacion_TSI() |
matirodriguez | 0:fd466ee999a6 | 88 | |
matirodriguez | 2:90667b428ce6 | 89 | Timeout apago; |
matirodriguez | 2:90667b428ce6 | 90 | Timeout estado; // Una pequeña demora que agrego entre que comparo y muestro los niveles del juego |
matirodriguez | 2:90667b428ce6 | 91 | |
matirodriguez | 0:fd466ee999a6 | 92 | // DEFINO SALIDAS |
matirodriguez | 0:fd466ee999a6 | 93 | DigitalOut ledrojo(LED_RED); |
matirodriguez | 0:fd466ee999a6 | 94 | DigitalOut ledverde(LED_GREEN); |
matirodriguez | 0:fd466ee999a6 | 95 | DigitalOut ledazul(LED_BLUE); |
matirodriguez | 1:f6ea213ed382 | 96 | |
matirodriguez | 1:f6ea213ed382 | 97 | AnalogIn noise(PTB0); // Entrada que usaré para generar la secuencia aleatoria con el ruido que me genere |
matirodriguez | 0:fd466ee999a6 | 98 | |
matirodriguez | 0:fd466ee999a6 | 99 | int main(void) |
matirodriguez | 0:fd466ee999a6 | 100 | { |
matirodriguez | 0:fd466ee999a6 | 101 | |
matirodriguez | 1:f6ea213ed382 | 102 | // Uno las funciones con el ticker correspondiente |
matirodriguez | 2:90667b428ce6 | 103 | lectura.attach(&LEER_TSI,0.1); |
matirodriguez | 2:90667b428ce6 | 104 | pulsacion.attach(&pulsacion_TSI,0.001); |
matirodriguez | 2:90667b428ce6 | 105 | temporizador.attach(&LED_1SEG,0.01); |
matirodriguez | 0:fd466ee999a6 | 106 | |
matirodriguez | 1:f6ea213ed382 | 107 | // Apago los leds al iniciar |
matirodriguez | 0:fd466ee999a6 | 108 | ledrojo = 1; |
matirodriguez | 0:fd466ee999a6 | 109 | ledverde= 1; |
matirodriguez | 0:fd466ee999a6 | 110 | ledazul = 1; |
matirodriguez | 0:fd466ee999a6 | 111 | |
matirodriguez | 0:fd466ee999a6 | 112 | while (true) { |
matirodriguez | 0:fd466ee999a6 | 113 | |
matirodriguez | 1:f6ea213ed382 | 114 | // Constantemente uso las maquinas de estados |
matirodriguez | 1:f6ea213ed382 | 115 | |
matirodriguez | 0:fd466ee999a6 | 116 | MAQ_lecturaTSI(); |
matirodriguez | 0:fd466ee999a6 | 117 | |
matirodriguez | 0:fd466ee999a6 | 118 | MAQ_SECUENCIA(); |
matirodriguez | 0:fd466ee999a6 | 119 | |
matirodriguez | 0:fd466ee999a6 | 120 | MAQ_MUESTREO(); |
matirodriguez | 0:fd466ee999a6 | 121 | |
matirodriguez | 0:fd466ee999a6 | 122 | MAQ_COMPARO(); |
matirodriguez | 0:fd466ee999a6 | 123 | |
matirodriguez | 0:fd466ee999a6 | 124 | } |
matirodriguez | 0:fd466ee999a6 | 125 | } |
matirodriguez | 0:fd466ee999a6 | 126 | |
matirodriguez | 2:90667b428ce6 | 127 | void apago_leds(){ |
matirodriguez | 2:90667b428ce6 | 128 | ledrojo=1; |
matirodriguez | 2:90667b428ce6 | 129 | ledverde=1; |
matirodriguez | 2:90667b428ce6 | 130 | ledazul=1; |
matirodriguez | 2:90667b428ce6 | 131 | } |
matirodriguez | 2:90667b428ce6 | 132 | |
matirodriguez | 0:fd466ee999a6 | 133 | void LEER_TSI() |
matirodriguez | 0:fd466ee999a6 | 134 | { |
matirodriguez | 0:fd466ee999a6 | 135 | float auxiliar = 0; |
matirodriguez | 1:f6ea213ed382 | 136 | auxiliar = tsi.readPercentage(); //Guardo de manera auxiliar el valor entre 0 y 1 del TSI |
matirodriguez | 1:f6ea213ed382 | 137 | |
matirodriguez | 1:f6ea213ed382 | 138 | // Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1) |
matirodriguez | 0:fd466ee999a6 | 139 | |
matirodriguez | 0:fd466ee999a6 | 140 | if(auxiliar == 0) { |
matirodriguez | 0:fd466ee999a6 | 141 | color_teclado = NADA; |
matirodriguez | 0:fd466ee999a6 | 142 | } |
matirodriguez | 0:fd466ee999a6 | 143 | |
matirodriguez | 2:90667b428ce6 | 144 | if((auxiliar > 0.05)&&(auxiliar < 0.30)) { |
matirodriguez | 0:fd466ee999a6 | 145 | color_teclado = ROJO; |
matirodriguez | 0:fd466ee999a6 | 146 | } |
matirodriguez | 0:fd466ee999a6 | 147 | |
matirodriguez | 2:90667b428ce6 | 148 | if((auxiliar >= 0.38)&&(auxiliar <= 0.60)) { |
matirodriguez | 0:fd466ee999a6 | 149 | color_teclado = VERDE; |
matirodriguez | 0:fd466ee999a6 | 150 | } |
matirodriguez | 0:fd466ee999a6 | 151 | |
matirodriguez | 2:90667b428ce6 | 152 | if((auxiliar > 0.68)&&(auxiliar <= 1)) { |
matirodriguez | 0:fd466ee999a6 | 153 | color_teclado = AZUL; |
matirodriguez | 0:fd466ee999a6 | 154 | } |
matirodriguez | 0:fd466ee999a6 | 155 | } |
matirodriguez | 0:fd466ee999a6 | 156 | |
matirodriguez | 0:fd466ee999a6 | 157 | void pulsacion_TSI() |
matirodriguez | 0:fd466ee999a6 | 158 | { |
matirodriguez | 0:fd466ee999a6 | 159 | if(var_pulsacion > 0) { |
matirodriguez | 0:fd466ee999a6 | 160 | var_pulsacion--; |
matirodriguez | 0:fd466ee999a6 | 161 | } |
matirodriguez | 0:fd466ee999a6 | 162 | } |
matirodriguez | 0:fd466ee999a6 | 163 | |
matirodriguez | 0:fd466ee999a6 | 164 | void MAQ_lecturaTSI() |
matirodriguez | 0:fd466ee999a6 | 165 | { |
matirodriguez | 1:f6ea213ed382 | 166 | if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms: |
matirodriguez | 1:f6ea213ed382 | 167 | var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo |
matirodriguez | 0:fd466ee999a6 | 168 | switch(estado_maq_tsi) { |
matirodriguez | 0:fd466ee999a6 | 169 | case NADA: |
matirodriguez | 1:f6ea213ed382 | 170 | ingreso = NADA; // La variable ingreso, salvo en los casos especificos, siempre se encontrará en NADA |
matirodriguez | 1:f6ea213ed382 | 171 | |
matirodriguez | 1:f6ea213ed382 | 172 | // En vez de usar cadenas de if en las transiciones, utilizo un switch |
matirodriguez | 1:f6ea213ed382 | 173 | |
matirodriguez | 0:fd466ee999a6 | 174 | switch(color_teclado) { |
matirodriguez | 0:fd466ee999a6 | 175 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 176 | estado_maq_tsi = ROJO; |
matirodriguez | 0:fd466ee999a6 | 177 | ingreso = ROJO; |
matirodriguez | 0:fd466ee999a6 | 178 | break; |
matirodriguez | 0:fd466ee999a6 | 179 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 180 | estado_maq_tsi = VERDE; |
matirodriguez | 0:fd466ee999a6 | 181 | ingreso = VERDE; |
matirodriguez | 0:fd466ee999a6 | 182 | break; |
matirodriguez | 0:fd466ee999a6 | 183 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 184 | estado_maq_tsi = AZUL; |
matirodriguez | 0:fd466ee999a6 | 185 | ingreso = AZUL; |
matirodriguez | 0:fd466ee999a6 | 186 | break; |
matirodriguez | 0:fd466ee999a6 | 187 | } |
matirodriguez | 0:fd466ee999a6 | 188 | break; |
matirodriguez | 1:f6ea213ed382 | 189 | |
matirodriguez | 0:fd466ee999a6 | 190 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 191 | switch(color_teclado) { |
matirodriguez | 0:fd466ee999a6 | 192 | case NADA: |
matirodriguez | 0:fd466ee999a6 | 193 | estado_maq_tsi = NADA; |
matirodriguez | 0:fd466ee999a6 | 194 | break; |
matirodriguez | 0:fd466ee999a6 | 195 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 196 | estado_maq_tsi = VERDE; |
matirodriguez | 0:fd466ee999a6 | 197 | ingreso = VERDE; |
matirodriguez | 0:fd466ee999a6 | 198 | break; |
matirodriguez | 0:fd466ee999a6 | 199 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 200 | estado_maq_tsi = AZUL; |
matirodriguez | 0:fd466ee999a6 | 201 | ingreso = AZUL; |
matirodriguez | 0:fd466ee999a6 | 202 | break; |
matirodriguez | 0:fd466ee999a6 | 203 | } |
matirodriguez | 0:fd466ee999a6 | 204 | break; |
matirodriguez | 1:f6ea213ed382 | 205 | |
matirodriguez | 0:fd466ee999a6 | 206 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 207 | switch(color_teclado) { |
matirodriguez | 0:fd466ee999a6 | 208 | case NADA: |
matirodriguez | 0:fd466ee999a6 | 209 | estado_maq_tsi = NADA; |
matirodriguez | 0:fd466ee999a6 | 210 | break; |
matirodriguez | 0:fd466ee999a6 | 211 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 212 | estado_maq_tsi = ROJO; |
matirodriguez | 0:fd466ee999a6 | 213 | ingreso = ROJO; |
matirodriguez | 0:fd466ee999a6 | 214 | break; |
matirodriguez | 0:fd466ee999a6 | 215 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 216 | estado_maq_tsi = AZUL; |
matirodriguez | 0:fd466ee999a6 | 217 | ingreso = AZUL; |
matirodriguez | 0:fd466ee999a6 | 218 | break; |
matirodriguez | 0:fd466ee999a6 | 219 | } |
matirodriguez | 0:fd466ee999a6 | 220 | break; |
matirodriguez | 1:f6ea213ed382 | 221 | |
matirodriguez | 0:fd466ee999a6 | 222 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 223 | switch(color_teclado) { |
matirodriguez | 0:fd466ee999a6 | 224 | case NADA: |
matirodriguez | 0:fd466ee999a6 | 225 | estado_maq_tsi = NADA; |
matirodriguez | 0:fd466ee999a6 | 226 | break; |
matirodriguez | 0:fd466ee999a6 | 227 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 228 | estado_maq_tsi = ROJO; |
matirodriguez | 0:fd466ee999a6 | 229 | ingreso = ROJO; |
matirodriguez | 0:fd466ee999a6 | 230 | break; |
matirodriguez | 0:fd466ee999a6 | 231 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 232 | estado_maq_tsi = VERDE; |
matirodriguez | 0:fd466ee999a6 | 233 | ingreso = VERDE; |
matirodriguez | 0:fd466ee999a6 | 234 | break; |
matirodriguez | 0:fd466ee999a6 | 235 | } |
matirodriguez | 0:fd466ee999a6 | 236 | break; |
matirodriguez | 0:fd466ee999a6 | 237 | } |
matirodriguez | 0:fd466ee999a6 | 238 | } |
matirodriguez | 0:fd466ee999a6 | 239 | } |
matirodriguez | 0:fd466ee999a6 | 240 | |
matirodriguez | 0:fd466ee999a6 | 241 | void LED_1SEG() |
matirodriguez | 0:fd466ee999a6 | 242 | { |
matirodriguez | 0:fd466ee999a6 | 243 | if(tiempo_muestreo >= 0) { |
matirodriguez | 0:fd466ee999a6 | 244 | tiempo_muestreo--; |
matirodriguez | 0:fd466ee999a6 | 245 | } |
matirodriguez | 0:fd466ee999a6 | 246 | } |
matirodriguez | 0:fd466ee999a6 | 247 | |
matirodriguez | 0:fd466ee999a6 | 248 | |
matirodriguez | 0:fd466ee999a6 | 249 | void MAQ_SECUENCIA() |
matirodriguez | 0:fd466ee999a6 | 250 | { |
matirodriguez | 0:fd466ee999a6 | 251 | |
matirodriguez | 0:fd466ee999a6 | 252 | 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) |
matirodriguez | 0:fd466ee999a6 | 253 | |
matirodriguez | 0:fd466ee999a6 | 254 | case ESPERO_USUARIO: |
matirodriguez | 1:f6ea213ed382 | 255 | if(ingreso != NADA) { // Si se presiona algo: |
matirodriguez | 1:f6ea213ed382 | 256 | genero_secuencia(); // Genero la secuencia |
matirodriguez | 1:f6ea213ed382 | 257 | nivel++; // Sumo 1 a "nivel" asi comienzo por el nivel 1 |
matirodriguez | 1:f6ea213ed382 | 258 | hab_mostrar = 1; // Habilito la maquina de estados que muestra los colores |
matirodriguez | 1:f6ea213ed382 | 259 | estado_maq_sec = MUESTRO_SECUENCIA; // Cambio de estado |
matirodriguez | 1:f6ea213ed382 | 260 | ingreso = NADA; // Reseteo la variable que contenia el color presionado |
matirodriguez | 1:f6ea213ed382 | 261 | ledrojo=1; |
matirodriguez | 1:f6ea213ed382 | 262 | ledazul=1; |
matirodriguez | 1:f6ea213ed382 | 263 | ledverde=1; |
matirodriguez | 0:fd466ee999a6 | 264 | } |
matirodriguez | 0:fd466ee999a6 | 265 | break; |
matirodriguez | 0:fd466ee999a6 | 266 | |
matirodriguez | 0:fd466ee999a6 | 267 | case MUESTRO_SECUENCIA: |
matirodriguez | 0:fd466ee999a6 | 268 | |
matirodriguez | 1:f6ea213ed382 | 269 | if(fin_mostrar == 1) { // Si se terminó la maquina de estados que muestra: |
matirodriguez | 1:f6ea213ed382 | 270 | fin_mostrar = 0; // Vacio la variable que me lo indicó, |
matirodriguez | 1:f6ea213ed382 | 271 | estado_maq_sec = COMPARO_SECUENCIA; // cambio de estado y |
matirodriguez | 1:f6ea213ed382 | 272 | hab_comparo = 1; // habilito la maquina que compara |
matirodriguez | 0:fd466ee999a6 | 273 | } |
matirodriguez | 0:fd466ee999a6 | 274 | |
matirodriguez | 0:fd466ee999a6 | 275 | break; |
matirodriguez | 0:fd466ee999a6 | 276 | |
matirodriguez | 0:fd466ee999a6 | 277 | case COMPARO_SECUENCIA: |
matirodriguez | 0:fd466ee999a6 | 278 | |
matirodriguez | 1:f6ea213ed382 | 279 | if(fin_comparo == CORRECTO) { // Si el usuario no se equivocó: |
matirodriguez | 1:f6ea213ed382 | 280 | if(nivel == 25) { // y se llego al maximo de niveles: |
matirodriguez | 1:f6ea213ed382 | 281 | fin_comparo = 0; // Vacio la variable |
matirodriguez | 1:f6ea213ed382 | 282 | estado_maq_sec = ESPERO_USUARIO; // Cambio al estado de inicio |
matirodriguez | 1:f6ea213ed382 | 283 | nivel = 0; // y reseteo todos los niveles |
matirodriguez | 1:f6ea213ed382 | 284 | ledverde=0; //Prendo leds para indicar que gané |
matirodriguez | 1:f6ea213ed382 | 285 | ledazul=0; |
matirodriguez | 1:f6ea213ed382 | 286 | } |
matirodriguez | 1:f6ea213ed382 | 287 | if(nivel < 25) { // Si en cambio faltan niveles: |
matirodriguez | 1:f6ea213ed382 | 288 | fin_comparo = 0; // Vacio la variable |
matirodriguez | 1:f6ea213ed382 | 289 | estado_maq_sec = MUESTRO_SECUENCIA; // Vuelvo al estado de mostrar |
matirodriguez | 1:f6ea213ed382 | 290 | hab_mostrar = 1; // Habilito esa maquina |
matirodriguez | 1:f6ea213ed382 | 291 | nivel++; // Y subo 1 nivel |
matirodriguez | 1:f6ea213ed382 | 292 | } |
matirodriguez | 1:f6ea213ed382 | 293 | } |
matirodriguez | 1:f6ea213ed382 | 294 | if(fin_comparo == ERROR) { |
matirodriguez | 0:fd466ee999a6 | 295 | fin_comparo = 0; |
matirodriguez | 1:f6ea213ed382 | 296 | estado_maq_sec = ESPERO_USUARIO; |
matirodriguez | 1:f6ea213ed382 | 297 | nivel = 0; |
matirodriguez | 1:f6ea213ed382 | 298 | ledrojo=0; // Prendo el leds para indicar que se perdió |
matirodriguez | 1:f6ea213ed382 | 299 | ledazul = 0; |
matirodriguez | 0:fd466ee999a6 | 300 | } |
matirodriguez | 0:fd466ee999a6 | 301 | break; |
matirodriguez | 0:fd466ee999a6 | 302 | } |
matirodriguez | 0:fd466ee999a6 | 303 | } |
matirodriguez | 0:fd466ee999a6 | 304 | |
matirodriguez | 0:fd466ee999a6 | 305 | void MAQ_MUESTREO() |
matirodriguez | 0:fd466ee999a6 | 306 | { |
matirodriguez | 0:fd466ee999a6 | 307 | |
matirodriguez | 0:fd466ee999a6 | 308 | static int nivel_mostrado; // Variable que voy a tener para saber que nivel estoy mostrando en los leds ahora |
matirodriguez | 0:fd466ee999a6 | 309 | |
matirodriguez | 0:fd466ee999a6 | 310 | switch(estado_maq_mues) { // Uso un switch para variar entre los estados de la maquina |
matirodriguez | 0:fd466ee999a6 | 311 | |
matirodriguez | 0:fd466ee999a6 | 312 | case ESPERO_HAB: |
matirodriguez | 0:fd466ee999a6 | 313 | |
matirodriguez | 0:fd466ee999a6 | 314 | nivel_mostrado = 1; // El primer nivel que muestro es 1, asi que reseteo esta variable cada vez que paso por este estado |
matirodriguez | 0:fd466ee999a6 | 315 | |
matirodriguez | 0:fd466ee999a6 | 316 | if(hab_mostrar == 1) { // Cuando recibo la habilitacion de la otra maquina de estados: |
matirodriguez | 0:fd466ee999a6 | 317 | |
matirodriguez | 0:fd466ee999a6 | 318 | estado_maq_mues = MUESTRO; // Cambio de estado y |
matirodriguez | 0:fd466ee999a6 | 319 | tiempo_muestreo = 100; // Establezco el tiempo en 1 seg (0.01seg * 100 = 1seg) |
matirodriguez | 0:fd466ee999a6 | 320 | hab_mostrar = 0; |
matirodriguez | 0:fd466ee999a6 | 321 | |
matirodriguez | 0:fd466ee999a6 | 322 | } |
matirodriguez | 0:fd466ee999a6 | 323 | break; |
matirodriguez | 0:fd466ee999a6 | 324 | |
matirodriguez | 0:fd466ee999a6 | 325 | case MUESTRO: |
matirodriguez | 0:fd466ee999a6 | 326 | |
matirodriguez | 0:fd466ee999a6 | 327 | switch(color[nivel_mostrado]) { // Muestro el color correspondiente al primer nivel, y voy cambiando cada 2 segundos |
matirodriguez | 0:fd466ee999a6 | 328 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 329 | ledrojo = 0; |
matirodriguez | 2:90667b428ce6 | 330 | ledverde=1; |
matirodriguez | 2:90667b428ce6 | 331 | ledazul=1; |
matirodriguez | 0:fd466ee999a6 | 332 | break; |
matirodriguez | 0:fd466ee999a6 | 333 | |
matirodriguez | 0:fd466ee999a6 | 334 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 335 | ledverde = 0; |
matirodriguez | 2:90667b428ce6 | 336 | ledazul=1; |
matirodriguez | 2:90667b428ce6 | 337 | ledrojo=1; |
matirodriguez | 0:fd466ee999a6 | 338 | break; |
matirodriguez | 0:fd466ee999a6 | 339 | |
matirodriguez | 0:fd466ee999a6 | 340 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 341 | ledazul = 0; |
matirodriguez | 2:90667b428ce6 | 342 | ledrojo=1; |
matirodriguez | 2:90667b428ce6 | 343 | ledverde=1; |
matirodriguez | 0:fd466ee999a6 | 344 | break; |
matirodriguez | 0:fd466ee999a6 | 345 | } |
matirodriguez | 0:fd466ee999a6 | 346 | |
matirodriguez | 0:fd466ee999a6 | 347 | if(tiempo_muestreo == 0) { // Si pasó 1 segundo, reseteo el tiempo y cambio de estado |
matirodriguez | 0:fd466ee999a6 | 348 | tiempo_muestreo = 100; // Establezco el tiempo en 1 segundo otra vez |
matirodriguez | 0:fd466ee999a6 | 349 | estado_maq_mues = APAGO; // Cambio de estado |
matirodriguez | 0:fd466ee999a6 | 350 | } |
matirodriguez | 0:fd466ee999a6 | 351 | break; |
matirodriguez | 0:fd466ee999a6 | 352 | |
matirodriguez | 0:fd466ee999a6 | 353 | case APAGO: |
matirodriguez | 0:fd466ee999a6 | 354 | |
matirodriguez | 0:fd466ee999a6 | 355 | switch(color[nivel_mostrado]) { // Ahora voy a apagar el led correspondiente al nivel que se esta mostrando. |
matirodriguez | 0:fd466ee999a6 | 356 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 357 | ledrojo = 1; |
matirodriguez | 0:fd466ee999a6 | 358 | break; |
matirodriguez | 0:fd466ee999a6 | 359 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 360 | ledverde = 1; |
matirodriguez | 0:fd466ee999a6 | 361 | break; |
matirodriguez | 0:fd466ee999a6 | 362 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 363 | ledazul = 1; |
matirodriguez | 0:fd466ee999a6 | 364 | break; |
matirodriguez | 0:fd466ee999a6 | 365 | } |
matirodriguez | 1:f6ea213ed382 | 366 | if(tiempo_muestreo == 0) { // Si paso el tiempo |
matirodriguez | 1:f6ea213ed382 | 367 | if(nivel_mostrado == nivel) { // Y no faltan niveles |
matirodriguez | 1:f6ea213ed382 | 368 | nivel_mostrado = 1; // Reseteo el nivel a mostrar |
matirodriguez | 1:f6ea213ed382 | 369 | estado_maq_mues = ESPERO_HAB; // Vuelvo a esperar la habilitacion |
matirodriguez | 1:f6ea213ed382 | 370 | fin_mostrar = 1; // Y marco que termino la maquina de estados |
matirodriguez | 0:fd466ee999a6 | 371 | } else { |
matirodriguez | 1:f6ea213ed382 | 372 | estado_maq_mues = MUESTRO; // Si en cambio faltan niveles, vuelvo a mostrar |
matirodriguez | 1:f6ea213ed382 | 373 | nivel_mostrado++; // Y muestro el siguiente |
matirodriguez | 1:f6ea213ed382 | 374 | tiempo_muestreo = 100; // Reseteo el tiempo (1 segundo) |
matirodriguez | 0:fd466ee999a6 | 375 | } |
matirodriguez | 0:fd466ee999a6 | 376 | } |
matirodriguez | 0:fd466ee999a6 | 377 | break; |
matirodriguez | 0:fd466ee999a6 | 378 | } |
matirodriguez | 0:fd466ee999a6 | 379 | } |
matirodriguez | 0:fd466ee999a6 | 380 | |
matirodriguez | 0:fd466ee999a6 | 381 | void MAQ_COMPARO() |
matirodriguez | 0:fd466ee999a6 | 382 | { |
matirodriguez | 0:fd466ee999a6 | 383 | |
matirodriguez | 0:fd466ee999a6 | 384 | |
matirodriguez | 0:fd466ee999a6 | 385 | static int nivel_comparado; // Variable que voy a usar para comparar todos los niveles sucesivamente, con lo que se vaya ingresando en el TSI |
matirodriguez | 1:f6ea213ed382 | 386 | 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 |
matirodriguez | 0:fd466ee999a6 | 387 | |
matirodriguez | 0:fd466ee999a6 | 388 | switch(estado_maq_comp) { |
matirodriguez | 0:fd466ee999a6 | 389 | case ESPERAR_HAB: |
matirodriguez | 0:fd466ee999a6 | 390 | |
matirodriguez | 0:fd466ee999a6 | 391 | nivel_comparado = 1; // Establezco en este estado el primer nivel que se va a comparar (el 1) |
matirodriguez | 0:fd466ee999a6 | 392 | |
matirodriguez | 0:fd466ee999a6 | 393 | if(hab_comparo == 1) { // Si recibí habilitacion desde la otra maquina, cambio de estado |
matirodriguez | 0:fd466ee999a6 | 394 | estado_maq_comp = ESPERAR_USUARIO; |
matirodriguez | 0:fd466ee999a6 | 395 | hab_comparo = 0; |
matirodriguez | 0:fd466ee999a6 | 396 | } |
matirodriguez | 0:fd466ee999a6 | 397 | |
matirodriguez | 0:fd466ee999a6 | 398 | break; |
matirodriguez | 0:fd466ee999a6 | 399 | |
matirodriguez | 0:fd466ee999a6 | 400 | case ESPERAR_USUARIO: |
matirodriguez | 0:fd466ee999a6 | 401 | |
matirodriguez | 1:f6ea213ed382 | 402 | if(ingreso != NADA) { // Si se ingresa algo en el TSI, lo guardo en la variable "obtenido" |
matirodriguez | 0:fd466ee999a6 | 403 | obtenido = ingreso; |
matirodriguez | 1:f6ea213ed382 | 404 | ingreso = NADA; // Reseteo la variable que guarda el valor del TSI |
matirodriguez | 0:fd466ee999a6 | 405 | estado_maq_comp = COMPARO; |
matirodriguez | 0:fd466ee999a6 | 406 | } |
matirodriguez | 0:fd466ee999a6 | 407 | |
matirodriguez | 0:fd466ee999a6 | 408 | break; |
matirodriguez | 0:fd466ee999a6 | 409 | |
matirodriguez | 0:fd466ee999a6 | 410 | case COMPARO: //Estado donde comparo el valor que se ingresó con el valor que corresponde |
matirodriguez | 0:fd466ee999a6 | 411 | |
matirodriguez | 1:f6ea213ed382 | 412 | if(obtenido == color[nivel_comparado]) { // Si el resultado es igual a lo que deberia: |
matirodriguez | 1:f6ea213ed382 | 413 | |
matirodriguez | 1:f6ea213ed382 | 414 | // Imprimo en pantalla el valor que se ingresó para comprobar |
matirodriguez | 0:fd466ee999a6 | 415 | switch(color[nivel_comparado]) { |
matirodriguez | 0:fd466ee999a6 | 416 | case ROJO: |
matirodriguez | 1:f6ea213ed382 | 417 | printf("Rojo\n"); |
matirodriguez | 2:90667b428ce6 | 418 | ledrojo=0; |
matirodriguez | 2:90667b428ce6 | 419 | break; |
matirodriguez | 2:90667b428ce6 | 420 | case VERDE: |
matirodriguez | 2:90667b428ce6 | 421 | printf("Verde\n"); |
matirodriguez | 2:90667b428ce6 | 422 | ledverde=0; |
matirodriguez | 2:90667b428ce6 | 423 | break; |
matirodriguez | 2:90667b428ce6 | 424 | case AZUL: |
matirodriguez | 2:90667b428ce6 | 425 | printf("Azul\n"); |
matirodriguez | 2:90667b428ce6 | 426 | ledazul=0; |
matirodriguez | 2:90667b428ce6 | 427 | break; |
matirodriguez | 2:90667b428ce6 | 428 | } |
matirodriguez | 2:90667b428ce6 | 429 | apago.attach(&apago_leds,0.5); |
matirodriguez | 2:90667b428ce6 | 430 | obtenido = NADA; // Reseteo la variable |
matirodriguez | 2:90667b428ce6 | 431 | if(nivel_comparado <= nivel) { // Si quedan niveles |
matirodriguez | 2:90667b428ce6 | 432 | |
matirodriguez | 2:90667b428ce6 | 433 | estado_maq_comp = ESPERAR_USUARIO; //Vuelvo al estado de esperar que el usuario ingrese algo y |
matirodriguez | 2:90667b428ce6 | 434 | nivel_comparado++; // Paso al siguiente nivel. |
matirodriguez | 2:90667b428ce6 | 435 | } |
matirodriguez | 2:90667b428ce6 | 436 | if(nivel_comparado > nivel) { // Si no quedan niveles |
matirodriguez | 2:90667b428ce6 | 437 | estado_maq_comp = ESPERAR_HAB; // Reseteo la maquina |
matirodriguez | 2:90667b428ce6 | 438 | estado.attach(&cambio_estado,1); // Indico que todo lo ingresado hasta este nivel es correcto |
matirodriguez | 2:90667b428ce6 | 439 | } |
matirodriguez | 2:90667b428ce6 | 440 | } else { // Si, en cambio, se ingreso algo incorrecto |
matirodriguez | 2:90667b428ce6 | 441 | estado_maq_comp = ESPERAR_HAB; // Reseteo la maquina |
matirodriguez | 2:90667b428ce6 | 442 | fin_comparo = ERROR; // Marco error |
matirodriguez | 2:90667b428ce6 | 443 | //Imprimo en pantalla que hubo error para comprobar |
matirodriguez | 2:90667b428ce6 | 444 | printf("ERROR\n"); |
matirodriguez | 2:90667b428ce6 | 445 | |
matirodriguez | 2:90667b428ce6 | 446 | // Imprimo en pantalla el valor que se ingresó para comprobar |
matirodriguez | 2:90667b428ce6 | 447 | switch(color[nivel_comparado]) { |
matirodriguez | 2:90667b428ce6 | 448 | case ROJO: |
matirodriguez | 2:90667b428ce6 | 449 | printf("Rojo\n"); |
matirodriguez | 0:fd466ee999a6 | 450 | break; |
matirodriguez | 0:fd466ee999a6 | 451 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 452 | |
matirodriguez | 1:f6ea213ed382 | 453 | printf("Verde\n"); |
matirodriguez | 0:fd466ee999a6 | 454 | break; |
matirodriguez | 0:fd466ee999a6 | 455 | case AZUL: |
matirodriguez | 1:f6ea213ed382 | 456 | printf("Azul\n"); |
matirodriguez | 0:fd466ee999a6 | 457 | break; |
matirodriguez | 0:fd466ee999a6 | 458 | |
matirodriguez | 0:fd466ee999a6 | 459 | |
matirodriguez | 0:fd466ee999a6 | 460 | } |
matirodriguez | 0:fd466ee999a6 | 461 | |
matirodriguez | 0:fd466ee999a6 | 462 | } |
matirodriguez | 0:fd466ee999a6 | 463 | break; |
matirodriguez | 0:fd466ee999a6 | 464 | } |
matirodriguez | 0:fd466ee999a6 | 465 | } |
matirodriguez | 0:fd466ee999a6 | 466 | |
matirodriguez | 0:fd466ee999a6 | 467 | void genero_secuencia() |
matirodriguez | 0:fd466ee999a6 | 468 | { |
matirodriguez | 0:fd466ee999a6 | 469 | int auxiliar; |
matirodriguez | 0:fd466ee999a6 | 470 | |
matirodriguez | 0:fd466ee999a6 | 471 | srand(int (noise * 10000)); // Cambio la semilla de la funcion rand usando un valor de ruido en una entrada analogica al aire |
matirodriguez | 0:fd466ee999a6 | 472 | |
matirodriguez | 0:fd466ee999a6 | 473 | for(int i = 1; i <=25 ; i++) { // Creo un for para recorren las 25 posiciones de memoria del vector "color[]" (el valor 0 no lo utilizo) |
matirodriguez | 0:fd466ee999a6 | 474 | |
matirodriguez | 0:fd466ee999a6 | 475 | |
matirodriguez | 0:fd466ee999a6 | 476 | auxiliar = rand(); //Genero un valor aleatorio y lo guardo en mi variable auxiliar |
matirodriguez | 0:fd466ee999a6 | 477 | |
matirodriguez | 0:fd466ee999a6 | 478 | // Dependiendo de cuanto resto me de al dividir por 3, asignare ese valor aleatorio con un color |
matirodriguez | 0:fd466ee999a6 | 479 | if((auxiliar % 3) == 0) { |
matirodriguez | 0:fd466ee999a6 | 480 | color[i] = ROJO; |
matirodriguez | 0:fd466ee999a6 | 481 | } |
matirodriguez | 0:fd466ee999a6 | 482 | |
matirodriguez | 0:fd466ee999a6 | 483 | if((auxiliar % 3 )== 1) { |
matirodriguez | 0:fd466ee999a6 | 484 | color[i] = VERDE; |
matirodriguez | 0:fd466ee999a6 | 485 | } |
matirodriguez | 0:fd466ee999a6 | 486 | |
matirodriguez | 0:fd466ee999a6 | 487 | if((auxiliar % 3 )== 2) { |
matirodriguez | 0:fd466ee999a6 | 488 | color[i] = AZUL; |
matirodriguez | 0:fd466ee999a6 | 489 | } |
matirodriguez | 0:fd466ee999a6 | 490 | switch(color[i]) { |
matirodriguez | 0:fd466ee999a6 | 491 | case ROJO: |
matirodriguez | 0:fd466ee999a6 | 492 | printf("%i ROJO;",i); |
matirodriguez | 0:fd466ee999a6 | 493 | break; |
matirodriguez | 0:fd466ee999a6 | 494 | case VERDE: |
matirodriguez | 0:fd466ee999a6 | 495 | printf("%i VERDE;",i); |
matirodriguez | 0:fd466ee999a6 | 496 | break; |
matirodriguez | 0:fd466ee999a6 | 497 | case AZUL: |
matirodriguez | 0:fd466ee999a6 | 498 | printf("%i AZUL;",i); |
matirodriguez | 0:fd466ee999a6 | 499 | break; |
matirodriguez | 0:fd466ee999a6 | 500 | } |
matirodriguez | 0:fd466ee999a6 | 501 | } |
matirodriguez | 0:fd466ee999a6 | 502 | printf("\n"); |
matirodriguez | 2:90667b428ce6 | 503 | } |
matirodriguez | 2:90667b428ce6 | 504 | |
matirodriguez | 2:90667b428ce6 | 505 | void cambio_estado(){ |
matirodriguez | 2:90667b428ce6 | 506 | fin_comparo = CORRECTO; |
matirodriguez | 0:fd466ee999a6 | 507 | } |