SIMON

Dependencies:   mbed tsi_sensor

Committer:
gonzaloMS
Date:
Sat Jun 22 00:02:57 2019 +0000
Revision:
1:6cb3e90ec4f3
Parent:
0:31131c8fdcfb
Comentado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gonzaloMS 0:31131c8fdcfb 1 #include "mbed.h"
gonzaloMS 0:31131c8fdcfb 2
gonzaloMS 1:6cb3e90ec4f3 3 //Creo los estados
gonzaloMS 1:6cb3e90ec4f3 4 enum{MUESTRA,MUESTRA2,NO_MUESTRA,NO_MUESTRA2,NO_INGRESA,INGRESA,ESPERA,FIN,LEE,APAGA,AGUARDA};
gonzaloMS 1:6cb3e90ec4f3 5 // |--------------------------------------|-----------------------------|-----------------|
gonzaloMS 1:6cb3e90ec4f3 6 // GENERACIÓN DE SECUENCIA CONFIRMACIÓN PULSADORES
gonzaloMS 0:31131c8fdcfb 7
gonzaloMS 1:6cb3e90ec4f3 8 //Defino la cantidad máxima de elementos
gonzaloMS 1:6cb3e90ec4f3 9 const int MaxElem=24;
gonzaloMS 0:31131c8fdcfb 10
gonzaloMS 1:6cb3e90ec4f3 11 //Defino como salidas el led RGB en los tres colores, Red, Green y Blue
gonzaloMS 0:31131c8fdcfb 12 DigitalOut ledR(LED1);
gonzaloMS 0:31131c8fdcfb 13 DigitalOut ledG(LED2);
gonzaloMS 0:31131c8fdcfb 14 DigitalOut ledB(LED3);
gonzaloMS 0:31131c8fdcfb 15
gonzaloMS 1:6cb3e90ec4f3 16 //Defino como entradas los 3 pulsadores (para Red, Green y Blue) y el pulsador para el reseteo
gonzaloMS 1:6cb3e90ec4f3 17 DigitalIn E1r(D2); //Pulsador para el color Rojo (R)
gonzaloMS 1:6cb3e90ec4f3 18 DigitalIn E2r(D3); //Pulsador para el color Verde (G)
gonzaloMS 1:6cb3e90ec4f3 19 DigitalIn E3r(D4); //Pulsador para el color Azul (B)
gonzaloMS 0:31131c8fdcfb 20 DigitalIn reseteo(D5);
gonzaloMS 0:31131c8fdcfb 21
gonzaloMS 1:6cb3e90ec4f3 22 //Variables donde guardo los valores de las entradas de los 3 colores
gonzaloMS 1:6cb3e90ec4f3 23 int E1; // <-- E1r
gonzaloMS 1:6cb3e90ec4f3 24 int E2; // <-- E2r
gonzaloMS 1:6cb3e90ec4f3 25 int E3; // <-- E3r
gonzaloMS 1:6cb3e90ec4f3 26
gonzaloMS 1:6cb3e90ec4f3 27 //Creo los tickers
gonzaloMS 0:31131c8fdcfb 28 Ticker pantalla;
gonzaloMS 1:6cb3e90ec4f3 29 Ticker mostrarLeds;
gonzaloMS 0:31131c8fdcfb 30 Ticker Interludio;
gonzaloMS 0:31131c8fdcfb 31
gonzaloMS 1:6cb3e90ec4f3 32 //Las funciones de cada ticker respectivamente
gonzaloMS 1:6cb3e90ec4f3 33 void visualizaTexto(); //Muestra en el Hercules los datos cada vez que se entra a la función
gonzaloMS 1:6cb3e90ec4f3 34 void visualizaSecuencia(); //Hace que, cada cierto tiempo, se prenda el led correspondiente a la parte de la secuencia en la que está
gonzaloMS 1:6cb3e90ec4f3 35 void tiempoLedsOn(); //Define básicamente cuánto tiempo quedan prendidos los leds antes de apagarse otra vez para esperar el próx.color o botón presionado
gonzaloMS 1:6cb3e90ec4f3 36
gonzaloMS 1:6cb3e90ec4f3 37 //Función encargada del reseteo de todas las variables y volver al estado inicial de cada máquina de estados
gonzaloMS 1:6cb3e90ec4f3 38 void reset();
gonzaloMS 0:31131c8fdcfb 39
gonzaloMS 1:6cb3e90ec4f3 40 //Funciones que son las máquinas de estados
gonzaloMS 1:6cb3e90ec4f3 41 void detectorPulsado(); //Detecta qué botón de los 3 de colores tocaste quitando el rebote
gonzaloMS 1:6cb3e90ec4f3 42 void generadorSecuencia(); //Genera la secuencia
gonzaloMS 1:6cb3e90ec4f3 43 void confirmacion(); //Confirma si lo ingresado con los pulsadores corresponde con la secuencia
gonzaloMS 0:31131c8fdcfb 44
gonzaloMS 1:6cb3e90ec4f3 45 //Variables que indican los estados de las máquinas de estados
gonzaloMS 1:6cb3e90ec4f3 46 int estadosPulsadores;
gonzaloMS 0:31131c8fdcfb 47 int estadosSecuencia;
gonzaloMS 0:31131c8fdcfb 48 int estadosConfirm;
gonzaloMS 0:31131c8fdcfb 49
gonzaloMS 0:31131c8fdcfb 50
gonzaloMS 0:31131c8fdcfb 51 int vecR[MaxElem];
gonzaloMS 0:31131c8fdcfb 52 int vecG[MaxElem];
gonzaloMS 0:31131c8fdcfb 53 int vecB[MaxElem];
gonzaloMS 0:31131c8fdcfb 54 int vecE1[MaxElem];
gonzaloMS 0:31131c8fdcfb 55 int vecE2[MaxElem];
gonzaloMS 0:31131c8fdcfb 56 int vecE3[MaxElem];
gonzaloMS 0:31131c8fdcfb 57
gonzaloMS 1:6cb3e90ec4f3 58 //Variable que determina si se tiene que generar una nueva secuencia o no (Habilita Generación)
gonzaloMS 1:6cb3e90ec4f3 59 int HG;
gonzaloMS 1:6cb3e90ec4f3 60 //Variable que indica la Cantidad Total de posiciones de la secuencia
gonzaloMS 1:6cb3e90ec4f3 61 int CT=0;
gonzaloMS 1:6cb3e90ec4f3 62 //Variable que indica en cuál de las posiciones de la secuencia está en el momento (Estado Parcial)
gonzaloMS 1:6cb3e90ec4f3 63 int EP;
gonzaloMS 1:6cb3e90ec4f3 64 //Variable que guarda un número random del cuál depende cuál color se va a guardar en esa posición de la secuencia
gonzaloMS 1:6cb3e90ec4f3 65 int LED;
gonzaloMS 1:6cb3e90ec4f3 66
gonzaloMS 1:6cb3e90ec4f3 67 //Variables que cuentan diferentes cosas
gonzaloMS 1:6cb3e90ec4f3 68 int iSecuencia=0; //Posición de la secuencia para generar la secuencia
gonzaloMS 1:6cb3e90ec4f3 69 int iIngresado=0; //Cantidad de veces que algo fue ingresado mediante los pulsadores
gonzaloMS 1:6cb3e90ec4f3 70 int iCorrecto=0; //Cantidad de veces que lo ingresado fue correcto / coincide con la secuencia
gonzaloMS 1:6cb3e90ec4f3 71 int iChequeo=0; //Posición para chequear si lo ingresado fue correcto / coincide con la secuencia
gonzaloMS 1:6cb3e90ec4f3 72 int iMuestra=0; //Posición para mostrar la secuencia en los leds
gonzaloMS 1:6cb3e90ec4f3 73
gonzaloMS 1:6cb3e90ec4f3 74 //Variables que sirven para eliminar el rebote de los pulsadores y detectar solo el flanco ascendente
gonzaloMS 1:6cb3e90ec4f3 75 int mantieneRojo=0;
gonzaloMS 1:6cb3e90ec4f3 76 int mantieneVerde=0;
gonzaloMS 1:6cb3e90ec4f3 77 int mantieneAzul=0;
gonzaloMS 1:6cb3e90ec4f3 78
gonzaloMS 1:6cb3e90ec4f3 79 //Variable que indica si se tienen que mostrar los printf o no en el Hercules
gonzaloMS 1:6cb3e90ec4f3 80 int print=0;
gonzaloMS 1:6cb3e90ec4f3 81 //Variable que, según su valor, indica si los leds tienen que estar apagados o mantener su estado
gonzaloMS 1:6cb3e90ec4f3 82 int decideLedOff=0;
gonzaloMS 1:6cb3e90ec4f3 83
gonzaloMS 1:6cb3e90ec4f3 84 //Variables que se usan para pasar por las posiciones de los vectores cuando estos se tienen que reiniciar o se quiere mostrar la secuencia en el Hercules
gonzaloMS 1:6cb3e90ec4f3 85 int j;
gonzaloMS 1:6cb3e90ec4f3 86 int w;
gonzaloMS 1:6cb3e90ec4f3 87 int p;
gonzaloMS 1:6cb3e90ec4f3 88
gonzaloMS 1:6cb3e90ec4f3 89 //Variable que indica si se tienen que prender los leds con respecto a las posiciones de la secuencia
gonzaloMS 1:6cb3e90ec4f3 90 int doSec=0;
gonzaloMS 0:31131c8fdcfb 91
gonzaloMS 0:31131c8fdcfb 92 int main(void) {
gonzaloMS 1:6cb3e90ec4f3 93 //Configuro en modo Pull-Up las 4 entradas con pulsadores
gonzaloMS 1:6cb3e90ec4f3 94 E1r.mode(PullUp);
gonzaloMS 1:6cb3e90ec4f3 95 E2r.mode(PullUp);
gonzaloMS 1:6cb3e90ec4f3 96 E3r.mode(PullUp);
gonzaloMS 0:31131c8fdcfb 97 reseteo.mode(PullUp);
gonzaloMS 1:6cb3e90ec4f3 98 //Apago los leds
gonzaloMS 0:31131c8fdcfb 99 ledR=1;
gonzaloMS 0:31131c8fdcfb 100 ledG=1;
gonzaloMS 0:31131c8fdcfb 101 ledB=1;
gonzaloMS 1:6cb3e90ec4f3 102 //Asigno las funciones a los tickers
gonzaloMS 1:6cb3e90ec4f3 103 pantalla.attach(&visualizaTexto,1); //Se ejecuta visualizaTexto cada 1 segundo
gonzaloMS 1:6cb3e90ec4f3 104 mostrarLeds.attach(&visualizaSecuencia,0.6); //Se ejecuta visualizaSecuencia cada 0,6 segundos
gonzaloMS 1:6cb3e90ec4f3 105 Interludio.attach(&tiempoLedsOn,0.2); //Se ejecuta tiempoLedsOn cada 0,2 segundos
gonzaloMS 1:6cb3e90ec4f3 106 while(true) {
gonzaloMS 1:6cb3e90ec4f3 107 //Llamo a la función reset todo el tiempo
gonzaloMS 1:6cb3e90ec4f3 108 reset();
gonzaloMS 1:6cb3e90ec4f3 109 //Si la cantidad total de elementos de una secuencia todavía no pasó el máximo permitido, se ejecutan las funciones y muestran los printf
gonzaloMS 1:6cb3e90ec4f3 110 //Sino, se para todo y se indica al jugador que debe apretar el botón reset para empezar de nuevo
gonzaloMS 0:31131c8fdcfb 111 if(CT<=MaxElem)
gonzaloMS 0:31131c8fdcfb 112 {
gonzaloMS 1:6cb3e90ec4f3 113 detectorPulsado();
gonzaloMS 1:6cb3e90ec4f3 114 confirmacion();
gonzaloMS 1:6cb3e90ec4f3 115 generadorSecuencia();
gonzaloMS 0:31131c8fdcfb 116 if(print==1)
gonzaloMS 0:31131c8fdcfb 117 {
gonzaloMS 0:31131c8fdcfb 118 printf("Cant. Total Secuencia:%d \n",CT);
gonzaloMS 1:6cb3e90ec4f3 119 printf("Cant. Total de veces Ingresado:%d \n",iIngresado);
gonzaloMS 1:6cb3e90ec4f3 120 printf("Cant. Total de veces que fue correcto lo ingresado:%d \n",iCorrecto);
gonzaloMS 0:31131c8fdcfb 121 printf("Secuencia a lograr: \n");
gonzaloMS 1:6cb3e90ec4f3 122 printf("R G B \n");
gonzaloMS 0:31131c8fdcfb 123 for(p=0;p<=(CT-1);p++)
gonzaloMS 0:31131c8fdcfb 124 {
gonzaloMS 0:31131c8fdcfb 125 if(CT==MaxElem+1)
gonzaloMS 0:31131c8fdcfb 126 {
gonzaloMS 0:31131c8fdcfb 127 break;
gonzaloMS 0:31131c8fdcfb 128 }
gonzaloMS 0:31131c8fdcfb 129 printf("%d %d %d \n",vecR[p],vecG[p],vecB[p]);
gonzaloMS 0:31131c8fdcfb 130 }
gonzaloMS 0:31131c8fdcfb 131 printf("\n \n");
gonzaloMS 0:31131c8fdcfb 132 print=0;
gonzaloMS 0:31131c8fdcfb 133 }
gonzaloMS 0:31131c8fdcfb 134 }
gonzaloMS 0:31131c8fdcfb 135 else
gonzaloMS 0:31131c8fdcfb 136 {
gonzaloMS 1:6cb3e90ec4f3 137 if(print==1)
gonzaloMS 0:31131c8fdcfb 138 {
gonzaloMS 0:31131c8fdcfb 139 printf("Por favor, empiece otra vez \n");
gonzaloMS 1:6cb3e90ec4f3 140 print=0;
gonzaloMS 0:31131c8fdcfb 141 }
gonzaloMS 0:31131c8fdcfb 142 }
gonzaloMS 0:31131c8fdcfb 143 }
gonzaloMS 0:31131c8fdcfb 144 }
gonzaloMS 0:31131c8fdcfb 145
gonzaloMS 1:6cb3e90ec4f3 146 void reset()
gonzaloMS 0:31131c8fdcfb 147 {
gonzaloMS 1:6cb3e90ec4f3 148 //Resetea todas las variables, los vectores y vuelve a los estados iniciales de las máquinas de estados
gonzaloMS 1:6cb3e90ec4f3 149 if(reseteo==0)
gonzaloMS 1:6cb3e90ec4f3 150 {
gonzaloMS 1:6cb3e90ec4f3 151 for(j=0;j<MaxElem;j++)
gonzaloMS 1:6cb3e90ec4f3 152 {
gonzaloMS 1:6cb3e90ec4f3 153 vecR[j]=0;
gonzaloMS 1:6cb3e90ec4f3 154 vecG[j]=0;
gonzaloMS 1:6cb3e90ec4f3 155 vecB[j]=0;
gonzaloMS 1:6cb3e90ec4f3 156 vecE1[j]=0;
gonzaloMS 1:6cb3e90ec4f3 157 vecE2[j]=0;
gonzaloMS 1:6cb3e90ec4f3 158 vecE3[j]=0;
gonzaloMS 1:6cb3e90ec4f3 159 }
gonzaloMS 1:6cb3e90ec4f3 160 CT=0;
gonzaloMS 1:6cb3e90ec4f3 161 HG=0;
gonzaloMS 1:6cb3e90ec4f3 162 EP=0;
gonzaloMS 1:6cb3e90ec4f3 163 doSec=0;
gonzaloMS 1:6cb3e90ec4f3 164 decideLedOff=0;
gonzaloMS 1:6cb3e90ec4f3 165 print=0;
gonzaloMS 1:6cb3e90ec4f3 166 LED=0;
gonzaloMS 1:6cb3e90ec4f3 167 mantieneRojo=0;
gonzaloMS 1:6cb3e90ec4f3 168 mantieneVerde=0;
gonzaloMS 1:6cb3e90ec4f3 169 mantieneAzul=0;
gonzaloMS 1:6cb3e90ec4f3 170 iSecuencia=0;
gonzaloMS 1:6cb3e90ec4f3 171 iIngresado=0;
gonzaloMS 1:6cb3e90ec4f3 172 iCorrecto=0;
gonzaloMS 1:6cb3e90ec4f3 173 iChequeo=0;
gonzaloMS 1:6cb3e90ec4f3 174 estadosSecuencia=NO_MUESTRA;
gonzaloMS 1:6cb3e90ec4f3 175 estadosConfirm=NO_INGRESA;
gonzaloMS 1:6cb3e90ec4f3 176 }
gonzaloMS 1:6cb3e90ec4f3 177 }
gonzaloMS 1:6cb3e90ec4f3 178
gonzaloMS 1:6cb3e90ec4f3 179 void visualizaTexto()
gonzaloMS 1:6cb3e90ec4f3 180 {
gonzaloMS 1:6cb3e90ec4f3 181 //Cada 1 segundo, esto se pone en 1 para mostrar los printf. Al instante se vuelve 0 y deja de mostrar los printf, esperando que se vuelva a llamar a la función
gonzaloMS 0:31131c8fdcfb 182 print=1;
gonzaloMS 0:31131c8fdcfb 183 }
gonzaloMS 0:31131c8fdcfb 184
gonzaloMS 1:6cb3e90ec4f3 185 void visualizaSecuencia()
gonzaloMS 1:6cb3e90ec4f3 186 {
gonzaloMS 1:6cb3e90ec4f3 187 //Cada 0,6 segundos, la variable se hace 1. Cuando llegue la parte de mostrar la secuencia, la variable se va a hacer 0 y va a esperar a que se llame a la función otra vez
gonzaloMS 1:6cb3e90ec4f3 188 doSec=1;
gonzaloMS 1:6cb3e90ec4f3 189 }
gonzaloMS 1:6cb3e90ec4f3 190
gonzaloMS 1:6cb3e90ec4f3 191 void tiempoLedsOn()
gonzaloMS 0:31131c8fdcfb 192 {
gonzaloMS 1:6cb3e90ec4f3 193 //Cada 0,2 segundos, se le suma 1 a la variable y, cada vez que es par, apaga los leds sin importar sus estados anteriores
gonzaloMS 1:6cb3e90ec4f3 194 if(decideLedOff%2==0)
gonzaloMS 0:31131c8fdcfb 195 {
gonzaloMS 0:31131c8fdcfb 196 ledR=1;
gonzaloMS 0:31131c8fdcfb 197 ledG=1;
gonzaloMS 0:31131c8fdcfb 198 ledB=1;
gonzaloMS 0:31131c8fdcfb 199 }
gonzaloMS 1:6cb3e90ec4f3 200 decideLedOff++;
gonzaloMS 0:31131c8fdcfb 201 }
gonzaloMS 1:6cb3e90ec4f3 202
gonzaloMS 1:6cb3e90ec4f3 203 void detectorPulsado()
gonzaloMS 0:31131c8fdcfb 204 {
gonzaloMS 1:6cb3e90ec4f3 205 switch(estadosPulsadores)
gonzaloMS 1:6cb3e90ec4f3 206 {
gonzaloMS 1:6cb3e90ec4f3 207 default:
gonzaloMS 1:6cb3e90ec4f3 208 case LEE:
gonzaloMS 1:6cb3e90ec4f3 209 //Espera a que se toque el pulsador de rojo
gonzaloMS 1:6cb3e90ec4f3 210 //Si es así guarda eso en los vectores, pone la variable E1 en 1, suma 1 a iIngresado y prende el led rojo, que va a ser apagado por la función tiempoLedsOn
gonzaloMS 1:6cb3e90ec4f3 211 //También se pone en 1 la variable mantieneRojo que es un indicador del estado anterior
gonzaloMS 1:6cb3e90ec4f3 212 //Cambia el estado a APAGA
gonzaloMS 1:6cb3e90ec4f3 213 if(E1r==0 && mantieneRojo==0)
gonzaloMS 1:6cb3e90ec4f3 214 {
gonzaloMS 1:6cb3e90ec4f3 215 E1=1;
gonzaloMS 1:6cb3e90ec4f3 216 mantieneRojo=1;
gonzaloMS 1:6cb3e90ec4f3 217 vecE1[iIngresado]=1;
gonzaloMS 1:6cb3e90ec4f3 218 vecE2[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 219 vecE3[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 220 ledR=0;
gonzaloMS 1:6cb3e90ec4f3 221 iIngresado++;
gonzaloMS 1:6cb3e90ec4f3 222 estadosPulsadores=APAGA;
gonzaloMS 1:6cb3e90ec4f3 223 }
gonzaloMS 1:6cb3e90ec4f3 224 //Espera a que se toque el pulsador de Verde
gonzaloMS 1:6cb3e90ec4f3 225 //Si es así guarda eso en los vectores, pone la variable E2 en 1, suma 1 a iIngresado y prende el led verde, que va a ser apagado por la función tiempoLedsOn
gonzaloMS 1:6cb3e90ec4f3 226 //También se pone en 1 la variable mantieneVerde que es un indicador del estado anterior
gonzaloMS 1:6cb3e90ec4f3 227 //Cambia el estado a APAGA
gonzaloMS 1:6cb3e90ec4f3 228 if(E2r==0 && mantieneVerde==0)
gonzaloMS 1:6cb3e90ec4f3 229 {
gonzaloMS 1:6cb3e90ec4f3 230 E2=1;
gonzaloMS 1:6cb3e90ec4f3 231 mantieneVerde=1;
gonzaloMS 1:6cb3e90ec4f3 232 vecE1[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 233 vecE2[iIngresado]=1;
gonzaloMS 1:6cb3e90ec4f3 234 vecE3[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 235 ledG=0;
gonzaloMS 1:6cb3e90ec4f3 236 iIngresado++;
gonzaloMS 1:6cb3e90ec4f3 237 estadosPulsadores=APAGA;
gonzaloMS 1:6cb3e90ec4f3 238 }
gonzaloMS 1:6cb3e90ec4f3 239 //Espera a que se toque el pulsador de Azul
gonzaloMS 1:6cb3e90ec4f3 240 //Si es así guarda eso en los vectores, pone la variable E3 en 1, suma 1 a iIngresado y prende el led verde, que va a ser apagado por la función tiempoLedsOn
gonzaloMS 1:6cb3e90ec4f3 241 //También se pone en 1 la variable mantieneAzul que es un indicador del estado anterior
gonzaloMS 1:6cb3e90ec4f3 242 //Cambia el estado a APAGA
gonzaloMS 1:6cb3e90ec4f3 243 if(E3r==0 && mantieneAzul==0)
gonzaloMS 1:6cb3e90ec4f3 244 {
gonzaloMS 1:6cb3e90ec4f3 245 E3=1;
gonzaloMS 1:6cb3e90ec4f3 246 mantieneAzul=1;
gonzaloMS 1:6cb3e90ec4f3 247 vecE1[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 248 vecE2[iIngresado]=0;
gonzaloMS 1:6cb3e90ec4f3 249 vecE3[iIngresado]=1;
gonzaloMS 1:6cb3e90ec4f3 250 ledB=0;
gonzaloMS 1:6cb3e90ec4f3 251 iIngresado++;
gonzaloMS 1:6cb3e90ec4f3 252 estadosPulsadores=APAGA;
gonzaloMS 1:6cb3e90ec4f3 253 }
gonzaloMS 1:6cb3e90ec4f3 254 break;
gonzaloMS 1:6cb3e90ec4f3 255
gonzaloMS 1:6cb3e90ec4f3 256 case APAGA:
gonzaloMS 1:6cb3e90ec4f3 257 //Si el pulsador de uno de los colores se mantiene pulsado y ya pasó por el estado anterior, E1 se vuelve 0 (E1 va a estar en 1 por muy poco tiempo)
gonzaloMS 1:6cb3e90ec4f3 258 //Se pasa al estado AGUARDA
gonzaloMS 1:6cb3e90ec4f3 259 if(E1r==0 && mantieneRojo==1)
gonzaloMS 1:6cb3e90ec4f3 260 {
gonzaloMS 1:6cb3e90ec4f3 261 E1=0;
gonzaloMS 1:6cb3e90ec4f3 262 estadosPulsadores=AGUARDA;
gonzaloMS 1:6cb3e90ec4f3 263 }
gonzaloMS 1:6cb3e90ec4f3 264 //Si el pulsador de uno de los colores se mantiene pulsado y ya pasó por el estado anterior, E2 se vuelve 0 (E2 va a estar en 1 por muy poco tiempo)
gonzaloMS 1:6cb3e90ec4f3 265 //Se pasa al estado AGUARDA
gonzaloMS 1:6cb3e90ec4f3 266 if(E2r==0 && mantieneVerde==1)
gonzaloMS 1:6cb3e90ec4f3 267 {
gonzaloMS 1:6cb3e90ec4f3 268 E2=0;
gonzaloMS 1:6cb3e90ec4f3 269 estadosPulsadores=AGUARDA;
gonzaloMS 1:6cb3e90ec4f3 270 }
gonzaloMS 1:6cb3e90ec4f3 271 //Si el pulsador de uno de los colores se mantiene pulsado y ya pasó por el estado anterior, E3 se vuelve 0 (E3 va a estar en 1 por muy poco tiempo)
gonzaloMS 1:6cb3e90ec4f3 272 //Se pasa al estado AGUARDA
gonzaloMS 1:6cb3e90ec4f3 273 if(E3r==0 && mantieneAzul==1)
gonzaloMS 1:6cb3e90ec4f3 274 {
gonzaloMS 1:6cb3e90ec4f3 275 E3=0;
gonzaloMS 1:6cb3e90ec4f3 276 estadosPulsadores=AGUARDA;
gonzaloMS 1:6cb3e90ec4f3 277 }
gonzaloMS 1:6cb3e90ec4f3 278 break;
gonzaloMS 1:6cb3e90ec4f3 279
gonzaloMS 1:6cb3e90ec4f3 280 case AGUARDA:
gonzaloMS 1:6cb3e90ec4f3 281 //Si ya se tocó el pulsador una vez y ahora se suelta, el E se mantiene como estaba, se indica con la otra variable que terminó el proceso y vuelve al estado LEE
gonzaloMS 1:6cb3e90ec4f3 282 if(E1r==1 && mantieneRojo==1)
gonzaloMS 1:6cb3e90ec4f3 283 {
gonzaloMS 1:6cb3e90ec4f3 284 E1=0;
gonzaloMS 1:6cb3e90ec4f3 285 mantieneRojo=0;
gonzaloMS 1:6cb3e90ec4f3 286 estadosPulsadores=LEE;
gonzaloMS 1:6cb3e90ec4f3 287 }
gonzaloMS 1:6cb3e90ec4f3 288 if(E2r==1 && mantieneVerde==1)
gonzaloMS 1:6cb3e90ec4f3 289 {
gonzaloMS 1:6cb3e90ec4f3 290 E2=0;
gonzaloMS 1:6cb3e90ec4f3 291 mantieneVerde=0;
gonzaloMS 1:6cb3e90ec4f3 292 estadosPulsadores=LEE;
gonzaloMS 1:6cb3e90ec4f3 293 }
gonzaloMS 1:6cb3e90ec4f3 294 if(E3r==1 && mantieneAzul==1)
gonzaloMS 1:6cb3e90ec4f3 295 {
gonzaloMS 1:6cb3e90ec4f3 296 E3=0;
gonzaloMS 1:6cb3e90ec4f3 297 mantieneAzul=0;
gonzaloMS 1:6cb3e90ec4f3 298 estadosPulsadores=LEE;
gonzaloMS 1:6cb3e90ec4f3 299 }
gonzaloMS 1:6cb3e90ec4f3 300 break;
gonzaloMS 1:6cb3e90ec4f3 301 }
gonzaloMS 0:31131c8fdcfb 302 }
gonzaloMS 0:31131c8fdcfb 303
gonzaloMS 0:31131c8fdcfb 304 void confirmacion(){
gonzaloMS 0:31131c8fdcfb 305 switch(estadosConfirm)
gonzaloMS 0:31131c8fdcfb 306 {
gonzaloMS 0:31131c8fdcfb 307 default:
gonzaloMS 0:31131c8fdcfb 308 case NO_INGRESA:
gonzaloMS 1:6cb3e90ec4f3 309 //Se reinicia el contenido de los vectores de entrada, así cuando completás una secuencia tenés que escribir toda la que sigue desde cero
gonzaloMS 1:6cb3e90ec4f3 310 //El contenido de los vectores de secuencia, que guardan los colores y su posición en la secuencia, no se reinicia porque es parte del juego que la secuencia
gonzaloMS 1:6cb3e90ec4f3 311 //siguiente siempre es igual que la anterior solo que con un color random más agregado al final
gonzaloMS 0:31131c8fdcfb 312 for(w=0;w<MaxElem;w++)
gonzaloMS 0:31131c8fdcfb 313 {
gonzaloMS 0:31131c8fdcfb 314 vecE1[w]=0;
gonzaloMS 0:31131c8fdcfb 315 vecE2[w]=0;
gonzaloMS 0:31131c8fdcfb 316 vecE3[w]=0;
gonzaloMS 0:31131c8fdcfb 317 }
gonzaloMS 1:6cb3e90ec4f3 318 //Se reinician los indicadores cuando completás una secuencia
gonzaloMS 1:6cb3e90ec4f3 319 iIngresado=0;
gonzaloMS 1:6cb3e90ec4f3 320 iChequeo=0;
gonzaloMS 1:6cb3e90ec4f3 321 iCorrecto=0;
gonzaloMS 1:6cb3e90ec4f3 322 //Se habilita la generación de una nueva secuencia
gonzaloMS 0:31131c8fdcfb 323 HG=1;
gonzaloMS 1:6cb3e90ec4f3 324 //Se pasa directamente al siguiente estado
gonzaloMS 0:31131c8fdcfb 325 estadosConfirm=ESPERA;
gonzaloMS 0:31131c8fdcfb 326 break;
gonzaloMS 0:31131c8fdcfb 327
gonzaloMS 0:31131c8fdcfb 328 case INGRESA:
gonzaloMS 1:6cb3e90ec4f3 329 //Se le suma 1 a iChequeo para que la proxima vez que se ingrese algo lo verifique con la siguiente posición de la secuencia
gonzaloMS 1:6cb3e90ec4f3 330 iChequeo++;
gonzaloMS 1:6cb3e90ec4f3 331 //Pasa directamente a ESPERA
gonzaloMS 0:31131c8fdcfb 332 estadosConfirm=ESPERA;
gonzaloMS 0:31131c8fdcfb 333 break;
gonzaloMS 0:31131c8fdcfb 334
gonzaloMS 0:31131c8fdcfb 335 case ESPERA:
gonzaloMS 1:6cb3e90ec4f3 336 //Automáticamente se deshabilita la generación
gonzaloMS 0:31131c8fdcfb 337 HG=0;
gonzaloMS 1:6cb3e90ec4f3 338 //Si no se ingresa nada mediante los pulsadores, queda en ESPERA
gonzaloMS 0:31131c8fdcfb 339 if(E1==0 && E2==0 && E3==0)
gonzaloMS 0:31131c8fdcfb 340 {
gonzaloMS 0:31131c8fdcfb 341 estadosConfirm=ESPERA;
gonzaloMS 0:31131c8fdcfb 342 }
gonzaloMS 1:6cb3e90ec4f3 343 //Si se ingresa algo, se fija si esa posición concuerda con la misma posición de la secuencia
gonzaloMS 1:6cb3e90ec4f3 344 //De ser correcto, va a INGRESA
gonzaloMS 1:6cb3e90ec4f3 345 //De ser incorrecto, el jugador perdió cambia el estado a FIN
gonzaloMS 0:31131c8fdcfb 346 else
gonzaloMS 0:31131c8fdcfb 347 {
gonzaloMS 1:6cb3e90ec4f3 348 if(iCorrecto!=CT)
gonzaloMS 0:31131c8fdcfb 349 {
gonzaloMS 1:6cb3e90ec4f3 350 if((vecR[iChequeo]==vecE1[iChequeo]) && (vecG[iChequeo]==vecE2[iChequeo]) && (vecB[iChequeo]==vecE3[iChequeo]))
gonzaloMS 0:31131c8fdcfb 351 {
gonzaloMS 1:6cb3e90ec4f3 352 iCorrecto++;
gonzaloMS 0:31131c8fdcfb 353 estadosConfirm=INGRESA;
gonzaloMS 0:31131c8fdcfb 354 }
gonzaloMS 0:31131c8fdcfb 355 else
gonzaloMS 0:31131c8fdcfb 356 {
gonzaloMS 1:6cb3e90ec4f3 357 estadosConfirm=FIN;
gonzaloMS 0:31131c8fdcfb 358 }
gonzaloMS 0:31131c8fdcfb 359 }
gonzaloMS 0:31131c8fdcfb 360 }
gonzaloMS 1:6cb3e90ec4f3 361 //Si se ingresó toda la secuencia correctamente, vuelve al estado inicial NO_INGRESA donde se va a habilitar una nueva generación y reiniciar variables
gonzaloMS 1:6cb3e90ec4f3 362 if(iCorrecto==CT)
gonzaloMS 0:31131c8fdcfb 363 {
gonzaloMS 0:31131c8fdcfb 364 estadosConfirm=NO_INGRESA;
gonzaloMS 0:31131c8fdcfb 365 }
gonzaloMS 0:31131c8fdcfb 366 break;
gonzaloMS 0:31131c8fdcfb 367
gonzaloMS 1:6cb3e90ec4f3 368 case FIN:
gonzaloMS 1:6cb3e90ec4f3 369 //En caso de perder, se hace que CT sea mayor a la máxima cantidad de elementos posibles, condición en la que se termina el juego y espera el reseteo
gonzaloMS 0:31131c8fdcfb 370 CT=MaxElem+1;
gonzaloMS 0:31131c8fdcfb 371 break;
gonzaloMS 0:31131c8fdcfb 372 }
gonzaloMS 0:31131c8fdcfb 373 }
gonzaloMS 0:31131c8fdcfb 374 void generadorSecuencia(){
gonzaloMS 0:31131c8fdcfb 375 switch(estadosSecuencia)
gonzaloMS 0:31131c8fdcfb 376 {
gonzaloMS 0:31131c8fdcfb 377 default:
gonzaloMS 0:31131c8fdcfb 378 case NO_MUESTRA:
gonzaloMS 1:6cb3e90ec4f3 379 //La variable LED empieza en 0, que no hace nada
gonzaloMS 1:6cb3e90ec4f3 380 LED=0;
gonzaloMS 1:6cb3e90ec4f3 381 //Si se habilitó la generación de una secuencia, pasa al siguiente estado, NO_MUESTRA2
gonzaloMS 1:6cb3e90ec4f3 382 //Sino, se queda en este estado
gonzaloMS 1:6cb3e90ec4f3 383 if(HG==0)
gonzaloMS 1:6cb3e90ec4f3 384 {
gonzaloMS 1:6cb3e90ec4f3 385 estadosSecuencia=NO_MUESTRA;
gonzaloMS 1:6cb3e90ec4f3 386 }
gonzaloMS 1:6cb3e90ec4f3 387 else
gonzaloMS 1:6cb3e90ec4f3 388 {
gonzaloMS 1:6cb3e90ec4f3 389 estadosSecuencia=NO_MUESTRA2;
gonzaloMS 1:6cb3e90ec4f3 390 }
gonzaloMS 1:6cb3e90ec4f3 391 break;
gonzaloMS 0:31131c8fdcfb 392
gonzaloMS 0:31131c8fdcfb 393 case NO_MUESTRA2:
gonzaloMS 1:6cb3e90ec4f3 394 //De ser habilitada la generación de una nueva secuencia, se le suma 1 a la cantidad total de elementos/posiciones que va a tener la secuencia
gonzaloMS 1:6cb3e90ec4f3 395 //CT empieza en 0, cuando se habilita la generación, CT pasa a ser 1, entonces dentro de la secuencia solo va a haber un color random
gonzaloMS 1:6cb3e90ec4f3 396 //Cuando se toque bien ese color, vuelve a generar una secuencia, solo que ahora va a hacer CT++ otra vez y la secuencia va a constar de 2 colores random
gonzaloMS 0:31131c8fdcfb 397 CT++;
gonzaloMS 1:6cb3e90ec4f3 398 //Pasa a MUESTRA directamente
gonzaloMS 0:31131c8fdcfb 399 estadosSecuencia=MUESTRA;
gonzaloMS 0:31131c8fdcfb 400 break;
gonzaloMS 0:31131c8fdcfb 401
gonzaloMS 0:31131c8fdcfb 402 case MUESTRA:
gonzaloMS 1:6cb3e90ec4f3 403 //Si el estado parcial en que se encuentra no es último de la secuencia, hace que LED sea un número random entre 1 y 3
gonzaloMS 1:6cb3e90ec4f3 404 //Basado en eso decide que color corresponde a ese estado parcial/posición de la secuencia
gonzaloMS 1:6cb3e90ec4f3 405 //Eso lo guarda en los vectores de secuencia, que tienen qué color corresponde a qué posición
gonzaloMS 1:6cb3e90ec4f3 406 //EP empieza en 0 y solo se reinicia en el reset, de manera que siempre se va a añadir un color random al final de la secuencia anterior para hacer la nueva
gonzaloMS 1:6cb3e90ec4f3 407 if(EP!=CT)
gonzaloMS 1:6cb3e90ec4f3 408 {
gonzaloMS 1:6cb3e90ec4f3 409 LED=rand()%3+1;
gonzaloMS 1:6cb3e90ec4f3 410 if(LED==1)
gonzaloMS 1:6cb3e90ec4f3 411 {
gonzaloMS 1:6cb3e90ec4f3 412 vecR[iSecuencia]=1;
gonzaloMS 1:6cb3e90ec4f3 413 vecG[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 414 vecB[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 415 }
gonzaloMS 1:6cb3e90ec4f3 416 else if(LED==2)
gonzaloMS 1:6cb3e90ec4f3 417 {
gonzaloMS 1:6cb3e90ec4f3 418 vecR[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 419 vecG[iSecuencia]=1;
gonzaloMS 1:6cb3e90ec4f3 420 vecB[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 421 }
gonzaloMS 1:6cb3e90ec4f3 422 else if(LED==3)
gonzaloMS 0:31131c8fdcfb 423 {
gonzaloMS 1:6cb3e90ec4f3 424 vecR[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 425 vecG[iSecuencia]=0;
gonzaloMS 1:6cb3e90ec4f3 426 vecB[iSecuencia]=1;
gonzaloMS 1:6cb3e90ec4f3 427 }
gonzaloMS 1:6cb3e90ec4f3 428 if(iSecuencia<CT)
gonzaloMS 1:6cb3e90ec4f3 429 {
gonzaloMS 1:6cb3e90ec4f3 430 iSecuencia++;
gonzaloMS 0:31131c8fdcfb 431 }
gonzaloMS 1:6cb3e90ec4f3 432 EP++;
gonzaloMS 1:6cb3e90ec4f3 433 }
gonzaloMS 1:6cb3e90ec4f3 434 //Al hacerlo una vez, EP pasa a ser igual que CT, por lo que cambia al estado MUESTRA2 y espera a que el proceso se vuelva a hacer para que CT valga más que EP
gonzaloMS 1:6cb3e90ec4f3 435 //(En el estado anterior con CT++)
gonzaloMS 1:6cb3e90ec4f3 436 else
gonzaloMS 1:6cb3e90ec4f3 437 {
gonzaloMS 1:6cb3e90ec4f3 438 estadosSecuencia=MUESTRA2;
gonzaloMS 1:6cb3e90ec4f3 439 }
gonzaloMS 1:6cb3e90ec4f3 440 break;
gonzaloMS 0:31131c8fdcfb 441
gonzaloMS 1:6cb3e90ec4f3 442 case MUESTRA2:
gonzaloMS 1:6cb3e90ec4f3 443 //Cada 1 segundo que doSec se hace 1 y pasa a ser 0 instantáneamente, los leds se prenden con respecto a la secuencia generada (guardada en los vectores)
gonzaloMS 1:6cb3e90ec4f3 444 //Se apagan con la funcion tiempoLedsOn
gonzaloMS 1:6cb3e90ec4f3 445 //El estado de los leds es igual a lo que contiene la posición del vector -negado- porque los leds se prenden con 0, no con 1
gonzaloMS 1:6cb3e90ec4f3 446 //Los vectores guardan con 1 los leds que se tienen que prender
gonzaloMS 1:6cb3e90ec4f3 447 //Cuando se muestra toda la secuencia en los leds, se reinicia iMuestra y vuelve al estado inicial NO_MUESTRA
gonzaloMS 1:6cb3e90ec4f3 448 if(doSec==1)
gonzaloMS 1:6cb3e90ec4f3 449 {
gonzaloMS 1:6cb3e90ec4f3 450 //La secuencia se guarda desde la posición 0 de los vectores. La primera secuencia se hace con CT=1. Por eso el CT-1
gonzaloMS 0:31131c8fdcfb 451 if(iMuestra<=CT-1)
gonzaloMS 0:31131c8fdcfb 452 {
gonzaloMS 0:31131c8fdcfb 453 ledR=!vecR[iMuestra];
gonzaloMS 0:31131c8fdcfb 454 ledG=!vecG[iMuestra];
gonzaloMS 0:31131c8fdcfb 455 ledB=!vecB[iMuestra];
gonzaloMS 0:31131c8fdcfb 456 iMuestra++;
gonzaloMS 0:31131c8fdcfb 457 }
gonzaloMS 0:31131c8fdcfb 458 else
gonzaloMS 0:31131c8fdcfb 459 {
gonzaloMS 0:31131c8fdcfb 460 iMuestra=0;
gonzaloMS 0:31131c8fdcfb 461 estadosSecuencia=NO_MUESTRA;
gonzaloMS 0:31131c8fdcfb 462 }
gonzaloMS 1:6cb3e90ec4f3 463 doSec=0;
gonzaloMS 1:6cb3e90ec4f3 464 }
gonzaloMS 1:6cb3e90ec4f3 465 break;
gonzaloMS 0:31131c8fdcfb 466 }
gonzaloMS 0:31131c8fdcfb 467 }
gonzaloMS 0:31131c8fdcfb 468