https://os.mbed.com/users/Jalle/code/Ejercicio2JalleVentiades/file/ad5829ebd588/main.cpp/

Dependencies:   Led7Seg mbed tsi_sensor MMA8451Q

Revision:
0:663cb45c05e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 23 13:46:09 2019 +0000
@@ -0,0 +1,372 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "MMA8451Q.h"
+#include "math.h"
+#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
+PinName const SDA = PTE25;
+PinName const SCL = PTE24;
+#elif defined (TARGET_KL05Z)
+PinName const SDA = PTB4;
+PinName const SCL = PTB3;
+#elif defined (TARGET_K20D50M)
+PinName const SDA = PTB1;
+PinName const SCL = PTB0;
+#else
+#error TARGET NOT DEFINED
+#endif
+#define M_PI 3.14159265358979323846
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+
+/* This defines will be replaced by PinNames soon */
+#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
+#define ELEC0 9
+#define ELEC1 10
+#elif defined (TARGET_KL05Z)
+#define ELEC0 9
+#define ELEC1 8
+#else
+#error TARGET NOT DEFINED
+#endif
+DigitalOut ledazul(LED_BLUE);
+DigitalOut ledverde(LED_GREEN);
+DigitalOut ledrojo(LED_RED);
+//unidades:
+
+
+BusOut display(PTC9,PTC8,PTD4,PTA12,PTA4,PTA5,PTC6);
+
+DigitalOut habuni(PTD7);
+DigitalOut habdec(PTD6);
+
+DigitalIn enta(PTC7);
+DigitalIn entb(PTC0);
+DigitalIn entc(PTC3);
+DigitalIn entd(PTC4);
+
+double a=0;
+unsigned int e=0,cuenta=2,cantidad=4,estado=0,mal=0,nuevo=0,erro=0,b=0,demo=0,ap=4,tiempo=20,s=0,d=0,c=0,acta=0,actb=0,actc=0,actd=0,uni=0,dec=0,bar=0,guar1=0,guar2=0;
+
+int dato[50]= {0,1,2,3};
+int dato2[50];
+Ticker barrido;
+Ticker jorge;
+void funcion();
+void ctrl_barrido();
+
+int main(void)
+{
+    dato2[0]=126; //Guardamos en este vector la informacion para formar los diferentes numeros en el display
+    dato2[1]=48;
+    dato2[2]=109;
+    dato2[3]=121;
+    dato2[4]=51;
+    dato2[5]=91;
+    dato2[6]=95;
+    dato2[7]=112;
+    dato2[8]=127;
+    dato2[9]=123;
+    barrido.attach(&ctrl_barrido,0.01); //Activamos el barrido cada 10ms
+    jorge.attach(&funcion, 1); //Cada 1seg se activará el ticker
+    TSIAnalogSlider tsi(ELEC0, ELEC1, 100); //El slider es para iniciar el juego
+    ledrojo=1; //Apagamos todo por las dudas
+    ledazul=1;
+    ledverde=1;
+
+
+    while (true) {
+        a=tsi.readPercentage();
+        ledverde=1;
+        ledrojo=1;
+        switch (estado) {
+            default:
+            case 0:
+               
+                
+                if (bar==0) { //Si bar es 1 se muentra las decenas y si es 0 se muestra las unidades
+                    habuni=1; //Se definen las habilitaciones para solo mostrar las unidades
+                    habdec=0;
+
+                    display=dato2[dec]; //Se envia la informacion a los displyas
+
+                }
+
+                if(bar==1) {
+                    habuni=0; //Se definen las habilitaciones para solo mostrar las decenas
+                    habdec=1;
+
+                    display=dato2[dec]; //Se envia la informacion a los displyas
+
+
+                }
+
+                if(c==0) { //Aca se va a generar la secuencia aleatoria
+                    dato[0]=rand() % (1+3);
+                    dato[1]=rand() % (1+3);
+                    dato[2]=rand() % (1+3);
+                    dato[3]=rand() % (1+3);
+                    c=1; //De esta manera solo se genera 1 y no se sobrescribe todo infinitamente
+                }
+
+                if(dato[1]==dato[0])
+                    dato[1]=rand() % (1+3);
+
+                if(dato[2]==dato[1]||dato[2]==dato[0])
+                    dato[2]=rand() % (1+3);
+
+
+                if(dato[3]==dato[2]||dato[3]==dato[1]||dato[3]==dato[0])
+                    dato[3]=rand() % (1+3);
+
+
+
+                if(d==0&&(dato[0]+dato[1]+dato[2]+dato[3])==6) { //Muestra esto solo 1 vez y cuando ya se generó la secuencia
+                    printf("Apreta el pad para empezar\n");
+                    d=1;
+                }
+
+                if(a>=0.4&&a<=0.6&&(dato[0]+dato[1]+dato[2]+dato[3])==6) { //Una vez que se aprieta el slider y la secuencia esta generada, podemos empezar el juego
+                    if(enta==0&&entb==0&&entc==0&&entd==0) { //Verificamos si todos los cables estan conectados
+                        estado=1;
+                        tiempo=20; //Esta variable almacena el tiempo
+                        ap=4; //AP es 4 cuando no se ha desconectado ningun cable
+                        b=0; //Esta variable se usa para llevar la cuenta de las desconexiones
+                        printf("El orden es: %d%d%d%d\n",dato[0],dato[1],dato[2],dato[3]); //Imprime en PC el orden de la secuencia
+                        acta=0; //Cada vez que se detecta una desconexion, se pone en 1 estas variables para poder ignorarlas luego de su primera deteccion
+                        actb=0; //Por eso siempre hay que volverlas a 0 antes de empezar
+                        actc=0;
+                        actd=0;
+                    } else {
+                        if(d==1) { //Solo si la secuencia ya se genero
+                            printf("Te falta conectar los cables \n"); //Aviso si no todos los cables estan conectados a gnd
+                        }
+                    }
+
+
+                    break;
+                case 1:
+                    if(e==1) {
+
+                        e=0; //Volvemos 0 la variable del ticker luego de detectarla
+
+                    }
+
+                    if (bar==0) {
+                        habuni=1; 
+                        habdec=0;
+
+                        display=dato2[dec];
+
+                    }
+
+                    if(bar==1) {
+                        habuni=0;
+                        habdec=1;
+
+                        display=dato2[dec];
+
+
+                    }
+
+                    if(enta==1&&acta==0) { //Si se desconecta el cable 1 ponemos AP en su valor correspondiente y colocamos a acta en 1 para ignorar a enta
+
+                        ap=0;
+                        acta=1;
+
+                    }
+                    if(entb==1&&actb==0) {
+
+                        ap=1; //Se guarda en AP el cable que fue desconectado
+                        actb=1;
+
+                    }
+                    if(entc==1&&actc==0) {
+
+                        ap=2;
+                        actc=1;
+
+                    }
+                    if(entd==1&&actd==0) {
+
+                        ap=3;
+                        actd=1;
+
+
+                    }
+
+                    if(ap!=4) { //Si se desconecta algun cable entramos aca
+                        if(ap==dato[b]) { //Si es correcto, avanzamos
+                            b++; //Sumamos 1 a la variable que lleva la cuenta de las desconexiones
+
+
+
+                            ap=4; //Ponemos AP en 4 otra vez porque ya vimos al cable que se desconecto
+                            if(b==4) { //Si b es 4 significa que se desconectaron los 4 cables en el orden correcto, asi que vamos al estado 4
+                                estado=4;
+                                tiempo=9; //Fijamos el tiempo que va a estar el led verde titilando
+                                ledverde=0; //Prendemos el led verde como felicitacion
+                                e=0; //Colocamos en 0 la variable del ticker por las dudas
+                                b=0; //Volvemos a 0 la cuenta de posiciones
+
+
+                            }
+                            c=0; //Ponemos c en 0 para que se pueda generar otra secuencia aleatoria
+                            d=0; //Ponemos d en 0 para que se pueda mostrar un printf del case 0
+
+
+
+                        } else {
+                            //Si el dato es incorrecto explota la bomba
+                            estado=3;
+                            tiempo=9;
+
+                            e=0;
+                            b=0;
+                            ledverde=1;
+                            ledrojo=0; //Prendemos el led rojo de alarma
+                        }
+                    }
+
+
+                    if(tiempo==0) { //Si el tiempo se termina tambien se pierde
+                        guar1=0;
+                        guar2=0;
+                        dec=0;
+                        estado=3;
+                        tiempo=9;
+                        ledrojo=0;
+                        ledverde=1;
+                        e=0;
+                        b=0;
+
+                    }
+
+                    break;
+
+
+
+
+                case 3:
+                    ledverde=1;
+
+                    if(tiempo%2==0) { //El led rojo y los displays titilan
+                        habuni=0;
+                        habdec=0;
+
+                        ledrojo=1;
+
+                        s=0;
+                    } else {
+                        if (bar==0) {
+                            habuni=1;
+                            habdec=0;
+
+                            display=dato2[dec];
+
+                        }
+
+                        if(bar==1) {
+                            habuni=0;
+                            habdec=1;
+
+                            display=dato2[dec];
+
+
+                        }
+                        ledrojo=0;
+
+                        s=1;
+                    }
+
+
+                    if(tiempo==0) { //Cuando ya titilaron el tiempo completo, volvemos a empezar en el estado 0
+                        estado=0;
+                        d=0;
+                        c=0;
+                    }
+                    break;
+
+
+                case 4:
+                    ledrojo=1;
+                    if(tiempo%2==0) { //El led verde y los displays titilan porque evitamos que la bomba explote
+                        habuni=0;
+                        habdec=0;
+                        ledverde=1;
+
+                        s=0;
+                    } else {
+                        if (bar==0) {
+                            habuni=1;
+                            habdec=0;
+
+                            display=dato2[dec];
+
+                        }
+
+                        if(bar==1) {
+                            habuni=0;
+                            habdec=1;
+                            display=dato2[dec];
+
+                        }
+
+                        ledverde=0;
+
+                        s=1;
+
+                    }
+                    e=0;
+                    if(tiempo==0) { //Volvemos a empezar luego de terminar este juego
+                        estado=0;
+                        c=0;
+                        d=0;
+                    }
+                    break;
+                }
+        }
+    }
+}
+
+void ctrl_barrido()
+{
+
+    if(bar==0) { //Si bar es 1 se muentra las decenas y si es 0 se muestra las unidades
+        bar=1;
+
+
+        if(estado!=3&&estado!=4) { //Solo se cumple si no estamos en el estado de perder o ganar
+            dec=tiempo/10; //Obtenemos el valor de las decenas
+            guar1=dec;
+        } else
+            dec=guar1; //Si estamos en perder o ganar, solo nos importa el ultimo valor antes de que el juego termine
+            
+        if(estado==0) //Si estamos en el estado de inicio los displays tienen que mostrar solo el numero inicial
+            dec=2;
+
+
+    }
+
+    else {
+        bar=0;
+
+
+        if(estado!=3&&estado!=4) { 
+            dec=tiempo-(dec*10); //Obtenemos el valor de las unidades
+            guar2=dec;
+        } else
+            dec=guar2; //Si estamos en perder o ganar, solo nos importa el ultimo valor antes de que el juego termine
+            
+            if(estado==0)//Si estamos en el estado de inicio los displays tienen que mostrar solo el numero inicial
+            dec=0;
+    }
+
+}
+
+void funcion()
+{
+
+    tiempo--; //Cada 1seg se decrece la variable tiempo
+    e=1; //Cada 1seg se pone e en 1
+
+}
\ No newline at end of file