Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

main.cpp

Committer:
agufal
Date:
2016-05-25
Revision:
13:e4c3b3e00e3d
Parent:
12:172acb80fcab

File content as of revision 13:e4c3b3e00e3d:

/*
 * Esto es para la placa Xtrinsic-Sense Board de element14, mas
 * concretamente para el acelerometro MMA8491Q
 */
#include "mbed.h"
#include "Acelerometro.h"
#include "AccelService.h"
#include "circular_buffer.h"

#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(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) {
        
        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 * pesos[i];
            y += v.y * pesos[i];
            z += v.z * pesos[i];
            
            sumaPesos += pesos[i];
            
        }
        
        Vector media;
        
        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);
        
        //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);      
        
    }
}