![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
VersionFinal
Diff: main.cpp
- Revision:
- 0:9475a54ade9e
- Child:
- 1:2aa790d91fb0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jun 16 01:19:26 2019 +0000 @@ -0,0 +1,331 @@ +/* + FERNANDEZ-CLERICI + EJER03 - TP01 + +PTB0 -- Pulsador Verde (CONECTADO A GND) +PTB1 -- Pulsador Azul (CONECTADO A GND) +PTB3 -- Pulsador Rojo (CONECTADO A GND) + +*/ + +/*Librerias*/ +#include "mbed.h" +#include "tsi_sensor.h" +#include "DebouncedIn.h" + +/* 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 + +#define ESTADO_COMENZAR 0 +#define ESTADO_REINICIO 1 +#define ESTADO_MUESTREO 2 +#define ESTADO_JUEGO 3 +#define ESTADO_PERDER 4 +#define ESTADO_GANAR 5 + +#define NIVELES 25 + + +TSIAnalogSlider tsi(ELEC0, ELEC1, 40); +//Definimos que el puerto serie se llama pc +Serial pc(USBTX, USBRX); +//Variable donde se guarda lo leido +char c = '\0'; +unsigned int semilla = 0; +//bit usado como flag para procesar datos +bool newdata = false; //Se pone en true cuando hay nuevos datos +//Creamos los tres leds pra usar +DigitalOut Rojo(LED1); +DigitalOut Verde(LED2); +DigitalOut Azul(LED3); + +void invierte(); +void simon(); +char Pulsador (); +void leds(int num); // led(0b000) = apagados, led(0b100) = rojo, led(0b010) = Verde, led(0b001) = Azul, led(0b111) = Blanco, + +char sec[50] = {0}; +char nivelSec = 1; +char posSec = 0; +char posJuego = 0; +int times = 0, espera = 0;; +bool flagPulsador = 0; +char pulsador = 0; +char estado = ESTADO_COMENZAR; + +bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1; +bool st1= 0, st2 = 0, st3 = 0, loop = 1, apagado = 0; + + +DebouncedIn PV(PTB1); +DebouncedIn PA(PTB0); +DebouncedIn PR(PTB2); +Ticker ti; + +//Callback cuando se detecta una entrada +void onCharReceived() +{ + //Copiamos lo leido en c + c = pc.getc(); + newdata = true; +} + +int main() +{ + ti.attach(&invierte, 0.1); + +//Prendemos los LEDS + leds(0b111); + printf("Toque cualquier pulsador para comenzar: \r\n"); + + while(true) { + //Cambio el estado de los pulsadores + Pulsador(); + //Ejecuto la funcion principal + simon(); + //Aseguro el reset de la habilitacion del pulsador + flagPulsador = 0; + } +} +void simon() +{ + static int i; + switch(estado) { + case ESTADO_COMENZAR: + //Espero que pulsen un pulsador para empezar + times = 0; + if(pulsador != 0 && flagPulsador == 1) { + leds(0b000); + printf("Comencemos: \r\n\n"); + estado = ESTADO_REINICIO; + flagPulsador = 0; + } + break; + + case ESTADO_REINICIO: + //Seteo la semilla + srand (semilla*4920*1912); + //Genero la secuencia + for(i = 0; i <= NIVELES ; i ++) { + sec[i] = rand() % 3 + 1; + } + nivelSec = 1; + posSec = 0; + posJuego = 0; + estado = ESTADO_MUESTREO; + times = 0; + loop = 0; + break; + + case ESTADO_MUESTREO: + //Muestro la secuencia generada + if(loop) { + //Cada vez que termino de mostrar un LED + if (apagado == 0) { + //Evaluo si mostre la cantidad de LEDs segun el nivel + if(posSec >= nivelSec) { + estado = ESTADO_JUEGO; + printf("\nA jugar Bro :) \r"); + printf("\r\n\n"); + espera = 0; + break; + } + switch(sec[posSec]) { + case 1: + //Muestro LED rojo + leds(0b100); + if(times > 5) { + times = 0; + printf("ROJO\r\n"); + apagado = 1; + posSec++; + } + break; + case 2: + //Muestro LED verde + leds(0b010); + if(times > 5) { + apagado = 1; + times = 0; + printf("VERDE\r\n"); + posSec++; + } + break; + case 3: + //Muestro LED azul + leds(0b001); + if(times > 5) { + apagado = 1; + times = 0; + printf("AZUL\r\n"); + posSec++; + } + break; + } + } else { + //Dejo un espacio apagado entre los colores de las secuencias + leds(0b000); + if (times > 5) { + times = 0; + apagado = 0; + } + } + } else { + //Espero 5 times el ultimo LED encendido y lo apago + if (times > 5) + leds(0b000); + //Espero 5 times mas para separar el final de muestreo con el inicio del Juego + if (times > 10) { + loop = 1; + times = 0; + } + } + break; + case ESTADO_JUEGO: + //Detecto si el jugador tarda mucho tiempo en apretar un boton + if (espera > 50) { + printf("Tardaste demaciado tiempo en elegir\r\n"); + estado = ESTADO_PERDER; + break; + } + //Detecto un cambio en los pulsadores + if(flagPulsador) { + espera = 0; + flagPulsador = 0; + times = 0; + //Detecto que pulsador precionaron y enciendo el LED + switch(pulsador) { + case 1: + printf("ROJO \r\n"); + leds(0b100); + break; + case 2: + printf("VERDE \r\n"); + leds(0b010); + break; + case 3: + printf("AZUL \r\n"); + leds(0b001); + break; + } + //Comparo si el pulsador apretado es el correcto segun la secuencia + if(pulsador == sec[posJuego]) { + posJuego++; + //Si alcancé el nivel en el que estoy paso de nivel + if(posJuego == nivelSec) { + nivelSec++; + printf("\n\t--------------------------------\r"); + //Si alcancé el máximo nivel paso al estado GANAR + if (nivelSec == NIVELES + 1) { + estado = ESTADO_GANAR; + } else { + //Si no llegué al máximo nivel paso de nivel + printf("\nPasaste al nivel %d!\r\n\n", nivelSec); + posSec = 0; + posJuego = 0; + estado = ESTADO_MUESTREO; + loop = 0; + times = 0; + } + } + } else { + //Si el pulsador no corresponde con la secuencia paso al estado PERDER + estado = ESTADO_PERDER; + } + } + //Espero 5 times el LED encendido + if (times > 5) { + leds(0b000); + + } + break; + case ESTADO_PERDER: + //Prendo el LED blanco para mostrar que termino el juego y vuelvo al estado COMENZAR + printf("\nPerdiste Bro :(\r\n"); + printf("Apreta cualquier boton para reiniciar!\r\n\n"); + leds(0b111); + estado = ESTADO_COMENZAR; + break; + + case ESTADO_GANAR: + //Mustro el LED blanco para mostrar que termino el juego y aviso que completo la secuencia + printf("\nGANASTE!!! :)\r\n\n"); + printf("Apreta cualquier boton para reiniciar!\r\n\n"); + leds(0b111); + estado = ESTADO_COMENZAR; + break; + } +} +void leds(int num) +{ + //Funcion que codifica el encendido y apagado de los LEDs + switch(num) { + case 0: + Rojo = 1; + Verde = 1; + Azul = 1; + break; + case 4: + Rojo = 0; + Verde = 1; + Azul = 1; + break; + case 2: + Rojo = 1; + Verde = 0; + Azul = 1; + break; + case 1: + Rojo = 1; + Verde = 1; + Azul = 0; + break; + case 7: + Rojo = 0; + Verde = 0; + Azul = 0; + break; + } +} + +char Pulsador() +{ + //Funcion que aciva un flag con el cambio del pulsador y guarda el pulsado en una variable + pulsador = 0; + + if (PR.rising()) { + flagPulsador = 1; + pulsador = 1; + return 0; + } + if (PV.rising()) { + flagPulsador = 1; + pulsador = 2; + return 0; + } + if (PA.rising()) { + flagPulsador = 1; + pulsador = 3; + return 0; + } + + pulsador = 0; + flagPulsador = 0; + return 0; +} + +void invierte() +{ + //Funcion que detecta las interrupciones del timer + times++; + semilla ++; + espera++; +} \ No newline at end of file