Gonzalo Martinez
/
TPSimon
SIMON
main.cpp@1:6cb3e90ec4f3, 2019-06-22 (annotated)
- Committer:
- gonzaloMS
- Date:
- Sat Jun 22 00:02:57 2019 +0000
- Revision:
- 1:6cb3e90ec4f3
- Parent:
- 0:31131c8fdcfb
Comentado
Who changed what in which revision?
User | Revision | Line number | New 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 |