Implemented first Hangar-Service

Dependencies:   CalibrateMagneto QuaternionMath

Fork of SML2 by TobyRich GmbH

Gyroscope.cpp

Committer:
pvaibhav
Date:
2015-02-12
Revision:
6:c12cea26842d
Parent:
5:b9f2f62a8f90
Child:
7:604a8369b801

File content as of revision 6:c12cea26842d:

#include "Gyroscope.h"
#define DEBUG "BMX055-Gyr"
#include "Logger.h"

Gyroscope::Gyroscope(I2C &i2c) : I2CPeripheral(i2c, 0x69 << 1 /* address */), int1(p3) {
    if (powerOn()) {
        INFO("Bosch Sensortec BMX055-Gyro found");
    } else {
        WARN("Bosch Sensortec BMX055-Gyro not found");
    }
}

void Gyroscope::powerOff() {
    write_reg(0x11, 1);
    LOG("deep sleep");
}

void Gyroscope::handleInterrupt(void) {
    static uint32_t ticks = 0;
    Sensor::Data frame = read();
    
    if (ticks % 100 == 0)
        sendData(frame);
}

bool Gyroscope::powerOn() {
    write_reg(0x14, 0xB6); // softreset
    wait_ms(30);
    LOG("powered on");
    return read_reg(0x00) == 0x0f; // verify Chip ID
}

void Gyroscope::start() {
    write_reg(0x10, 5); // set capture rate: 200 Hz / filter: 23 Hz
    write_reg(0x16, 5); // interrupts active high, push-pull
    write_reg(0x18, 1 << 0); // map new data interrupt to INT3 pin (1st interrupt for gyro)
    int1.rise(this, &Gyroscope::handleInterrupt);
    timer.reset();
    timer.start();
    write_reg(0x15, 1 << 7); // new data interrupt enabled
}

void Gyroscope::stop() {
    timer.stop();
    write_reg(0x15, 0); // turn off new data interrupt
}

Sensor::Data Gyroscope::read() {
    Sensor::Data frame;
    
    read_reg(0x3F, (uint8_t*)&frame, sizeof frame);
    frame.timestamp = timer.read();
    
    return frame;
}