Trabajo práctico 1 Ejercicio 2 SIMON Maver, Francisco Almada, Santiago

Dependencies:   mbed tsi_sensor

main.cpp

Committer:
Franmaver
Date:
2019-06-02
Revision:
0:8fc99b9ef045

File content as of revision 0:8fc99b9ef045:

#include "mbed.h"
#include "tsi_sensor.h"
#include "stdlib.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
//defino las salidas
DigitalOut verde(LED_GREEN);
DigitalOut azul(LED_BLUE);
DigitalOut rojo(LED_RED);

TSIAnalogSlider tsi(ELEC0, ELEC1, 40);

int PULS_TSI();
int COLORES();

//General
enum MAQUINA_ESTADO_GENERAL {INICIO, MUESTRO_SEC, ESPERO_SEC, APRETO, LOOSER, WIN};
MAQUINA_ESTADO_GENERAL MAQUINA_GENERAL;
void FUNCION_GENERAL();

//Muestro
enum MAQUINA_ESTADO_MUESTRO {INICIO2, ON, OFF};
MAQUINA_ESTADO_MUESTRO MAQUINA_MUESTRO;
void FUNCION_MOSTRAR();
char paso [25];
int nivel_muestro = 0;
int nivel_mostrando = 0;
int variable = 0;

//Apreto
enum MAQUINA_ESTADO_APRETO {INICIO3, ESPERO_PULS, COMPARO_PULS, DELAY, DELAY2};
MAQUINA_ESTADO_APRETO MAQUINA_APRETO;
void FUNCION_APRETO();
int espero_puls = 0;
int estado_prox = 0;

//tiempo
Ticker tiempo;
int contador = 0;
int contador_muestro = 0;
int contador_apreto = 0;
int PULSADOR = 5;
int mostrando = 0;
int apretar = 0;
void funcion_tiempo();

//funcion de los botones para el tsi
int PULS_TSI()
{
    if((tsi.readPercentage() > 0.06) && (tsi.readPercentage() < 0.2))
        PULSADOR = 0;//0 designado para el color rojo
    else if((tsi.readPercentage() > 0.4) && (tsi.readPercentage() < 0.6))
        PULSADOR = 1;//1 designado para el color verde
    else if((tsi.readPercentage() > 0.8) && (tsi.readPercentage() < 0.94))
        PULSADOR = 2;//2 designado para el color azul
    else
        PULSADOR = -1;//-1 designado cuando no se oprime el TSI

    return PULSADOR;//me devuelve lo que aprete
}
//funcion que prende los leds 
void COLORES(int color)
{
    switch(color) {
        case 0://rojo
            rojo = 0;
            verde = 1;
            azul = 1;
            break;
        case 1://verde
            rojo = 1;
            verde = 0;
            azul = 1;
            break;
        case 2://azul
            rojo = 1;
            verde = 1;
            azul = 0;
            break;
    }
}

int main(void)
{
    //defino los leds como apagados
    verde = 1;
    azul = 1;
    rojo = 1;
    tiempo.attach(&funcion_tiempo, 0.1);
    
    while (true) {
        variable++;//variable usada para el srand
        FUNCION_GENERAL();//GENERAL
        FUNCION_MOSTRAR();//MOSTRAR
        FUNCION_APRETO();//APRETAR
    }
}

void funcion_tiempo()
{
    contador++;
    contador_muestro++;
    contador_apreto++;
}

