Implemented first Hangar-Service

Dependencies:   CalibrateMagneto QuaternionMath

Fork of SML2 by TobyRich GmbH

Accelerometer.cpp

Committer:
pvaibhav
Date:
2015-02-24
Revision:
9:a0ae9e68f95d
Parent:
8:cba37530d480
Child:
11:d21275e60ebb

File content as of revision 9:a0ae9e68f95d:

#include "Accelerometer.h"
#define DEBUG "BMX055-Acc"
#include "Logger.h"

#include "Vector3.h"

Accelerometer::Accelerometer(I2C &i2c) : I2CPeripheral(i2c, 0x18 << 1 /* address */)
{
    if (powerOn()) {
        INFO("Bosch Sensortec BMX055-Accel found");
        powerOff();
    } else {
        WARN("Bosch Sensortec BMX055-Accel not found");
    }
}

bool Accelerometer::powerOn()
{
    write_reg(0x14, 0xB6); // reset
    wait_ms(2); // page 11 says only 1.3ms, nothing for startup time, so assuming 2ms
    write_reg(0x11, 0); // set power normal mode
    write_reg(0x10, 15); // set bandwidth = 250 Hz
    return read_reg(0x00) == 0xfa; // verify chip ID
}

void Accelerometer::powerOff()
{
    write_reg(0x11, 1); // deep suspend mode
    LOG("deep sleep");
}

void Accelerometer::start()
{
    // nothing to do right now
}

void Accelerometer::stop()
{
    // nothing to do right now
}

Vector3 Accelerometer::read()
{
    // Check comments in the read() function of the Gyroscope for more info why we read bytes one by one.
    union {
        uint8_t bytes[6];
        struct {
            int16_t x;
            int16_t y;
            int16_t z;
        } values;
    } f;
    
    f.bytes[0] = read_reg(0x02) >> 4;
    f.bytes[1] = read_reg(0x03);
    f.bytes[2] = read_reg(0x04) >> 4;
    f.bytes[3] = read_reg(0x05);
    f.bytes[4] = read_reg(0x06) >> 4;
    f.bytes[5] = read_reg(0x07);
    
    f.values.x /= 16;
    f.values.y /= 16;
    f.values.z /= 16;
    
    const float accel_resolution = 0.0009765625;
    
    return Vector3(f.values.x, f.values.y, f.values.z) * accel_resolution;
}