EJERCICIO SIMON: Axel Oropeza Matias Rodriguez

Dependencies:   mbed tsi_sensor

main.cpp

Committer:
matirodriguez
Date:
2019-05-22
Revision:
0:fd466ee999a6
Child:
1:f6ea213ed382

File content as of revision 0:fd466ee999a6:

#include "mbed.h"
#include "tsi_sensor.h"

#define ELEC0 9
#define ELEC1 10

/*  Defino esas palabras que luego usaré para
lo que se pulsa en el TSI como numeros usando la funcion
"enum{}"
*/
enum {NADA,
      ROJO,
      VERDE,
      AZUL
     };

/*  Defino los nombres de los estados como
numeros enteros con la funcion "enum{}"
*/

enum {ESPERO_USUARIO,
      MUESTRO_SECUENCIA,
      COMPARO_SECUENCIA
     };

enum {ESPERO_HAB,
      MUESTRO,
      APAGO
     };

enum {ESPERAR_HAB,
      ESPERAR_USUARIO,
      COMPARO
     };

#define ERROR 15
#define CORRECTO 24

TSIAnalogSlider tsi(ELEC0, ELEC1, 40);

// Prototipos de funciones de maquinas de estados
void MAQ_SECUENCIA();
void MAQ_MUESTREO();
void MAQ_COMPARO();

void MAQ_lecturaTSI();

void LEER_TSI();    //Prototipo funcion de lectura del TSI

void LED_1SEG();


void pulsacion_TSI();



void genero_secuencia(); // Funcion que utilizo para generar la secuencia aleatoria.

//Variables que indican el estado de las maquinas (empiezo en estado de reset)
int estado_maq_sec = ESPERO_USUARIO;
int estado_maq_mues = ESPERO_HAB;
int estado_maq_comp = ESPERAR_HAB;

int estado_maq_tsi = NADA;

//Variables que habilitan maquinas de estados
int hab_mostrar = 0;
int hab_comparo = 0;

//Variables que me indican el fin de una maquina de estados
int fin_mostrar = 0;
int fin_comparo = 0;

//Variables que acumulan datos

int color[25]; //Esta variable contendrá toda la secuencia aleatoria de 24 valores (no voy a usar el valor 0).
int nivel = 0;
int tiempo_muestreo = 0;
int color_teclado = NADA;
int ingreso = NADA;

int var_pulsacion = 25;

Ticker lectura;
Ticker temporizador;

Ticker pulsacion;

// DEFINO SALIDAS

DigitalOut ledrojo(LED_RED);
DigitalOut ledverde(LED_GREEN);
DigitalOut ledazul(LED_BLUE);
AnalogIn noise(PTB0);


int main(void)
{

    lectura.attach(LEER_TSI,0.1);
    pulsacion.attach(pulsacion_TSI,0.001);

    temporizador.attach(LED_1SEG,0.01);


    ledrojo = 1;
    ledverde= 1;
    ledazul = 1;

    while (true) {

        MAQ_lecturaTSI();

        MAQ_SECUENCIA();

        MAQ_MUESTREO();

        MAQ_COMPARO();

    }
}

void LEER_TSI()
{
    float auxiliar = 0;
    auxiliar = tsi.readPercentage();

    if(auxiliar == 0) {
        color_teclado = NADA;
    }

    if((auxiliar > 0)&&(auxiliar < 0.33)) {
        color_teclado = ROJO;
    }

    if((auxiliar >= 0.33)&&(auxiliar <= 0.66)) {
        color_teclado = VERDE;
    }

    if((auxiliar > 0.66)&&(auxiliar <= 1)) {
        color_teclado = AZUL;
    }
}

void pulsacion_TSI()
{
    if(var_pulsacion > 0) {
        var_pulsacion--;
    }
}

