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; }