TP1 Ej 3 Bomba Cobas, Montero

Dependencies:   mbed tsi_sensor

Files at this revision

API Documentation at this revision

Comitter:
cobasjuan
Date:
Thu Jun 06 13:58:23 2019 +0000
Parent:
0:9d8c86972a9d
Commit message:
TP 1 Ej 3 Bomba

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 9d8c86972a9d -r d99665a519ed main.cpp
--- a/main.cpp	Wed May 22 20:58:56 2019 +0000
+++ b/main.cpp	Thu Jun 06 13:58:23 2019 +0000
@@ -18,121 +18,267 @@
 #define PIERDE 3
 #define ESPERO_CABLES 4
 #define COMPARACION 5
+#define GEN_SEC 6
 
 // Funciones
 void CABLES();
 void MAQUINA_GENERAL();
+void CONTADOR();
+void displays();
+void t();
+
 //Timer
 Ticker timer;
-void t();
+
 //Salidas
 DigitalOut ledr(LED1);
 DigitalOut ledg(LED2);
 DigitalOut ledb(LED3);
+BusOut Unidades (PTE5,PTE4,PTE3,PTE2);
+BusOut Decenas (PTB11,PTB10,PTB9,PTB8);
+
+//Entradas
 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+DigitalIn C1(A1);
+DigitalIn C2(A2);
+DigitalIn C3(A3);
+DigitalIn C4(A4);
 
 // Variables
-unsigned int n=0, habcables=0, perdiste=0, finsec=0, tiempo=0;
-int secuencia[4]= {1,3,4,2};
+volatile unsigned int tiempo=0;
+unsigned int n=0, habcables=0, gen=0, perdiste=0, finsec=0, reed_time=0, segundos=20, fin_tiempo=0;
+unsigned int variacion=0;
+unsigned int uni=0, dec=0;
+int vector[4];
+int jugador[4];
+
 int main(void)
 {
+    C1.mode(PullUp);    // Le seteo PullUp a las entradas de los cables para que cuando esten al aire detecte un 1
+    C2.mode(PullUp);
+    C3.mode(PullUp);
+    C4.mode(PullUp);
     ledg=1;
     ledr=1;
     ledb=1;
     timer.attach(&t,0.01);
     while (true) {
+        gen++;  // SEMILLA
         CABLES();
         MAQUINA_GENERAL();
+        CONTADOR();
+        displays();
     }
 }
 
 
