/*
* Author: Brendan Le Foll<brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Code based on LSM303DLH sample by Jim Lindblom SparkFun Electronics
* and the CompensatedCompass.ino by Frankie Chu from SeedStudio
*
* Further modifications to port to the LSM303d by <bruce.j.beare@intel.com>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string.h>
#include <mraa/i2c.hpp>
#include <math.h>
namespace upm {
/**
* @brief LSM303d Accelerometer/Compass library
* @defgroup lsm303d libupm-lsm303d
* @ingroup seeed adafruit i2c accelerometer compass
*/
/**
* @library lsm303d
* @sensor lsm303d
* @comname LSM303d Accelerometer & Compass
* @altname Grove 6-Axis Accelerometer & Compass
* @type accelerometer compass
* @man seeed adafruit
* @web http://www.seeedstudio.com/wiki/Grove_-_6-Axis_Accelerometer%26Compass
* @con i2c
*
* @brief API for the LSM303d Accelerometer & Compass
*
* This module defines the LSM303d 3-axis magnetometer/3-axis accelerometer.
* This module was tested with the Seeed Studio* Grove 6-Axis Accelerometer & Compass
* version 2.0 module used over I2C. The magnometer and acceleromter are accessed
* at two seperate I2C addresses.
*
* @image html lsm303d.jpeg
* @snippet lsm303d.cxx Interesting
*/
class LSM303d {
public:
/* Address definitions for the grove 6DOF v2.0 */
typedef enum {
LSM303d_ADDR = 0x1E
} GROVE_6DOF_ADDRS_T;
typedef enum {
LM303D_SCALE_2G = 2,
LM303D_SCALE_4G = 4,
LM303D_SCALE_6G = 6,
LM303D_SCALE_8G = 8,
LM303D_SCALE_16G = 16
} LSM303D_SCALE_T;
typedef enum {
X = 0,
Y = 1,
Z = 2
} XYZ_T;
/**
* Instantiates an LSM303d object
*
* @param i2c bus
* @param addr Magnetometer
* @param addr Accelerometer
*/
LSM303d (int bus,
int addr=LSM303d_ADDR,
int accScale=LM303D_SCALE_4G);
/**
* LSM303d object destructor
* where is no more need for this here - I2c connection will be stopped
* automatically when m_i2c variable will go out of scope
* ~LSM303d ();
**/
/**
* Gets the current heading; headings <0 indicate an error has occurred
*
* @return float
*/
float getHeading();
/**
* Gets the coordinates in the XYZ order
*/
mraa::Result getCoordinates();
/**
* Gets accelerometer values
* Should be called before other "get" functions for acceleration
*/
mraa::Result getAcceleration();
/**
* Gets raw coordinate data; it is updated when getCoordinates() is called
*/
int16_t* getRawCoorData();
/**
* Gets the X component of the coordinates data
*/
int16_t getCoorX();
/**
* Gets the Y component of the coordinates data
*/
int16_t getCoorY();
/**
* Gets the Z component of the coordinates data
*/
int16_t getCoorZ();
/**
* Gets raw accelerometer data; it is updated when getAcceleration() is called
*/
int16_t* getRawAccelData();
/**
* Gets the X component of the acceleration data
*/
int16_t getAccelX();
/**
* Gets the Y component of the acceleration data
*/
int16_t getAccelY();
/**
* Gets the Z component of the acceleration data
*/
int16_t getAccelZ();
private:
/* LSM303d Register definitions */
typedef enum {
STATUS_M = 0x7,
OUT_X_L_M = 0x8,
OUT_X_H_M = 0x9,
OUT_Y_L_M = 0xA,
OUT_Y_H_M = 0xB,
OUT_Z_L_M = 0xC,
OUT_Z_H_M = 0xD,
CTRL_REG0 = 0x1f,
CTRL_REG1 = 0x20,
CTRL_REG2 = 0x21,
CTRL_REG3 = 0x22,
CTRL_REG4 = 0x23,
CTRL_REG5 = 0x24,
CTRL_REG6 = 0x25,
CTRL_REG7 = 0x26,
STATUS_REGA = 0x27,
OUT_X_L_A = 0x28,
OUT_X_H_A = 0x29,
OUT_Y_L_A = 0x2A,
OUT_Y_H_A = 0x2B,
OUT_Z_L_A = 0x2C,
OUT_Z_H_A = 0x2D,
FIFO_CTRL = 0x2E,
FIFO_SRC = 0x2F,
IG_CFG1 = 0x30,
IG_SRC1 = 0x31,
IG_THS1 = 0x32,
IG_DUR1 = 0x33,
IG_CFG2 = 0x34,
IG_SRC2 = 0x35,
IG_THS2 = 0x36,
IG_DUR2 = 0x37,
CLICK_CFG = 0x38,
CLICK_SRC = 0x39,
CLICK_THS = 0x3A,
TIME_LIMIT = 0x3B,
TIME_LATEN = 0x3C,
TIME_WINDO = 0x3D,
ACT_THS = 0x3E,
ACT_DUR = 0x3F,
} LSM303d_REGS_T;
int writeThenRead(uint8_t reg);
mraa::Result setRegisterSafe(uint8_t slave, uint8_t sregister, uint8_t data);
mraa::I2c m_i2c;
int m_addr;
uint8_t buf[6];
int16_t coor[3];
int16_t accel[3];
};
}