TRABAJO PRACTICO - EJERCICIO 3 - TERMINADO

Dependencies:   mbed tsi_sensor

Committer:
matirodriguez
Date:
Mon Jun 10 18:01:52 2019 +0000
Revision:
1:ad8aebd0e5c7
Parent:
0:ec6eb1da0a1c
EJERCICIO 3 TERMINADO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
matirodriguez 0:ec6eb1da0a1c 1 #include "mbed.h"
matirodriguez 0:ec6eb1da0a1c 2 #include "tsi_sensor.h"
matirodriguez 0:ec6eb1da0a1c 3
matirodriguez 0:ec6eb1da0a1c 4 #define ELEC0 9
matirodriguez 0:ec6eb1da0a1c 5 #define ELEC1 10
matirodriguez 0:ec6eb1da0a1c 6
matirodriguez 1:ad8aebd0e5c7 7 // Funcion enum que utilizo para usar palabras como valores (para mas claridad en el codigo)
matirodriguez 1:ad8aebd0e5c7 8 enum { HABILITADO,
matirodriguez 1:ad8aebd0e5c7 9 CABLE1,
matirodriguez 1:ad8aebd0e5c7 10 CABLE2,
matirodriguez 1:ad8aebd0e5c7 11 CABLE3,
matirodriguez 1:ad8aebd0e5c7 12 CABLE4,
matirodriguez 1:ad8aebd0e5c7 13 DISPONIBLE,
matirodriguez 1:ad8aebd0e5c7 14 USADO,
matirodriguez 1:ad8aebd0e5c7 15 DESHABILITADO,
matirodriguez 1:ad8aebd0e5c7 16 CORRECTO,
matirodriguez 1:ad8aebd0e5c7 17 VICTORIA,
matirodriguez 1:ad8aebd0e5c7 18 DERROTA
matirodriguez 1:ad8aebd0e5c7 19 };
matirodriguez 1:ad8aebd0e5c7 20
matirodriguez 1:ad8aebd0e5c7 21 // Funciones enum que indican el estado de las maquinas de estados
matirodriguez 1:ad8aebd0e5c7 22 enum { ESPERO_INICIO,
matirodriguez 1:ad8aebd0e5c7 23 CAMBIO_DISPLAY,
matirodriguez 1:ad8aebd0e5c7 24 RESTO_DISPLAY
matirodriguez 1:ad8aebd0e5c7 25 };
matirodriguez 1:ad8aebd0e5c7 26 enum { PAUSA,
matirodriguez 1:ad8aebd0e5c7 27 ESPERO_CABLE,
matirodriguez 1:ad8aebd0e5c7 28 COMPARO
matirodriguez 1:ad8aebd0e5c7 29 };
matirodriguez 0:ec6eb1da0a1c 30 enum { NADA,
matirodriguez 0:ec6eb1da0a1c 31 PULSADO
matirodriguez 0:ec6eb1da0a1c 32 };
matirodriguez 1:ad8aebd0e5c7 33 enum { ESPERO,
matirodriguez 1:ad8aebd0e5c7 34 PRENDO,
matirodriguez 1:ad8aebd0e5c7 35 APAGO
matirodriguez 1:ad8aebd0e5c7 36 };
matirodriguez 1:ad8aebd0e5c7 37
matirodriguez 0:ec6eb1da0a1c 38
matirodriguez 0:ec6eb1da0a1c 39 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
matirodriguez 0:ec6eb1da0a1c 40
matirodriguez 0:ec6eb1da0a1c 41 // Prototipos de funciones de maquinas de estados
matirodriguez 1:ad8aebd0e5c7 42 void MAQ_cuentareg(); //Prototipo funcion de la cuenta regresiva
matirodriguez 0:ec6eb1da0a1c 43
matirodriguez 1:ad8aebd0e5c7 44 void MAQ_bomba(); // Prototipo funcion general del juego
matirodriguez 0:ec6eb1da0a1c 45
matirodriguez 1:ad8aebd0e5c7 46 void MAQ_parpadeo(); //Prototipo funcion para parpadear display y led
matirodriguez 1:ad8aebd0e5c7 47
matirodriguez 1:ad8aebd0e5c7 48 void MAQ_lecturaTSI(); //Prototipo funcion para solo leer 1 vez que se presiona el TSI
matirodriguez 1:ad8aebd0e5c7 49 void LEER_TSI(); //Prototipo funcion para guardar el valor analogico del TSI en todo momento
matirodriguez 0:ec6eb1da0a1c 50 void pulsacion_TSI(); //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg
matirodriguez 0:ec6eb1da0a1c 51
matirodriguez 1:ad8aebd0e5c7 52 void segundos(); //Funcion para realizar cambiar el display cada 1 segundo
matirodriguez 1:ad8aebd0e5c7 53
matirodriguez 1:ad8aebd0e5c7 54 void parpadeo1();
matirodriguez 1:ad8aebd0e5c7 55 void parpadeo2();
matirodriguez 0:ec6eb1da0a1c 56
matirodriguez 0:ec6eb1da0a1c 57 void genero_secuencia(); // Funcion que utilizo para generar la secuencia aleatoria.
matirodriguez 0:ec6eb1da0a1c 58
matirodriguez 0:ec6eb1da0a1c 59 //Variables que indican el estado de las maquinas (empiezo en estado de reset)
matirodriguez 0:ec6eb1da0a1c 60
matirodriguez 0:ec6eb1da0a1c 61 int estado_maq_tsi = NADA;
matirodriguez 1:ad8aebd0e5c7 62 int estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 63 int estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 64 int estado_maq_parpadeo = ESPERO;
matirodriguez 0:ec6eb1da0a1c 65
matirodriguez 0:ec6eb1da0a1c 66 //Variables que habilitan maquinas de estados
matirodriguez 1:ad8aebd0e5c7 67 int hab_display = DESHABILITADO;
matirodriguez 0:ec6eb1da0a1c 68
matirodriguez 0:ec6eb1da0a1c 69 //Variables que me indican el fin de una maquina de estados
matirodriguez 1:ad8aebd0e5c7 70 int fin_display = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 71 int fin_juego = NADA;
matirodriguez 1:ad8aebd0e5c7 72
matirodriguez 0:ec6eb1da0a1c 73
matirodriguez 0:ec6eb1da0a1c 74 //Variables que acumulan datos
matirodriguez 0:ec6eb1da0a1c 75 int var_pulsacion = 25; // Variable para contar los 2.5mseg de la funcion pulsacion_TSI()
matirodriguez 0:ec6eb1da0a1c 76
matirodriguez 1:ad8aebd0e5c7 77 int teclado = NADA; // Variable que contiene el valor analogico del TSI en todo momento
matirodriguez 1:ad8aebd0e5c7 78 int ingreso = NADA; // Variable que contiene si se presionó el TSI, que se lee y luego se borra
matirodriguez 1:ad8aebd0e5c7 79
matirodriguez 1:ad8aebd0e5c7 80 int segundo = 100; // Variable que cuenta desde 100 hasta 0 para contar 1 segundo
matirodriguez 1:ad8aebd0e5c7 81 int tiempo = 60; // Variable que utilizo para establecer cuanto tiempo contar
matirodriguez 1:ad8aebd0e5c7 82
matirodriguez 1:ad8aebd0e5c7 83 int secuencia[4]; // Variable que contiene la secuencia aleatoria
matirodriguez 1:ad8aebd0e5c7 84
matirodriguez 1:ad8aebd0e5c7 85 int memoria1 = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 86 int memoria2 = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 87
matirodriguez 0:ec6eb1da0a1c 88
matirodriguez 0:ec6eb1da0a1c 89 Ticker lectura; // Ticker lectura del TSI
matirodriguez 0:ec6eb1da0a1c 90 Ticker pulsacion; // Ticker para usar la funcion pulsacion_TSI()
matirodriguez 0:ec6eb1da0a1c 91
matirodriguez 1:ad8aebd0e5c7 92 Ticker cuenta; //Ticker para realizar la cuenta regresiva
matirodriguez 1:ad8aebd0e5c7 93
matirodriguez 1:ad8aebd0e5c7 94 Timeout blink1;
matirodriguez 1:ad8aebd0e5c7 95 Timeout blink2;
matirodriguez 1:ad8aebd0e5c7 96
matirodriguez 0:ec6eb1da0a1c 97 // DEFINO SALIDAS
matirodriguez 0:ec6eb1da0a1c 98 DigitalOut ledrojo(LED_RED);
matirodriguez 0:ec6eb1da0a1c 99 DigitalOut ledverde(LED_GREEN);
matirodriguez 0:ec6eb1da0a1c 100
matirodriguez 1:ad8aebd0e5c7 101 BusOut decenas(PTA4,PTA5,PTC8,PTC9); // Salidas para el display de las decenas
matirodriguez 1:ad8aebd0e5c7 102 BusOut unidades(PTC7, PTC0, PTC3, PTC4); // Salidas para el display de las unidades
matirodriguez 1:ad8aebd0e5c7 103
matirodriguez 1:ad8aebd0e5c7 104 // DEFINO ENTRADAS
matirodriguez 1:ad8aebd0e5c7 105
matirodriguez 1:ad8aebd0e5c7 106 BusIn entradas(PTC12,PTC13,PTC16,PTC17); // Entradas donde estarán los cables a desconectar
matirodriguez 0:ec6eb1da0a1c 107
matirodriguez 0:ec6eb1da0a1c 108 AnalogIn noise(PTB0); // Entrada que usaré para generar la secuencia aleatoria con el ruido que me genere
matirodriguez 0:ec6eb1da0a1c 109
matirodriguez 1:ad8aebd0e5c7 110
matirodriguez 0:ec6eb1da0a1c 111 int main(void)
matirodriguez 0:ec6eb1da0a1c 112 {
matirodriguez 0:ec6eb1da0a1c 113
matirodriguez 1:ad8aebd0e5c7 114 entradas.mode(PullUp); // Coloco las entradas con un pullup interno
matirodriguez 1:ad8aebd0e5c7 115
matirodriguez 0:ec6eb1da0a1c 116 // Uno las funciones con el ticker correspondiente
matirodriguez 0:ec6eb1da0a1c 117 lectura.attach(&LEER_TSI,0.1);
matirodriguez 0:ec6eb1da0a1c 118 pulsacion.attach(&pulsacion_TSI,0.001);
matirodriguez 1:ad8aebd0e5c7 119 cuenta.attach(&segundos,0.01);
matirodriguez 1:ad8aebd0e5c7 120
matirodriguez 0:ec6eb1da0a1c 121
matirodriguez 0:ec6eb1da0a1c 122 // Apago los leds al iniciar
matirodriguez 0:ec6eb1da0a1c 123 ledrojo = 1;
matirodriguez 0:ec6eb1da0a1c 124 ledverde= 1;
matirodriguez 1:ad8aebd0e5c7 125 // Pongo los displays en 0 (Se tienen que negar las salidas)
matirodriguez 1:ad8aebd0e5c7 126 decenas = 0 ^ 0xF;
matirodriguez 1:ad8aebd0e5c7 127 unidades = 0 ^ 0xF;
matirodriguez 0:ec6eb1da0a1c 128 while (true) {
matirodriguez 0:ec6eb1da0a1c 129
matirodriguez 0:ec6eb1da0a1c 130 // Constantemente uso las maquinas de estados
matirodriguez 0:ec6eb1da0a1c 131 MAQ_lecturaTSI();
matirodriguez 1:ad8aebd0e5c7 132 MAQ_cuentareg();
matirodriguez 1:ad8aebd0e5c7 133 MAQ_bomba();
matirodriguez 1:ad8aebd0e5c7 134 MAQ_parpadeo();
matirodriguez 0:ec6eb1da0a1c 135
matirodriguez 0:ec6eb1da0a1c 136 }
matirodriguez 0:ec6eb1da0a1c 137 }
matirodriguez 0:ec6eb1da0a1c 138
matirodriguez 1:ad8aebd0e5c7 139 void MAQ_parpadeo()
matirodriguez 1:ad8aebd0e5c7 140 {
matirodriguez 1:ad8aebd0e5c7 141 int auxiliar;
matirodriguez 1:ad8aebd0e5c7 142
matirodriguez 1:ad8aebd0e5c7 143 switch(estado_maq_parpadeo) {
matirodriguez 1:ad8aebd0e5c7 144 case ESPERO:
matirodriguez 1:ad8aebd0e5c7 145 if(fin_juego != NADA) { // Si el juego terminó, habilito la maquina de estados
matirodriguez 1:ad8aebd0e5c7 146 estado_maq_parpadeo = APAGO;
matirodriguez 1:ad8aebd0e5c7 147 blink1.attach(&parpadeo1,0.25); // Uso un Timeout para cambiar de estado una vez pasaron 0.25 segundos
matirodriguez 1:ad8aebd0e5c7 148 }
matirodriguez 1:ad8aebd0e5c7 149 break;
matirodriguez 1:ad8aebd0e5c7 150
matirodriguez 1:ad8aebd0e5c7 151 case APAGO:
matirodriguez 1:ad8aebd0e5c7 152 unidades = 0; // Apago los displays
matirodriguez 1:ad8aebd0e5c7 153 decenas = 0;
matirodriguez 1:ad8aebd0e5c7 154 ledverde=0; // Prendo el led verde
matirodriguez 1:ad8aebd0e5c7 155 if(fin_juego == DERROTA) {
matirodriguez 1:ad8aebd0e5c7 156 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 157 ledverde=1;
matirodriguez 1:ad8aebd0e5c7 158 }
matirodriguez 1:ad8aebd0e5c7 159 break;
matirodriguez 1:ad8aebd0e5c7 160
matirodriguez 1:ad8aebd0e5c7 161 case PRENDO:
matirodriguez 1:ad8aebd0e5c7 162 auxiliar = tiempo / 10;
matirodriguez 1:ad8aebd0e5c7 163 decenas = auxiliar ^ (0xF); // Como utilizo salidas que se prenden con 0, invierto el numero.
matirodriguez 1:ad8aebd0e5c7 164 unidades = (tiempo - auxiliar * 10) ^ (0xF);
matirodriguez 1:ad8aebd0e5c7 165 if(fin_juego == DERROTA) {
matirodriguez 1:ad8aebd0e5c7 166 ledrojo = 1;
matirodriguez 1:ad8aebd0e5c7 167 }
matirodriguez 1:ad8aebd0e5c7 168 break;
matirodriguez 1:ad8aebd0e5c7 169 }
matirodriguez 1:ad8aebd0e5c7 170 }
matirodriguez 1:ad8aebd0e5c7 171
matirodriguez 1:ad8aebd0e5c7 172 void parpadeo1() //Funcion que vinculo al timeout para cambiar de estado cada 0.25 segundos
matirodriguez 1:ad8aebd0e5c7 173 {
matirodriguez 1:ad8aebd0e5c7 174 if(fin_juego != NADA) {
matirodriguez 1:ad8aebd0e5c7 175 estado_maq_parpadeo = PRENDO;
matirodriguez 1:ad8aebd0e5c7 176 blink2.attach(&parpadeo2,0.25);
matirodriguez 1:ad8aebd0e5c7 177 } else {
matirodriguez 1:ad8aebd0e5c7 178 estado_maq_parpadeo = ESPERO;
matirodriguez 1:ad8aebd0e5c7 179 }
matirodriguez 1:ad8aebd0e5c7 180 }
matirodriguez 1:ad8aebd0e5c7 181
matirodriguez 1:ad8aebd0e5c7 182 void parpadeo2() //Funcion que vinculo al timeout para cambiar de estado cada 0.25 segundos
matirodriguez 1:ad8aebd0e5c7 183 {
matirodriguez 1:ad8aebd0e5c7 184 if(fin_juego != NADA) {
matirodriguez 1:ad8aebd0e5c7 185 estado_maq_parpadeo = APAGO;
matirodriguez 1:ad8aebd0e5c7 186 blink1.attach(&parpadeo1,0.25);
matirodriguez 1:ad8aebd0e5c7 187 } else {
matirodriguez 1:ad8aebd0e5c7 188 estado_maq_parpadeo = ESPERO;
matirodriguez 1:ad8aebd0e5c7 189 }
matirodriguez 1:ad8aebd0e5c7 190 }
matirodriguez 1:ad8aebd0e5c7 191
matirodriguez 1:ad8aebd0e5c7 192
matirodriguez 1:ad8aebd0e5c7 193 void MAQ_bomba()
matirodriguez 1:ad8aebd0e5c7 194 {
matirodriguez 1:ad8aebd0e5c7 195 static int aux;
matirodriguez 1:ad8aebd0e5c7 196 static int nivel;
matirodriguez 1:ad8aebd0e5c7 197 static int diferencia;
matirodriguez 1:ad8aebd0e5c7 198 static int correctos[]= {NADA,NADA,NADA,NADA,NADA};
matirodriguez 1:ad8aebd0e5c7 199 // Nada, C1, C2, C3, C4
matirodriguez 1:ad8aebd0e5c7 200 switch(estado_maq_bomba) {
matirodriguez 1:ad8aebd0e5c7 201 case PAUSA:
matirodriguez 1:ad8aebd0e5c7 202 if(ingreso == PULSADO) {
matirodriguez 1:ad8aebd0e5c7 203
matirodriguez 1:ad8aebd0e5c7 204 //Reseteo las variables
matirodriguez 1:ad8aebd0e5c7 205 ingreso = NADA;
matirodriguez 1:ad8aebd0e5c7 206
matirodriguez 1:ad8aebd0e5c7 207 fin_juego = NADA;
matirodriguez 1:ad8aebd0e5c7 208 estado_maq_parpadeo = ESPERO;
matirodriguez 1:ad8aebd0e5c7 209
matirodriguez 1:ad8aebd0e5c7 210 correctos[CABLE1] = NADA;
matirodriguez 1:ad8aebd0e5c7 211 correctos[CABLE2] = NADA;
matirodriguez 1:ad8aebd0e5c7 212 correctos[CABLE3] = NADA;
matirodriguez 1:ad8aebd0e5c7 213 correctos[CABLE4] = NADA;
matirodriguez 1:ad8aebd0e5c7 214
matirodriguez 1:ad8aebd0e5c7 215 ledrojo = 1; //Apago los leds
matirodriguez 1:ad8aebd0e5c7 216 ledverde = 1;
matirodriguez 1:ad8aebd0e5c7 217
matirodriguez 1:ad8aebd0e5c7 218 genero_secuencia(); //Genero la secuencia aleatoria
matirodriguez 1:ad8aebd0e5c7 219
matirodriguez 1:ad8aebd0e5c7 220 nivel = 0;
matirodriguez 1:ad8aebd0e5c7 221
matirodriguez 1:ad8aebd0e5c7 222 hab_display = HABILITADO;
matirodriguez 1:ad8aebd0e5c7 223
matirodriguez 1:ad8aebd0e5c7 224 aux = entradas;
matirodriguez 1:ad8aebd0e5c7 225
matirodriguez 1:ad8aebd0e5c7 226 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 227
matirodriguez 1:ad8aebd0e5c7 228 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 229
matirodriguez 1:ad8aebd0e5c7 230 }
matirodriguez 1:ad8aebd0e5c7 231 break;
matirodriguez 1:ad8aebd0e5c7 232
matirodriguez 1:ad8aebd0e5c7 233 case ESPERO_CABLE:
matirodriguez 1:ad8aebd0e5c7 234 if(aux != entradas) { // Si se detecta una diferencia con respecto a un valor anterior en la entrada
matirodriguez 1:ad8aebd0e5c7 235 estado_maq_bomba = COMPARO;
matirodriguez 1:ad8aebd0e5c7 236 diferencia = (aux) ^ (entradas); // Guardo dicha diferencia en una variable
matirodriguez 1:ad8aebd0e5c7 237 }
matirodriguez 1:ad8aebd0e5c7 238 if(fin_display == HABILITADO) { // Si se termina el tiempo:
matirodriguez 1:ad8aebd0e5c7 239 fin_display = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 240 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 241 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 242 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 243 tiempo = 0;
matirodriguez 1:ad8aebd0e5c7 244 }
matirodriguez 1:ad8aebd0e5c7 245 break;
matirodriguez 1:ad8aebd0e5c7 246
matirodriguez 1:ad8aebd0e5c7 247 case COMPARO:
matirodriguez 1:ad8aebd0e5c7 248
matirodriguez 1:ad8aebd0e5c7 249 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 250
matirodriguez 1:ad8aebd0e5c7 251
matirodriguez 1:ad8aebd0e5c7 252 switch(diferencia) { // Uso un switch para variar entre los casos de los cables que se sacaron
matirodriguez 1:ad8aebd0e5c7 253 //Uso una memoria para ver si el cable ya se retiro y no tenerlo mas en cuenta
matirodriguez 1:ad8aebd0e5c7 254 //Si el valor no corresponde, el jugador pierde
matirodriguez 1:ad8aebd0e5c7 255 case 0b0001:
matirodriguez 1:ad8aebd0e5c7 256 if(correctos[CABLE1]==NADA) {
matirodriguez 1:ad8aebd0e5c7 257 correctos[CABLE1]=CORRECTO;
matirodriguez 1:ad8aebd0e5c7 258 if(secuencia[nivel]!=CABLE1) {
matirodriguez 1:ad8aebd0e5c7 259 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 260 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 261 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 262 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 263 } else {
matirodriguez 1:ad8aebd0e5c7 264 nivel++;
matirodriguez 1:ad8aebd0e5c7 265 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 266 aux = entradas;
matirodriguez 1:ad8aebd0e5c7 267 }
matirodriguez 1:ad8aebd0e5c7 268 }
matirodriguez 1:ad8aebd0e5c7 269 break;
matirodriguez 1:ad8aebd0e5c7 270
matirodriguez 1:ad8aebd0e5c7 271 case 0b0010:
matirodriguez 1:ad8aebd0e5c7 272 if(correctos[CABLE2]==NADA) {
matirodriguez 1:ad8aebd0e5c7 273 correctos[CABLE2]=CORRECTO;
matirodriguez 1:ad8aebd0e5c7 274 if(secuencia[nivel]!=CABLE2) {
matirodriguez 1:ad8aebd0e5c7 275 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 276 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 277 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 278 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 279 } else {
matirodriguez 1:ad8aebd0e5c7 280 nivel++;
matirodriguez 1:ad8aebd0e5c7 281 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 282 aux = entradas;
matirodriguez 1:ad8aebd0e5c7 283 }
matirodriguez 1:ad8aebd0e5c7 284 }
matirodriguez 1:ad8aebd0e5c7 285
matirodriguez 1:ad8aebd0e5c7 286 break;
matirodriguez 1:ad8aebd0e5c7 287
matirodriguez 1:ad8aebd0e5c7 288 case 0b0100:
matirodriguez 1:ad8aebd0e5c7 289 if(correctos[CABLE3]==NADA) {
matirodriguez 1:ad8aebd0e5c7 290 correctos[CABLE3]=CORRECTO;
matirodriguez 1:ad8aebd0e5c7 291 if(secuencia[nivel]!=CABLE3) {
matirodriguez 1:ad8aebd0e5c7 292 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 293 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 294 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 295 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 296 } else {
matirodriguez 1:ad8aebd0e5c7 297 nivel++;
matirodriguez 1:ad8aebd0e5c7 298 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 299 aux = entradas;
matirodriguez 1:ad8aebd0e5c7 300
matirodriguez 1:ad8aebd0e5c7 301 }
matirodriguez 1:ad8aebd0e5c7 302 }
matirodriguez 1:ad8aebd0e5c7 303
matirodriguez 1:ad8aebd0e5c7 304 break;
matirodriguez 1:ad8aebd0e5c7 305
matirodriguez 1:ad8aebd0e5c7 306 case 0b1000:
matirodriguez 1:ad8aebd0e5c7 307 if(correctos[CABLE4]==NADA) {
matirodriguez 1:ad8aebd0e5c7 308 correctos[CABLE4]=CORRECTO;
matirodriguez 1:ad8aebd0e5c7 309 if(secuencia[nivel]!=CABLE4) {
matirodriguez 1:ad8aebd0e5c7 310 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 311 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 312 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 313 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 314 } else {
matirodriguez 1:ad8aebd0e5c7 315 nivel++;
matirodriguez 1:ad8aebd0e5c7 316 estado_maq_bomba = ESPERO_CABLE;
matirodriguez 1:ad8aebd0e5c7 317 aux = entradas;
matirodriguez 1:ad8aebd0e5c7 318
matirodriguez 1:ad8aebd0e5c7 319 }
matirodriguez 1:ad8aebd0e5c7 320 }
matirodriguez 1:ad8aebd0e5c7 321
matirodriguez 1:ad8aebd0e5c7 322 break;
matirodriguez 1:ad8aebd0e5c7 323 }
matirodriguez 1:ad8aebd0e5c7 324 printf("%i\n",nivel);
matirodriguez 1:ad8aebd0e5c7 325 // Si nivel es 4 significa que el jugador ganó
matirodriguez 1:ad8aebd0e5c7 326 if(nivel == 4) {
matirodriguez 1:ad8aebd0e5c7 327 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 328 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 329 fin_juego = VICTORIA;
matirodriguez 1:ad8aebd0e5c7 330 }
matirodriguez 1:ad8aebd0e5c7 331 if(fin_display == HABILITADO) {// Si el tiempo llego al final:
matirodriguez 1:ad8aebd0e5c7 332 ledrojo = 0;
matirodriguez 1:ad8aebd0e5c7 333 tiempo = 0;
matirodriguez 1:ad8aebd0e5c7 334 estado_maq_bomba = PAUSA;
matirodriguez 1:ad8aebd0e5c7 335 fin_display = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 336 fin_juego = DERROTA;
matirodriguez 1:ad8aebd0e5c7 337
matirodriguez 1:ad8aebd0e5c7 338 }
matirodriguez 1:ad8aebd0e5c7 339 break;
matirodriguez 1:ad8aebd0e5c7 340 }
matirodriguez 1:ad8aebd0e5c7 341 }
matirodriguez 1:ad8aebd0e5c7 342
matirodriguez 1:ad8aebd0e5c7 343 void MAQ_cuentareg()
matirodriguez 1:ad8aebd0e5c7 344 {
matirodriguez 1:ad8aebd0e5c7 345 int auxiliar;
matirodriguez 1:ad8aebd0e5c7 346
matirodriguez 1:ad8aebd0e5c7 347 switch(estado_maq_display) {
matirodriguez 1:ad8aebd0e5c7 348 case ESPERO_INICIO:
matirodriguez 1:ad8aebd0e5c7 349 if(hab_display == HABILITADO) { // Si se habilita, pongo el tiempo al maximo y cuento 60 segundos
matirodriguez 1:ad8aebd0e5c7 350 hab_display = DESHABILITADO;
matirodriguez 1:ad8aebd0e5c7 351 estado_maq_display = CAMBIO_DISPLAY;
matirodriguez 1:ad8aebd0e5c7 352 tiempo = 60;
matirodriguez 1:ad8aebd0e5c7 353 segundo=100;
matirodriguez 1:ad8aebd0e5c7 354 }
matirodriguez 1:ad8aebd0e5c7 355 break;
matirodriguez 1:ad8aebd0e5c7 356 case CAMBIO_DISPLAY:
matirodriguez 1:ad8aebd0e5c7 357 // Cambio el valor de los displays por el que corresponde al tiempo
matirodriguez 1:ad8aebd0e5c7 358 auxiliar = tiempo / 10;
matirodriguez 1:ad8aebd0e5c7 359 decenas = auxiliar ^ (0xF);
matirodriguez 1:ad8aebd0e5c7 360 unidades = (tiempo - auxiliar * 10) ^ (0xF);
matirodriguez 1:ad8aebd0e5c7 361
matirodriguez 1:ad8aebd0e5c7 362 if(segundo == 0) {
matirodriguez 1:ad8aebd0e5c7 363 estado_maq_display = RESTO_DISPLAY;
matirodriguez 1:ad8aebd0e5c7 364 }
matirodriguez 1:ad8aebd0e5c7 365 break;
matirodriguez 1:ad8aebd0e5c7 366 case RESTO_DISPLAY:
matirodriguez 1:ad8aebd0e5c7 367 // Cada 1 segundo resto 1 valor al tiempo
matirodriguez 1:ad8aebd0e5c7 368 // Si el tiempo es menor a 0, marco como que se terminó la cuenta
matirodriguez 1:ad8aebd0e5c7 369 tiempo--;
matirodriguez 1:ad8aebd0e5c7 370 if(tiempo < 0) {
matirodriguez 1:ad8aebd0e5c7 371 estado_maq_display = ESPERO_INICIO;
matirodriguez 1:ad8aebd0e5c7 372 fin_display = HABILITADO;
matirodriguez 1:ad8aebd0e5c7 373
matirodriguez 1:ad8aebd0e5c7 374 } else {
matirodriguez 1:ad8aebd0e5c7 375 estado_maq_display = CAMBIO_DISPLAY;
matirodriguez 1:ad8aebd0e5c7 376 segundo=100;
matirodriguez 1:ad8aebd0e5c7 377 }
matirodriguez 1:ad8aebd0e5c7 378 break;
matirodriguez 1:ad8aebd0e5c7 379 }
matirodriguez 1:ad8aebd0e5c7 380 }
matirodriguez 1:ad8aebd0e5c7 381
matirodriguez 1:ad8aebd0e5c7 382 void segundos()
matirodriguez 1:ad8aebd0e5c7 383 {
matirodriguez 1:ad8aebd0e5c7 384 segundo--;
matirodriguez 1:ad8aebd0e5c7 385 }
matirodriguez 1:ad8aebd0e5c7 386
matirodriguez 1:ad8aebd0e5c7 387
matirodriguez 0:ec6eb1da0a1c 388 void LEER_TSI()
matirodriguez 0:ec6eb1da0a1c 389 {
matirodriguez 0:ec6eb1da0a1c 390 float auxiliar = 0;
matirodriguez 0:ec6eb1da0a1c 391 auxiliar = tsi.readPercentage(); //Guardo de manera auxiliar el valor entre 0 y 1 del TSI
matirodriguez 0:ec6eb1da0a1c 392
matirodriguez 0:ec6eb1da0a1c 393 // Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1)
matirodriguez 0:ec6eb1da0a1c 394
matirodriguez 0:ec6eb1da0a1c 395 if(auxiliar >= 0) {
matirodriguez 0:ec6eb1da0a1c 396 teclado = NADA;
matirodriguez 0:ec6eb1da0a1c 397 }
matirodriguez 0:ec6eb1da0a1c 398 if((auxiliar > 0.05)&&(auxiliar <= 1)) {
matirodriguez 0:ec6eb1da0a1c 399 teclado = PULSADO;
matirodriguez 0:ec6eb1da0a1c 400 }
matirodriguez 0:ec6eb1da0a1c 401 }
matirodriguez 0:ec6eb1da0a1c 402
matirodriguez 0:ec6eb1da0a1c 403 void pulsacion_TSI()
matirodriguez 0:ec6eb1da0a1c 404 {
matirodriguez 0:ec6eb1da0a1c 405 if(var_pulsacion > 0) {
matirodriguez 0:ec6eb1da0a1c 406 var_pulsacion--;
matirodriguez 0:ec6eb1da0a1c 407 }
matirodriguez 0:ec6eb1da0a1c 408 }
matirodriguez 0:ec6eb1da0a1c 409
matirodriguez 0:ec6eb1da0a1c 410 void MAQ_lecturaTSI()
matirodriguez 0:ec6eb1da0a1c 411 {
matirodriguez 0:ec6eb1da0a1c 412 if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms:
matirodriguez 1:ad8aebd0e5c7 413
matirodriguez 0:ec6eb1da0a1c 414 var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo
matirodriguez 1:ad8aebd0e5c7 415
matirodriguez 0:ec6eb1da0a1c 416 switch(estado_maq_tsi) {
matirodriguez 0:ec6eb1da0a1c 417 case NADA:
matirodriguez 1:ad8aebd0e5c7 418 ingreso = NADA; // La variable ingreso, salvo en el caso especifico, siempre se encontrará en NADA
matirodriguez 0:ec6eb1da0a1c 419
matirodriguez 0:ec6eb1da0a1c 420 if(teclado==PULSADO) {
matirodriguez 0:ec6eb1da0a1c 421 estado_maq_tsi = PULSADO;
matirodriguez 1:ad8aebd0e5c7 422 ingreso = PULSADO; // El valor del TSI lo cambio en la transicion entre estados para asegurarme que solo se pueda leer 1 vez
matirodriguez 0:ec6eb1da0a1c 423 }
matirodriguez 0:ec6eb1da0a1c 424 break;
matirodriguez 0:ec6eb1da0a1c 425
matirodriguez 0:ec6eb1da0a1c 426 case PULSADO:
matirodriguez 0:ec6eb1da0a1c 427 if(teclado == NADA) {
matirodriguez 0:ec6eb1da0a1c 428 estado_maq_tsi = NADA;
matirodriguez 0:ec6eb1da0a1c 429 }
matirodriguez 0:ec6eb1da0a1c 430 break;
matirodriguez 0:ec6eb1da0a1c 431 }
matirodriguez 0:ec6eb1da0a1c 432 }
matirodriguez 1:ad8aebd0e5c7 433 }
matirodriguez 1:ad8aebd0e5c7 434
matirodriguez 1:ad8aebd0e5c7 435 void genero_secuencia()
matirodriguez 1:ad8aebd0e5c7 436 {
matirodriguez 1:ad8aebd0e5c7 437 int auxiliar; // Variable que voy a usar para contener un numero aleatorio
matirodriguez 1:ad8aebd0e5c7 438
matirodriguez 1:ad8aebd0e5c7 439 // Variables que uso para saber si el cable que intento establecer en la secuencia ya se usó anteriormente
matirodriguez 1:ad8aebd0e5c7 440 int cable1 = DISPONIBLE;
matirodriguez 1:ad8aebd0e5c7 441 int cable2 = DISPONIBLE;
matirodriguez 1:ad8aebd0e5c7 442 int cable3 = DISPONIBLE;
matirodriguez 1:ad8aebd0e5c7 443 int cable4 = DISPONIBLE;
matirodriguez 1:ad8aebd0e5c7 444
matirodriguez 1:ad8aebd0e5c7 445 srand(int (noise * 10000)); // Cambio la semilla de la funcion rand usando un valor de ruido en una entrada analogica al aire
matirodriguez 1:ad8aebd0e5c7 446
matirodriguez 1:ad8aebd0e5c7 447 for(int i = 0; i <=3 ; i++) { // Creo un for para recorreR las 4 posiciones de memoria del vector "secuencia[]"
matirodriguez 1:ad8aebd0e5c7 448
matirodriguez 1:ad8aebd0e5c7 449 auxiliar = rand(); //Genero un valor aleatorio y lo guardo en mi variable auxiliar
matirodriguez 1:ad8aebd0e5c7 450
matirodriguez 1:ad8aebd0e5c7 451 // Dependiendo de cuanto resto me de al dividir por 4, asignare ese valor aleatorio con un cable distinto
matirodriguez 1:ad8aebd0e5c7 452 // Si el cable que intento establecer en la secuencia se encuentra usado, resto un valor de "i" para volver a intentar
matirodriguez 1:ad8aebd0e5c7 453 // con otro valor aleatorio.
matirodriguez 1:ad8aebd0e5c7 454 // Este procedimiento se repite hasta que pueda llenar los 4 valores de la secuencia
matirodriguez 1:ad8aebd0e5c7 455
matirodriguez 1:ad8aebd0e5c7 456 if((auxiliar % 4) == 0) {
matirodriguez 1:ad8aebd0e5c7 457 if(cable1 == DISPONIBLE) {
matirodriguez 1:ad8aebd0e5c7 458 secuencia[i] = CABLE1;
matirodriguez 1:ad8aebd0e5c7 459 cable1 = USADO;
matirodriguez 1:ad8aebd0e5c7 460 } else {
matirodriguez 1:ad8aebd0e5c7 461 i--;
matirodriguez 1:ad8aebd0e5c7 462 }
matirodriguez 1:ad8aebd0e5c7 463 }
matirodriguez 1:ad8aebd0e5c7 464 if((auxiliar % 4 ) == 1) {
matirodriguez 1:ad8aebd0e5c7 465 if(cable2 == DISPONIBLE) {
matirodriguez 1:ad8aebd0e5c7 466 secuencia[i] = CABLE2;
matirodriguez 1:ad8aebd0e5c7 467 cable2 = USADO;
matirodriguez 1:ad8aebd0e5c7 468 } else {
matirodriguez 1:ad8aebd0e5c7 469 i--;
matirodriguez 1:ad8aebd0e5c7 470 }
matirodriguez 1:ad8aebd0e5c7 471 }
matirodriguez 1:ad8aebd0e5c7 472 if((auxiliar % 4 ) == 2) {
matirodriguez 1:ad8aebd0e5c7 473 if(cable3 == DISPONIBLE) {
matirodriguez 1:ad8aebd0e5c7 474 secuencia[i] = CABLE3;
matirodriguez 1:ad8aebd0e5c7 475 cable3 = USADO;
matirodriguez 1:ad8aebd0e5c7 476 } else {
matirodriguez 1:ad8aebd0e5c7 477 i--;
matirodriguez 1:ad8aebd0e5c7 478 }
matirodriguez 1:ad8aebd0e5c7 479 }
matirodriguez 1:ad8aebd0e5c7 480 if((auxiliar % 4 ) == 3) {
matirodriguez 1:ad8aebd0e5c7 481 if(cable4 == DISPONIBLE) {
matirodriguez 1:ad8aebd0e5c7 482 secuencia[i] = CABLE4;
matirodriguez 1:ad8aebd0e5c7 483 cable4 = USADO;
matirodriguez 1:ad8aebd0e5c7 484 } else {
matirodriguez 1:ad8aebd0e5c7 485 i--;
matirodriguez 1:ad8aebd0e5c7 486 }
matirodriguez 1:ad8aebd0e5c7 487 }
matirodriguez 1:ad8aebd0e5c7 488 }
matirodriguez 1:ad8aebd0e5c7 489 // Muestro la secuencia en el puerto serie
matirodriguez 1:ad8aebd0e5c7 490 for(int i = 0; i<4; i++) {
matirodriguez 1:ad8aebd0e5c7 491 printf("%i",secuencia[i]);
matirodriguez 1:ad8aebd0e5c7 492 }
matirodriguez 1:ad8aebd0e5c7 493 printf("\n");
matirodriguez 0:ec6eb1da0a1c 494 }