LSM9DS1

Dependents:   Zumipen MIX_DEVICE

LSM9DS1.cpp

Committer:
tona0516
Date:
2017-02-20
Revision:
0:8e17d3584f99

File content as of revision 0:8e17d3584f99:

/**
 * Includes
 */
#include "LSM9DS1.h"

LSM9DS1::LSM9DS1(PinName sda, PinName scl) : connection(sda, scl) {
    //Initializations:
    this->setSleepMode(false);
    this->initCTRL_REG1_G();
//    this->initORIENT_CFG_G();
//    this->initCTRL_REG4();
    this->initCTRL_REG6_XL();
    currentGyroRange = 0;
    currentAcceleroRange = 0;
}

//--------------------------------------------------
//-------------------General------------------------
//--------------------------------------------------

void LSM9DS1::write(char address, char data) {
    char temp[2];
    temp[0]=address;
    temp[1]=data;
    
    connection.write(LSM9DS1_ADDRESS * 2,temp,2);
}

char LSM9DS1::read(char address) {
    char retval;
    connection.write(LSM9DS1_ADDRESS * 2, &address, 1, true);
    connection.read(LSM9DS1_ADDRESS * 2, &retval, 1);
    return retval;
}

void LSM9DS1::read(char address, char *data, int length) {
    connection.write(LSM9DS1_ADDRESS * 2, &address, 1, true);
    connection.read(LSM9DS1_ADDRESS * 2, data, length);
}

bool LSM9DS1::testConnection( void ) {
    char temp;
    temp = this->read(LSM9DS1_WHO_AM_I_REG);
    return (temp == (LSM9DS1_ADDRESS & 0x68));
}

void LSM9DS1::setSleepMode(bool state) {
    char temp;
    temp = this->read(LSM9DS1_CTRL_REG9);
    if (state == true)
        temp |= 1<<LSM9DS1_SLP_BIT;
    if (state == false)
        temp &= ~(1<<LSM9DS1_SLP_BIT);
    this->write(LSM9DS1_CTRL_REG9 , temp);
}

void LSM9DS1::initCTRL_REG1_G( void ){
    this->write(LSM9DS1_CTRL_REG1_G, 0xC3);
}

void LSM9DS1::initORIENT_CFG_G( void ){
    this->write(LSM9DS1_ORIENT_CFG_G, 0x38);
}

void LSM9DS1::initCTRL_REG4( void ){
    this->write(LSM9DS1_CTRL_REG4, 0x39);
}

void LSM9DS1::initCTRL_REG6_XL( void ){
    this->write(LSM9DS1_CTRL_REG6_XL, 0xC3);
}


//--------------------------------------------------
//----------------Accelerometer---------------------
//--------------------------------------------------

void LSM9DS1::setAcceleroRange( char range ) {
    char temp;
    range = range & 0x03;
    currentAcceleroRange = range;
    temp = this->read(LSM9DS1_CTRL_REG6_XL);
    temp &= ~(3<<3);
    temp = temp + (range<<3);
    this->write(LSM9DS1_CTRL_REG6_XL, temp);
}

int LSM9DS1::getAcceleroRawX( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_ACCEL_XOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}
    
int LSM9DS1::getAcceleroRawY( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_ACCEL_YOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}

int LSM9DS1::getAcceleroRawZ( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_ACCEL_ZOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}

void LSM9DS1::getAcceleroRaw( int *data ) {
    char temp[6];
    this->read(LSM9DS1_ACCEL_XOUT_L_REG, temp, 6);
    data[0] = (int)(short)((temp[1]<<8) + temp[0]);
    data[1] = (int)(short)((temp[3]<<8) + temp[2]);
    data[2] = (int)(short)((temp[5]<<8) + temp[4]);
}


//--------------------------------------------------
//------------------Gyroscope-----------------------
//--------------------------------------------------

void LSM9DS1::setGyroRange( char range ) {
    char temp;
    currentGyroRange = range;
    range = range & 0x03;
    temp = this->read(LSM9DS1_CTRL_REG1_G);
    temp &= ~(3<<3);
    temp = temp + range<<3;
    this->write(LSM9DS1_CTRL_REG1_G, temp);
}

int LSM9DS1::getGyroRawX( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_GYRO_XOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}
    
int LSM9DS1::getGyroRawY( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_GYRO_YOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}

int LSM9DS1::getGyroRawZ( void ) {
    short retval;
    char data[2];
    this->read(LSM9DS1_GYRO_ZOUT_L_REG, data, 2);
    retval = (data[1]<<8) + data[0];
    return (int)retval;
}

void LSM9DS1::getGyroRaw( int *data ) {
    char temp[6];
    this->read(LSM9DS1_GYRO_XOUT_L_REG, temp, 6);
    data[0] = (int)(short)((temp[1]<<8) + temp[0]);
    data[1] = (int)(short)((temp[3]<<8) + temp[2]);
    data[2] = (int)(short)((temp[5]<<8) + temp[4]);
}