TP1_EJER3

Dependencies:   mbed tsi_sensor

Revision:
1:5b92fb2cd769
Parent:
0:256d00799c21
--- a/main.cpp	Wed May 22 13:07:54 2019 +0000
+++ b/main.cpp	Tue Jun 04 02:09:27 2019 +0000
@@ -11,78 +11,103 @@
 #else
 #error TARGET NOT DEFINED
 #endif
-Ticker tiempo;
+Ticker contador;
+Ticker titila;
 
+//Enumero los distintos casos de la Maquina de Estados
 enum maquina_estado_general {INICIO, CABLE1, CABLE2, CABLE3, CABLE4, WIN, LOOSER};
 maquina_estado_general maquina_general;
 
-PwmOut display(PTA2);
 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+
+//Defino salidas utilizadas
 AnalogIn noise (PTC1);
 DigitalIn cable_0 (PTB0);
 DigitalIn cable_1 (PTB1);
 DigitalIn cable_2 (PTB2);
-DigitalIn cable_3 (PTC12);
+DigitalIn cable_3 (PTB3);
 DigitalOut verde (LED_GREEN);
 DigitalOut rojo (LED_RED);
+DigitalOut buzzzer (PTC12);
+BusOut Unidades (PTE2,PTE3,PTE4,PTE5);
+BusOut Decenas (PTB8,PTB9,PTB10,PTB11);
 
+//Creo y defino vectores
 int vector_secuencia [4];
 int vector_orden_cables [4] = {-1, -1, -1, -1};
+
+//Defino variables
 int ccero = 0;
 int cuno = 0;
 int cdos = 0;
 int ctres = 0;
 int sumador = 0;
+int contadorun = 0;
+int contadordec = 0;
+int contadortotal = 60;
+int mandar = 0;
+int titilarun = 0;
+int titilardec = 0;
+int titilar = 0;
+int x = 0;
+int z = 0;
+int a = 0;
 
+//Prototipo de funciones
 void secuencia();
 void maquina_general_sec ();
-//void maquina_display ();
-void maquina_orden_cables ();
+void orden_cables ();
 void suma ();
+void funcion_tiempo ();
+void funcion_titila ();
+void buzzer ();
 int cablesDesconectados(int n);
 
 int main(void)
 {
-
+    //Activo Pull Up interno
     cable_0.mode (PullUp);
     cable_1.mode (PullUp);
     cable_2.mode (PullUp);
     cable_3.mode (PullUp);
 
-
+    //Salida que mide ruido para la semilla de la funcion rand
     srand (int(noise * 10000));
 
     secuencia ();
     verde = 1;
     rojo = 1;
+    contador.attach (&funcion_tiempo, 1);
+    titila.attach (&funcion_titila, 0.5);
 
     while (true) {
+        
         maquina_general_sec ();
-        //maquina_display ();
-        maquina_orden_cables ();
-        printf("%d %d %d %d", vector_orden_cables[0], vector_orden_cables[1], vector_orden_cables[2], vector_orden_cables[3]);
+        orden_cables ();
+
     }
 }
 
-void suma ()
-{
-    sumador++;
-}
-
+/*Funcion que crea la secuencia del orden que hay que sacar los cables
+y los guarda en un vector evitando que se repita el numero*/
 void secuencia ()
 {
     vector_secuencia [0] = rand () %4;
     for (int i = 1; i < 4; i++) {
         int randomm = rand () %4;
-        if (vector_secuencia [i - 1] != randomm)
-            vector_secuencia [i] = randomm;
+        int aux = 1;
+        for(int j = 0; j < i; j++)
+            if(vector_secuencia[j] == randomm)
+                aux = 0;
+        if(aux)
+            vector_secuencia[i] = randomm;
         else
             i--;
     }
 
 }
 
