VersionFinal

Dependencies:   mbed tsi_sensor

Files at this revision

API Documentation at this revision

Comitter:
NIcolasFernandezSanz
Date:
Sun Jun 16 01:19:26 2019 +0000
Commit message:
FERNANDEZ_CLERICI;

Changed in this revision

DebouncedIn.cpp Show annotated file Show diff for this revision Revisions of this file
DebouncedIn.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
tsi_sensor.lib Show annotated file Show diff for this revision Revisions of this file
--- /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