RAMIRO MENTERES / Mbed 2 deprecated DesactivalaBomba

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <stdio.h>
00003 
00004 #define BASE_TIEMPO 0.0001
00005 
00006 //Declaración de estados
00007 enum{
00008     NORMAL,
00009     Juego1,
00010     Juego2,
00011     Juego3,
00012     Gano,
00013     Perdio
00014 };
00015 
00016 //Declaración de entradas y salidas
00017 DigitalIn SW(D4);
00018 DigitalIn C1(PTC7);
00019 DigitalIn C2(PTC0);
00020 DigitalIn C3(PTC3);
00021 DigitalIn C4(PTC4);
00022 DigitalOut ROJO(D2);
00023 DigitalOut VERDE(D3);
00024 DigitalOut BUZZER(D5);
00025 DigitalOut A(PTC17);
00026 DigitalOut B(PTC16);
00027 DigitalOut C(PTC13);
00028 DigitalOut D(PTC12);
00029 DigitalOut BL(D8);
00030 DigitalOut DISPLAY1(D9);
00031 DigitalOut DISPLAY2(D10);
00032 
00033 //Declaración de variables
00034 Ticker tick;
00035 Serial pc(USBTX, USBRX);
00036 int segundos = 0 , music = 0 ,notime = 0;
00037 int t = 0;
00038 int E = 0;
00039 int Cable = 4;
00040 int MUSICA = 0;
00041 int GREEN = 0 , RED = 0, BLINK = 0;
00042 int valor = 0;
00043 int mux_display = 0;
00044 
00045 //Declaración de funciones
00046 void bomba();
00047 void display(int);
00048 void secuencia();
00049 void Interrupt(){
00050     segundos++;
00051     mux_display++;
00052     music++;
00053     //El buzzer modifica su oscilación dependiendo de MUSICA, siempre y cuando se encuentre en partida. 
00054     if(music >= 30000 - 9000*MUSICA && MUSICA >= 1 && MUSICA <= 3){
00055         BUZZER ? BUZZER = 0 : BUZZER = 1;
00056         music =0;
00057     }else
00058     BUZZER = 0;
00059     //Cada medio segundo hago oscilar los leds y el display, solo si RED o GREEN se activan
00060     if(segundos == 5000 || segundos == 10000){
00061         if(GREEN)
00062             VERDE ? (VERDE = 0) : (VERDE = 1);
00063         else
00064             VERDE = 0;
00065         if(RED)
00066             ROJO ? (ROJO = 0) : (ROJO = 1);
00067         else
00068             ROJO = 0;
00069         if(BLINK)
00070             BL ? (BL = 0) : (BL = 1);
00071         else
00072             BL = 1;
00073     }
00074     //Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
00075     if(segundos >= 10000 ){
00076         if(t > 0)
00077             t--;
00078         segundos = 0;
00079     }
00080     //Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
00081     if(mux_display >= 41 ){     
00082         if(BLINK)
00083             display(valor); 
00084         else
00085             display(t);
00086         mux_display = 0;
00087     }
00088 }
00089 
00090 int main(){
00091     tick.attach(&Interrupt , BASE_TIEMPO);
00092     while(1){
00093         bomba();
00094     }
00095 }
00096 
00097 void bomba(){
00098     static int estado = NORMAL;
00099     //Declaro los estados como se diagramaron en la máquina de estados
00100     switch(estado){
00101         case NORMAL:
00102             if(SW.read() == 1){
00103                 secuencia();
00104                 estado = Juego1;
00105                 t = 70;
00106                 MUSICA = 1;
00107                 RED = 0;
00108                 GREEN = 0;
00109                 pc.printf("El juego esta ahora en marcha. Primeros 30s\n");
00110             }
00111             break;
00112         case Juego1:
00113             secuencia();
00114             if(t <= 40){
00115                 estado = Juego2;
00116                 MUSICA = 2;
00117                 pc.printf("La musica se intensifica\n");
00118             }
00119             if(E){
00120                 estado = Perdio;
00121                 valor = t;
00122                 t = 10;
00123                 RED = 1;
00124                 MUSICA = 5;
00125                 BLINK = 1;
00126                 pc.printf("Partida terminada, el jugador pierde.\n");
00127             }
00128             if(Cable == 0){
00129                 estado = Gano;
00130                 GREEN = 1;
00131                 MUSICA = 4;
00132                 BLINK = 1;
00133                 valor = t;
00134                 t = 10;
00135                 pc.printf("Partida terminada, el jugador gana.\n");
00136             }
00137             break;
00138         case Juego2:
00139             secuencia();
00140             if(t <= 20){
00141                 estado = Juego3;
00142                 MUSICA = 3;
00143                 pc.printf("Queda poco tiempo\n");
00144             }
00145             if (E){
00146                 estado = Perdio;
00147                 RED = 1;
00148                 MUSICA = 5;
00149                 BLINK = 1;
00150                 valor = t;
00151                 t=10;
00152                 pc.printf("Partida terminada, el jugador pierde.\n");
00153             }
00154             if(Cable == 0){
00155                 estado = Gano;
00156                 GREEN = 1;
00157                 MUSICA = 4;
00158                 BLINK = 1;
00159                 valor = t;
00160                 t = 10;
00161                 pc.printf("Partida terminada, el jugador gana.\n");
00162             }
00163             break;
00164         case Juego3:
00165             secuencia();
00166             if(t <= 10 || E){
00167                 estado = Perdio;
00168                 MUSICA = 5;
00169                 RED = 1;
00170                 BLINK = 1;
00171                 valor = t;
00172                 pc.printf("Partida terminada, el jugador pierde.\n");
00173             }
00174             if(t <= 10)
00175                 notime = 1;
00176             if(Cable == 0){
00177                 estado = Gano;
00178                 GREEN = 1;
00179                 MUSICA = 4;
00180                 BLINK = 1;
00181                 valor = t;
00182                 t = 10;
00183                 pc.printf("Partida terminada, el jugador gana.\n");
00184             }
00185             break;
00186         case Gano:
00187             if(t == 0){
00188                 estado = NORMAL;
00189                 Cable = 4;
00190                 MUSICA = 0;
00191                 BLINK = 0;
00192                 GREEN = 0;
00193                 pc.printf("El juego se encuentra listo para comenzar.\n");
00194             }
00195             break;
00196         case Perdio:
00197             if(t == 0){
00198                 estado = NORMAL;
00199                 Cable = 4;
00200                 E = 0;
00201                 MUSICA = 0;
00202                 BLINK = 0;
00203                 RED = 0;
00204                 pc.printf("El juego se encuentra listo para comenzar.\n");
00205             }
00206         break;
00207         default:
00208             estado = NORMAL;
00209     }
00210 }
00211 
00212 //Funcion de control de multiplexado
00213 void display(int x){
00214     char decenas;
00215     char unidades;
00216     if(x > 10){
00217         decenas = (x-10)/10;
00218         unidades = (x-10)%10;
00219     }else{
00220         decenas = 0;
00221         unidades = 0;
00222     }
00223     static char estado = 0;
00224     //estado indica el display a utilizar.
00225     //En ambos casos se toma bit a bit el número (unidad o decena) y se la inserta en el CD4511 mediante A, B, C y D
00226     //Los displays se apagan por un breve momento mientras se configura el Cd4511
00227     if(estado == 0){
00228         DISPLAY2 = 0;
00229         A = (decenas & 0b1000)>>3;
00230         B = (decenas & 0b100)>>2;
00231         C = (decenas & 0b10)>>1;
00232         D = decenas & 1;
00233         DISPLAY1 = 1;
00234         estado = 1;
00235     }else if(estado == 1){
00236         DISPLAY1 = 0;
00237         A = (unidades & 0b1000)>>3;
00238         B = (unidades & 0b100)>>2;
00239         C = (unidades & 0b10)>>1;
00240         D = unidades & 1;
00241         DISPLAY2 = 1;
00242         estado = 0;
00243     }
00244 }
00245 
00246 //Funcion que se encarga de modificar la secuencia y su correcto seguimiento durante la partida.
00247 void secuencia(){
00248     static int flag = 0 , flagc1 = 0 , flagc2 = 0 , flagc3 = 0 , flagc4 = 0;
00249     static int secuencia[4];
00250     if (flag == 0){
00251         flagc1 = 0;
00252         flagc2 = 0;
00253         flagc3 = 0;
00254         flagc4 = 0;
00255         secuencia[0]= 0;
00256         secuencia[1]= 0;
00257         secuencia[2]= 0;
00258         secuencia[3]= 0;
00259         
00260         //Declaro las variables dentro de la secuencia hasta que tenga un ejemplar de cada numereo del 1 al 4
00261         for(int i = 0 ; i < 4 ;){
00262             secuencia[i] = rand() % 4 + 1;
00263             for(int j = i - 1 ; j >= 0 ; j--){
00264                 if (secuencia[i] == secuencia[j]){
00265                     i--;
00266                     break;
00267                     }
00268             }
00269             i++;
00270         }
00271         pc.printf("LA SECUENCIA A REPRODUCIR ES %d %d %d %d\n" , secuencia[0] , secuencia[1] , secuencia[2] , secuencia[3]);
00272         flag++;
00273     }else{
00274         //Cada cable tiene su propio número asignado. Cuando lo desconecto
00275         //ese código debe conincidir con la secuencia, de otro modo será un
00276         //error. Una vez desactivado se utiliza una variable para descartarlos
00277         //hatsa la proxima partida.
00278         if(C1.read() == 1){
00279             if(secuencia [flag-1] == 1 && !flagc1){
00280                 Cable--;
00281                 flag++;
00282                 flagc1 = 1;
00283             }else if(!flagc1)
00284                 E = 1;
00285             }
00286         if(C2.read() == 1 && !flagc2){
00287             if(secuencia [flag-1] == 2){
00288                 Cable--;
00289                 flag++;
00290                 flagc2 = 1;
00291             }else if(!flagc2)
00292                 E = 1;
00293             }
00294         if(C3.read() == 1 && !flagc3){
00295             if(secuencia [flag-1] == 3){
00296                 Cable--;
00297                 flag++;
00298                 flagc3 = 1;
00299             }else if(!flagc3)
00300                 E = 1;
00301             }
00302         if(C4.read() == 1 && !flagc4){
00303             if(secuencia [flag-1] == 4){
00304                 Cable--;
00305                 flag++;
00306                 flagc4 = 1;
00307             }else if(!flagc4)
00308                 E = 1;
00309             }
00310         //Cuando se terina la secuencia, se comete un error o se acaba el
00311         // tiempo se vuelve al primer estado flag = 0 
00312         if (flag == 5 || E == 1 || notime == 1){
00313             flag = 0;
00314             notime = 0;
00315             }
00316     }
00317 }