Gabriel Lopez
/
TP1 - Ejercicio2
Ejercicio realizado por: HU, Julian y LOPEZ, Gabriel.
Diff: main.cpp
- Revision:
- 2:2aa02cd60b0b
- Parent:
- 1:06553fdedc7e
--- a/main.cpp Wed Jun 26 16:00:03 2019 +0000 +++ b/main.cpp Thu Jun 27 21:36:35 2019 +0000 @@ -1,294 +1,314 @@ -//Incluyo las librerias a utilizar. #include "mbed.h" -//Se cambia el nombre de "0" y de "1" por NO, SI, ON y OFF para que el progama sea mas facil de leer. -#define NO 0 -#define SI 1 -#define ON 1 -#define OFF 0 +#define ON 0 +#define OFF 1 -//Lo mismo que en el caso anterior, pero con el led. #define LED_ON 0 #define LED_OFF 1 - -//Lo mismo que en el caso anterior, pero con el pulsador. -#define PULS_ON 0 -#define PULS_OFF 1 - -//Se definen las entradas digitales para los tres pulsadores. -DigitalIn pulsador_1 (PTC12); -DigitalIn pulsador_2 (PTC13); -DigitalIn pulsador_3 (PTC16); - -//Se definen como salidas digitales los 3 leds para podes jugar. -DigitalOut ledrojo(LED_RED); -DigitalOut ledazul(LED_BLUE); -DigitalOut ledverde(LED_GREEN); +#define NADA 99 +//------------------------------SALIDA DE LEDS--------------------------------// +DigitalOut led_r(LED_RED); +DigitalOut led_a(LED_BLUE); +DigitalOut led_v(LED_GREEN); +//---------------------------ENTRADA DE PULSADORES----------------------------// +DigitalIn boton_0 (PTC12); +DigitalIn boton_1 (PTC13); +DigitalIn boton_2 (PTC16); +//----------------------------MAQUINA PRINCIPAL-------------------------------// +enum { + INICIO, + SECUENCIA_LED, + MUESTRA_SECUENCIA, + DETECCION +} maq_principal; +//------------------------MAQUINA DE MUESTRA DE LEDS--------------------------// +enum { + MUESTRA_LED, + LED_R_ON, + LED_V_ON, + LED_A_ON +} maq_leds; +//---------------------MAQUINA DE DETTECION DE PULSADORES---------------------// +enum { + DETT_PULS, + BOTON_0_ON, + BOTON_1_ON, + BOTON_2_ON +} maq_botones; +//----------------MAQUINA DE DETECCION DE PULSADOR DE INICIO------------------// +enum { + DETT, + ESP +} encendido; +//-------------------------------FUNCIONES------------------------------------// +void pulsador_on(); +void muestra_de_leds(); +void deteccion_de_puls(); +//---------------------------FUNCION PARA TIMER-------------------------------// +void timer(); +Ticker ti; +int t_juego = 0; +bool toff = false; +bool errores = false; +bool a = false; -//Se definen todos los Tickers. -Ticker pulsos; -Ticker aviso; -Ticker colores; -Ticker ti; -Ticker random; +uint8_t boton = NADA,random; +uint8_t turno = 0, turno_acciones = 0; +int t_led = 0, t_espera=0, t_juego = 0;// VARIABLES PARA TEMPORIZADORES +uint8_t secuencia[24]; -//Se definen todos los prototipos de las funciones. -void pulsador(); -void timer(); -void detector(); -void muestra(); -void mostrar(); -void intermitencia(); -void obtengorandom(); - -//Se definen todas las variables a utilizar -uint8_t secuencia[25], turno=0,toff=0; //Estas son uint8_t para ocupar menos espacio -uint8_t juego=OFF,a=0,empieza=NO,ocupado=NO,interaccion=NO; //Estas son uint8_t para ocupar menos espacio -uint8_t pulso_1=OFF,pulso_2=OFF,pulso_3=OFF; //Estas son uint8_t para ocupar menos espacio -int tiempo=0, valorrandom; int main() { - //Habilito las interrupciones. __enable_irq(); - //Defino la semilla para los numero random. - srand(valorrandom); - //Llamo a la funcion obtengorandom cada 10ms. - random.attach(&obtengorandom,0.01); - //Activo las R Pull-UP internas de los 3 pulsadores. - pulsador_1.mode(PullUp); - pulsador_2.mode(PullUp); - pulsador_3.mode(PullUp); - //Llamo a la funcion pulsador cada 10ms. - pulsos.attach(&pulsador,0.01); - //Al empezar el programa, se apagan todos los leds. - ledrojo = LED_OFF; - ledverde= LED_OFF; - ledazul = LED_OFF; +//-----------------------PULL UP PARA LOS PULSADORES--------------------------// + boton_0.mode(PullUp); + boton_1.mode(PullUp); + boton_2.mode(PullUp); +//----------------------------------------------------------------------------// + encendido = DETT; + maq_botones = DETT_PULS; + maq_principal = INICIO; + maq_leds = MUESTRA_LED; + srand(random); - while (true) { - if (juego == OFF) { - if (a == 0) { - aviso.attach(&intermitencia, 1); - printf("--------------------------------------------------------\n"); //Decoracion - printf("------------------------ATENCION------------------------\n"); //Decoracion - printf("--------------------------------------------------------\n"); //Decoracion - printf(" Presione cualquier pulsador para comenzar \n"); //Decoracion - a = 1; - } - if (pulso_2 == ON || pulso_1 == ON || pulso_3 == ON) { - pulso_1 = OFF; - pulso_3 = OFF; - pulso_2 = OFF; - ledrojo = LED_OFF; - ledazul = LED_OFF; - ledverde = LED_OFF; - juego = ON; - } - } - if (turno == 25 && ocupado == NO) { - printf("Congratulations, you won the game!"); - a = 0,turno = 0; - juego = OFF,empieza = NO,ocupado = NO; - ledrojo = LED_OFF; - ledazul = LED_OFF; - ledverde= LED_OFF; - } - if (juego == ON && empieza == SI && ocupado == NO && turno < 25) { - secuencia[turno] = rand () % 3; - turno++; - ocupado = SI; - colores.attach(&mostrar,0.1); - } - if (interaccion == SI) { - pulsos.attach(&pulsador,0.01); - ti.attach(&timer,0.01); - tiempo = 1001; - interaccion = NO; + ti.attach(&timer,0.01); +/* + EL PROGRAMA EMPIEZA ESPERANDO LA SEÑAL DEL PULSADOR DE INICIO. + UNA VEZ PULSADO, EMPIEZA EL JUEGO, ENTRE CADA PULSO HAY 5 SEGUNDOS DE ESPERA + SI LLEGA A LOS 5 SEGUNDOS Y NO SE PRESIONO NINGUN BOTON, PIERDES Y EL JUEGO + SE REINICIA. + LA SECUENCIA SE VA A IR GENERANDO A MEDIDA QUE VA AVANZANDO EL JUEGO. +*/ + while(1) { + switch (maq_principal) { + case INICIO: + if (a == false) { + printf("toque el primer boton para comenzar\n"); + a = true; + } + pulsador_on(); + led_r = LED_ON; + led_a = LED_ON; + led_v = LED_ON; + if (boton == 5) { + boton = NADA; + turno = 0; + maq_principal = SECUENCIA_LED; + } + break; + case SECUENCIA_LED: + if (turno == 24) { + maq_principal = INICIO; + printf("you won \n"); + } + if (turno < 24) { + secuencia[turno] = rand () % 3; + t_led = 50; + maq_principal = MUESTRA_SECUENCIA; + } + break; + case MUESTRA_SECUENCIA: + muestra_de_leds(); + if (t_led == 0 && turno_acciones > turno) { + turno_acciones = 0; + t_juego = 500; + maq_principal = DETECCION; + } + break; + case DETECCION: + deteccion_de_puls(); + if (errores == true) { + printf("you lose\n"); + maq_principal = INICIO; + } + if (t_juego == 0) { + printf("se acabo el tiempo\n"); + maq_principal = INICIO; + } + if (turno_acciones > turno) { + turno_acciones = 0; + turno++; + maq_principal = SECUENCIA_LED; + } } } } -void timer() + +void pulsador_on() { - static uint8_t c=0; - tiempo--; - if(pulso_2 == ON && secuencia[c] == 1) { - //printf("correcto\n"); - pulso_2 = OFF; - ledverde = LED_OFF; - tiempo = 1001; - c++; - } - if(pulso_1 == ON && secuencia[c] == 0) { - //printf("correcto\n"); - pulso_1 = OFF; - ledrojo = LED_OFF; - tiempo = 1001; - c++; - } - if(pulso_3 == ON && secuencia[c] == 2) { - //printf("correcto\n"); - pulso_3 = OFF; - ledazul = LED_OFF; - tiempo = 1001; - c++; + switch(encendido) { + case DETT: + if (boton_0 == ON && t_espera == 0) { + t_espera = 5; + toff = false; + encendido = ESP; + } + break; + case ESP: + if (t_espera == 0 && toff == false && boton_0 == OFF) { + t_espera = 5; + toff = true; + } + if(t_espera == 0 && toff == true) { + boton = 5; + encendido = DETT; + } + break; } - if (c == turno) { - printf("--------------------------------------------------------\n"); //Decoracion - printf("--------------------Nivel %d superado-------------------\n",c); //Decoracion - printf("--------------------------------------------------------\n"); //Decoracion - - ocupado=NO; - pulsos.detach(); - ti.detach(); - c=0; - toff=6; - } - if (pulso_3 == ON && secuencia[c] != 2 || - pulso_1 == ON && secuencia[c] != 0 || - pulso_2 == ON && secuencia[c] != 1 || - tiempo==0) { - printf("--------------------------------------------------------\n"); //Decoracion - printf("--------------------------------------------------------\n"); //Decoracion - printf("-----------------------YOU LOSE-------------------------\n"); //Decoracion - printf("--------------------------------------------------------\n"); //Decoracion - printf("--------------------------------------------------------\n"); //Decoracion - - ti.detach(); - a = 0,turno = 0; - juego = OFF,empieza = NO,ocupado = NO; - ledrojo = LED_OFF; - ledazul = LED_OFF; - ledverde= LED_OFF; - pulso_1 = OFF; - pulso_2 = OFF; - pulso_3 = OFF; +} +/* + SE VAN MOSTRANDO LA SECUENCIA DE LOS LED, SE VA A MOSTRAR POR 1 SEGUNDO Y + VA A ESTAR APAGADO POR 0.5 SEGUNDOS, DE ESTA FORMA SE LO PUEDE DIFERENCIAR + DE OTRA SECUENCIA CON EL MISMO COLOR. +*/ +void muestra_de_leds() +{ + switch (maq_leds) { + case MUESTRA_LED: + led_r = LED_OFF; + led_a = LED_OFF; + led_v = LED_OFF; + if (t_led == 0 && turno_acciones <= turno) { + if(secuencia[turno_acciones] == 0) { + maq_leds = LED_R_ON; + t_led = 100; + } + if(secuencia[turno_acciones] == 1) { + maq_leds = LED_V_ON; + t_led = 100; + } + if(secuencia[turno_acciones] == 2) { + maq_leds = LED_A_ON; + t_led = 100; + } + } + break; + case LED_R_ON: + led_r = LED_ON; + led_a = LED_OFF; + led_v = LED_OFF; + if (t_led == 0) { + turno_acciones++; + t_led = 50; + maq_leds = MUESTRA_LED; + } + break; + case LED_V_ON: + led_r = LED_OFF; + led_a = LED_OFF; + led_v = LED_ON; + if (t_led == 0) { + turno_acciones++; + t_led = 50; + maq_leds = MUESTRA_LED; + } + break; + case LED_A_ON: + led_r = LED_OFF; + led_a = LED_ON; + led_v = LED_OFF; + if (t_led == 0) { + turno_acciones++; + t_led = 50; + maq_leds = MUESTRA_LED; + } + break; } } - -void mostrar() -{ - muestra(); -} - -void muestra() +/* + LOS BOTONES ESTAN PROGRAMADOS PARA QUE SE ACTIVEN CON FLANCO DESCENDENTE, + ENTONCES SI LOS PRESIONAN, PRIMERO VA A CONTAR 50MS DE ANTIREBOTE Y ESPERA + A QUE SUELTEN EL BOTON, UNA VEZ SOLTADO EL BOTON, VA A ESPERAR OTROS 50MS + DE ANTIRREBOTE Y ES ESE PUNTO DETECTA EL BOTON. +*/ +void deteccion_de_puls() { - static uint8_t i=0,ton=0; - uint8_t color;//tf=turno+1; - if (ton == 0 && toff == 0) { - if (i == turno) { - colores.detach(); - interaccion = SI; - i = 99; - } - color=secuencia[i]; - if (i == 99) - color = 3; - switch (color) { - case 3: - i = 99; - break; - case 0: - ledrojo = LED_ON; - ledverde= LED_OFF; - ledazul = LED_OFF; - ton=11; - break; - - case 1: - ledrojo = LED_OFF; - ledverde= LED_ON; - ledazul = LED_OFF; - ton=11; - break; - - case 2: - ledrojo = LED_OFF; - ledverde= LED_OFF; - ledazul = LED_ON; - ton=11; - break; - }//switch - i++; - if(i == 100) - i = 0; - }//if ton/toff=0 - if (ton > 0) { - ton--; - toff = 6; - } - if (ton == 0 && toff > 0) { - toff--; - ledrojo = LED_OFF; - ledverde= LED_OFF; - ledazul = LED_OFF; - } -}//final -void pulsador() -{ - detector(); -} -void detector() -{ - static uint8_t verificacion_1=OFF,verificacion_2=OFF,verificacion_3=OFF, antirebote=0; - //pulsador 1 - if (pulsador_1 == PULS_ON && pulso_1 == OFF && verificacion_1 == OFF) { - antirebote = 4; - verificacion_1 = ON; - ledrojo = LED_ON; - } - //pulsador 2 - if (pulsador_2 == PULS_ON && pulso_2 == OFF && verificacion_2 == OFF) { - antirebote = 4; - verificacion_2 = ON; - ledverde= LED_ON; - } - //pulsador 3 - if (pulsador_3 == PULS_ON && pulso_3 == OFF && verificacion_3 == OFF) { - antirebote = 4; - verificacion_3 = ON; - ledazul = LED_ON; - } - if (antirebote==0) { - if (pulsador_1 == PULS_OFF && verificacion_1 == ON) { - verificacion_1 = OFF; - pulso_1 = ON; - //printf("pulsador 1 on\n"); - } - if (pulsador_2 == PULS_OFF && verificacion_2 == ON) { - verificacion_2 = OFF; - pulso_2 = ON; - //printf("pulsador 2 on\n"); - } - if (pulsador_3 == PULS_OFF && verificacion_3 == ON) { - verificacion_3 = OFF; - pulso_3 = ON; - //printf("pulsador 3 on\n"); - } - } - if (antirebote>0) - antirebote--; -} - -void intermitencia() -{ - if (juego == OFF) { - ledrojo = !ledrojo; - ledazul = !ledazul; - ledverde= !ledverde; - } - if (juego == ON) { - printf("--------------------------------------------------------\n"); //Decoracion - printf("-----------------------ATENCION-------------------------\n"); //Decoracion - printf(" QUE COMIENCE EL JUEGO \n"); //Decoracion - empieza = SI; - aviso.detach(); - pulsos.detach(); + switch(maq_botones) { + case DETT_PULS: + led_r = LED_OFF; + led_a = LED_OFF; + led_v = LED_OFF; + if (t_juego > 0 && turno_acciones <= turno && errores == false) { + if (boton_0 == ON && t_espera == 0) { + t_espera = 5; + toff = false; + led_r = LED_ON; + maq_botones = BOTON_0_ON; + } + if (boton_1 == ON && t_espera == 0) { + t_espera = 5; + toff = false; + led_v = LED_ON; + maq_botones = BOTON_1_ON; + } + if (boton_2 == ON && t_espera == 0) { + t_espera = 5; + toff = false; + led_a = LED_ON; + maq_botones = BOTON_2_ON; + } + } + break; + case BOTON_0_ON: + if (t_espera == 0 && toff == false && boton_0 == OFF) { + t_espera = 5; + toff = true; + } + if (t_espera == 0 && toff == true) { + boton = 0; + if (boton == secuencia[turno_acciones]) { + turno_acciones++; + t_juego = 500; + } else { + errores = true; + } + maq_botones = DETT_PULS; + boton = NADA; + } + break; + case BOTON_1_ON: + if (t_espera == 0 && toff == false && boton_1 == OFF) { + t_espera = 5; + toff = true; + } + if (t_espera == 0 && toff == true) { + boton = 1; + if (boton == secuencia[turno_acciones]) { + turno_acciones++; + t_juego = 500; + } else { + errores = true; + } + maq_botones = DETT_PULS; + boton = NADA; + } + break; + case BOTON_2_ON: + if (t_espera == 0 && toff == false && boton_2 == OFF) { + t_espera = 5; + toff = true; + } + if (t_espera == 0 && toff == true) { + boton = 2; + if (boton == secuencia[turno_acciones]) { + turno_acciones++; + t_juego = 500; + } else { + errores = true; + } + maq_botones = DETT_PULS; + boton = NADA; + } + break; } } - -void obtengorandom () +void timer () { - valorrandom++; - srand(valorrandom); + if(t_led > 0) + t_led--; + if(t_espera > 0) + t_espera--; + if(t_juego > 0) + t_juego--; } \ No newline at end of file