Pio IX Jalle Ventiades 6b 2019

Dependencies:   mbed tsi_sensor MMA8451Q

main.cpp

Committer:
Jalle
Date:
2019-06-23
Revision:
0:ad5829ebd588

File content as of revision 0:ad5829ebd588:

#include "mbed.h"
#include "tsi_sensor.h"
#include "MMA8451Q.h"
#include "math.h"

DigitalOut ledazul(LED_BLUE);
DigitalOut ledverde(LED_GREEN);
DigitalOut ledrojo(LED_RED);
DigitalIn enta(PTC7);
DigitalIn entb(PTC0);
DigitalIn entc(PTC3);


int e=0,cuenta=2,cantidad=1,estado=1,mal=0,nuevo=0,erro=0,b=1,demo=0,ap=4,cuenta2=0,temp1=0,temp2=0,temp3=0;
int dato[50]; 
Ticker tic2;
Ticker tic1;
void funcion(); 
void cuento();


int main(void)
{
    tic2.attach(&funcion, 1); //Contador general 1seg
    tic1.attach(&cuento, 0.01); //Contador del sistema de antirebote 10mseg
    
    ledrojo=1; //Apagamos todo antes de empezar por las dudas
    ledazul=1;
    ledverde=1;
    printf("Presione los botones en el siguiente orden: (verde=1)(rojo=2)(azul=3)\n");

    while (true) {
        
        switch (estado) { //Maquina de estados gemeral
            default:
            case 1: //Estado para generar colores
                
                if(b!=cuenta) { //Generamos colores hasta que generamos todos los que necesitamos (cuenta nos dice cuantos)
                    dato[b]=rand() % (1+2)+1; //Dato almacena los colores
                    printf("%d\n",dato[b]);
                    b++; //b nos va a servir para llevar la cuenta internamente en muchos estados
                    cantidad++; //Cantidad almacena cuantos colores hay guardados
                
                }
                

                if(b==cuenta) { //Si b alcanzo a la cantidad que colores que tendriamos que tener generados, avanza
                    estado=2;
                    b=1; //Borramos esta variable para que los siguientes estados la puedan usar
                    
                }
                break;

            case 2: //Estado para mostrar los colores que hay que apretar luego 
                
                if(dato[b]==1) { //Si esta almacenado el verde, se muestra el verde
                    ledverde=0;
                    ledrojo=1;
                    ledazul=1;
                }
                if(dato[b]==2) {
                    ledverde=1;
                    ledrojo=0;
                    ledazul=1;
                }
                if(dato[b]==3) {
                    ledverde=1;
                    ledrojo=1;
                    ledazul=0;
                }

                if(e==1) { //Luego de 1seg mostrando un color, nos vamos al estado 7 para esperar 1seg
                    estado=7;

                    e=0; //Volvemos a poner en 0 la variable del ticker
                    ledverde=1; //Apagamos todo para esperar 1seg
                    ledrojo=1;
                    ledazul=1;
                    b++; //Guardamos que mostramos 1 color mas
                }
                if(b==cantidad) { //Si mostramos todos los colores que tenemos almacenados avanzamos a la siguiente etapa

                    estado=4; 
                    cuenta2=0;
                    demo=0; //Ponemos en 0 todas las variables locales para que las siguientes etapas las puedan usar
                    e=0;
                    ledverde=1; //Apagamos leds
                    ledrojo=1;
                    ledazul=1;
                    b=1;
                }
                break;

            case 4:
               

                switch (temp1) { //Maquina de antirebote para el color rojo
                    case 0:
                        if(enta==0){//Esperamos a que se apriete el pulsador
                            temp1=1;//Vamos al estado 1
                            
                            cuenta2=0;
                            }
                        
                        
                        break;
                    case 1:
                        if(cuenta2>=1) {//Esperamos que pasen 20mseg antes de poder avanzar, asi ignoramos el rebote
                            temp1=2;

                            
                            e=0; //Ponemos en 0 el ticker otra vez
                            ledverde=1; //Prendemos el led rojo
                            ledrojo=0;
                            ledazul=1;
                            ap=2; //Guardamos que se pulso el led rojo
                        }
                        break;
                    case 2:
                        if(enta==1){ //Esperamos a que se despulse
                            temp1=3; //Vamos al siguiente estado
                        cuenta2=0;
                        }
                        
                        break;
                    case 3:
                        if(cuenta2>=1) { //Esperamos 20mseg para ignorar el rebote
                            temp1=0;

                             //Todas las maquinas de antirebote son iguales, solo que correspondientes a su pulsador y color asociado.
                        }
                        break;
                }


                switch (temp2) { //Maquina de antirebote para el color verde
                    case 0:
                        if(entb==0){
                            temp2=1; 
                        cuenta2=0;
                        }
                        break;
                    case 1:
                        if(cuenta2>=1) { 
                            temp2=2;

                            
                            e=0;
                            ledverde=0; 
                            ledrojo=1;
                            ledazul=1;
                            ap=1;
                        }
                        break;
                    case 2:
                        if(entb==1){
                            temp2=3;
                        cuenta2=0;
                        }
                        break;
                    case 3:
                        if(cuenta2>=1) {
                            temp2=0;

                           
                        }
                        break;
                }
                switch (temp3) { //Maquina de antirebote del color azul
                    case 0:
                        if(entc==0){
                            temp3=1;
                        cuenta2=0;
                        }
                        break;
                    case 1:
                        if(cuenta2>=1) {
                            temp3=2;

                           
                            e=0;
                            ledverde=1;
                            ledrojo=1;
                            ledazul=0;
                            ap=3;
                        }
                        break;
                    case 2:
                        if(entc==1){
                            temp3=3;
                        cuenta2=0;
                        }
                        break;
                    case 3:
                        if(cuenta2>=1) {
                            temp3=0;

                           
                        }
                        break;
                } //Termina la maquina

                if(ap!=4) { //AP es 4 cuando nada se aprieta, en caso de que no sea 4 significa que algo se apreto
                    if(ap==dato[b]&&e==1) { //Si lo que se apreto es igual a lo que habia que apretar, avanzamos (tambien hay que esperar a que pase 1seg)
                        b++; //Guardamos que avanzamos en 1
                        estado=5; //Si es correcto, vamos al estado 5 que es un clon de este estado
                        e=0; 
                        
                        ap=4; //Ponemos AP en 4 para que no nos cuente mas de 1 vez un solo apriete
                        ledverde=1; //Apagamos todo 
                        ledrojo=1;
                        ledazul=1;

                    }
                    if(ap!=dato[b]&&e==1) { //Si el boton no corresponde con lo que habia que apretar, aplicamos la parte del error
                        
                        estado=6; 
                        e=0;
                        b=1; //Ponemos en 0 todo (o 1 en caso de b)
                    }
                }
                if(b==cuenta) { //Si avanzamos correctamente hasta el punto que no hay mas colores que apretar, significa que ganamos 
                    
                    cuenta++; //Guardamos que queremos 1 color mas
                    e=0; 
                    estado=8; 
                }
                if(b==24) { //Si llegamos a 24 significa que el juego termino
                    
                    b=1; 
                    e=0; 
                    estado=6; 
                }
                
                if(cuenta2>=3000) { //Si pasan 3 segundos sin tocar nada tambien se pierde significa que el juego termino
                    
                    b=1; 
                    e=0; 
                    estado=6; 
                }
                
                break;
            case 5: //Clon del estado 4
                
                
                switch (temp1) {
                    case 0:
                        if(enta==0){
                            temp1=1;
                        cuenta2=0;
                        }
                        break;
                    case 1:
                        if(cuenta2>=2) {
                            temp1=2;

                            e=0;
                            ledverde=1;
                            ledrojo=0;
                            ledazul=1;
                            ap=2;
                        }
                        break;
                    case 2:
                        if(enta==1){
                            temp1=3;
                        cuenta2=0;
                        }
                        break;
                    case 3:
                        if(cuenta2>=2) {
                            temp1=0;

                            
                        }
                        break;
                }


                switch (temp2) {
                    case 0:
                        if(entb==0){
                            temp2=1;
                        cuenta2=0;
                        }
                        break;
                    case 1:
                        if(cuenta2>=2) {
                            temp2=2;

                           
                            e=0;
                            ledverde=0;
                            ledrojo=1;
                            ledazul=1;
                            ap=1;
                        }
                        break;
                    case 2:
                        if(entb==1){
                            temp2=3;
                        cuenta2=0;
                        }
                        break;
                    case 3:
                        if(cuenta2>=2) {
                            temp2=0;

                            
                        }
                        break;
                }
                switch (temp3) {
                    case 0:
                        if(entc==0){
                            temp3=1;
                        cuenta2=0;
                        }
                        break;
                    case 1:
                        if(cuenta2>=2) {
                            temp3=2;

                            
                            e=0;
                            ledverde=1;
                            ledrojo=1;
                            ledazul=0;
                            ap=3;
                        }
                        break;
                    case 2:
                        if(entc==1){
                            temp3=3;
                        cuenta2=0;
                        }
                        break;
                    case 3:
                        if(cuenta2>=2) {
                            temp3=0;

                           
                        }
                        break;
                }
                

                if(ap!=4) {
                    if(ap==dato[b]&&e==1) {
                        b++;
                        estado=4; //Si es correcto, vamos al estado 4 otra vez. Es un ciclo infinito
                        e=0;
                        ap=4;
                        ledverde=1;
                        ledrojo=1;
                        ledazul=1;

                    }
                    if(ap!=dato[b]&&e==1) {

                        estado=6;
                        e=0;
                        b=1;
                    }
                }
                if(b==cuenta) {
                    
                    cuenta++;
                    e=0;
                    estado=8;
                }
                if(b==24) { //Si llegamos a 24 significa que el juego termino
                    
                    b=1; 
                    e=0; 
                    estado=6; 
                }
                
                
                if(cuenta2>=3000) { //Si pasan 3 segundos sin tocar nada tambien se pierde significa que el juego termino
                    
                    b=1; 
                    e=0; 
                    estado=6; 
                }
                break;
            case 6:
                 //Estado de error
                ledverde=1; //Apagamos todo
                ledrojo=1;
                ledazul=1;
                ap=4; 
                
                cantidad=1; //Ponemos todas las variables para empezar desde 0 todo el juego
                cuenta=2;
                b=1;
                if(e==1) {
                    estado=1; //Luego de esperar 1seg, vamos al estado 1 a empezar otra vez
                    printf("Presione los botones en el siguiente orden: (rojo=2)(verde=1)(azul=3)\n");
                    }
                e=0;
                

            case 7:
                
                if(e==1)
                    estado=2;//Esperamos 1seg antes de mostrar el siguiente color
                e=0;
                break;
            case 8: 
                if(e==1)
                    estado=1;//Esperamos 1seg antes de avanzar en el juego
                e=0;
                break;







        }




    }
}


void cuento()
{

    cuenta2++; //Cuenta cada 10mseg para el sistema de antirebote
    
}
void funcion()
{
    
    if(e==0) //Se pone en 1 cada 1seg
        e=1;

}