TP1 Ej 3 Bomba Cobas, Montero

Dependencies:   mbed tsi_sensor

Committer:
cobasjuan
Date:
Thu Jun 06 13:58:23 2019 +0000
Revision:
1:d99665a519ed
Parent:
0:9d8c86972a9d
TP 1 Ej 3 Bomba

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cobasjuan 0:9d8c86972a9d 1 #include "mbed.h"
cobasjuan 0:9d8c86972a9d 2 #include "tsi_sensor.h"
cobasjuan 0:9d8c86972a9d 3
cobasjuan 0:9d8c86972a9d 4 /* This defines will be replaced by PinNames soon */
cobasjuan 0:9d8c86972a9d 5 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
cobasjuan 0:9d8c86972a9d 6 #define ELEC0 9
cobasjuan 0:9d8c86972a9d 7 #define ELEC1 10
cobasjuan 0:9d8c86972a9d 8 #elif defined (TARGET_KL05Z)
cobasjuan 0:9d8c86972a9d 9 #define ELEC0 9
cobasjuan 0:9d8c86972a9d 10 #define ELEC1 8
cobasjuan 0:9d8c86972a9d 11 #else
cobasjuan 0:9d8c86972a9d 12 #error TARGET NOT DEFINED
cobasjuan 0:9d8c86972a9d 13 #endif
cobasjuan 0:9d8c86972a9d 14
cobasjuan 0:9d8c86972a9d 15 #define ESPERO_ARRANQUE 0
cobasjuan 0:9d8c86972a9d 16 #define COMPARO_CABLES 1
cobasjuan 0:9d8c86972a9d 17 #define GANA 2
cobasjuan 0:9d8c86972a9d 18 #define PIERDE 3
cobasjuan 0:9d8c86972a9d 19 #define ESPERO_CABLES 4
cobasjuan 0:9d8c86972a9d 20 #define COMPARACION 5
cobasjuan 1:d99665a519ed 21 #define GEN_SEC 6
cobasjuan 0:9d8c86972a9d 22
cobasjuan 0:9d8c86972a9d 23 // Funciones
cobasjuan 0:9d8c86972a9d 24 void CABLES();
cobasjuan 0:9d8c86972a9d 25 void MAQUINA_GENERAL();
cobasjuan 1:d99665a519ed 26 void CONTADOR();
cobasjuan 1:d99665a519ed 27 void displays();
cobasjuan 1:d99665a519ed 28 void t();
cobasjuan 1:d99665a519ed 29
cobasjuan 0:9d8c86972a9d 30 //Timer
cobasjuan 0:9d8c86972a9d 31 Ticker timer;
cobasjuan 1:d99665a519ed 32
cobasjuan 0:9d8c86972a9d 33 //Salidas
cobasjuan 0:9d8c86972a9d 34 DigitalOut ledr(LED1);
cobasjuan 0:9d8c86972a9d 35 DigitalOut ledg(LED2);
cobasjuan 0:9d8c86972a9d 36 DigitalOut ledb(LED3);
cobasjuan 1:d99665a519ed 37 BusOut Unidades (PTE5,PTE4,PTE3,PTE2);
cobasjuan 1:d99665a519ed 38 BusOut Decenas (PTB11,PTB10,PTB9,PTB8);
cobasjuan 1:d99665a519ed 39
cobasjuan 1:d99665a519ed 40 //Entradas
cobasjuan 0:9d8c86972a9d 41 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
cobasjuan 1:d99665a519ed 42 DigitalIn C1(A1);
cobasjuan 1:d99665a519ed 43 DigitalIn C2(A2);
cobasjuan 1:d99665a519ed 44 DigitalIn C3(A3);
cobasjuan 1:d99665a519ed 45 DigitalIn C4(A4);
cobasjuan 0:9d8c86972a9d 46
cobasjuan 0:9d8c86972a9d 47 // Variables
cobasjuan 1:d99665a519ed 48 volatile unsigned int tiempo=0;
cobasjuan 1:d99665a519ed 49 unsigned int n=0, habcables=0, gen=0, perdiste=0, finsec=0, reed_time=0, segundos=20, fin_tiempo=0;
cobasjuan 1:d99665a519ed 50 unsigned int variacion=0;
cobasjuan 1:d99665a519ed 51 unsigned int uni=0, dec=0;
cobasjuan 1:d99665a519ed 52 int vector[4];
cobasjuan 1:d99665a519ed 53 int jugador[4];
cobasjuan 1:d99665a519ed 54
cobasjuan 0:9d8c86972a9d 55 int main(void)
cobasjuan 0:9d8c86972a9d 56 {
cobasjuan 1:d99665a519ed 57 C1.mode(PullUp); // Le seteo PullUp a las entradas de los cables para que cuando esten al aire detecte un 1
cobasjuan 1:d99665a519ed 58 C2.mode(PullUp);
cobasjuan 1:d99665a519ed 59 C3.mode(PullUp);
cobasjuan 1:d99665a519ed 60 C4.mode(PullUp);
cobasjuan 0:9d8c86972a9d 61 ledg=1;
cobasjuan 0:9d8c86972a9d 62 ledr=1;
cobasjuan 0:9d8c86972a9d 63 ledb=1;
cobasjuan 0:9d8c86972a9d 64 timer.attach(&t,0.01);
cobasjuan 0:9d8c86972a9d 65 while (true) {
cobasjuan 1:d99665a519ed 66 gen++; // SEMILLA
cobasjuan 0:9d8c86972a9d 67 CABLES();
cobasjuan 0:9d8c86972a9d 68 MAQUINA_GENERAL();
cobasjuan 1:d99665a519ed 69 CONTADOR();
cobasjuan 1:d99665a519ed 70 displays();
cobasjuan 0:9d8c86972a9d 71 }
cobasjuan 0:9d8c86972a9d 72 }
cobasjuan 0:9d8c86972a9d 73
cobasjuan 0:9d8c86972a9d 74
cobasjuan 1:d99665a519ed 75 void MAQUINA_GENERAL() // Maquina de estados: funcionamiento general del programa
cobasjuan 0:9d8c86972a9d 76 {
cobasjuan 0:9d8c86972a9d 77 static unsigned int paso_general=ESPERO_ARRANQUE;
cobasjuan 1:d99665a519ed 78 unsigned int num=0;
cobasjuan 0:9d8c86972a9d 79 switch(paso_general) {
cobasjuan 1:d99665a519ed 80 case ESPERO_ARRANQUE: // RESET
cobasjuan 0:9d8c86972a9d 81 n=0;
cobasjuan 0:9d8c86972a9d 82 tiempo=0;
cobasjuan 1:d99665a519ed 83 num=0;
cobasjuan 1:d99665a519ed 84 variacion=0;
cobasjuan 0:9d8c86972a9d 85 perdiste=0;
cobasjuan 0:9d8c86972a9d 86 if(tsi.readPercentage() != 0) {
cobasjuan 1:d99665a519ed 87 paso_general=GEN_SEC;
cobasjuan 1:d99665a519ed 88 printf("Comienzo\n\r");
cobasjuan 0:9d8c86972a9d 89 }
cobasjuan 0:9d8c86972a9d 90 break;
cobasjuan 1:d99665a519ed 91 case GEN_SEC: // Genero una secuencia aleatoria encargandome de que no se repitan
cobasjuan 1:d99665a519ed 92 for(num=0; num<4; num++) {
cobasjuan 1:d99665a519ed 93 srand(++gen);
cobasjuan 1:d99665a519ed 94 vector[num]=1+rand()%4;
cobasjuan 1:d99665a519ed 95 if(num==1) {
cobasjuan 1:d99665a519ed 96 while(vector[1]==vector[0]) {
cobasjuan 1:d99665a519ed 97 srand(++gen);
cobasjuan 1:d99665a519ed 98 vector[1]=1+rand()%4;
cobasjuan 1:d99665a519ed 99 }
cobasjuan 1:d99665a519ed 100 } else if(num==2) {
cobasjuan 1:d99665a519ed 101 while(vector[2]==vector[1]|| vector[2]==vector[0]) {
cobasjuan 1:d99665a519ed 102 srand(++gen);
cobasjuan 1:d99665a519ed 103 vector[2]=1+rand()%4;
cobasjuan 1:d99665a519ed 104 }
cobasjuan 1:d99665a519ed 105 } else if(num==3) {
cobasjuan 1:d99665a519ed 106 while(vector[3]==vector[2]|| vector[3]==vector[1] || vector[3]==vector[0]) {
cobasjuan 1:d99665a519ed 107 srand(++gen);
cobasjuan 1:d99665a519ed 108 vector[3]=1+rand()%4;
cobasjuan 1:d99665a519ed 109 }
cobasjuan 1:d99665a519ed 110 }
cobasjuan 1:d99665a519ed 111 printf("%d\r\n", vector[num]);
cobasjuan 1:d99665a519ed 112 }
cobasjuan 1:d99665a519ed 113 paso_general=COMPARO_CABLES;
cobasjuan 1:d99665a519ed 114 break;
cobasjuan 1:d99665a519ed 115 case COMPARO_CABLES: // Habilito la maquina de estados de comparacion de cables con secuencia
cobasjuan 0:9d8c86972a9d 116 habcables=1;
cobasjuan 1:d99665a519ed 117 if(perdiste == 1 || fin_tiempo==1) { //Si se levanta el flag de perdida paso al caso "PIERDE"
cobasjuan 1:d99665a519ed 118 perdiste=0;
cobasjuan 1:d99665a519ed 119 printf("Perdiste\r\n");
cobasjuan 1:d99665a519ed 120 tiempo=150;
cobasjuan 0:9d8c86972a9d 121 paso_general=PIERDE;
cobasjuan 0:9d8c86972a9d 122 }
cobasjuan 1:d99665a519ed 123 if(finsec == 1) { //Si se levanta el flag de perdida paso al caso "GANA"
cobasjuan 1:d99665a519ed 124 finsec=0;
cobasjuan 1:d99665a519ed 125 printf("Ganaste\r\n");
cobasjuan 1:d99665a519ed 126 tiempo=150;
cobasjuan 0:9d8c86972a9d 127 paso_general=GANA;
cobasjuan 0:9d8c86972a9d 128 }
cobasjuan 0:9d8c86972a9d 129 break;
cobasjuan 1:d99665a519ed 130 case GANA: // Enciendo el led verde y titilo displays hasta reiniciar el juego
cobasjuan 1:d99665a519ed 131 ledg=0;
cobasjuan 1:d99665a519ed 132 if(tiempo == 100) {
cobasjuan 1:d99665a519ed 133 Unidades=uni;
cobasjuan 1:d99665a519ed 134 Decenas=dec;
cobasjuan 1:d99665a519ed 135 }
cobasjuan 1:d99665a519ed 136 if(tiempo == 50) {
cobasjuan 1:d99665a519ed 137 Unidades=15;
cobasjuan 1:d99665a519ed 138 Decenas=15;
cobasjuan 1:d99665a519ed 139 }
cobasjuan 1:d99665a519ed 140 if(tiempo == 0) {
cobasjuan 1:d99665a519ed 141 tiempo=120;
cobasjuan 1:d99665a519ed 142 }
cobasjuan 1:d99665a519ed 143 if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) {
cobasjuan 1:d99665a519ed 144 n=0;
cobasjuan 0:9d8c86972a9d 145 ledg=1;
cobasjuan 1:d99665a519ed 146 tiempo=0;
cobasjuan 1:d99665a519ed 147 perdiste=0;
cobasjuan 1:d99665a519ed 148 finsec=0;
cobasjuan 1:d99665a519ed 149 fin_tiempo=0;
cobasjuan 1:d99665a519ed 150 segundos=20;
cobasjuan 1:d99665a519ed 151 num=0;
cobasjuan 1:d99665a519ed 152 variacion=0;
cobasjuan 1:d99665a519ed 153 paso_general=GEN_SEC;
cobasjuan 1:d99665a519ed 154 printf("Comienzo\n\r");
cobasjuan 0:9d8c86972a9d 155 }
cobasjuan 0:9d8c86972a9d 156 break;
cobasjuan 1:d99665a519ed 157 case PIERDE: // Titilo el led rojo y los displays hasta reiniciar el juego
cobasjuan 1:d99665a519ed 158 if(tiempo == 100) {
cobasjuan 1:d99665a519ed 159 ledr=0;
cobasjuan 1:d99665a519ed 160 Unidades=uni;
cobasjuan 1:d99665a519ed 161 Decenas=dec;
cobasjuan 1:d99665a519ed 162 }
cobasjuan 1:d99665a519ed 163 if(tiempo == 50) {
cobasjuan 1:d99665a519ed 164 ledr=1;
cobasjuan 1:d99665a519ed 165 Unidades=15;
cobasjuan 1:d99665a519ed 166 Decenas=15;
cobasjuan 1:d99665a519ed 167 }
cobasjuan 1:d99665a519ed 168 if(tiempo == 0) {
cobasjuan 1:d99665a519ed 169 tiempo=120;
cobasjuan 1:d99665a519ed 170 }
cobasjuan 1:d99665a519ed 171 if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) {
cobasjuan 1:d99665a519ed 172 n=0;
cobasjuan 1:d99665a519ed 173 ledg=1;
cobasjuan 1:d99665a519ed 174 ledr=1;
cobasjuan 1:d99665a519ed 175 tiempo=0;
cobasjuan 1:d99665a519ed 176 perdiste=0;
cobasjuan 1:d99665a519ed 177 finsec=0;
cobasjuan 1:d99665a519ed 178 fin_tiempo=0;
cobasjuan 1:d99665a519ed 179 segundos=20;
cobasjuan 1:d99665a519ed 180 num=0;
cobasjuan 1:d99665a519ed 181 variacion=0;
cobasjuan 1:d99665a519ed 182 paso_general=GEN_SEC;
cobasjuan 1:d99665a519ed 183 printf("Comienzo\n\r");
cobasjuan 1:d99665a519ed 184 }
cobasjuan 0:9d8c86972a9d 185 break;
cobasjuan 0:9d8c86972a9d 186 }
cobasjuan 0:9d8c86972a9d 187 }
cobasjuan 0:9d8c86972a9d 188
cobasjuan 0:9d8c86972a9d 189
cobasjuan 1:d99665a519ed 190 void CABLES() // Maquina de estados: comparo la secuencia generada con el cable desconectado
cobasjuan 0:9d8c86972a9d 191 {
cobasjuan 0:9d8c86972a9d 192 static unsigned int paso_cables=ESPERO_CABLES;
cobasjuan 1:d99665a519ed 193 static unsigned int fail=0, bloqueo_cable1=0, bloqueo_cable2=0, bloqueo_cable3=0, bloqueo_cable4=0;
cobasjuan 0:9d8c86972a9d 194 switch(paso_cables) {
cobasjuan 0:9d8c86972a9d 195 case ESPERO_CABLES:
cobasjuan 0:9d8c86972a9d 196 if(habcables == 1) {
cobasjuan 0:9d8c86972a9d 197 paso_cables=COMPARACION;
cobasjuan 0:9d8c86972a9d 198 }
cobasjuan 0:9d8c86972a9d 199 break;
cobasjuan 1:d99665a519ed 200 case COMPARACION: // Si se desconecta un cable se levanta un flag de variacion y se bloquea ese cable para que no se vuelva a detectar
cobasjuan 1:d99665a519ed 201 if(C1 == 1 && bloqueo_cable1 == 0) {
cobasjuan 1:d99665a519ed 202 bloqueo_cable1=1;
cobasjuan 1:d99665a519ed 203 variacion=1;
cobasjuan 1:d99665a519ed 204 jugador[n]=1;
cobasjuan 1:d99665a519ed 205 } else if(C2 == 1 && bloqueo_cable2 == 0) {
cobasjuan 1:d99665a519ed 206 bloqueo_cable2=1;
cobasjuan 1:d99665a519ed 207 variacion=1;
cobasjuan 1:d99665a519ed 208 jugador[n]=2;
cobasjuan 1:d99665a519ed 209 } else if(C3 == 1 && bloqueo_cable3 == 0) {
cobasjuan 1:d99665a519ed 210 bloqueo_cable3=1;
cobasjuan 1:d99665a519ed 211 variacion=1;
cobasjuan 1:d99665a519ed 212 jugador[n]=3;
cobasjuan 1:d99665a519ed 213 } else if(C4 == 1 && bloqueo_cable4 == 0) {
cobasjuan 1:d99665a519ed 214 bloqueo_cable4=1;
cobasjuan 1:d99665a519ed 215 variacion=1;
cobasjuan 1:d99665a519ed 216 jugador[n]=4;
cobasjuan 0:9d8c86972a9d 217 }
cobasjuan 1:d99665a519ed 218 if(variacion == 1) { // Si se levanta el flag de variacion comparo el cable con la secuencia
cobasjuan 1:d99665a519ed 219 if(jugador[n] == vector[n]) {
cobasjuan 1:d99665a519ed 220 printf("Bien hecho!\n\r"); // Si coincide pasa de nivel
cobasjuan 1:d99665a519ed 221 n++;
cobasjuan 1:d99665a519ed 222 } else fail=1; // Si difiere levanto el flag de partida perdida
cobasjuan 1:d99665a519ed 223 variacion=0;
cobasjuan 1:d99665a519ed 224 }
cobasjuan 1:d99665a519ed 225 if(fail == 1) { //reinicio las variables y levanto el flag de perdida
cobasjuan 0:9d8c86972a9d 226 perdiste=1;
cobasjuan 0:9d8c86972a9d 227 habcables=0;
cobasjuan 1:d99665a519ed 228 bloqueo_cable1=0;
cobasjuan 1:d99665a519ed 229 bloqueo_cable2=0;
cobasjuan 1:d99665a519ed 230 bloqueo_cable3=0;
cobasjuan 1:d99665a519ed 231 bloqueo_cable4=0;
cobasjuan 1:d99665a519ed 232 fail=0;
cobasjuan 1:d99665a519ed 233 paso_cables=ESPERO_CABLES;
cobasjuan 1:d99665a519ed 234 } else if(n == 4) { // Si llego al nivel 4 quiere decir que termino el juego y ganaste. Levanto el flag de victoria
cobasjuan 1:d99665a519ed 235 finsec=1;
cobasjuan 1:d99665a519ed 236 bloqueo_cable1=0;
cobasjuan 1:d99665a519ed 237 bloqueo_cable2=0;
cobasjuan 1:d99665a519ed 238 bloqueo_cable3=0;
cobasjuan 1:d99665a519ed 239 bloqueo_cable4=0;
cobasjuan 1:d99665a519ed 240 variacion=0;
cobasjuan 1:d99665a519ed 241 habcables=0;
cobasjuan 0:9d8c86972a9d 242 paso_cables=ESPERO_CABLES;
cobasjuan 0:9d8c86972a9d 243 }
cobasjuan 0:9d8c86972a9d 244 break;
cobasjuan 0:9d8c86972a9d 245 }
cobasjuan 0:9d8c86972a9d 246 }
cobasjuan 0:9d8c86972a9d 247
cobasjuan 1:d99665a519ed 248 void CONTADOR() // Decremento una variable cada 1 segundo que corresponde al tiempo de juego. La variable comienza en 30
cobasjuan 1:d99665a519ed 249 {
cobasjuan 1:d99665a519ed 250 static unsigned int comienzo=0;
cobasjuan 1:d99665a519ed 251 if(habcables == 1) {
cobasjuan 1:d99665a519ed 252 if(comienzo == 0) {
cobasjuan 1:d99665a519ed 253 tiempo=0;
cobasjuan 1:d99665a519ed 254 comienzo=1;
cobasjuan 1:d99665a519ed 255 }
cobasjuan 1:d99665a519ed 256 if(tiempo == 0 && fin_tiempo == 0) {
cobasjuan 1:d99665a519ed 257 segundos--;
cobasjuan 1:d99665a519ed 258 reed_time=0;
cobasjuan 1:d99665a519ed 259 tiempo=100;
cobasjuan 1:d99665a519ed 260 }
cobasjuan 1:d99665a519ed 261 if(segundos == -1 && fin_tiempo == 0) {
cobasjuan 1:d99665a519ed 262 fin_tiempo=1;
cobasjuan 1:d99665a519ed 263 segundos++;
cobasjuan 1:d99665a519ed 264 printf("Se acabo el tiempo!\n\r");
cobasjuan 1:d99665a519ed 265 }
cobasjuan 1:d99665a519ed 266 }
cobasjuan 1:d99665a519ed 267 }
cobasjuan 1:d99665a519ed 268
cobasjuan 1:d99665a519ed 269 void displays() // Envio de informacion de tiempo de juego a displays
cobasjuan 1:d99665a519ed 270 {
cobasjuan 1:d99665a519ed 271 dec=segundos/10;
cobasjuan 1:d99665a519ed 272 uni=segundos%10;
cobasjuan 1:d99665a519ed 273 if(reed_time == 0 && fin_tiempo == 0) {
cobasjuan 1:d99665a519ed 274 Unidades=uni;
cobasjuan 1:d99665a519ed 275 Decenas=dec;
cobasjuan 1:d99665a519ed 276 reed_time=1;
cobasjuan 1:d99665a519ed 277 }
cobasjuan 1:d99665a519ed 278 }
cobasjuan 1:d99665a519ed 279
cobasjuan 1:d99665a519ed 280
cobasjuan 1:d99665a519ed 281
cobasjuan 0:9d8c86972a9d 282 void t()
cobasjuan 0:9d8c86972a9d 283 {
cobasjuan 0:9d8c86972a9d 284 if (tiempo > 0)
cobasjuan 0:9d8c86972a9d 285 tiempo--;
cobasjuan 0:9d8c86972a9d 286 }