TP1_EJER3

Dependencies:   mbed tsi_sensor

main.cpp

Committer:
Charin
Date:
2019-06-04
Revision:
1:5b92fb2cd769
Parent:
0:256d00799c21

File content as of revision 1:5b92fb2cd769:

#include "mbed.h"
#include "tsi_sensor.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
Ticker contador;
Ticker titila;

//Enumero los distintos casos de la Maquina de Estados
enum maquina_estado_general {INICIO, CABLE1, CABLE2, CABLE3, CABLE4, WIN, LOOSER};
maquina_estado_general maquina_general;

TSIAnalogSlider tsi(ELEC0, ELEC1, 40);

//Defino salidas utilizadas
AnalogIn noise (PTC1);
DigitalIn cable_0 (PTB0);
DigitalIn cable_1 (PTB1);
DigitalIn cable_2 (PTB2);
DigitalIn cable_3 (PTB3);
DigitalOut verde (LED_GREEN);
DigitalOut rojo (LED_RED);
DigitalOut buzzzer (PTC12);
BusOut Unidades (PTE2,PTE3,PTE4,PTE5);
BusOut Decenas (PTB8,PTB9,PTB10,PTB11);

//Creo y defino vectores
int vector_secuencia [4];
int vector_orden_cables [4] = {-1, -1, -1, -1};

//Defino variables
int ccero = 0;
int cuno = 0;
int cdos = 0;
int ctres = 0;
int sumador = 0;
int contadorun = 0;
int contadordec = 0;
int contadortotal = 60;
int mandar = 0;
int titilarun = 0;
int titilardec = 0;
int titilar = 0;
int x = 0;
int z = 0;
int a = 0;

//Prototipo de funciones
void secuencia();
void maquina_general_sec ();
void orden_cables ();
void suma ();
void funcion_tiempo ();
void funcion_titila ();
void buzzer ();
int cablesDesconectados(int n);

int main(void)
{
    //Activo Pull Up interno
    cable_0.mode (PullUp);
    cable_1.mode (PullUp);
    cable_2.mode (PullUp);
    cable_3.mode (PullUp);

    //Salida que mide ruido para la semilla de la funcion rand
    srand (int(noise * 10000));

    secuencia ();
    verde = 1;
    rojo = 1;
    contador.attach (&funcion_tiempo, 1);
    titila.attach (&funcion_titila, 0.5);

    while (true) {
        
        maquina_general_sec ();
        orden_cables ();

    }
}

/*Funcion que crea la secuencia del orden que hay que sacar los cables
y los guarda en un vector evitando que se repita el numero*/
void secuencia ()
{
    vector_secuencia [0] = rand () %4;
    for (int i = 1; i < 4; i++) {
        int randomm = rand () %4;
        int aux = 1;
        for(int j = 0; j < i; j++)
            if(vector_secuencia[j] == randomm)
                aux = 0;
        if(aux)
            vector_secuencia[i] = randomm;
        else
            i--;
    }

}

