Simon

Dependencies:   mbed

main.cpp

Committer:
JuanClerici
Date:
2019-05-27
Revision:
0:a49a5f50d6bc
Child:
1:78297550b459

File content as of revision 0:a49a5f50d6bc:

#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 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 r = 1;
char t = 0;
char pos = 0;
int times    = 0, espera = 0;;
bool flagPulsador = 0;
char pulsador = 0;
char estado = 0;

bool timer1 = 0, timer2 = 0, timer3 = 0;
bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1;
bool st1= 0, st2 = 0, st3 = 0, l = 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");
//Ejecutar onCharReceived por cada entrada por puerto

    while(true) {
        Pulsador();
        simon();
        flagPulsador = 0;
    }
}
void simon()
{
    static int i;
    switch(estado) {
        default:
            times = 0;
            if(pulsador != 0 && flagPulsador == 1) {
                leds(0b000);
                printf("Comencemos: \r\n\n");
                estado = 1;
                flagPulsador = 0;
            }
            break;

        case 1:
            //Reinicio la secuencia
            srand (semilla*4920*1912);
            for(i = 0; i <= NIVELES ; i ++) {
                sec[i] = rand() % 3 + 1;
            }
            r = 1;
            t = 0;
            pos = 0;
            estado = 2;
            times = 0;
            l = 0;
            break;

        case 2:
            //Muestro la secuencia
            if(l) {
                if (apagado == 0) {
                    if(t >= r) {
                        estado = 3;
                        printf("\nA jugar Bro :) \r");
                        printf("\r\n\n");
                        espera = 0;
                        break;
                    }
                    switch(sec[t]) {
                        case 1:
                            leds(0b100);
                            if(times > 5) {
                                times = 0;
                                printf("ROJO\r\n");
                                apagado = 1;
                                t++;
                            }
                            break;
                        case 2:
                            leds(0b010);
                            if(times > 5) {
                                apagado = 1;
                                times = 0;
                                printf("VERDE\r\n");
                                t++;
                            }
                            break;
                        case 3:
                            leds(0b001);
                            if(times > 5) {
                                apagado = 1;
                                times = 0;
                                printf("AZUL\r\n");
                                t++;
                            }
                            break;
                    }
                } else {
                    leds(0b000);
                    if (times > 5) {
                        times = 0;
                        apagado = 0;
                    }
                }
            } else {
                if (times > 5)
                    leds(0b000);
                if (times > 10) {
                    l = 1;
                    times = 0;
                }
            }
            break;
        case 3:
            if (espera > 50) {
                printf("Tardaste demaciado tiempo en elegir\r\n");
                estado = 4;
                break;
            }
            if(flagPulsador) {
                espera = 0;
                flagPulsador = 0;
                times = 0;
                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;
                }
                if(pulsador == sec[pos]) {
                    pos++;
                    if(pos == r) {
                        r++;
                        printf("\n\t--------------------------------\r");
                        if (r == NIVELES + 1) {
                            printf("\nGANASTE!!! :)\r\n\n");
                            printf("Apreta cualquier boton para reiniciar!\r\n\n");
                            leds(0b111);
                            estado = 0;
                        } else {
                            printf("\nPasaste al nivel %d!\r\n\n", r);
                            t = 0;
                            pos = 0;
                            estado = 2;
                            l = 0;
                            times = 0;
                        }
                    }
                } else {
                    estado = 4;
                }
            }
            if (times > 5) {
                leds(0b000);

            }
            break;
        case 4:
            printf("\nPerdiste Bro :(\r\n");
            printf("Apreta cualquier boton para reiniciar!\r\n\n");
            leds(0b111);
            estado = 0;
            break;
    }
}
void leds(int num)
{
    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()
{
    pulsador = 0;
    
    if (PV.rising()) {
        flagPulsador = 1;
        pulsador = 2;
        return 0;
    }
    if (PA.rising()) {
        flagPulsador = 1;
        pulsador = 3;
        return 0;
    }
    if (PR.rising()) {
        flagPulsador = 1;
        pulsador = 1;
        return 0;
    }
    
    pulsador = 0;
    flagPulsador = 0;
    return 0;
}

void invierte()
{
    times++;
    semilla ++;
    espera++;
}