TP1_EJER3
Dependencies: mbed tsi_sensor
Diff: main.cpp
- Revision:
- 1:5b92fb2cd769
- Parent:
- 0:256d00799c21
diff -r 256d00799c21 -r 5b92fb2cd769 main.cpp --- a/main.cpp Wed May 22 13:07:54 2019 +0000 +++ b/main.cpp Tue Jun 04 02:09:27 2019 +0000 @@ -11,78 +11,103 @@ #else #error TARGET NOT DEFINED #endif -Ticker tiempo; +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; -PwmOut display(PTA2); 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 (PTC12); +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 maquina_display (); -void maquina_orden_cables (); +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 (); - //maquina_display (); - maquina_orden_cables (); - printf("%d %d %d %d", vector_orden_cables[0], vector_orden_cables[1], vector_orden_cables[2], vector_orden_cables[3]); + orden_cables (); + } } -void suma () -{ - sumador++; -} - +/*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; - if (vector_secuencia [i - 1] != randomm) - vector_secuencia [i] = randomm; + 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) { @@ -90,86 +115,112 @@ default: maquina_general = INICIO; break; - +//Se arranca apretando el tsi y con los display en 60seg. (TSI tambien para reiniciar) case INICIO: - if (tsi.readPercentage() > 0.5){ + rojo = 1; + verde = 1; + buzzzer = 0; + if (tsi.readPercentage() != 0) { + a = 0; + contadortotal = 60; + x = 1; + mandar = 1; + z = 0; maquina_general = CABLE1; - verde = 0; } - else - maquina_general = INICIO; break; - +//Compara el primer cable con la secuencia creada case CABLE1: - verde = 1; if (vector_secuencia [0] == vector_orden_cables [0] && vector_orden_cables [0] != -1) { maquina_general = CABLE2; } - else { - maquina_general = CABLE1; - } 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: - rojo = 0; if (vector_secuencia [1] == vector_orden_cables [1] && vector_orden_cables [1] != -1) { maquina_general = CABLE3; - tiempo.attach (&suma, 1); - } - else { - maquina_general = CABLE2; } 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: - rojo = 1; if (vector_secuencia [2] == vector_orden_cables [2] && vector_orden_cables [2] != -1) { maquina_general = CABLE4; - tiempo.attach (&suma, 1); - } - else { - maquina_general = CABLE3; } 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: - rojo = 0; if (vector_secuencia [3] == vector_orden_cables [3] && vector_orden_cables [3] != -1) { maquina_general = WIN; } - else { - maquina_general = CABLE4; - } 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: - verde = 0; + 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: - verde = 0; - rojo = 0; + 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; } } - -void maquina_orden_cables () +//Funcion que guarda el orden de los cables que se sacan +void orden_cables () { - static int a = 0; if (cable_0 != 0 && cablesDesconectados(0) == 0) { ccero = 0; @@ -191,14 +242,14 @@ a++; printf ("vector orden cables [%d] = 2", &a); } - if (cable_3 != 0 && cablesDesconectados(3) != 0) { + 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) { @@ -208,3 +259,27 @@ } 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++; +}