//Maquina de Estado general para arranque, pasaje de un cable a otro y reinicio
void maquina_general_sec ()
{
    switch (maquina_general) {

        default:
            maquina_general = INICIO;
            break;
//Se arranca apretando el tsi y con los display en 60seg. (TSI tambien para reiniciar)
        case INICIO:
            rojo = 1;
            verde = 1;
            buzzzer = 0;
            if (tsi.readPercentage() != 0) {
                a = 0;
                contadortotal = 60;
                x = 1;
                mandar = 1;
                z = 0;
                maquina_general = CABLE1;
            }
            break;
//Compara el primer cable con la secuencia creada
        case CABLE1:
            if (vector_secuencia [0] == vector_orden_cables [0] && vector_orden_cables [0] != -1) {
                maquina_general = CABLE2;
            }
            if (vector_secuencia [0] != vector_orden_cables [0] && vector_orden_cables [0] != -1) {
                maquina_general = LOOSER;
            }

            break;
//Compara el segundo cable con la secuencia creada
        case CABLE2:
            if (vector_secuencia [1] == vector_orden_cables [1] && vector_orden_cables [1] != -1) {
                maquina_general = CABLE3;
            }
            if (vector_secuencia [1] != vector_orden_cables [1] && vector_orden_cables [1] != -1) {
                maquina_general = LOOSER;
            }

            break;
//Compara el tercer cable con la secuencia creada
        case CABLE3:
            if (vector_secuencia [2] == vector_orden_cables [2] && vector_orden_cables [2] != -1) {
                maquina_general = CABLE4;
            }
            if (vector_secuencia [2] != vector_orden_cables [2] && vector_orden_cables [2] != -1) {
                maquina_general = LOOSER;
            }
            break;
//Compara el cuarto cable con la secuencia creada
        case CABLE4:
            if (vector_secuencia [3] == vector_orden_cables [3] && vector_orden_cables [3] != -1) {
                maquina_general = WIN;
            }
            if (vector_secuencia [3] != vector_orden_cables [3] && vector_orden_cables [3] != -1) {
                maquina_general = LOOSER;
            }
            break;
//Si el orden es correcto titilan los display y led verde
        case WIN:
            z = 1;
            rojo=1;
            if (titilar %2 == 0) {
                Unidades = titilarun;
                Decenas = titilardec;
                buzzzer = 1;
                verde = 0;
            } else if(titilar %2 != 0) {
                Unidades = 15;
                Decenas = 15;
                buzzzer = 0;
                verde = 1;
            }

            if (tsi.readPercentage() != 0) {
                maquina_general = INICIO;
                for(int k = 0; k < 4; k++)
                    vector_orden_cables[k] = -1;
                secuencia();

            }

            break;
//Si el orden es incorrecto titilan los display y led rojo
        case LOOSER:
            z = 1;
            if(tsi.readPercentage() == 0) {
                if (titilar %2 == 0) {
                    Unidades = titilarun;
                    Decenas = titilardec;
                    buzzzer = 1;
                    rojo = 0;
                } else if(titilar %2 != 0) {
                    Unidades = 15;
                    Decenas = 15;
                    buzzzer = 0;
                    rojo = 1;
                }
            }
            if (tsi.readPercentage() != 0) {
                maquina_general = INICIO;
                for(int k = 0; k < 4; k++)
                    vector_orden_cables[k] = -1;
                secuencia();
            }
            break;

    }
}
//Funcion que guarda el orden de los cables que se sacan
void orden_cables ()
{

    if (cable_0 != 0 && cablesDesconectados(0) == 0) {
        ccero = 0;
        vector_orden_cables [a] = ccero;
        a++;
        printf ("vector orden cables [%d] = 0", &a);

    }
    if (cable_1 != 0 && cablesDesconectados(1) == 0) {
        cuno = 1;
        vector_orden_cables [a] = cuno;
        a++;
        printf ("vector orden cables [%d] = 1", &a);

    }
    if (cable_2 != 0 && cablesDesconectados(2) == 0) {
        cdos = 2;
        vector_orden_cables [a] = cdos;
        a++;
        printf ("vector orden cables [%d] = 2", &a);
    }
    if (cable_3 != 0 && cablesDesconectados(3) == 0) {
        ctres = 3;
        vector_orden_cables [a] = ctres;
        a++;
        printf ("vector orden cables [%d] = 3", &a);
    }
}
//Funcion que interpreta la desconexion de los cables
int cablesDesconectados(int n)
{

    for(int j = 0; j < 4; j++) {
        if(vector_orden_cables[j] == n)
            return 1;
    }
    return 0;
}
//Funcion de cuenta regresiva en los display
void funcion_tiempo()
{

    if(contadortotal == 0)
        maquina_general = LOOSER;

    if(!z && x && contadortotal > 0)
        contadortotal--;

    Unidades = contadortotal % 10;
    titilarun = Unidades;
    Decenas = contadortotal / 10;
    titilardec = Decenas;


    printf("%d %d %d %d || %d %d %d %d\n\r", vector_orden_cables[0], vector_orden_cables[1], vector_orden_cables[2], vector_orden_cables[3], vector_secuencia[0], vector_secuencia[1], vector_secuencia[2], vector_secuencia[3]);

}

void funcion_titila ()
{
    titilar++;
}