prueba

Dependencies:   mbed SDFileSystem FXOS8700Q

TP para SO. Escribe a memoria SD, lee inputs desde la coneccion serial a una pc, muestra en pantalla de la misma un menu y permite visualizar el funcionamiento del sensor acelerometro.

Revision:
6:3c77a20acb12
Parent:
5:cf92a5a1f081
Child:
7:f49ea76f3ac1
--- a/main.cpp	Wed Jun 05 21:40:19 2019 +0000
+++ b/main.cpp	Sun Jun 23 17:05:49 2019 +0000
@@ -1,8 +1,16 @@
 #include "mbed.h"
 #include "SDFileSystem.h"
+#include "FXOS8700Q.h"
 
 //creamos el objeto sd con la clase SDFileSystem con los pines de la sd  para usar el sistema de archivos
 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
+
+I2C i2c(PTE25, PTE24);
+FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1);    // Configura sensor acelerometro
+
+//creamos la comunicacion serial con la pc
+Serial pc(USBTX, USBRX);
+
 //creamos los led con la clase digitalout con los pines de los leds
 DigitalOut led1(PTB22);
 DigitalOut led2(PTE26);
@@ -14,13 +22,113 @@
 //creo un puntero para el archivo
 FILE *fp;
 
-//contafor para los "puntos"
-int cont=0;
+ int cont=0;//contador de los puntos
+
+void menu();
+void boton2();
+void boton3();
+void opcion3();
+void opcion1(); 
+
+// main() runs in its own thread in the OS
+int main()
+{    
+   sw2.rise(&boton2);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2
+   sw3.rise(&boton3);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3
+    led1=1;//apago el led rojo
+    menu();//llamo al menu
+
+}
+
+void menu(){
+   char c='0';//inicializo el char para leer del teclado
+   int buffer;//int para leer del archivo de puntos
+   while(c!='q'){//mientras que no salga muestro el menu
+        pc.printf("----------------------- \n \r");
+        pc.printf("1-Iniciar juego \n \r");
+        pc.printf("2-mostrar puntuacion anterior \n \r");
+        pc.printf("3-opcion3 \n \r");
+        pc.printf("q-salir \n \r");
+        c=pc.getc();//leo del teclado
+        switch(c){
+            case '1':opcion1();//llamo al metodo principal del juego
+            break;
+            case '2':pc.printf("\033[2J");//limpio la pantalla 
+                    //leo el archivo y muestro por pantalla
+                     fp = fopen("/sd/puntos.txt", "r");//asigno el archivo a fp
+                    if (fp != NULL) {
+                        fscanf(fp,"%d",&buffer);//leo el contenido 
+                        fclose(fp);//cierro el archivo
+                    } 
+                    pc.printf("Puntos anteriores: ");
+                    pc.printf("%d",buffer);  //escribo en la pantalla el entero formateado a string  
+                    pc.printf("\n \r");
+                    break;
+            case '3': opcion3();//llamo al metodo de la prueba del acelerometro
+            break;
+        } 
+    }
+ }
+ 
+ 
+void opcion1(){//metodo principal del juego
+    bool aux=true;//bolean para salir
+    char tecla='0';//char para leer del teclado
+   cont=0;//inicializo el contador de puntos en 0
+    int i;//int para el random
+    led2=0;//apago los leds
+    led3=0;
+    pc.printf("\033[2J");
+    pc.printf("----------------------- \n \r");//muestro comienzo del juego
+    pc.printf("Comenzo el juego!\n \r");
+    pc.printf("Para terminar presione x \n \r");
+    pc.printf("----------------------- \n \r");
+    //bucle principal
+        while(aux){
+            // Pone valor random en i (de 0 a 1) y prende el color correspondiente
+            i=rand()%2;
+            switch(i){
+                case 0: led2=1;//si es 0 prendo el verde
+                    break;
+                case 1: led3=1;//si es 1 prendo el azul
+                    break;
+            }
+           
+            //bucle para esperar la interrupcion
+         while((led2.read()!=0 || led3.read()!=0) && aux){
+             // espero a que aprete boton   
+             if(pc.readable()){ 
+                  tecla=pc.getc();  
+                  if(tecla=='x'){//si lee x del teclado sale del metodo y vuelve al menu
+                  aux=false;
+                  return;  
+                  }
+              }   
+             }
+              //desactivo las interrupciones para escribir sin problemas
+            __disable_irq(); 
+            //abro el archivo para escribir si no existe se crea
+            fp = fopen("/sd/puntos.txt", "w");//asigno el archivo a fp
+            if (fp != NULL) {
+                fprintf(fp, "%d",cont);//escribo el contenido de cont en el archivo fp
+                fclose(fp);//cierro el archivo
+            }     
+            //vuelvo a activar las interrupciones 
+            __enable_irq();
+            
+             //espero en la salida para mostrar el resultado
+             wait_ms(500);
+             //apago el led rojo si esta prendido
+             if(led1.read()==0)
+             led1=1;
+        }
+}
 
 //funciones para las interrupciones
 void boton2(){
     if(led2.read()!=0){
         cont++;//si se apreta el sw2 y esta el led2 en 1 se cuenta un punto y apaga el led
+        pc.printf("Buena pulsada , un punto \n \r"); //muestro por pantalla un mensaje motivacional   
         led2=0;
         } else {
             //apago el led y prendo el led rojo
@@ -29,59 +137,40 @@
             led1=0;
             //resto un punto 
             cont--;
+            pc.printf("Fallaste  \n \r");
             } 
 
     }
