Pio IX Jalle Ventiades 6b 2019

Dependencies:   mbed tsi_sensor MMA8451Q

Revision:
0:ad5829ebd588
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 23 13:43:37 2019 +0000
@@ -0,0 +1,443 @@
+#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;
+
+}
\ No newline at end of file