Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

Revision:
12:172acb80fcab
Parent:
11:27f2850b9388
Child:
13:e4c3b3e00e3d
diff -r 27f2850b9388 -r 172acb80fcab main.cpp
--- a/main.cpp	Thu Mar 10 09:56:59 2016 +0000
+++ b/main.cpp	Mon May 23 13:48:29 2016 +0000
@@ -7,48 +7,82 @@
 #include "AccelService.h"
 #include "circular_buffer.h"
 
-Serial pc(p9, p11);
+#define MUESTRAS 10
+
+//Serial pc(p9, p11);
+
+bool expired = false;
+Timeout timeout; // Hay un LowPowerTimeout, pero no me deja usarlo por algun motivo
+
+/*****************************************************************************
+Por lo visto hay que tener cuidado con las funciones de i2c.read y i2c.write, 
+porque la funcion sleep desactiva el reloj cuando empieza, y lo reactiva al 
+final del todo cuando hay una interrupcion. Dice que se podria reactivar 
+manualmente el reloj...
+
+En teoria el solito determina que tipo de sleep utilizar "dinamicamente"
+
+Fuente:
+https://developer.mbed.org/teams/SiliconLabs/wiki/Using-the-improved-mbed-sleep-API
+******************************************************************************/
+
+void activar(void){
+
+    expired = true;
+    
+}
 
 int main() {
    
     Acelerometro acc;
     AccelService acc_service;
-    circular_buffer<Vector> buffer(10);
+    circular_buffer<Vector> buffer(MUESTRAS);
+    
+    wait(0.01);
+    
+    // Pesos para la media ponderada, para darle mas valor a los ultimos datos
+    int pesos[] = { 10, 10, 10, 10, 20, 30, 40, 50, 80, 90 };
    
     while(1) {
         
-        pc.printf("-----------------------------------------\n");
-        
-        // Hacer un buffer circular para ir leyendo lo que tienes
-        // Problema?: ahora los datos cambian un poco lento, por ejemplo para 
-        // pasar de -1g a 1g tarda un par de segundos aunque el cambio haya sido rapido 
-        buffer.push_back(acc.leer());
+        Vector ultimo = acc.leer();
+        buffer.push_back(ultimo);
         
         // TODO Hacer esto en un hilo
+        // TODO Hacer otro buffer mas chiquitito para la luz de freno
         int x = 0, y = 0, z = 0;
+        int sumaPesos = 0;
+        
         for (int i = 0; i < buffer.get_size(); i++){
             
             Vector v = buffer[i];
             
-            x += v.x;
-            y += v.y;
-            z += v.z;
+            x += v.x * pesos[i];
+            y += v.y * pesos[i];
+            z += v.z * pesos[i];
+            
+            sumaPesos += pesos[i];
             
         }
         
         Vector media;
         
-        media.x = x / buffer.get_size();
-        media.y = y / buffer.get_size();
-        media.z = z / buffer.get_size();
-        
-       /* if (media.x <= 1000 && media.x >= -1000) media.x = 0;
-        if (media.y <= 1000 && media.y >= -1000) media.y = 0;
-        if (media.z <= 1000 && media.z >= -1000) media.z = 0;*/
+        media.x = x / sumaPesos; //buffer.get_size();
+        media.y = y / sumaPesos; //buffer.get_size();
+        media.z = z / sumaPesos; //buffer.get_size();
         
         acc_service.updateAccelState(media);
         
-        pc.printf(" X: %i\n Y: %i\n Z: %i\n", media.x, media.y, media.z);      
+        //wait(1);        
+        expired = false;
+        timeout.attach(activar, 1);
+        
+        // Esto es porque sale del sleep con cualquier interrupcion, 
+        // asi que hay que decirle que si no es la nuestra, se vuelva a dormir
+        while(!expired) sleep(); 
+        
+        //pc.printf("media - X: %i\n Y: %i\n Z: %i\n", media.x, media.y, media.z);
+        //pc.printf("valor - X: %i\n Y: %i\n Z: %i\n", ultimo.x, ultimo.y, ultimo.z);      
         
     }
 }
\ No newline at end of file