-
+//Maquina de Estado general para arranque, pasaje de un cable a otro y reinicio
 void maquina_general_sec ()
 {
     switch (maquina_general) {
@@ -90,86 +115,112 @@
         default:
             maquina_general = INICIO;
             break;
-
+//Se arranca apretando el tsi y con los display en 60seg. (TSI tambien para reiniciar)
         case INICIO:
-            if (tsi.readPercentage() > 0.5){
+            rojo = 1;
+            verde = 1;
+            buzzzer = 0;
+            if (tsi.readPercentage() != 0) {
+                a = 0;
+                contadortotal = 60;
+                x = 1;
+                mandar = 1;
+                z = 0;
                 maquina_general = CABLE1;
-                verde = 0;
             }
-            else
-                maquina_general = INICIO;
             break;
-
+//Compara el primer cable con la secuencia creada
         case CABLE1:
-            verde = 1;
             if (vector_secuencia [0] == vector_orden_cables [0] && vector_orden_cables [0] != -1) {
                 maquina_general = CABLE2;
             }
-            else {
-                maquina_general = CABLE1;
-            }
             if (vector_secuencia [0] != vector_orden_cables [0] && vector_orden_cables [0] != -1) {
                 maquina_general = LOOSER;
             }
 
             break;
-
+//Compara el segundo cable con la secuencia creada
         case CABLE2:
-            rojo = 0;
             if (vector_secuencia [1] == vector_orden_cables [1] && vector_orden_cables [1] != -1) {
                 maquina_general = CABLE3;
-                tiempo.attach (&suma, 1);
-            }
-            else {
-                maquina_general = CABLE2;
             }
             if (vector_secuencia [1] != vector_orden_cables [1] && vector_orden_cables [1] != -1) {
                 maquina_general = LOOSER;
             }
 
             break;
-
+//Compara el tercer cable con la secuencia creada
         case CABLE3:
-            rojo = 1;
             if (vector_secuencia [2] == vector_orden_cables [2] && vector_orden_cables [2] != -1) {
                 maquina_general = CABLE4;
-                tiempo.attach (&suma, 1);
-            }
-            else {
-                maquina_general = CABLE3;
             }
             if (vector_secuencia [2] != vector_orden_cables [2] && vector_orden_cables [2] != -1) {
                 maquina_general = LOOSER;
             }
             break;
-
+//Compara el cuarto cable con la secuencia creada
         case CABLE4:
-            rojo = 0;
             if (vector_secuencia [3] == vector_orden_cables [3] && vector_orden_cables [3] != -1) {
                 maquina_general = WIN;
             }
-            else {
-                maquina_general = CABLE4;
-            }
             if (vector_secuencia [3] != vector_orden_cables [3] && vector_orden_cables [3] != -1) {
                 maquina_general = LOOSER;
             }
             break;
-
+//Si el orden es correcto titilan los display y led verde
         case WIN:
-            verde = 0;
+            z = 1;
+            rojo=1;
+            if (titilar %2 == 0) {
+                Unidades = titilarun;
+                Decenas = titilardec;
+                buzzzer = 1;
+                verde = 0;
+            } else if(titilar %2 != 0) {
+                Unidades = 15;
+                Decenas = 15;
+                buzzzer = 0;
+                verde = 1;
+            }
+
+            if (tsi.readPercentage() != 0) {
+                maquina_general = INICIO;
+                for(int k = 0; k < 4; k++)
+                    vector_orden_cables[k] = -1;
+                secuencia();
+
+            }
+
             break;
+//Si el orden es incorrecto titilan los display y led rojo
         case LOOSER:
-            verde = 0;
-            rojo = 0;
+            z = 1;
+            if(tsi.readPercentage() == 0) {
+                if (titilar %2 == 0) {
+                    Unidades = titilarun;
+                    Decenas = titilardec;
+                    buzzzer = 1;
+                    rojo = 0;
+                } else if(titilar %2 != 0) {
+                    Unidades = 15;
+                    Decenas = 15;
+                    buzzzer = 0;
+                    rojo = 1;
+                }
+            }
+            if (tsi.readPercentage() != 0) {
+                maquina_general = INICIO;
+                for(int k = 0; k < 4; k++)
+                    vector_orden_cables[k] = -1;
+                secuencia();
+            }
             break;
 
     }
 }
-
-void maquina_orden_cables ()
+//Funcion que guarda el orden de los cables que se sacan
+void orden_cables ()
 {
-    static int a = 0;
 
     if (cable_0 != 0 && cablesDesconectados(0) == 0) {
         ccero = 0;
@@ -191,14 +242,14 @@
         a++;
         printf ("vector orden cables [%d] = 2", &a);
     }
-    if (cable_3 != 0 && cablesDesconectados(3) != 0) {
+    if (cable_3 != 0 && cablesDesconectados(3) == 0) {
         ctres = 3;
         vector_orden_cables [a] = ctres;
         a++;
         printf ("vector orden cables [%d] = 3", &a);
     }
 }
-
+//Funcion que interpreta la desconexion de los cables
 int cablesDesconectados(int n)
 {
 
@@ -208,3 +259,27 @@
     }
     return 0;
 }
+//Funcion de cuenta regresiva en los display
+void funcion_tiempo()
+{
+
+    if(contadortotal == 0)
+        maquina_general = LOOSER;
+
+    if(!z && x && contadortotal > 0)
+        contadortotal--;
+
+    Unidades = contadortotal % 10;
+    titilarun = Unidades;
+    Decenas = contadortotal / 10;
+    titilardec = Decenas;
+
+
+    printf("%d %d %d %d || %d %d %d %d\n\r", vector_orden_cables[0], vector_orden_cables[1], vector_orden_cables[2], vector_orden_cables[3], vector_secuencia[0], vector_secuencia[1], vector_secuencia[2], vector_secuencia[3]);
+
+}
+
+void funcion_titila ()
+{
+    titilar++;
+}