-//lo mismo que boton2 pero para el otro boton
+//parecido a boton2 pero para el otro boton
 void boton3(){
     if(led3.read()!=0){
-        cont++;//si se apreta el sw3 y esta el led3 en 1 se cuenta y apaga el led       
+        cont++;//si se apreta el sw3 y esta el led3 en 1 se cuenta y apaga el led  
+        pc.printf("Buena pulsada , un punto \n \r");  //muestro por pantalla un mensaje motivacional   
         led3=0;
     }else{    
         led2=0;   
         led1=0;
         cont--;
+        pc.printf("Fallaste \n \r");
         }
 
      }
-
-
-// main() runs in its own thread in the OS
-int main()
-{
-   sw2.rise(&boton2);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2
-   sw3.rise(&boton3);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3
-   int i;//entero usado para el random
-    led1=1;//apago el led rojo
-    //bucle principal
-        while(true){
-            // Pone valor random en i (de 0 a 1) y prende el color correspondiente
-            i=rand()%2;
-            switch(i){
-                case 0: led2=1;//si es 0 prendo el verde
-                    break;
-                case 1: led3=1;//si es 1 prendo el azul
-                    break;
-            }
-            //desactivo las interrupciones para escribir sin problemas
-            __disable_irq(); 
-            //abro el archivo para escribir si no existe se crea
-            fp = fopen("/sd/puntos.txt", "w");//asigno el archivo a fp
-            if (fp != NULL) {
-                fprintf(fp, "%d",cont);//escrivo el contenido de cont en el archivo fp
-                fclose(fp);//cierro el archivo
-            }     
-            //vuelvo a activar las interrupciones 
-            __enable_irq();
-            //bucle para esperar la interrupcion
-         while(led2.read()!=0 || led3.read()!=0){
-             // espero a que aprete boton             
-             }
-             //espero en la salida para mostrar el resultado
-             wait_ms(500);
-             //apago el led rojo si esta prendido
-             if(led1.read()==0)
-             led1=1;
-        }
-
-}
+void opcion3(){
+     float faX;//variable para el valor de x
+    acc.enable();//activar el sensor
+    while (true) {
+        acc.getX(faX);//funcion del sensor que devuelve la orientacion en x
+        if(faX>0.25f){//si esta inclinado a la derecha se mueve a la derecha
+            pc.printf("| | |o| \r\n"); 
+            }else{
+        if (faX<0.001f){//si esta inclinado a la izquierda se mueve a la izquierda
+             pc.printf("|o| | | \r\n");
+            }else//sino queda en el centro
+            pc.printf("| |o| | \r\n");}
+         if(pc.readable()){ 
+                  menu();
+                 return;
+          }
+    } 
+     
+}   
\ No newline at end of file