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

Dependencies:   mbed tsi_sensor

Revision:
0:8fc99b9ef045
diff -r 000000000000 -r 8fc99b9ef045 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 02 16:51:36 2019 +0000
@@ -0,0 +1,321 @@
+#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;
+    }
+}
\ No newline at end of file