void MAQ_lecturaTSI()
{
    if(var_pulsacion < 1) {
        var_pulsacion = 25;
        switch(estado_maq_tsi) {
            case NADA:
                ingreso = NADA;
                switch(color_teclado) {
                    case ROJO:
                        estado_maq_tsi = ROJO;
                        ingreso = ROJO;
                        break;
                    case VERDE:
                        estado_maq_tsi = VERDE;
                        ingreso = VERDE;
                        break;
                    case AZUL:
                        estado_maq_tsi = AZUL;
                        ingreso = AZUL;
                        break;
                }
                break;
            case ROJO:
                switch(color_teclado) {
                    case NADA:
                        estado_maq_tsi = NADA;
                        break;
                    case VERDE:
                        estado_maq_tsi = VERDE;
                        ingreso = VERDE;
                        break;
                    case AZUL:
                        estado_maq_tsi = AZUL;
                        ingreso = AZUL;
                        break;
                }
                break;
            case VERDE:
                switch(color_teclado) {
                    case NADA:
                        estado_maq_tsi = NADA;
                        break;
                    case ROJO:
                        estado_maq_tsi = ROJO;
                        ingreso = ROJO;
                        break;
                    case AZUL:
                        estado_maq_tsi = AZUL;
                        ingreso = AZUL;
                        break;
                }
                break;
            case AZUL:
                switch(color_teclado) {
                    case NADA:
                        estado_maq_tsi = NADA;
                        break;
                    case ROJO:
                        estado_maq_tsi = ROJO;
                        ingreso = ROJO;
                        break;
                    case VERDE:
                        estado_maq_tsi = VERDE;
                        ingreso = VERDE;
                        break;
                }
                break;
        }
    }
}

void LED_1SEG()
{
    if(tiempo_muestreo >= 0) {
        tiempo_muestreo--;
    }
}


void MAQ_SECUENCIA()
{

    switch(estado_maq_sec) {    //El switch variará entre los distintos estados de mi maquina (los numeros correspondientes se encuentran en el "enum{}" al inicio del codigo)

        case ESPERO_USUARIO:
            if(ingreso != NADA) {
                genero_secuencia();
                nivel++;
                hab_mostrar = 1;
                estado_maq_sec = MUESTRO_SECUENCIA;
                ingreso = NADA;
            }
            break;

        case MUESTRO_SECUENCIA:

            if(fin_mostrar == 1) {
                fin_mostrar = 0;
                estado_maq_sec = COMPARO_SECUENCIA;
                hab_comparo = 1;
            }

            break;

        case COMPARO_SECUENCIA:

            if(fin_comparo == 1) {
                fin_comparo = 0;
                estado_maq_sec = MUESTRO_SECUENCIA;
                hab_mostrar = 1;
                nivel++;

            }
            break;
    }
}

void MAQ_MUESTREO()
{

    static int nivel_mostrado;  // Variable que voy a tener para saber que nivel estoy mostrando en los leds ahora

    switch(estado_maq_mues) {   // Uso un switch para variar entre los estados de la maquina

        case ESPERO_HAB:

            nivel_mostrado = 1; // El primer nivel que muestro es 1, asi que reseteo esta variable cada vez que paso por este estado

            if(hab_mostrar == 1) {  // Cuando recibo la habilitacion de la otra maquina de estados:

                estado_maq_mues = MUESTRO;  // Cambio de estado y
                tiempo_muestreo = 100;  // Establezco el tiempo en 1 seg (0.01seg * 100 = 1seg)
                hab_mostrar = 0;

            }
            break;

        case MUESTRO:

            switch(color[nivel_mostrado]) { // Muestro el color correspondiente al primer nivel, y voy cambiando cada 2 segundos
                case ROJO:
                    ledrojo = 0;
                    break;

                case VERDE:
                    ledverde = 0;
                    break;

                case AZUL:
                    ledazul = 0;
                    break;
            }

            if(tiempo_muestreo == 0) {  // Si pasó 1 segundo, reseteo el tiempo y cambio de estado
                tiempo_muestreo = 100;  // Establezco el tiempo en 1 segundo otra vez
                estado_maq_mues = APAGO;    // Cambio de estado
            }
            break;

        case APAGO:

            switch(color[nivel_mostrado]) { // Ahora voy a apagar el led correspondiente al nivel que se esta mostrando.
                case ROJO:
                    ledrojo = 1;
                    break;
                case VERDE:
                    ledverde = 1;
                    break;
                case AZUL:
                    ledazul = 1;
                    break;
            }
            if(tiempo_muestreo == 0) {
                if(nivel_mostrado == nivel) {
                    nivel_mostrado = 1;
                    estado_maq_mues = ESPERO_HAB;
                    fin_mostrar = 1;
                } else {
                    estado_maq_mues = MUESTRO;
                    nivel_mostrado++;
                    tiempo_muestreo = 100;
                }
            }
            break;


    }


}