//GENERAL
void FUNCION_GENERAL()
{
    switch (MAQUINA_GENERAL) {

        default:
            MAQUINA_GENERAL = INICIO;
            break;
        case INICIO://igualo todas mis variables a 0 
            mostrando = 0;
            espero_puls = 0;
            nivel_muestro = 0;
            nivel_mostrando = 0;
            contador = 0;
            contador_muestro = 0;
            contador_apreto = 0;
            PULSADOR = 5;
            mostrando = 0;
            apretar = 0;
            if(tsi.readPercentage() != 0) {//oprimo TSI
                contador = 0;
                mostrando = 1;
                MAQUINA_GENERAL = MUESTRO_SEC;
            }
            break;
        case MUESTRO_SEC:
            if(mostrando == 0) {//mostrando va a ser 0 cuando en la funcion de mostrar ya mostro todo
                MAQUINA_GENERAL = ESPERO_SEC;
                apretar = 1;
            }
            break;
        case ESPERO_SEC:
            if(apretar == 0) {
                MAQUINA_GENERAL = MUESTRO_SEC;
                mostrando = 1;
            }
            break;
        case LOOSER://caso cuando perdes
        //prende salida color violeta por 2 segundos luego vuelve a inicio
            azul = 0;
            rojo = 0;
            verde = 1;
            if(contador >= 20) {
                azul = 1;
                rojo = 1;
                verde = 1;
                contador = 0;
                MAQUINA_GENERAL = INICIO;
            }
            break;
        case WIN://caso cuando ganas
        //prende salida color amarillo por 2 segundos luego vuelve a inicio
            contador = 0;
            rojo = 0;
            verde = 0;
            azul = 1;
            if(contador >= 20) {
                azul = 1;
                rojo = 1;
                verde = 1;
                contador = 0;
                MAQUINA_GENERAL = INICIO;
            }
            break;
    }
}
//MOSTRAR
void FUNCION_MOSTRAR()
{
    switch (MAQUINA_MUESTRO) {
        default:
            MAQUINA_MUESTRO = INICIO2;
            break;
        case INICIO2:
            if(mostrando == 1) {
                nivel_mostrando = 0;
                srand(variable);//como variable va a estar siempre variando, srand tomara distintas posiciones
                paso[nivel_muestro++] = (rand() % 3);//genero mi secuencia con numero al azar entre 0 y 2
                //POR QUE NIVEL VOY (nivel muestro)

                if(nivel_muestro == 24) {//si llego a 24 niveles, gano
                    mostrando = 0;
                    MAQUINA_GENERAL = WIN;
                    MAQUINA_MUESTRO = INICIO2;
                }
                contador_muestro = 0;
                MAQUINA_MUESTRO = ON;
            }
            break;
        case ON:
            COLORES(paso[nivel_mostrando]);//prendo los colores de la secuencia 

            //CUAL ESTOY MOSTRANDO AHORA (nivel_mostrando)
            //a medida que se aumentan los niveles se disminuye el tiempo de encendido de los leds
            if (nivel_muestro <= 5) {
                if (contador_muestro >= 10) {
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = OFF;
                }
            }
            if ((nivel_muestro > 5)&&(nivel_muestro <= 10)) {
                if (contador_muestro >= 8) {
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = OFF;
                }
            }
            if ((nivel_muestro > 10)&&(nivel_muestro <= 15)) {
                if (contador_muestro >= 6) {
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = OFF;
                }
            }
            if ((nivel_muestro > 15)&&(nivel_muestro <= 20)) {
                if (contador_muestro >= 10) {
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = OFF;
                }
            }
            if ((nivel_muestro > 20)&&(nivel_muestro <= 24)) {
                if (contador_muestro >= 10) {
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = OFF;
                }
            }
            break;
        case OFF://apago las salidas
            rojo = 1;
            verde = 1;
            azul = 1;
            if(contador_muestro >= 5) {//tiempo de espera entre led y led
                if((nivel_mostrando) == (nivel_muestro - 1)) {//si se mostraron todos los niveles
                    mostrando = 0;//en la maquina general hbailita a pasar al caso de espero_sec
                    MAQUINA_MUESTRO = INICIO2;
                } else {//si quedan niveles por mostrar
                    nivel_mostrando++;//aumento variable para luego mostrar proximo nivel
                    contador_muestro = 0;
                    MAQUINA_MUESTRO = ON;//vuelvo a prender el siguiente nivel
                }
            }
    }
}
//APRETAR
void FUNCION_APRETO()
{
    switch(MAQUINA_APRETO) {
        default:
            MAQUINA_APRETO = INICIO3;
            break;
        case INICIO3:
            if(apretar == 1) {//habilitado por la maquina general cuando entro al case espero_sec
                espero_puls = 0;
                contador_apreto = 0;
                MAQUINA_APRETO = ESPERO_PULS;
            }
            break;
        case ESPERO_PULS:

            if(PULS_TSI() != -1) {//si oprimo el tsi
                if(PULS_TSI() == paso[espero_puls]) {//si lo oprimido es el seleccionado para el color asignado previamente
                    if(espero_puls < (nivel_muestro-1)) {//si no oprimi todos los niveles
                        espero_puls++;//sumo variable para apretar el proximo nivel y comparar
                        contador_apreto = 0;
                        MAQUINA_APRETO = DELAY;//voy al caso en el que se muestran los leds que aprete
                        estado_prox = 1;//en el caso de tener que seguir apretando
                    } else {
                        MAQUINA_APRETO = DELAY;//voy al caso en el que se muestran los leds que aprete
                        estado_prox = 2;//en el caso de no tener que apretar mas
                    }
                } else {// si lo oprimido no es lo seleccionado para el color asignado previamente
                    contador = 0;
                    MAQUINA_GENERAL = LOOSER;//pierdo
                    MAQUINA_APRETO = INICIO3;
                }
            }
            if(contador_apreto >= 30) {//si pasaron 3 segundos y no oprimi nada
                contador = 0;
                contador_apreto = 0;
                MAQUINA_GENERAL = LOOSER;//pierdo
                MAQUINA_APRETO = INICIO3;
            }
            break;
        case DELAY://caso de delay
            COLORES(PULS_TSI());//muestro los leds que oprimo con el TSI
            if(contador_apreto > 2) {//genero un tiempo de 200ms
                MAQUINA_APRETO = DELAY2;//voy al caso donde apago los leds
                contador_apreto = 0;
            }
            break;
        case DELAY2:
        //apago los leds
            rojo = 1;
            azul = 1;
            verde = 1;

            if(estado_prox == 1 && contador_apreto > 2) {//genero otro timepo de 200ms para poder volver a leer el TSI
            //y si tengo que seguir apretando
                MAQUINA_APRETO = ESPERO_PULS;//vuelvo al caso donde oprimo los niveles siguientes
                contador_apreto = 0;
            } else if(estado_prox == 2 && contador_apreto > 2) {//y si no tengo que apretar mas
            //y genero otro timepo de 200ms
                apretar = 0;//hbailito a quer maquina general vuelva a muestro_sec
                MAQUINA_APRETO = INICIO3;
                contador_apreto = 0;
            }
            break;
    }
}