-void MAQUINA_GENERAL()
+void MAQUINA_GENERAL() // Maquina de estados: funcionamiento general del programa
 {
     static unsigned int paso_general=ESPERO_ARRANQUE;
-    unsigned int flag=0;
+    unsigned int num=0;
     switch(paso_general) {
-        case ESPERO_ARRANQUE:
+        case ESPERO_ARRANQUE:   // RESET
             n=0;
             tiempo=0;
-            flag=0;
+            num=0;
+            variacion=0;
             perdiste=0;
             if(tsi.readPercentage() != 0) {
-                paso_general=COMPARO_CABLES;
+                paso_general=GEN_SEC;
+                printf("Comienzo\n\r");
             }
             break;
-        case COMPARO_CABLES:
+        case GEN_SEC:   // Genero una secuencia aleatoria encargandome de que no se repitan
+            for(num=0; num<4; num++) {
+                srand(++gen);
+                vector[num]=1+rand()%4;
+                if(num==1) {
+                    while(vector[1]==vector[0]) {
+                        srand(++gen);
+                        vector[1]=1+rand()%4;
+                    }
+                } else if(num==2) {
+                    while(vector[2]==vector[1]|| vector[2]==vector[0]) {
+                        srand(++gen);
+                        vector[2]=1+rand()%4;
+                    }
+                } else if(num==3) {
+                    while(vector[3]==vector[2]|| vector[3]==vector[1] || vector[3]==vector[0]) {
+                        srand(++gen);
+                        vector[3]=1+rand()%4;
+                    }
+                }
+                printf("%d\r\n", vector[num]);
+            }
+            paso_general=COMPARO_CABLES;
+            break;
+        case COMPARO_CABLES:    // Habilito la maquina de estados de comparacion de cables con secuencia
             habcables=1;
-            if(perdiste == 1) {
+            if(perdiste == 1 || fin_tiempo==1) { //Si se levanta el flag de perdida paso al caso "PIERDE"
+                perdiste=0;
+                printf("Perdiste\r\n");
+                tiempo=150;
                 paso_general=PIERDE;
             }
-            if(finsec == 1) {
+            if(finsec == 1) {   //Si se levanta el flag de perdida paso al caso "GANA"
+                finsec=0;
+                printf("Ganaste\r\n");
+                tiempo=150;
                 paso_general=GANA;
             }
             break;
-        case GANA:
-            if(flag == 0) {
-                flag=1;
-                tiempo=100;
-                ledg=0;
-            } else if(tiempo==0 && flag == 1) {
+        case GANA:  // Enciendo el led verde y titilo displays hasta reiniciar el juego
+            ledg=0;
+            if(tiempo == 100) {
+                Unidades=uni;
+                Decenas=dec;
+            }
+            if(tiempo == 50) {
+                Unidades=15;
+                Decenas=15;
+            }
+            if(tiempo == 0) {
+                tiempo=120;
+            }
+            if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) {
+                n=0;
                 ledg=1;
-                paso_general=ESPERO_ARRANQUE;
+                tiempo=0;
+                perdiste=0;
+                finsec=0;
+                fin_tiempo=0;
+                segundos=20;
+                num=0;
+                variacion=0;
+                paso_general=GEN_SEC;
+                printf("Comienzo\n\r");
             }
             break;
-        case PIERDE:
+        case PIERDE:    // Titilo el led rojo y los displays hasta reiniciar el juego
+            if(tiempo == 100) {
+                ledr=0;
+                Unidades=uni;
+                Decenas=dec;
+            }
+            if(tiempo == 50) {
+                ledr=1;
+                Unidades=15;
+                Decenas=15;
+            }
+            if(tiempo == 0) {
+                tiempo=120;
+            }
+            if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) {
+                n=0;
+                ledg=1;
+                ledr=1;
+                tiempo=0;
+                perdiste=0;
+                finsec=0;
+                fin_tiempo=0;
+                segundos=20;
+                num=0;
+                variacion=0;
+                paso_general=GEN_SEC;
+                printf("Comienzo\n\r");
+            }
             break;
     }
 }
 
 
-void CABLES()
+void CABLES()   // Maquina de estados: comparo la secuencia generada con el cable desconectado
 {
     static unsigned int paso_cables=ESPERO_CABLES;
-    unsigned int fail=0;
+    static unsigned int fail=0, bloqueo_cable1=0, bloqueo_cable2=0, bloqueo_cable3=0, bloqueo_cable4=0;
     switch(paso_cables) {
         case ESPERO_CABLES:
             if(habcables == 1) {
                 paso_cables=COMPARACION;
             }
             break;
-        case COMPARACION:
-            if(n == 0) {
-                if((C1 || C2 || C3 || C4) == 1) {
-                    if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) {
-                        n++;
-                    } else fail=1;
-                }
-            } else if(n == 1) {
-                if() {
-                    if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) {
-                        n++;
-                    } else fail=1;
-                }
-            } else if(n == 2) {
-                if() {
-                    if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) {
-                        n++;
-                    } else fail=1;
-                }
-            } else if(n == 3) {
-                if() {
-                    if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) {
-                        finsec=1;
-                        habcables=0;
-                        paso_cables=ESPERO_CABLES;
-                    } else fail=1;
-                }
+        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
+            if(C1 == 1 && bloqueo_cable1 == 0) {    
+                bloqueo_cable1=1;
+                variacion=1;
+                jugador[n]=1;
+            } else if(C2 == 1 && bloqueo_cable2 == 0) {
+                bloqueo_cable2=1;
+                variacion=1;
+                jugador[n]=2;
+            } else if(C3 == 1 && bloqueo_cable3 == 0) {
+                bloqueo_cable3=1;
+                variacion=1;
+                jugador[n]=3;
+            } else if(C4 == 1 && bloqueo_cable4 == 0) {
+                bloqueo_cable4=1;
+                variacion=1;
+                jugador[n]=4;
             }
-            if(fail == 1) {
+            if(variacion == 1) { // Si se levanta el flag de variacion comparo el cable con la secuencia
+                if(jugador[n] == vector[n]) {
+                    printf("Bien hecho!\n\r");  // Si coincide pasa de nivel
+                    n++;
+                } else fail=1;  // Si difiere levanto el flag de partida perdida
+                variacion=0;
+            }
+            if(fail == 1) { //reinicio las variables y levanto el flag de perdida
                 perdiste=1;
                 habcables=0;
+                bloqueo_cable1=0;
+                bloqueo_cable2=0;
+                bloqueo_cable3=0;
+                bloqueo_cable4=0;
+                fail=0;
+                paso_cables=ESPERO_CABLES;
+            } else if(n == 4) { // Si llego al nivel 4 quiere decir que termino el juego y ganaste. Levanto el flag de victoria
+                finsec=1;
+                bloqueo_cable1=0;
+                bloqueo_cable2=0;
+                bloqueo_cable3=0;
+                bloqueo_cable4=0;
+                variacion=0;
+                habcables=0;
                 paso_cables=ESPERO_CABLES;
             }
             break;
     }
 }
 
+void CONTADOR()     // Decremento una variable cada 1 segundo que corresponde al tiempo de juego. La variable comienza en 30
+{
+    static unsigned int comienzo=0;
+    if(habcables == 1) {
+        if(comienzo == 0) {
+            tiempo=0;
+            comienzo=1;
+        }
+        if(tiempo == 0 && fin_tiempo == 0) {
+            segundos--;
+            reed_time=0;
+            tiempo=100;
+        }
+        if(segundos == -1 && fin_tiempo == 0) {
+            fin_tiempo=1;
+            segundos++;
+            printf("Se acabo el tiempo!\n\r");
+        }
+    }
+}
+
+void displays() // Envio de informacion de tiempo de juego a displays
+{
+    dec=segundos/10;
+    uni=segundos%10;
+    if(reed_time == 0 && fin_tiempo == 0) {
+        Unidades=uni;
+        Decenas=dec;
+        reed_time=1;
+    }
+}
+
+
+
 void t()
 {
     if (tiempo > 0)