void MAQ_COMPARO()
{


    static int nivel_comparado; // Variable que voy a usar para comparar todos los niveles sucesivamente, con lo que se vaya ingresando en el TSI
    static int obtenido = NADA;

    switch(estado_maq_comp) {
        case ESPERAR_HAB:

            nivel_comparado = 1; // Establezco en este estado el primer nivel que se va a comparar (el 1)

            if(hab_comparo == 1) {  // Si recibí habilitacion desde la otra maquina, cambio de estado
                estado_maq_comp = ESPERAR_USUARIO;
                hab_comparo = 0;
            }

            break;

        case ESPERAR_USUARIO:

            if(ingreso != NADA) { // Si se ingresa algo en el TSI, lo guardo en la variable "teclado"
                obtenido = ingreso;
                ingreso = NADA;
                estado_maq_comp = COMPARO;
            }

            break;

        case COMPARO:   //Estado donde comparo el valor que se ingresó con el valor que corresponde

            if(obtenido == color[nivel_comparado]) {
                switch(color[nivel_comparado]) {
                    case ROJO:
                        printf("rojo\n");
                        break;
                    case VERDE:

                        printf("verde\n");
                        break;
                    case AZUL:
                        printf("azul\n");
                        break;


                }


                obtenido = NADA;
                if(nivel_comparado <= nivel) {
                    estado_maq_comp = ESPERAR_USUARIO;  //Vuelvo al estado de esperar que el usuario ingrese algo y
                    nivel_comparado++;  // Paso al siguiente nivel.
                }
                if(nivel_comparado > nivel) {
                    estado_maq_comp = ESPERAR_HAB;  // Reseteo la maquina
                    fin_comparo = 1;
                }

            } else {
                estado_maq_comp = ESPERAR_HAB;  // Reseteo la maquina
                fin_comparo = 1;    // Marco error
                printf("ERROR");
                printf("ERROR");
                printf("ERROR");
                printf("ERROR");
                printf("ERROR\n");

            }
            break;
    }
}

void genero_secuencia()
{
    int auxiliar;

    srand(int (noise * 10000)); // Cambio la semilla de la funcion rand usando un valor de ruido en una entrada analogica al aire

    for(int i = 1; i <=25 ; i++) {  // Creo un for para recorren las 25 posiciones de memoria del vector "color[]" (el valor 0 no lo utilizo)


        auxiliar = rand();  //Genero un valor aleatorio y lo guardo en mi variable auxiliar

        // Dependiendo de cuanto resto me de al dividir por 3, asignare ese valor aleatorio con un color
        if((auxiliar % 3) == 0) {
            color[i] = ROJO;
        }

        if((auxiliar % 3 )== 1) {
            color[i] = VERDE;
        }

        if((auxiliar % 3 )== 2) {
            color[i] = AZUL;
        }
        switch(color[i]) {
            case ROJO:
                printf("%i ROJO;",i);
                break;
            case VERDE:
                printf("%i VERDE;",i);
                break;
            case AZUL:
                printf("%i AZUL;",i);
                break;
        }
    }
    printf("\n");
}