Simon

Dependencies:   mbed

main.cpp

Committer:
JuanClerici
Date:
2019-06-17
Revision:
3:1610e2f8803b
Parent:
2:f45bd4655817
Child:
4:ddba0fd2caa4

File content as of revision 3:1610e2f8803b:

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