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

Dependencies:   Led7Seg mbed tsi_sensor MMA8451Q

main.cpp

Committer:
Jalle
Date:
2019-06-23
Revision:
0:663cb45c05e2

File content as of revision 0:663cb45c05e2:

#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

}