Nicolas Fernandez Sanz
/
TP1_EJER03_FERNANDEZ_CLERICI
VersionFinal
Revision 0:9475a54ade9e, committed 2019-06-16
- Comitter:
- NIcolasFernandezSanz
- Date:
- Sun Jun 16 01:19:26 2019 +0000
- Commit message:
- FERNANDEZ_CLERICI;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DebouncedIn.cpp Sun Jun 16 01:19:26 2019 +0000 @@ -0,0 +1,93 @@ +#include "DebouncedIn.h" +#include "mbed.h" + +/* + * Constructor + */ +DebouncedIn::DebouncedIn(PinName in) + : _in(in) { + + // reset all the flags and counters + _samples = 0; + _output = 0; + _output_last = 0; + _rising_flag = 0; + _falling_flag = 0; + _state_counter = 0; + + // Attach ticker + _ticker.attach(this, &DebouncedIn::_sample, 0.005); +} + +void DebouncedIn::_sample() { + + // take a sample + _samples = _samples >> 1; // shift left + + if (_in) { + _samples |= 0x80; + } + + // examine the sample window, look for steady state + if (_samples == 0x00) { + _output = 0; + } + else if (_samples == 0xFF) { + _output = 1; + } + + + // Rising edge detection + if ((_output == 1) && (_output_last == 0)) { + _rising_flag++; + _state_counter = 0; + } + + // Falling edge detection + else if ((_output == 0) && (_output_last == 1)) { + _falling_flag++; + _state_counter = 0; + } + + // steady state + else { + _state_counter++; + } + + // update the output + _output_last = _output; + +} + + + +// return number of rising edges +int DebouncedIn::rising(void) { + int return_value = _rising_flag; + _rising_flag = 0; + return(return_value); +} + +// return number of falling edges +int DebouncedIn::falling(void) { + int return_value = _falling_flag; + _falling_flag = 0; + return(return_value); +} + +// return number of ticsk we've bene steady for +int DebouncedIn::steady(void) { +return(_state_counter); +} + +// return the debounced status +int DebouncedIn::read(void) { + return(_output); +} + +// shorthand for read() +DebouncedIn::operator int() { + return read(); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DebouncedIn.h Sun Jun 16 01:19:26 2019 +0000 @@ -0,0 +1,31 @@ +#include "mbed.h" + + class DebouncedIn { + public: + DebouncedIn(PinName in); + + int read (void); + operator int(); + + int rising(void); + int falling(void); + int steady(void); + + private : + // objects + DigitalIn _in; + Ticker _ticker; + + // function to take a sample, and update flags + void _sample(void); + + // counters and flags + int _samples; + int _output; + int _output_last; + int _rising_flag; + int _falling_flag; + int _state_counter; + + }; + \ No newline at end of file
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Jun 16 01:19:26 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsi_sensor.lib Sun Jun 16 01:19:26 2019 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Kojto/code/tsi_sensor/#976904559b5c