Juan Ignacio Cobas
/
TP_SIMON_FINAL
TP 1 Ejer 2 simon Cobas, Montero
main.cpp@2:edadb31efe9b, 2019-06-06 (annotated)
- Committer:
- cobasjuan
- Date:
- Thu Jun 06 13:56:58 2019 +0000
- Revision:
- 2:edadb31efe9b
- Parent:
- 1:2ec64607a2a4
TP 1 Ej 2 simon
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cobasjuan | 0:694030aeaef8 | 1 | #include "mbed.h" |
cobasjuan | 0:694030aeaef8 | 2 | #include "tsi_sensor.h" |
cobasjuan | 0:694030aeaef8 | 3 | |
cobasjuan | 0:694030aeaef8 | 4 | /* This defines will be replaced by PinNames soon */ |
cobasjuan | 0:694030aeaef8 | 5 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
cobasjuan | 0:694030aeaef8 | 6 | #define ELEC0 9 |
cobasjuan | 0:694030aeaef8 | 7 | #define ELEC1 10 |
cobasjuan | 0:694030aeaef8 | 8 | #elif defined (TARGET_KL05Z) |
cobasjuan | 0:694030aeaef8 | 9 | #define ELEC0 9 |
cobasjuan | 0:694030aeaef8 | 10 | #define ELEC1 8 |
cobasjuan | 0:694030aeaef8 | 11 | #else |
cobasjuan | 0:694030aeaef8 | 12 | #error TARGET NOT DEFINED |
cobasjuan | 0:694030aeaef8 | 13 | #endif |
cobasjuan | 0:694030aeaef8 | 14 | |
cobasjuan | 0:694030aeaef8 | 15 | #define ESPERAR_A 300 |
cobasjuan | 0:694030aeaef8 | 16 | #define MOSTRAR 301 |
cobasjuan | 0:694030aeaef8 | 17 | #define ESPERO_JUG 302 |
cobasjuan | 0:694030aeaef8 | 18 | #define MUESTREO 303 |
cobasjuan | 0:694030aeaef8 | 19 | #define ESPERAR_B 304 |
cobasjuan | 0:694030aeaef8 | 20 | #define ESPERAR_C 305 |
cobasjuan | 0:694030aeaef8 | 21 | #define JUGANDO 306 |
cobasjuan | 2:edadb31efe9b | 22 | #define GEN_SEC 307 |
cobasjuan | 0:694030aeaef8 | 23 | |
cobasjuan | 2:edadb31efe9b | 24 | // Salidas |
cobasjuan | 0:694030aeaef8 | 25 | DigitalOut ledr(LED1); |
cobasjuan | 0:694030aeaef8 | 26 | DigitalOut ledg(LED2); |
cobasjuan | 0:694030aeaef8 | 27 | DigitalOut ledb(LED3); |
cobasjuan | 0:694030aeaef8 | 28 | |
cobasjuan | 2:edadb31efe9b | 29 | // Funciones |
cobasjuan | 0:694030aeaef8 | 30 | void GENERAL(); |
cobasjuan | 0:694030aeaef8 | 31 | void MOSTRAR_LED(); |
cobasjuan | 0:694030aeaef8 | 32 | void JUEGO(); |
cobasjuan | 0:694030aeaef8 | 33 | void PULSADORES(); |
cobasjuan | 2:edadb31efe9b | 34 | void t(); |
cobasjuan | 0:694030aeaef8 | 35 | |
cobasjuan | 2:edadb31efe9b | 36 | // Timer |
cobasjuan | 2:edadb31efe9b | 37 | Ticker timer; |
cobasjuan | 2:edadb31efe9b | 38 | |
cobasjuan | 2:edadb31efe9b | 39 | // Variables |
cobasjuan | 2:edadb31efe9b | 40 | int secuencia[20], variable=0; |
cobasjuan | 0:694030aeaef8 | 41 | int cant=0, finsec=0, n=0, P1=0, P2=0, P3=0; |
cobasjuan | 0:694030aeaef8 | 42 | int habmostrar=0, habjug=0, fin_mostrar=0, finjug=0, perdiste=0; |
cobasjuan | 0:694030aeaef8 | 43 | volatile unsigned int tiempo=100; |
cobasjuan | 0:694030aeaef8 | 44 | static int traba=0, principio=0; |
cobasjuan | 0:694030aeaef8 | 45 | |
cobasjuan | 2:edadb31efe9b | 46 | // Entradas |
cobasjuan | 0:694030aeaef8 | 47 | TSIAnalogSlider tsi(ELEC0, ELEC1, 40); |
cobasjuan | 0:694030aeaef8 | 48 | |
cobasjuan | 0:694030aeaef8 | 49 | int main() |
cobasjuan | 0:694030aeaef8 | 50 | { |
cobasjuan | 0:694030aeaef8 | 51 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 52 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 53 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 54 | timer.attach(&t,0.01); |
cobasjuan | 0:694030aeaef8 | 55 | while(1) { |
cobasjuan | 2:edadb31efe9b | 56 | variable++; // SEMILLA |
cobasjuan | 0:694030aeaef8 | 57 | GENERAL(); |
cobasjuan | 0:694030aeaef8 | 58 | MOSTRAR_LED(); |
cobasjuan | 0:694030aeaef8 | 59 | JUEGO(); |
cobasjuan | 0:694030aeaef8 | 60 | PULSADORES(); |
cobasjuan | 0:694030aeaef8 | 61 | } |
cobasjuan | 0:694030aeaef8 | 62 | } |
cobasjuan | 0:694030aeaef8 | 63 | |
cobasjuan | 0:694030aeaef8 | 64 | |
cobasjuan | 2:edadb31efe9b | 65 | void GENERAL() // Maquina de estados: funcionamiento general del programa |
cobasjuan | 0:694030aeaef8 | 66 | { |
cobasjuan | 0:694030aeaef8 | 67 | static int paso_a=ESPERAR_A; |
cobasjuan | 0:694030aeaef8 | 68 | switch(paso_a) { |
cobasjuan | 2:edadb31efe9b | 69 | case ESPERAR_A: // RESET |
cobasjuan | 0:694030aeaef8 | 70 | habmostrar=0; |
cobasjuan | 0:694030aeaef8 | 71 | habjug=0; |
cobasjuan | 0:694030aeaef8 | 72 | fin_mostrar=0; |
cobasjuan | 0:694030aeaef8 | 73 | finjug=0; |
cobasjuan | 0:694030aeaef8 | 74 | perdiste=0; |
cobasjuan | 0:694030aeaef8 | 75 | cant=0; |
cobasjuan | 0:694030aeaef8 | 76 | principio=0; |
cobasjuan | 2:edadb31efe9b | 77 | if((P1 == 1 || P2 == 1 || P3 == 1) && traba == 0) { // Con que el TSI detecte algo alcanza para comenzar el juego |
cobasjuan | 0:694030aeaef8 | 78 | traba=1; |
cobasjuan | 2:edadb31efe9b | 79 | paso_a=GEN_SEC; |
cobasjuan | 0:694030aeaef8 | 80 | principio++; |
cobasjuan | 0:694030aeaef8 | 81 | printf("Inicio del juego\n\r"); |
cobasjuan | 0:694030aeaef8 | 82 | } |
cobasjuan | 0:694030aeaef8 | 83 | break; |
cobasjuan | 2:edadb31efe9b | 84 | case GEN_SEC: // Genero una secuencia aleatoria |
cobasjuan | 2:edadb31efe9b | 85 | srand(variable); |
cobasjuan | 2:edadb31efe9b | 86 | secuencia[cant]=(rand() % 3); |
cobasjuan | 2:edadb31efe9b | 87 | paso_a=MOSTRAR; |
cobasjuan | 2:edadb31efe9b | 88 | break; |
cobasjuan | 2:edadb31efe9b | 89 | case MOSTRAR: // Habilito la maquina de estados de muestreo |
cobasjuan | 0:694030aeaef8 | 90 | habmostrar=1; |
cobasjuan | 0:694030aeaef8 | 91 | finjug=0; |
cobasjuan | 0:694030aeaef8 | 92 | if(fin_mostrar==1) { |
cobasjuan | 0:694030aeaef8 | 93 | paso_a=ESPERO_JUG; |
cobasjuan | 0:694030aeaef8 | 94 | } |
cobasjuan | 0:694030aeaef8 | 95 | break; |
cobasjuan | 2:edadb31efe9b | 96 | case ESPERO_JUG: // Habilito la maquina de estados de juego |
cobasjuan | 0:694030aeaef8 | 97 | habjug=1; |
cobasjuan | 0:694030aeaef8 | 98 | fin_mostrar=0; |
cobasjuan | 2:edadb31efe9b | 99 | if(finjug==1) { // Si se levanto el flag de final de jugada incremento el nivel |
cobasjuan | 0:694030aeaef8 | 100 | cant++; |
cobasjuan | 2:edadb31efe9b | 101 | if(cant == 24){ // Si el juego llega al nivel 24 termina |
cobasjuan | 1:2ec64607a2a4 | 102 | printf("Ganaste!\n\r"); |
cobasjuan | 1:2ec64607a2a4 | 103 | paso_a=ESPERAR_A; |
cobasjuan | 1:2ec64607a2a4 | 104 | } |
cobasjuan | 1:2ec64607a2a4 | 105 | else |
cobasjuan | 2:edadb31efe9b | 106 | paso_a=GEN_SEC; |
cobasjuan | 0:694030aeaef8 | 107 | } |
cobasjuan | 2:edadb31efe9b | 108 | if(perdiste==1) { // Si se levanta el flag de partida perdida reinicio el juego |
cobasjuan | 0:694030aeaef8 | 109 | paso_a=ESPERAR_A; |
cobasjuan | 0:694030aeaef8 | 110 | } |
cobasjuan | 0:694030aeaef8 | 111 | break; |
cobasjuan | 0:694030aeaef8 | 112 | } |
cobasjuan | 0:694030aeaef8 | 113 | } |
cobasjuan | 0:694030aeaef8 | 114 | |
cobasjuan | 0:694030aeaef8 | 115 | |
cobasjuan | 2:edadb31efe9b | 116 | void MOSTRAR_LED() // Maquina de estados: muestreo de la secuencia de leds a seguir |
cobasjuan | 0:694030aeaef8 | 117 | { |
cobasjuan | 0:694030aeaef8 | 118 | static int paso_b=ESPERAR_B; |
cobasjuan | 0:694030aeaef8 | 119 | switch(paso_b) { |
cobasjuan | 0:694030aeaef8 | 120 | case ESPERAR_B: |
cobasjuan | 0:694030aeaef8 | 121 | if(habmostrar==1) { |
cobasjuan | 0:694030aeaef8 | 122 | paso_b=MUESTREO; |
cobasjuan | 0:694030aeaef8 | 123 | } |
cobasjuan | 0:694030aeaef8 | 124 | break; |
cobasjuan | 2:edadb31efe9b | 125 | case MUESTREO: |
cobasjuan | 2:edadb31efe9b | 126 | if(finsec==0) { // Muestra un valor n de la secuencia un determinado tiempo, se apaga un determinado tiempo e incrementa n |
cobasjuan | 0:694030aeaef8 | 127 | if (tiempo == 0) { |
cobasjuan | 0:694030aeaef8 | 128 | if(cant < n) { |
cobasjuan | 0:694030aeaef8 | 129 | finsec=1; |
cobasjuan | 2:edadb31efe9b | 130 | } else if(secuencia[n]== 0) { |
cobasjuan | 0:694030aeaef8 | 131 | ledr=0; |
cobasjuan | 0:694030aeaef8 | 132 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 133 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 134 | printf("LED_ROJO\n\r"); |
cobasjuan | 2:edadb31efe9b | 135 | } else if(secuencia[n]== 1) { |
cobasjuan | 0:694030aeaef8 | 136 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 137 | ledg=0; |
cobasjuan | 0:694030aeaef8 | 138 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 139 | printf("LED_VERDE\n\r"); |
cobasjuan | 2:edadb31efe9b | 140 | } else if(secuencia[n]== 2) { |
cobasjuan | 0:694030aeaef8 | 141 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 142 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 143 | ledb=0; |
cobasjuan | 0:694030aeaef8 | 144 | printf("LED_AZUL\n\r"); |
cobasjuan | 0:694030aeaef8 | 145 | } |
cobasjuan | 0:694030aeaef8 | 146 | tiempo = 130; |
cobasjuan | 0:694030aeaef8 | 147 | n++; |
cobasjuan | 0:694030aeaef8 | 148 | } |
cobasjuan | 2:edadb31efe9b | 149 | if(tiempo == 40) { // Se apaga un determinado tiempo para diferenciar en caso de ser dos veces el mismo color |
cobasjuan | 0:694030aeaef8 | 150 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 151 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 152 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 153 | } |
cobasjuan | 2:edadb31efe9b | 154 | } else if(finsec==1) { // Muestreo finalizado |
cobasjuan | 0:694030aeaef8 | 155 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 156 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 157 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 158 | fin_mostrar=1; |
cobasjuan | 0:694030aeaef8 | 159 | habmostrar=0; |
cobasjuan | 0:694030aeaef8 | 160 | paso_b=ESPERAR_B; |
cobasjuan | 0:694030aeaef8 | 161 | } |
cobasjuan | 0:694030aeaef8 | 162 | break; |
cobasjuan | 0:694030aeaef8 | 163 | } |
cobasjuan | 0:694030aeaef8 | 164 | } |
cobasjuan | 0:694030aeaef8 | 165 | |
cobasjuan | 0:694030aeaef8 | 166 | |
cobasjuan | 2:edadb31efe9b | 167 | void JUEGO() // Maquina de estados: se compara lo que presiona el jugador con la secuencia generada |
cobasjuan | 0:694030aeaef8 | 168 | { |
cobasjuan | 0:694030aeaef8 | 169 | static int paso_c=ESPERAR_C; |
cobasjuan | 0:694030aeaef8 | 170 | switch(paso_c) { |
cobasjuan | 0:694030aeaef8 | 171 | case ESPERAR_C: |
cobasjuan | 0:694030aeaef8 | 172 | if(habjug==1) { |
cobasjuan | 0:694030aeaef8 | 173 | paso_c=JUGANDO; |
cobasjuan | 0:694030aeaef8 | 174 | n=0; |
cobasjuan | 0:694030aeaef8 | 175 | finsec=0; |
cobasjuan | 0:694030aeaef8 | 176 | } |
cobasjuan | 0:694030aeaef8 | 177 | break; |
cobasjuan | 0:694030aeaef8 | 178 | case JUGANDO: |
cobasjuan | 0:694030aeaef8 | 179 | if(finsec == 0) { |
cobasjuan | 2:edadb31efe9b | 180 | if((P1 == 1 || P2 == 1 || P3 == 1) && traba == 0) { // Se espera a que se presione el TSI para no comparar todo el tiempo |
cobasjuan | 0:694030aeaef8 | 181 | traba=1; |
cobasjuan | 2:edadb31efe9b | 182 | if((secuencia[n] == 0 && P1 == 1) || (secuencia[n] == 1 && P2 == 1) || (secuencia[n] == 2 && P3 == 1)) { // Comparo lo que se presiono con la secuencia |
cobasjuan | 2:edadb31efe9b | 183 | n++; // Si coincide incremento |
cobasjuan | 2:edadb31efe9b | 184 | } else { // Si difiere levanto el flag de partida perdida |
cobasjuan | 0:694030aeaef8 | 185 | printf("Game Over\n\r"); |
cobasjuan | 0:694030aeaef8 | 186 | perdiste=1; |
cobasjuan | 0:694030aeaef8 | 187 | principio=0; |
cobasjuan | 0:694030aeaef8 | 188 | habjug=0; |
cobasjuan | 0:694030aeaef8 | 189 | break; |
cobasjuan | 0:694030aeaef8 | 190 | } |
cobasjuan | 2:edadb31efe9b | 191 | if(cant < n) { // Si termino la secuencia y todas las comparaciones fueron coincidentes levanto el flag de final de secuencia |
cobasjuan | 0:694030aeaef8 | 192 | finsec=1; |
cobasjuan | 0:694030aeaef8 | 193 | printf("Enhorabuena!\n\r"); |
cobasjuan | 0:694030aeaef8 | 194 | } |
cobasjuan | 0:694030aeaef8 | 195 | } |
cobasjuan | 2:edadb31efe9b | 196 | } else if(finsec == 1) { // Si se levanto el flag de final de secuencia levanto el flag de final de jugada |
cobasjuan | 0:694030aeaef8 | 197 | finjug=1; |
cobasjuan | 0:694030aeaef8 | 198 | habjug=0; |
cobasjuan | 0:694030aeaef8 | 199 | paso_c=ESPERAR_C; |
cobasjuan | 0:694030aeaef8 | 200 | } |
cobasjuan | 0:694030aeaef8 | 201 | break; |
cobasjuan | 0:694030aeaef8 | 202 | |
cobasjuan | 0:694030aeaef8 | 203 | } |
cobasjuan | 0:694030aeaef8 | 204 | } |
cobasjuan | 0:694030aeaef8 | 205 | |
cobasjuan | 0:694030aeaef8 | 206 | |
cobasjuan | 0:694030aeaef8 | 207 | void t() |
cobasjuan | 0:694030aeaef8 | 208 | { |
cobasjuan | 0:694030aeaef8 | 209 | if (tiempo > 0) |
cobasjuan | 0:694030aeaef8 | 210 | tiempo--; |
cobasjuan | 0:694030aeaef8 | 211 | } |
cobasjuan | 0:694030aeaef8 | 212 | |
cobasjuan | 0:694030aeaef8 | 213 | |
cobasjuan | 2:edadb31efe9b | 214 | void PULSADORES() // Separacion del TSI en pulsadores |
cobasjuan | 0:694030aeaef8 | 215 | { |
cobasjuan | 0:694030aeaef8 | 216 | static int lectura=0, color=0; |
cobasjuan | 2:edadb31efe9b | 217 | float valor=tsi.readPercentage(); // Leo el TSI una vez y lo guardo en una variable para no leerlo reiteradas veces |
cobasjuan | 0:694030aeaef8 | 218 | if(tiempo == 0) { |
cobasjuan | 2:edadb31efe9b | 219 | tiempo=3; // Tiempo de retardo para no leer todo el tiempo |
cobasjuan | 2:edadb31efe9b | 220 | if(valor != 0 && lectura == 0) { // la variable lectura se encarga de detectar el flanco para no leer distintos valores de un mismo pulso |
cobasjuan | 0:694030aeaef8 | 221 | lectura=1; |
cobasjuan | 0:694030aeaef8 | 222 | if(valor > 0.37 && valor < 0.73) { |
cobasjuan | 0:694030aeaef8 | 223 | P2=1; |
cobasjuan | 0:694030aeaef8 | 224 | } else if(valor <= 0.33) { |
cobasjuan | 0:694030aeaef8 | 225 | P1=1; |
cobasjuan | 0:694030aeaef8 | 226 | } else if(valor >= 0.77) { |
cobasjuan | 0:694030aeaef8 | 227 | P3=1; |
cobasjuan | 0:694030aeaef8 | 228 | } |
cobasjuan | 0:694030aeaef8 | 229 | } else if( valor == 0 && lectura == 1) { |
cobasjuan | 0:694030aeaef8 | 230 | ledr=1; |
cobasjuan | 0:694030aeaef8 | 231 | ledg=1; |
cobasjuan | 0:694030aeaef8 | 232 | ledb=1; |
cobasjuan | 0:694030aeaef8 | 233 | traba=0; |
cobasjuan | 0:694030aeaef8 | 234 | color=0; |
cobasjuan | 0:694030aeaef8 | 235 | lectura=0; |
cobasjuan | 0:694030aeaef8 | 236 | P1=0; |
cobasjuan | 0:694030aeaef8 | 237 | P2=0; |
cobasjuan | 0:694030aeaef8 | 238 | P3=0; |
cobasjuan | 0:694030aeaef8 | 239 | } |
cobasjuan | 0:694030aeaef8 | 240 | if(valor != 0 && principio > 0 && color == 0) { |
cobasjuan | 0:694030aeaef8 | 241 | color=1; |
cobasjuan | 0:694030aeaef8 | 242 | if(valor > 0.37 && valor < 0.73) { |
cobasjuan | 0:694030aeaef8 | 243 | printf("Tocaste el color VERDE\n\r"); |
cobasjuan | 0:694030aeaef8 | 244 | ledg=0; |
cobasjuan | 0:694030aeaef8 | 245 | } else if(valor <= 0.33) { |
cobasjuan | 0:694030aeaef8 | 246 | printf("Tocaste el color ROJO\n\r"); |
cobasjuan | 0:694030aeaef8 | 247 | ledr=0; |
cobasjuan | 0:694030aeaef8 | 248 | } else if(valor >= 0.77) { |
cobasjuan | 0:694030aeaef8 | 249 | printf("Tocaste el color AZUL\n\r"); |
cobasjuan | 0:694030aeaef8 | 250 | ledb=0; |
cobasjuan | 0:694030aeaef8 | 251 | } |
cobasjuan | 0:694030aeaef8 | 252 | } |
cobasjuan | 0:694030aeaef8 | 253 | } |
cobasjuan | 0:694030aeaef8 | 254 | } |