diff --git a/examples/java/BMI055_Example.java b/examples/java/BMI055_Example.java index fc11696f..33293c4c 100644 --- a/examples/java/BMI055_Example.java +++ b/examples/java/BMI055_Example.java @@ -45,11 +45,11 @@ public class BMI055_Example + " z: " + data[2] + " g"); - data = sensor.getGyroscope(); + upm_bmx055.floatVector dataG = sensor.getGyroscope(); - System.out.println("Gyroscope x: " + data[0] - + " y: " + data[1] - + " z: " + data[2] + System.out.println("Gyroscope x: " + dataG.get(0) + + " y: " + dataG.get(1) + + " z: " + dataG.get(2) + " degrees/s"); System.out.println(); diff --git a/examples/java/BMX055_Example.java b/examples/java/BMX055_Example.java index 2abb0da2..e599cd02 100644 --- a/examples/java/BMX055_Example.java +++ b/examples/java/BMX055_Example.java @@ -45,14 +45,13 @@ public class BMX055_Example + " z: " + data[2] + " g"); - data = sensor.getGyroscope(); + upm_bmx055.floatVector dataG = sensor.getGyroscope(); - System.out.println("Gyroscope x: " + data[0] - + " y: " + data[1] - + " z: " + data[2] + System.out.println("Gyroscope x: " + dataG.get(0) + + " y: " + dataG.get(1) + + " z: " + dataG.get(2) + " degrees/s"); - data = sensor.getMagnetometer(); System.out.println("Magnetometer x: " + data[0] diff --git a/src/bmx055/CMakeLists.txt b/src/bmx055/CMakeLists.txt index d0a90991..71ad1688 100644 --- a/src/bmx055/CMakeLists.txt +++ b/src/bmx055/CMakeLists.txt @@ -1,5 +1,5 @@ -set (libname "bmx055") -set (libdescription "Bosch IMU Sensor Library") -set (module_src ${libname}.cxx bma250e.cxx bmg160.cxx bmm150.cxx bmc150.cxx bmi055.cxx) -set (module_hpp ${libname}.hpp bma250e.hpp bmg160.hpp bmm150.hpp bmc150.cxx bmi055.hpp) -upm_module_init(mraa) +upm_mixed_module_init (NAME bmx055 + DESCRIPTION "Bosch IMU Sensor Library" + CPP_HDR bmx055.hpp bma250e.hpp bmm150.hpp bmc150.cxx bmi055.hpp + CPP_SRC bmx055.cxx bma250e.cxx bmm150.cxx bmc150.cxx bmi055.cxx + REQUIRES mraa bmg160) diff --git a/src/bmx055/bmg160.cxx b/src/bmx055/bmg160.cxx deleted file mode 100644 index b50302d9..00000000 --- a/src/bmx055/bmg160.cxx +++ /dev/null @@ -1,587 +0,0 @@ -/* - * Author: Jon Trulson - * Copyright (c) 2016 Intel Corporation. - * - * 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. - */ - -#include -#include -#include -#include -#include - -#include "bmg160.hpp" - -using namespace upm; -using namespace std; - -#define BMG160_DEFAULT_CHIPID 0x0f - -// conversion from celsius to fahrenheit - -static float c2f(float c) -{ - return (c * (9.0 / 5.0) + 32.0); -} - -BMG160::BMG160(int bus, int addr, int cs) : - m_i2c(0), m_spi(0), m_gpioIntr1(0), m_gpioIntr2(0), m_gpioCS(0) -{ - m_gyrX = 0; - m_gyrY = 0; - m_gyrZ = 0; - m_gyrScale = 0; - m_temperature = 0.0; - - if (addr < 0) - { - m_addr = 0; - m_isSPI = true; - } - else - { - m_addr = uint8_t(addr); - m_isSPI = false; - } - - if (m_isSPI) - { - m_spi = new mraa::Spi(bus); - - // Only create cs context if we are actually using a valid pin. - // A hardware controlled pin should specify cs as -1. - if (cs >= 0) - { - m_gpioCS = new mraa::Gpio(cs); - m_gpioCS->dir(mraa::DIR_OUT); - } - - m_spi->mode(mraa::SPI_MODE0); - m_spi->frequency(5000000); - } - else - { - // I2C - m_i2c = new mraa::I2c(bus); - - mraa::Result rv; - if ((rv = m_i2c->address(m_addr)) != mraa::SUCCESS) - { - throw std::runtime_error(string(__FUNCTION__) + - ": I2c.address() failed"); - } - } - - // check the chip id - - uint8_t chipID = getChipID(); - if (chipID != BMG160_DEFAULT_CHIPID) - { - throw std::runtime_error(string(__FUNCTION__) - + ": invalid chip ID. Expected " - + std::to_string(int(BMG160_DEFAULT_CHIPID)) - + ", got " - + std::to_string(int(chipID))); - } - - // call init with default options - init(); -} - -BMG160::~BMG160() -{ - uninstallISR(INTERRUPT_INT1); - uninstallISR(INTERRUPT_INT2); - - if (m_i2c) - delete m_i2c; - if (m_spi) - delete m_spi; - if(m_gpioCS) - delete m_gpioCS; -} - -void BMG160::init(POWER_MODE_T pwr, RANGE_T range, BW_T bw) -{ - setPowerMode(pwr); - usleep(50000); // 50ms, in case we are waking up - - // set our range and bandwidth - setRange(range); - setBandwidth(bw); - - // make sure register shadowing is enabled - enableRegisterShadowing(true); - - // enable output filtering - enableOutputFiltering(true); - - // use the FIFO by default - fifoConfig(FIFO_MODE_BYPASS, FIFO_DATA_SEL_XYZ); - enableFIFO(true); - - // settle - usleep(50000); -} - -void BMG160::update() -{ - int bufLen = 7; // max, non-FIFO - uint8_t startReg = REG_RATE_X_LSB; - - if (m_useFIFO) - { - bufLen = 6; - startReg = REG_FIFO_DATA; - } - - uint8_t buf[bufLen]; - - if (readRegs(startReg, buf, bufLen) != bufLen) - { - throw std::runtime_error(string(__FUNCTION__) - + ": readRegs() failed to read " - + std::to_string(bufLen) - + " bytes"); - } - - int16_t val; - - // x - val = int16_t(buf[1] << 8 | buf[0]); - m_gyrX = float(val); - - // y - val = int16_t(buf[3] << 8 | buf[2]); - m_gyrY = float(val); - - // z - val = int16_t(buf[5] << 8 | buf[4]); - m_gyrZ = float(val); - - // get the temperature... - - uint8_t temp = 0; - if (m_useFIFO) - { - // we have to read temperature separately... - temp = readReg(REG_TEMP); - } - else - { - // we already got it - temp = buf[6]; - } - - // .5K/LSB, 23C center point - m_temperature = (float(temp) / 2.0) + 23.0; -} - -void BMG160::enableFIFO(bool useFIFO) -{ - m_useFIFO = useFIFO; -} - -uint8_t BMG160::readReg(uint8_t reg) -{ - if (m_isSPI) - { - reg |= 0x80; // needed for read - uint8_t pkt[2] = {reg, 0}; - - csOn(); - if (m_spi->transfer(pkt, pkt, 2)) - { - csOff(); - throw std::runtime_error(string(__FUNCTION__) - + ": Spi.transfer() failed"); - } - csOff(); - - return pkt[1]; - } - else - return m_i2c->readReg(reg); -} - -int BMG160::readRegs(uint8_t reg, uint8_t *buffer, int len) -{ - if (m_isSPI) - { - reg |= 0x80; // needed for read - - uint8_t sbuf[len + 1]; - memset((char *)sbuf, 0, len + 1); - sbuf[0] = reg; - - // We need to do it this way for edison - ie: use a single - // transfer rather than breaking it up into two like we used to. - // This means a buffer copy is now required, but that's the way - // it goes. - - csOn(); - if (m_spi->transfer(sbuf, sbuf, len + 1)) - { - csOff(); - throw std::runtime_error(string(__FUNCTION__) - + ": Spi.transfer(buf) failed"); - } - csOff(); - - // now copy it into user buffer - for (int i=0; ireadBytesReg(reg, buffer, len); -} - -void BMG160::writeReg(uint8_t reg, uint8_t val) -{ - if (m_isSPI) - { - reg &= 0x7f; // mask off 0x80 for writing - uint8_t pkt[2] = {reg, val}; - - csOn(); - if (m_spi->transfer(pkt, NULL, 2)) - { - csOff(); - throw std::runtime_error(string(__FUNCTION__) - + ": Spi.transfer() failed"); - } - csOff(); - } - else - { - - mraa::Result rv; - if ((rv = m_i2c->writeReg(reg, val)) != mraa::SUCCESS) - { - throw std::runtime_error(std::string(__FUNCTION__) - + ": I2c.writeReg() failed"); - } - } -} - -void BMG160::csOn() -{ - if (m_gpioCS) - m_gpioCS->write(0); -} - -void BMG160::csOff() -{ - if (m_gpioCS) - m_gpioCS->write(1); -} - -uint8_t BMG160::getChipID() -{ - return readReg(REG_CHIP_ID); -} - -void BMG160::getGyroscope(float *x, float *y, float *z) -{ - if (x) - *x = (m_gyrX * m_gyrScale) / 1000.0; - - if (y) - *y = (m_gyrY * m_gyrScale) / 1000.0; - - if (z) - *z = (m_gyrZ * m_gyrScale) / 1000.0; -} - -float *BMG160::getGyroscope() -{ - static float v[3]; - - getGyroscope(&v[0], &v[1], &v[2]); - return v; -} - -float BMG160::getTemperature(bool fahrenheit) -{ - if (fahrenheit) - return c2f(m_temperature); - else - return m_temperature; -} - -void BMG160::reset() -{ - writeReg(REG_SOFTRESET, BMG160_RESET_BYTE); - sleep(1); -} - -void BMG160::setRange(RANGE_T range) -{ - switch(range) - { - case RANGE_125: - m_gyrScale = 3.8; // milli-degrees - break; - - case RANGE_250: - m_gyrScale = 7.6; - break; - - case RANGE_500: - m_gyrScale = 15.3; - break; - - case RANGE_1000: - m_gyrScale = 30.5; - break; - - case RANGE_2000: - m_gyrScale = 61.0; - break; - } - - // we also have to write a fixed '0x10' to the high-order bits for - // some reason (according to datasheet) - uint8_t reg = range | (_GYR_RANGE_FIXED_VALUE << _GYR_RANGE_FIXED_SHIFT); - writeReg(REG_GYR_RANGE, reg); -} - -void BMG160::setBandwidth(BW_T bw) -{ - writeReg(REG_GYR_BW, bw); -} - -void BMG160::setPowerMode(POWER_MODE_T power) -{ - // mask off reserved bits - uint8_t reg = readReg(REG_LPM1) & ~_LPM1_RESERVED_MASK; - - reg &= ~(_LPM1_POWER_MODE_MASK << _LPM1_POWER_MODE_SHIFT); - reg |= (power << _LPM1_POWER_MODE_SHIFT); - - writeReg(REG_LPM1, power); -} - -void BMG160::fifoSetWatermark(int wm) -{ - // mask off illegal values - uint8_t reg = uint8_t(wm) & _FIFO_CONFIG_0_WATER_MARK_MASK; - - writeReg(REG_FIFO_CONFIG_0, reg); -} - -void BMG160::fifoConfig(FIFO_MODE_T mode, FIFO_DATA_SEL_T axes) -{ - uint8_t reg = ( (mode << _FIFO_CONFIG_1_FIFO_MODE_SHIFT) | - (axes << _FIFO_CONFIG_1_FIFO_DATA_SHIFT) ); - - writeReg(REG_FIFO_CONFIG_1, reg); -} - -uint8_t BMG160::getInterruptEnable0() -{ - return readReg(REG_INT_EN_0) & ~_INT_EN_0_RESERVED_BITS; -} - -void BMG160::setInterruptEnable0(uint8_t bits) -{ - uint8_t reg = bits & ~_INT_EN_0_RESERVED_BITS; - - writeReg(REG_INT_EN_0, reg); -} - -uint8_t BMG160::getInterruptMap0() -{ - return readReg(REG_INT_MAP_0) & ~_INT_MAP_0_RESERVED_BITS; -} - -void BMG160::setInterruptMap0(uint8_t bits) -{ - uint8_t reg = bits & ~_INT_MAP_0_RESERVED_BITS; - - writeReg(REG_INT_MAP_0, reg); -} - -uint8_t BMG160::getInterruptMap1() -{ - return readReg(REG_INT_MAP_1); -} - -void BMG160::setInterruptMap1(uint8_t bits) -{ - writeReg(REG_INT_MAP_1, bits); -} - -// REG_INT_EN1, for some strange reason -uint8_t BMG160::getInterruptSrc() -{ - return readReg(REG_INT_EN_1) & ~_INT_EN_1_INT1_RESERVED_BITS; -} - -void BMG160::setInterruptSrc(uint8_t bits) -{ - uint8_t reg = bits & ~_INT_EN_1_INT1_RESERVED_BITS; - - writeReg(REG_INT_EN_1, reg); -} - -uint8_t BMG160::getInterruptOutputControl() -{ - return readReg(REG_INT_EN_1) & ~_INT_EN_1_INT1_RESERVED_BITS; -} - -void BMG160::setInterruptOutputControl(uint8_t bits) -{ - uint8_t reg = bits & ~_INT_EN_1_INT1_RESERVED_BITS; - - writeReg(REG_INT_EN_1, reg); -} - -void BMG160::clearInterruptLatches() -{ - uint8_t reg = readReg(REG_INT_RST_LATCH) & ~_INT_RST_LATCH_RESERVED_BITS; - - reg |= INT_RST_LATCH_RESET_INT; - - writeReg(REG_INT_RST_LATCH, reg); -} - -BMG160::RST_LATCH_T BMG160::getInterruptLatchBehavior() -{ - uint8_t reg = readReg(REG_INT_RST_LATCH) & ~_INT_RST_LATCH_RESERVED_BITS; - - reg &= (_INT_RST_LATCH_MASK << _INT_RST_LATCH_SHIFT); - - return static_cast(reg); -} - -void BMG160::setInterruptLatchBehavior(RST_LATCH_T latch) -{ - uint8_t reg = readReg(REG_INT_RST_LATCH) & ~_INT_RST_LATCH_RESERVED_BITS; - - reg &= ~(_INT_RST_LATCH_MASK << _INT_RST_LATCH_SHIFT); - reg |= (latch << _INT_RST_LATCH_SHIFT); - - writeReg(REG_INT_RST_LATCH, reg); -} - -void BMG160::enableRegisterShadowing(bool shadow) -{ - uint8_t reg = readReg(REG_RATE_HBW) & ~_RATE_HBW_RESERVED_BITS; - - if (shadow) - reg &= ~RATE_HBW_SHADOW_DIS; - else - reg |= RATE_HBW_SHADOW_DIS; - - writeReg(REG_RATE_HBW, reg); -} - -void BMG160::enableOutputFiltering(bool filter) -{ - uint8_t reg = readReg(REG_RATE_HBW) & ~_RATE_HBW_RESERVED_BITS; - - if (filter) - reg &= ~RATE_HBW_DATA_HIGH_BW; - else - reg |= RATE_HBW_DATA_HIGH_BW; - - writeReg(REG_RATE_HBW, reg); -} - -uint8_t BMG160::getInterruptStatus0() -{ - return readReg(REG_INT_STATUS_0) & ~_INT_STATUS_0_RESERVED_BITS; -} - -uint8_t BMG160::getInterruptStatus1() -{ - return readReg(REG_INT_STATUS_1) & ~_INT_STATUS_1_RESERVED_BITS; -} - -uint8_t BMG160::getInterruptStatus2() -{ - return readReg(REG_INT_STATUS_2) & ~_INT_STATUS_2_RESERVED_BITS; -} - -uint8_t BMG160::getInterruptStatus3() -{ - return readReg(REG_INT_STATUS_3) & ~_INT_STATUS_3_RESERVED_BITS; -} - -#if defined(SWIGJAVA) || (JAVACALLBACK) -void BMG160::installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, - jobject runnable) -{ - // delete any existing ISR and GPIO context - uninstallISR(intr); - - // create gpio context - getPin(intr) = new mraa::Gpio(gpio); - - getPin(intr)->dir(mraa::DIR_IN); - getPin(intr)->isr(level, runnable); -} -#else -void BMG160::installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, - void (*isr)(void *), void *arg) -{ - // delete any existing ISR and GPIO context - uninstallISR(intr); - - // create gpio context - getPin(intr) = new mraa::Gpio(gpio); - - getPin(intr)->dir(mraa::DIR_IN); - getPin(intr)->isr(level, isr, arg); -} -#endif - -void BMG160::uninstallISR(INTERRUPT_PINS_T intr) -{ - if (getPin(intr)) - { - getPin(intr)->isrExit(); - delete getPin(intr); - - getPin(intr) = 0; - } -} - -mraa::Gpio*& BMG160::getPin(INTERRUPT_PINS_T intr) -{ - switch(intr) - { - case INTERRUPT_INT1: - return m_gpioIntr1; - break; - - case INTERRUPT_INT2: - return m_gpioIntr2; - break; - - default: - throw std::out_of_range(string(__FUNCTION__) + - ": Invalid interrupt enum passed"); - } -} diff --git a/src/bmx055/bmg160.hpp b/src/bmx055/bmg160.hpp deleted file mode 100644 index 2ce81b62..00000000 --- a/src/bmx055/bmg160.hpp +++ /dev/null @@ -1,1224 +0,0 @@ -/* - * Author: Jon Trulson - * Copyright (c) 2016 Intel Corporation. - * - * 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 -#include -#include -#include - -#define BMG160_I2C_BUS 0 -#define BMG160_SPI_BUS 0 -#define BMG160_DEFAULT_ADDR 0x68 - - -namespace upm { - - /** - * @library bmx050 - * @sensor bmg160 - * @comname 3-axis Gyroscope Sensor - * @type gyro - * @man bosch - * @con i2c spi gpio - * @web https://www.bosch-sensortec.com/bst/products/all_products/bmg160 - * - * @brief API for the BMG160 16 bit Triaxial Gyroscope - * - * The BMG160 is a 3-axis angular rate sensor that is made of a - * surface micro machined sensing element and an evaluation ASIC. - * Both parts are packed into one single LGA 3.0mm x 3.0mm x 0.95mm - * housing. The BMG160 is designed to meet requirements for - * consumer applications such as image stabilization (DSC and - * camera-phone), gaming and pointing devices. It is capable to - * measure angular rates in three perpendicular room dimensions, the - * x-, y- and z-axis, and to provide the corresponding output - * signals. The BMG160 is fitted with digital bi-directional SPI and - * I2C interfaces for optimum system integration. - * - * Not all functionality of this chip has been implemented in this - * driver, however all the pieces are present to add any desired - * functionality. This driver supports both I2C (default) and SPI - * operation. - * - * This device requires 3.3v operation. - * - * @snippet bmg160.cxx Interesting - */ - - class BMG160 { - public: - // special reset byte - static const uint8_t BMG160_RESET_BYTE = 0xb6; - - // NOTE: Reserved registers must not be written into. Reading - // from them may return indeterminate values. Registers - // containing reserved bitfields must be written as 0. Reading - // reserved bitfields may return indeterminate values. - - /** - * BMG160 registers - */ - typedef enum : uint8_t { - REG_CHIP_ID = 0x00, - - // 0x01 reserved - - REG_RATE_X_LSB = 0x02, - REG_RATE_X_MSB = 0x03, - REG_RATE_Y_LSB = 0x04, - REG_RATE_Y_MSB = 0x05, - REG_RATE_Z_LSB = 0x06, - REG_RATE_Z_MSB = 0x07, - - REG_TEMP = 0x08, - - REG_INT_STATUS_0 = 0x09, - REG_INT_STATUS_1 = 0x0a, - REG_INT_STATUS_2 = 0x0b, - REG_INT_STATUS_3 = 0x0c, - - // 0x0d reserved - - REG_FIFO_STATUS = 0x0e, - - REG_GYR_RANGE = 0x0f, - REG_GYR_BW = 0x10, - REG_LPM1 = 0x11, - REG_LPM2 = 0x12, - - REG_RATE_HBW = 0x13, - - REG_SOFTRESET = 0x14, - - REG_INT_EN_0 = 0x15, - REG_INT_EN_1 = 0x16, - - REG_INT_MAP_0 = 0x17, - REG_INT_MAP_1 = 0x18, - REG_INT_MAP_2 = 0x19, - - REG_INT_1A = 0x1a, - REG_INT_1B = 0x1b, - REG_INT_1C = 0x1c, - - // 0x1d reserved - - REG_INT_1E = 0x1e, - - // 0x1f-0x20 reserved - - REG_INT_RST_LATCH = 0x21, - - REG_HIGH_TH_X = 0x22, - REG_HIGH_DUR_X = 0x23, - REG_HIGH_TH_Y = 0x24, - REG_HIGH_DUR_Y = 0x25, - REG_HIGH_TH_Z = 0x26, - REG_HIGH_DUR_Z = 0x27, - - // 0x28-0x30 reserved - - REG_SOC = 0x31, - REG_A_FOC = 0x32, - - REG_TRIM_NVM_CTRL = 0x33, - - REG_SPI3_WDT = 0x34, - - // 0x35 reserved - - REG_OFC1 = 0x36, - REG_OFC2 = 0x37, - REG_OFC3 = 0x38, - REG_OFC4 = 0x39, - - REG_TRIM_GP0 = 0x3a, - REG_TRIM_GP1 = 0x3b, - - REG_BIST = 0x3c, - - REG_FIFO_CONFIG_0 = 0x3d, - REG_FIFO_CONFIG_1 = 0x3e, - - REG_FIFO_DATA = 0x3f - - } BMG160_REGS_T; - - /** - * REG_INT_STATUS_0 bits - */ - typedef enum { - _INT_STATUS_0_RESERVED_BITS = 0xf0 | 0x08 | 0x01, - - INT_STATUS_0_HIGH_INT = 0x02, - INT_STATUS_0_ANY_INT = 0x04 - } INT_STATUS_0_BITS_T; - - /** - * REG_INT_STATUS_1 bits - */ - typedef enum { - _INT_STATUS_1_RESERVED_BITS = 0x0f, - - INT_STATUS_1_FIFO_INT = 0x10, - INT_STATUS_1_FAST_OFFSET_INT = 0x20, - INT_STATUS_1_AUTO_OFFSET_INT = 0x40, - INT_STATUS_1_DATA_INT = 0x80 - } INT_STATUS_1_BITS_T; - - /** - * REG_INT_STATUS_2 bits - */ - typedef enum { - _INT_STATUS_2_RESERVED_BITS = 0xf0, - - INT_STATUS_2_ANY_FIRST_X = 0x01, - INT_STATUS_2_ANY_FIRST_Y = 0x02, - INT_STATUS_2_ANY_FIRST_Z = 0x04, - INT_STATUS_2_ANY_SIGN = 0x08 - } INT_STATUS_2_BITS_T; - - /** - * REG_INT_STATUS_3 bits - */ - typedef enum { - _INT_STATUS_3_RESERVED_BITS = 0xf0, - - INT_STATUS_3_HIGH_FIRST_X = 0x01, - INT_STATUS_3_HIGH_FIRST_Y = 0x02, - INT_STATUS_3_HIGH_FIRST_Z = 0x04, - INT_STATUS_3_HIGH_SIGN = 0x08 - } INT_STATUS_3_BITS_T; - - /** - * REG_FIFO_STATUS bits - */ - typedef enum { - FIFO_STATUS_FRAME_COUNTER0 = 0x01, - FIFO_STATUS_FRAME_COUNTER1 = 0x02, - FIFO_STATUS_FRAME_COUNTER2 = 0x04, - FIFO_STATUS_FRAME_COUNTER3 = 0x08, - FIFO_STATUS_FRAME_COUNTER4 = 0x10, - FIFO_STATUS_FRAME_COUNTER5 = 0x20, - FIFO_STATUS_FRAME_COUNTER6 = 0x40, - _FIFO_STATUS_FRAME_COUNTER_MASK = 127, - _FIFO_STATUS_FRAME_COUNTER_SHIFT = 0, - - FIFO_STATUS_FIFO_OVERRUN = 0x80 - } FIFO_STATUS_BITS_T; - - /** - * REG_GYR_RANGE bits - */ - typedef enum { - _GYR_RANGE_RESERVED_BITS = 0x20 | 0x10 | 0x08, - - GYR_RANGE0 = 0x01, - GYR_RANGE1 = 0x02, - GYR_RANGE2 = 0x04, - _GYR_RANGE_MASK = 7, - _GYR_RANGE_SHIFT = 0, - - GYR_RANGE_FIXED0 = 0x40, // bits need hardcoding to 0b10 - GYR_RANGE_FIXED1 = 0x80, // for some odd reason... - _GYR_RANGE_FIXED_MASK = 3, - _GYR_RANGE_FIXED_SHIFT = 6, - _GYR_RANGE_FIXED_VALUE = 2 // 0b10 - } GYR_RANGE_BITS_T; - - /** - * GYR_RANGE (gyroscope deg/s range) values - */ - typedef enum { - RANGE_2000 = 0, // degrees/sec - RANGE_1000 = 1, - RANGE_500 = 2, - RANGE_250 = 3, - RANGE_125 = 4 - } RANGE_T; - - /** - * REG_GYR_BW bits - */ - typedef enum { - _GYR_BW_RESERVED_BITS = 0xf0, - - GYR_BW0 = 0x01, - GYR_BW1 = 0x02, - GYR_BW2 = 0x04, - GYR_BW3 = 0x08, - _GYR_BW_MASK = 15, - _GYR_BW_SHIFT = 0 - } GYR_BW_BITS_T; - - /** - * GYR_BW (gyroscope filter bandwidth) values - */ - typedef enum { - BW_2000_UNFILTERED = 0, // ODR/Filter BW - BW_2000_230 = 1, // ODR 2000Hz, Filter BW 230Hz - BW_1000_116 = 2, - BW_400_47 = 3, - BW_200_23 = 4, - BW_100_12 = 5, - BW_200_64 = 6, - BW_100_32 = 7 - } BW_T; - - /** - * REG_LPM1 bits - */ - typedef enum { - // 0x01 reserved - _LPM1_RESERVED_MASK = 0x40 | 0x10 | 0x01, - - LPM1_SLEEP_DUR0 = 0x02, // sleep dur in low power mode - LPM1_SLEEP_DUR1 = 0x04, - LPM1_SLEEP_DUR2 = 0x08, - _LPM1_SLEEP_MASK = 7, - _LPM1_SLEEP_SHIFT = 1, - - // These are separate bits, deep_suspend and suspend (and if all - // 0, normal). Since only specific combinations are allowed, we - // will treat this as a 3 bit bitfield called POWER_MODE. - LPM1_POWER_MODE0 = 0x20, // deep_suspend - LPM1_POWER_MODE1 = 0x40, // must always be 0! - LPM1_POWER_MODE2 = 0x80, // suspend - _LPM1_POWER_MODE_MASK = 7, - _LPM1_POWER_MODE_SHIFT = 5 - } LPM1_BITS_T; - - /** - * SLEEP_DUR values - */ - typedef enum { - SLEEP_DUR_2 = 0, // 2ms - SLEEP_DUR_4 = 1, - SLEEP_DUR_5 = 2, - SLEEP_DUR_8 = 3, - SLEEP_DUR_10 = 4, - SLEEP_DUR_15 = 5, - SLEEP_DUR_18 = 6, - SLEEP_DUR_20 = 7 - } SLEEP_DUR_T; - - /** - * POWER_MODE values - */ - typedef enum { - POWER_MODE_NORMAL = 0, - POWER_MODE_DEEP_SUSPEND = 1, - POWER_MODE_SUSPEND = 4 - } POWER_MODE_T; - - /** - * REG_LPM2 bits - */ - typedef enum { - _LPM2_RESERVED_BITS = 0x08, - - LPM2_AUTOSLEEP_DUR0 = 0x01, - LPM2_AUTOSLEEP_DUR1 = 0x02, - LPM2_AUTOSLEEP_DUR2 = 0x04, - _LPM2_AUTOSLEEP_DUR_MASK = 7, - _LPM2_AUTOSLEEP_DUR_SHIFT = 0, - - LPM2_EXT_TRIG_SEL0 = 0x10, - LPM2_EXT_TRIG_SEL1 = 0x20, - _LPM2_EXT_TRIG_SEL_MASK = 3, - _LPM2_EXT_TRIG_SEL_SHIFT = 4, - - LPM2_POWER_SAVE_MODE = 0x40, - LPM2_FAST_POWERUP = 0x80 - } LPM2_BITS_T; - - - /** - * LPM2_AUTOSLEEP_DUR values - */ - typedef enum { - AUTOSLEEP_DUR_NONE = 0, - AUTOSLEEP_DUR_4MS = 1, - AUTOSLEEP_DUR_5MS = 2, - AUTOSLEEP_DUR_8MS = 3, - AUTOSLEEP_DUR_10MS = 4, - AUTOSLEEP_DUR_15MS = 5, - AUTOSLEEP_DUR_20MS = 6, - AUTOSLEEP_DUR_40MS = 7 - } AUTOSLEEP_DUR_T; - - /** - * LPM2_EXT_TRIG_SEL values - */ - typedef enum { - EXT_TRIG_SEL_NONE = 0, - EXT_TRIG_SEL_INT1 = 1, - EXT_TRIG_SEL_INT2 = 2, - EXT_TRIG_SEL_SDO = 3 // if SPI3 mode (unsupported) - } EXT_TRIG_SEL_T; - - /** - * REG_RATE_HBW bits - */ - typedef enum { - _RATE_HBW_RESERVED_BITS = 0x0f | 0x10 | 0x20, - - RATE_HBW_SHADOW_DIS = 0x40, - RATE_HBW_DATA_HIGH_BW = 0x80 - } RATE_HBW_BITS_T; - - /** - * REG_INT_EN_0 bits - */ - typedef enum { - _INT_EN_0_RESERVED_BITS = 0x20 | 0x10 | 0x08 | 0x02 | 0x01, - - INT_EN_0_AUTO_OFFSET_EN = 0x04, - - INT_EN_0_FIFO_EN = 0x40, - INT_EN_0_DATA_EN = 0x80 - } INT_EN_0_BITS_T; - - /** - * REG_INT_EN_1 bits - */ - typedef enum { - _INT_EN_1_INT1_RESERVED_BITS = 0xf0, - - INT_EN_1_INT1_LVL = 0x01, // level or edge - INT_EN_1_INT1_OD = 0x02, // push-pull or open drain - INT_EN_1_INT2_LVL = 0x04, - INT_EN_1_INT2_OD = 0x08 - } INT_EN_1_BITS_T; - - /** - * REG_INT_MAP_0 bits - */ - typedef enum { - _INT_MAP_0_RESERVED_BITS = 0xf0 | 0x04 | 0x01, - - INT_MAP_0_INT1_ANY = 0x02, - INT_MAP_0_INT1_HIGH = 0x08 - } INT_MAP_0_BITS_T; - - /** - * REG_INT_MAP_1 bits - */ - typedef enum { - INT_MAP_1_INT1_DATA = 0x01, - INT_MAP_1_INT1_FAST_OFFSET = 0x02, - INT_MAP_1_INT1_FIFO = 0x04, - INT_MAP_1_INT1_AUTO_OFFSET = 0x08, - INT_MAP_1_INT2_AUTO_OFFSET = 0x10, - INT_MAP_1_INT2_FIFO = 0x20, - INT_MAP_1_INT2_FAST_OFFSET = 0x40, - INT_MAP_1_INT2_DATA = 0x80 - } INT_MAP_1_BITS_T; - - /** - * REG_INT_1A bits - */ - typedef enum { - _INT_1A_RESERVED_BITS = 0xd5, - - INT_1A_ANY_UNFILT_DATA = 0x02, - INT_1A_HIGH_UNFILT_DATA = 0x08, - INT_1A_SLOW_OFFSET_UNFILT = 0x20 - } INT_1A_BITS_T; - - /** - * REG_INT_1B bits - */ - typedef enum { - INT_1B_ANY_TH0 = 0x01, - INT_1B_ANY_TH1 = 0x02, - INT_1B_ANY_TH2 = 0x04, - INT_1B_ANY_TH3 = 0x08, - INT_1B_ANY_TH4 = 0x10, - INT_1B_ANY_TH5 = 0x20, - INT_1B_ANY_TH6 = 0x40, - _INT_1B_ANY_TH_MASK = 127, - _INT_1B_ANY_TH_SHIFT = 0, - - INT_1B_FAST_OFFSET_UNFILT = 0x80 - } INT_1B_BITS_T; - - /** - * REG_INT_1C bits - */ - typedef enum { - _INT_1C_RESERVED_BITS = 0x08, - - INT_1C_ANY_EN_X = 0x01, - INT_1C_ANY_EN_Y = 0x02, - INT_1C_ANY_EN_Z = 0x04, - - INT_1C_ANY_DUR_SAMPLE0 = 0x10, - INT_1C_ANY_DUR_SAMPLE1 = 0x20, - INT_1C_ANY_DUR_SAMPLE_MASK = 3, - INT_1C_ANY_DUR_SAMPLE_SHIFT = 4, - - INT_1C_AWAKE_DUR0 = 0x40, - INT_1C_AWAKE_DUR1 = 0x80, - INT_1C_AWAKE_DUR_MASK = 3, - INT_1C_AWAKE_DUR_SHIFT = 6 - } INT_1C_BITS_T; - - /** - * INT_1C_ANY_DUR_SAMPLE values - */ - typedef enum { - ANY_DUR_SAMPLE_4 = 0, // samples - ANY_DUR_SAMPLE_8 = 1, - ANY_DUR_SAMPLE_12 = 2, - ANY_DUR_SAMPLE_16 = 3 - } ANY_DUR_SAMPLE_T; - - /** - * INT_1C_AWAKE_DUR values - */ - typedef enum { - AWAKE_DUR_SAMPLE_8 = 0, // samples - AWAKE_DUR_SAMPLE_16 = 1, - AWAKE_DUR_SAMPLE_32 = 2, - AWAKE_DUR_SAMPLE_64 = 3 - } AWAKE_DUR_SAMPLE_T; - - /** - * REG_INT_1E bits - */ - typedef enum { - _INT_1E_RESERVED_BITS = 0x7f, - - INT_1E_FIFO_WM_EN = 0x80 - } INT_1E_BITS_T; - - /** - * REG_INT_RST_LATCH bits - */ - typedef enum { - _INT_RST_LATCH_RESERVED_BITS = 0x20, - - INT_RST_LATCH0 = 0x01, - INT_RST_LATCH1 = 0x02, - INT_RST_LATCH2 = 0x04, - INT_RST_LATCH3 = 0x08, - _INT_RST_LATCH_MASK = 15, - _INT_RST_LATCH_SHIFT = 0, - - INT_RST_LATCH_STATUS_BIT = 0x10, - - INT_RST_LATCH_OFFSET_RESET = 0x40, - INT_RST_LATCH_RESET_INT = 0x80 - } INT_RST_LATCH_BITS_T; - - /** - * RST_LATCH values - */ - typedef enum { - RST_LATCH_NON_LATCHED = 0, - RST_LATCH_TEMPORARY_250MS = 1, - RST_LATCH_TEMPORARY_500MS = 2, - RST_LATCH_TEMPORARY_1S = 3, - RST_LATCH_TEMPORARY_2S = 4, - RST_LATCH_TEMPORARY_4S = 5, - RST_LATCH_TEMPORARY_8S = 6, - RST_LATCH_LATCHED = 7, - - // 8 == non latched - - RST_LATCH_TEMPORARY_250US = 9, - RST_LATCH_TEMPORARY_500US = 10, - RST_LATCH_TEMPORARY_1MS = 11, - RST_LATCH_TEMPORARY_12_5MS = 12, - RST_LATCH_TEMPORARY_25MS = 13, - RST_LATCH_TEMPORARY_50MS = 14 - - // 15 == latched - } RST_LATCH_T; - - /** - * REG_HIGH_TH_* (X, Y, and Z) register bits - */ - typedef enum { - HIGH_TH_EN = 0x01, - - HIGH_TH_TH0 = 0x02, - HIGH_TH_TH1 = 0x04, - HIGH_TH_TH2 = 0x08, - HIGH_TH_TH3 = 0x10, - HIGH_TH_TH4 = 0x20, - _HIGH_TH_TH_MASK = 31, - _HIGH_TH_TH_SHIFT = 1, - - HIGH_TH_HY0 = 0x40, - HIGH_TH_HY1 = 0x80, - _HIGH_TH_HY_MASK = 3, - _HIGH_TH_HY_SHIFT = 6 - } HIGH_TH_BITS_T; - - /** - * REG_SOC bits - */ - typedef enum { - SOC_SLOW_OFFSET_EN_X = 0x01, - SOC_SLOW_OFFSET_EN_Y = 0x02, - SOC_SLOW_OFFSET_EN_Z = 0x04, - - SOC_SLOW_OFFSET_DUR0 = 0x08, - SOC_SLOW_OFFSET_DUR1 = 0x10, - SOC_SLOW_OFFSET_DUR2 = 0x20, - _SOC_SLOW_OFFSET_DUR_MASK = 7, - _SOC_SLOW_OFFSET_DUR_SHIFT = 3, - - SOC_SLOW_OFFSET_TH0 = 0x40, - SOC_SLOW_OFFSET_TH1 = 0x80, - _SOC_SLOW_OFFSET_TH_MASK = 3, - _SOC_SLOW_OFFSET_TH_SHIFT = 6 - } SOC_BITS_T; - - /** - * SOC_SLOW_OFFSET_DUR values - */ - typedef enum { - SLOW_OFFSET_DUR_40MS = 0, // 40ms - SLOW_OFFSET_DUR_80MS = 1, - SLOW_OFFSET_DUR_160MS = 2, - SLOW_OFFSET_DUR_320MS = 3, - SLOW_OFFSET_DUR_640MS = 4, - SLOW_OFFSET_DUR_1280MS = 5 - } SLOW_OFFSET_DUR_T; - - /** - * SOC_SLOW_OFFSET_TH values - */ - typedef enum { - SLOW_OFFSET_TH_0_1 = 0, // 0.1 degree/s - SLOW_OFFSET_TH_0_2 = 1, - SLOW_OFFSET_TH_0_5 = 2, - SLOW_OFFSET_TH_1 = 3 - } SLOW_OFFSET_TH_T; - - /** - * REG_A_FOC bits - */ - typedef enum { - A_FOC_FAST_OFFSET_EN_X = 0x01, - A_FOC_FAST_OFFSET_EN_Y = 0x02, - A_FOC_FAST_OFFSET_EN_Z = 0x04, - - A_FOC_FAST_OFFSET_EN = 0x08, - - A_FOC_FAST_OFFSET_WORDLENGTH0 = 0x10, - A_FOC_FAST_OFFSET_WORDLENGTH1 = 0x20, - _A_FOC_FAST_OFFSET_WORDLENGTH_MASK = 3, - _A_FOC_FAST_OFFSET_WORDLENGTH_SHIFT = 4, - - A_FOC_AUTO_OFFSET_WORDLENGTH0 = 0x40, - A_FOC_AUTO_OFFSET_WORDLENGTH1 = 0x80, - _A_FOC_AUTO_OFFSET_WORDLENGTH_MASK = 3, - _A_FOC_AUTO_OFFSET_WORDLENGTH_SHIFT = 6 - } A_FOC_BITS_T; - - /** - * FAST_OFFSET_WORDLENGTH values - */ - typedef enum { - FAST_OFFSET_WORDLENGTH_32 = 0, // samples - FAST_OFFSET_WORDLENGTH_64 = 1, - FAST_OFFSET_WORDLENGTH_128 = 2, - FAST_OFFSET_WORDLENGTH_256 = 3 - } FAST_OFFSET_WORDLENGTH_T; - - /** - * AUTO_OFFSET_WORDLENGTH values - */ - typedef enum { - AUTO_OFFSET_WORDLENGTH_32 = 0, // samples - AUTO_OFFSET_WORDLENGTH_64 = 1, - AUTO_OFFSET_WORDLENGTH_128 = 2, - AUTO_OFFSET_WORDLENGTH_256 = 3 - } AUTO_OFFSET_WORDLENGTH_T; - - /** - * REG_TRIM_NVM_CTRL bits - */ - typedef enum { - TRIM_NVM_CTRL_NVM_PROG_MODE = 0x01, - TRIM_NVM_CTRL_NVM_PROG_TRIG = 0x02, - TRIM_NVM_CTRL_NVM_PROG_RDY = 0x04, - TRIM_NVM_CTRL_NVM_PROG_LOAD = 0x08, - - TRIM_NVM_CTRL_NVM_REMAIN0 = 0x10, - TRIM_NVM_CTRL_NVM_REMAIN1 = 0x20, - TRIM_NVM_CTRL_NVM_REMAIN2 = 0x40, - TRIM_NVM_CTRL_NVM_REMAIN3 = 0x80, - _TRIM_NVM_CTRL_NVM_REMAIN_MASK = 15, - _TRIM_NVM_CTRL_NVM_REMAIN_SHIFT = 4 - } TRIM_NVM_CTRL_BITS_T; - - /** - * REG_SPI3_WDT bits - */ - typedef enum { - _SPI3_WDT_RESERVED_BITS = 0xf0 | 0x08, - - SPI3_WDT_SPI3 = 0x01, // 3-wire SPI - NOT SUPPORTED - - SPI3_WDT_I2C_WDT_SEL = 0x02, - SPI3_WDT_I2C_WDT_EN = 0x04 - - // 0x08-0x80 reserved - } SPI3_WDT_BITS_T; - - /** - * REG_OFC1 bits, the missing x, y, and z llsb bits are in GP0 - */ - typedef enum { - OFC1_OFFSET_Z0 = 0x01, // Z lsb (3:1) - OFC1_OFFSET_Z1 = 0x02, - OFC1_OFFSET_Z2 = 0x04, - _OFC1_OFFSET_Z_MASK = 7, - _OFC1_OFFSET_Z_SHIFT = 0, - - OFC1_OFFSET_Y0 = 0x08, // Y lsb (3:1) - OFC1_OFFSET_Y1 = 0x10, - OFC1_OFFSET_Y2 = 0x20, - _OFC1_OFFSET_Y_MASK = 7, - _OFC1_OFFSET_Y_SHIFT = 3, - - OFC1_OFFSET_X0 = 0x08, // bits 3:2 of X lsb. geez - OFC1_OFFSET_X1 = 0x10, - _OFC1_OFFSET_X_MASK = 3, - _OFC1_OFFSET_X_SHIFT = 6 - } OFC1_OFFSET_BITS_T; - - /** - * REG_GP0 bits - */ - typedef enum { - GP0_OFFSET_Z = 0x01, // Z llsb (bit 0) - GP0_OFFSET_Y = 0x02, // Y llsb (bit 0) - - GP0_OFFSET_X0 = 0x04, // X llsbs (bits 1:0) - GP0_OFFSET_X1 = 0x08, - _GP0_OFFSET_X_MASK = 3, - _GP0_OFFSET_X_SHIFT = 2, - - GP0_GP00 = 0x10, - GP0_GP01 = 0x20, - GP0_GP02 = 0x40, - GP0_GP03 = 0x80, - _GP0_GP0_MASK = 15, - _GP0_GP0_SHIFT = 4 - } GP0_BITS_T; - - /** - * REG_BIST bits - */ - typedef enum { - _BIST_RESERVED_BITS = 0x80 | 0x40 | 0x20 | 0x08, - - BIST_TRIG_BIST = 0x01, - BIST_BIST_RDY = 0x02, - BIST_BIST_FAIL = 0x04, - - BIST_RATE_OK = 0x10 - } BIST_BITS_T; - - /** - * REG_FIFO_CONFIG_0 bits - */ - typedef enum { - FIFO_CONFIG_0_WATER_MARK0 = 0x01, - FIFO_CONFIG_0_WATER_MARK1 = 0x02, - FIFO_CONFIG_0_WATER_MARK2 = 0x04, - FIFO_CONFIG_0_WATER_MARK3 = 0x08, - FIFO_CONFIG_0_WATER_MARK4 = 0x10, - FIFO_CONFIG_0_WATER_MARK5 = 0x20, - FIFO_CONFIG_0_WATER_MARK6 = 0x40, - _FIFO_CONFIG_0_WATER_MARK_MASK = 127, - _FIFO_CONFIG_0_WATER_MARK_SHIFT = 0, - - FIFO_CONFIG_0_TAG = 0x80 - } FIFO_CONFIG_0_BITS_T; - - /** - * REG_FIFO_CONFIG_1 bits - */ - typedef enum { - _FIFO_CONFIG_1_RESERVED_BITS = 0x20 | 0x10 |0x08 | 0x04, - - FIFO_CONFIG_1_FIFO_DATA_SEL0 = 0x01, - FIFO_CONFIG_1_FIFO_DATA_SEL1 = 0x02, - _FIFO_CONFIG_1_FIFO_DATA_SEL = 3, - _FIFO_CONFIG_1_FIFO_DATA_SHIFT = 0, - - FIFO_CONFIG_1_FIFO_MODE0 = 0x40, - FIFO_CONFIG_1_FIFO_MODE1 = 0x80, - _FIFO_CONFIG_1_FIFO_MODE_MASK = 3, - _FIFO_CONFIG_1_FIFO_MODE_SHIFT = 6 - } FIFO_CONFIG_1_BITS_T; - - /** - * FIFO_DATA_SEL values - */ - typedef enum { - FIFO_DATA_SEL_XYZ = 0, - FIFO_DATA_SEL_X = 1, - FIFO_DATA_SEL_Y = 2, - FIFO_DATA_SEL_Z = 3 - } FIFO_DATA_SEL_T; - - /** - * FIFO_MODE values - */ - typedef enum { - FIFO_MODE_BYPASS = 0, - FIFO_MODE_FIFO = 1, - FIFO_MODE_STREAM = 2 - } FIFO_MODE_T; - - // interrupt selection for installISR() and uninstallISR() - typedef enum { - INTERRUPT_INT1, - INTERRUPT_INT2 - } INTERRUPT_PINS_T; - - - /** - * BMG160 constructor. - * - * This device can support both I2C and SPI. For SPI, set the addr - * to -1, and specify a positive integer representing the Chip - * Select (CS) pin for the cs argument. If you are using a - * hardware CS pin (like edison with arduino breakout), then you - * can connect the proper pin to the hardware CS pin on your MCU - * and supply -1 for cs. The default operating mode is I2C. - * - * @param bus I2C or SPI bus to use. - * @param addr The address for this device. -1 for SPI. - * @param cs The gpio pin to use for the SPI Chip Select. -1 for - * I2C or for SPI with a hardware controlled pin. - * @param theChipID The chip ID to use for validation - */ - BMG160(int bus=BMG160_I2C_BUS, int addr=BMG160_DEFAULT_ADDR, - int cs=-1); - - /** - * BMG160 Destructor. - */ - ~BMG160(); - - /** - * Update the internal stored values from sensor data. - */ - void update(); - - /** - * Return the chip ID. - * - * @return The chip ID (BMG160_CHIPID). - */ - uint8_t getChipID(); - - /** - * Return gyroscope data in degrees per second. update() must - * have been called prior to calling this method. - * - * @param x Pointer to a floating point value that will have the - * current x component placed into it. - * @param y Pointer to a floating point value that will have the - * current y component placed into it. - * @param z Pointer to a floating point value that will have the - * current z component placed into it. - */ - void getGyroscope(float *x, float *y, float *z); - - /** - * Return gyroscope data in degrees per second in the form of a - * floating point array. The pointer returned by this function is - * statically allocated and will be rewritten on each call. - * update() must have been called prior to calling this method. - * - * @return A floating point array containing x, y, and z in - * that order. - */ - float *getGyroscope(); - - /** - * Return the current measured temperature. Note, this is not - * ambient temperature. update() must have been called prior to - * calling this method. - * - * @param fahrenheit true to return data in Fahrenheit, false for - * Celicus. Celsius is the default. - * @return The temperature in degrees Celsius or Fahrenheit. - */ - float getTemperature(bool fahrenheit=false); - - /** - * Initialize the device and start operation. This function is - * called from the constructor so will not typically need to be - * called by a user unless the device is reset. - * - * @param pwr One of the POWER_MODE_T values. The default is - * POWER_MODE_NORMAL. - * @param range One of the RANGE_T values. The default is - * RANGE_250. - * @param bw One of the filtering BW_T values. The default is - * BW_400_47. - */ - void init(POWER_MODE_T pwr=POWER_MODE_NORMAL, - RANGE_T range=RANGE_250, BW_T bw=BW_400_47); - - /** - * Reset the device as if during a power on reset. All configured - * values are lost when this happens. You should call init() - * afterwards, or at least perform the same initialization init() - * does before continuing. - */ - void reset(); - - /** - * Set the gyroscope detection scaling range. This device - * supports 125, 250, 500, 100, and 2000 degree/s ranges. - * - * @param range One of the RANGE_T values. - */ - void setRange(RANGE_T range); - - /** - * Set the output filtering bandwidth of the device. - * - * @param bw One of the BW_T values. - */ - void setBandwidth(BW_T bw); - - /** - * Set the power mode of the device. Care must be taken when - * setting a low power or suspend mode. See the datasheet for - * details. I ncertain power modes, register write must be - * drastically slowed down. which we cannot support. - * - * @param power One of the POWER_MODE_T values. - */ - void setPowerMode(POWER_MODE_T power); - - /** - * Enable update() to read from the FIFO rather than the gyroscope - * axis registers directly. init() enables this mode by default. - * An advantage to this mode that all axis data is sampled from - * the same timeslice. When reading directly from the gyroscope - * output registers, it's possible for one axis to be updated - * while another is being read, causing a temporal - * inconsistancy.. - * - * Using the FIFO removes this problem. - * - * @param useFIFO true to enable update() to read from the FIFO. - * When false, update will read from the gyroscope output - * registers directly. - */ - void enableFIFO(bool useFIFO); - - /** - * Set the FIFO watermark. When the watermark is reached an - * interrupt (if enabled) will be generated. - * - * @param wm The FIFO watermark to use. The maximum value is 63. - */ - void fifoSetWatermark(int wm); - - /** - * Set the FIFO configuration. init() uses the FIFO_MODE_BYPASS - * mode with axes set to FIFO_DATA_SEL_XYZ by default. - * - * @param mode One of the FIFO_MODE_T values. - * @param axes One of the FIFO_DATA_SEL_T values. - */ - void fifoConfig(FIFO_MODE_T mode, FIFO_DATA_SEL_T axes); - - /** - * Return the Interrupt Enables 0 register. These registers - * allow you to enable various interrupt conditions. See the - * datasheet for details. - * - * @return A bitmask of INT_EN_0_BITS_T bits. - */ - uint8_t getInterruptEnable0(); - - /** - * Set the Interrupt Enables 0 register. See the datasheet for - * details. - * - * @param bits A bitmask of INT_EN_0_BITS_T bits. - */ - void setInterruptEnable0(uint8_t bits); - - /** - * Return the Interrupt Map 0 register. These registers allow you - * to map specific interrupts to the interrupt 1 or interrupt 2 - * pin. See the datasheet for details. - * - * @return A bitmask of INT_MAP_0_BITS_T bits. - */ - uint8_t getInterruptMap0(); - - /** - * Set the Interrupt Map 0 register. These registers allow you - * to map specific interrupts to the interrupt 1 or interrupt 2 - * pin. See the datasheet for details. - * - * @param A bitmask of INT_MAP_0_BITS_T bits. - */ - void setInterruptMap0(uint8_t bits); - - /** - * Return the Interrupt Map 1 register. See the datasheet for - * details. - * - * @return A bitmask of INT_MAP_1_BITS_T bits. - */ - uint8_t getInterruptMap1(); - - /** - * Set the Interrupt Map 1 register. See the datasheet for - * details. - * - * @param A bitmask of INT_MAP_1_BITS_T bits. - */ - void setInterruptMap1(uint8_t bits); - - /** - * Return the Interrupt source register. This register allows - * determining where data comes from (filtered/unfiltered) for - * those interrupt sources where this is selectable. See the - * datasheet for details. - * - * @return A bitmask of INT_1A_BITS_T bits. - */ - uint8_t getInterruptSrc(); - - /** - * Set the Interrupt source register. This register allows - * determining where data comes from (filtered/unfiltered) for - * those interrupt sources where this is selectable. See the - * datasheet for details. - * - * @param bits A bitmask of INT_1A_BITS_T bits. - */ - void setInterruptSrc(uint8_t bits); - - /** - * Return the Interrupt output control register. This register - * allows determining the electrical characteristics of the 2 - * interrupt pins (open-drain/push-pull and level/edge - * triggering). See the datasheet for details. - * - * @return A bitmask of INT_EN_1_BITS_T bits. - */ - uint8_t getInterruptOutputControl(); - - /** - * Set the Interrupt output control register. This register - * allows determining the electrical characteristics of the 2 - * interrupt pins (open-drain/push-pull and level/edge - * triggering). See the datasheet for details. - * - * @param bits A bitmask of INT_EN_1_BITS_T bits. - */ - void setInterruptOutputControl(uint8_t bits); - - /** - * Clear all latched interrupts. See the datasheet for details. - */ - void clearInterruptLatches(); - - /** - * Return the current interrupt latching behavior. See the - * datasheet for details. - * - * @return One of the RST_LATCH_T values. - */ - RST_LATCH_T getInterruptLatchBehavior(); - - /** - * Set the current interrupt latching behavior. See the datasheet - * for details. - * - * @param latch One of the RST_LATCH_T values. - */ - void setInterruptLatchBehavior(RST_LATCH_T latch); - - /** - * Return the interrupt status 0 register. These registers - * indicate which interrupts have been triggered. See the - * datasheet for details. - * - * @return a bitmask of INT_STATUS_0_BITS_T bits. - */ - uint8_t getInterruptStatus0(); - - /** - * Return the interrupt status 1 register. See the datasheet for - * details. - * - * @return a bitmask of INT_STATUS_1_BITS_T bits. - */ - uint8_t getInterruptStatus1(); - - /** - * Return the interrupt status 2 register. See the datasheet for - * details. - * - * @return a bitmask of INT_STATUS_2_BITS_T bits. - */ - uint8_t getInterruptStatus2(); - - /** - * Return the interrupt status 3 register. See the datasheet for - * details. - * - * @return a bitmask of INT_STATUS_3_BITS_T bits. - */ - uint8_t getInterruptStatus3(); - - /** - * Enable shadowing of the gyroscope output registers. When - * enabled, a read of an axis LSB register automatically locks the - * MSB register of that axis until it has been read. This is - * usually a good thing to have enabled. init() enables this by - * default. If disabled, then it becomes possible for part of an - * axis value to change while another part is being read, causing - * inconsistent data. - * - * @param shadow true to enable axis register shadowing, false otherwise. - */ - void enableRegisterShadowing(bool shadow); - - /** - * Enable filtering of the gyroscope axis data. init() - * enables this by default. If disabled, then gyroscope data - * that is read will be raw and unfiltered (rated R). See the - * datasheet for details. - * - * @param filter true to enable filtering, false to disable. - */ - void enableOutputFiltering(bool filter); - -#if defined(SWIGJAVA) || defined(JAVACALLBACK) - void installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, - jobject runnable); -#else - /** - * install an interrupt handler. - * - * @param intr one of the INTERRUPT_PINS_T values specifying which - * interrupt pin you are installing. - * @param gpio gpio pin to use as interrupt pin - * @param level the interrupt trigger level (one of mraa::Edge - * values). Make sure that you have configured the interrupt pin - * properly for whatever level you choose. - * @param isr the interrupt handler, accepting a void * argument - * @param arg the argument to pass the the interrupt handler - */ - void installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, - void (*isr)(void *), void *arg); -#endif - - /** - * uninstall a previously installed interrupt handler - * - * @param intr one of the INTERRUPT_PINS_T values specifying which - * interrupt pin you are removing. - */ - void uninstallISR(INTERRUPT_PINS_T intr); - - /** - * Read a register. - * - * @param reg The register to read. - * @return The value of the register. - */ - uint8_t readReg(uint8_t reg); - - /** - * Read contiguous registers into a buffer. - * - * @param buffer The buffer to store the results. - * @param len The number of registers to read. - * @return The number of bytes read. - */ - int readRegs(uint8_t reg, uint8_t *buffer, int len); - - /** - * Write to a register - * - * @param reg The register to write to. - * @param val The value to write. - */ - void writeReg(uint8_t reg, uint8_t val); - - protected: - mraa::I2c *m_i2c; - mraa::Spi *m_spi; - - mraa::Gpio *m_gpioIntr1; - mraa::Gpio *m_gpioIntr2; - - // spi chip select - mraa::Gpio *m_gpioCS; - - uint8_t m_addr; - - // SPI chip select - void csOn(); - void csOff(); - - // acc data - float m_gyrX; - float m_gyrY; - float m_gyrZ; - - float m_gyrScale; - - float m_temperature; - - private: - bool m_isSPI; - // use the FIFO by default? - bool m_useFIFO; - - // return a reference to a gpio pin pointer depending on intr - mraa::Gpio*& getPin(INTERRUPT_PINS_T intr); - - // Adding a private function definition for java bindings -#if defined(SWIGJAVA) || defined(JAVACALLBACK) - void installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, - void (*isr)(void *), void *arg); -#endif - }; -} diff --git a/src/bmx055/bmi055.cxx b/src/bmx055/bmi055.cxx index 41e3083c..90ba5e30 100644 --- a/src/bmx055/bmi055.cxx +++ b/src/bmx055/bmi055.cxx @@ -70,9 +70,9 @@ void BMI055::initAccelerometer(BMA250E::POWER_MODE_T pwr, m_accel->init(pwr, range, bw); } -void BMI055::initGyroscope(BMG160::POWER_MODE_T pwr, - BMG160::RANGE_T range, - BMG160::BW_T bw) +void BMI055::initGyroscope(BMG160_POWER_MODE_T pwr, + BMG160_RANGE_T range, + BMG160_BW_T bw) { if (m_gyro) m_gyro->init(pwr, range, bw); @@ -110,13 +110,10 @@ void BMI055::getGyroscope(float *x, float *y, float *z) m_gyro->getGyroscope(x, y, z); } -float *BMI055::getGyroscope() +std::vector BMI055::getGyroscope() { if (m_gyro) return m_gyro->getGyroscope(); else - { - static float v[3] = {0.0f, 0.0f, 0.0f}; - return v; - } + return {0, 0, 0}; } diff --git a/src/bmx055/bmi055.hpp b/src/bmx055/bmi055.hpp index 0f68f244..3efea255 100644 --- a/src/bmx055/bmi055.hpp +++ b/src/bmx055/bmi055.hpp @@ -24,6 +24,7 @@ #pragma once #include +#include #include "bma250e.hpp" #include "bmg160.hpp" @@ -87,7 +88,7 @@ namespace upm { BMI055(int accelBus=BMA250E_I2C_BUS, int accelAddr=BMA250E_DEFAULT_ADDR, int accelCS=-1, - int gyroBus=BMG160_I2C_BUS, + int gyroBus=BMG160_DEFAULT_I2C_BUS, int gyroAddr=BMG160_DEFAULT_ADDR, int gyroCS=-1); @@ -131,9 +132,9 @@ namespace upm { * @param bw One of the filtering BMG160::BW_T values. The default is * BMG160::BW_400_47. */ - void initGyroscope(BMG160::POWER_MODE_T pwr=BMG160::POWER_MODE_NORMAL, - BMG160::RANGE_T range=BMG160::RANGE_250, - BMG160::BW_T bw=BMG160::BW_400_47); + void initGyroscope(BMG160_POWER_MODE_T pwr=BMG160_POWER_MODE_NORMAL, + BMG160_RANGE_T range=BMG160_RANGE_250, + BMG160_BW_T bw=BMG160_BW_400_47); /** * Return accelerometer data in gravities. update() must have @@ -174,14 +175,13 @@ namespace upm { /** * Return gyroscope data in degrees per second in the form of a - * floating point array. The pointer returned by this function is - * statically allocated and will be rewritten on each call. - * update() must have been called prior to calling this method. + * floating point vector. update() must have been called prior to + * calling this method. * - * @return A floating point array containing x, y, and z in + * @return A floating point vector containing x, y, and z in * that order. */ - float *getGyroscope(); + std::vector getGyroscope(); protected: diff --git a/src/bmx055/bmx055.cxx b/src/bmx055/bmx055.cxx index 2c4f10f1..f5d27f9e 100644 --- a/src/bmx055/bmx055.cxx +++ b/src/bmx055/bmx055.cxx @@ -80,9 +80,9 @@ void BMX055::initAccelerometer(BMA250E::POWER_MODE_T pwr, m_accel->init(pwr, range, bw); } -void BMX055::initGyroscope(BMG160::POWER_MODE_T pwr, - BMG160::RANGE_T range, - BMG160::BW_T bw) +void BMX055::initGyroscope(BMG160_POWER_MODE_T pwr, + BMG160_RANGE_T range, + BMG160_BW_T bw) { if (m_gyro) m_gyro->init(pwr, range, bw); @@ -110,6 +110,15 @@ void BMX055::getAccelerometer(float *x, float *y, float *z) { if (m_accel) m_accel->getAccelerometer(x, y, z); + else + { + if (x) + *x = 0; + if (y) + *y = 0; + if (z) + *z = 0; + } } float *BMX055::getAccelerometer() @@ -127,23 +136,38 @@ void BMX055::getGyroscope(float *x, float *y, float *z) { if (m_gyro) m_gyro->getGyroscope(x, y, z); + else + { + if (x) + *x = 0; + if (y) + *y = 0; + if (z) + *z = 0; + } } -float *BMX055::getGyroscope() +std::vector BMX055::getGyroscope() { if (m_gyro) return m_gyro->getGyroscope(); else - { - static float v[3] = {0.0f, 0.0f, 0.0f}; - return v; - } + return {0, 0, 0}; } void BMX055::getMagnetometer(float *x, float *y, float *z) { if (m_mag) m_mag->getMagnetometer(x, y, z); + else + { + if (x) + *x = 0; + if (y) + *y = 0; + if (z) + *z = 0; + } } float *BMX055::getMagnetometer() diff --git a/src/bmx055/bmx055.hpp b/src/bmx055/bmx055.hpp index 4d280e5c..4d486edb 100644 --- a/src/bmx055/bmx055.hpp +++ b/src/bmx055/bmx055.hpp @@ -24,6 +24,7 @@ #pragma once #include +#include #include "bma250e.hpp" #include "bmg160.hpp" @@ -102,7 +103,7 @@ namespace upm { BMX055(int accelBus=BMA250E_I2C_BUS, int accelAddr=BMA250E_DEFAULT_ADDR, int accelCS=-1, - int gyroBus=BMG160_I2C_BUS, + int gyroBus=BMG160_DEFAULT_I2C_BUS, int gyroAddr=BMG160_DEFAULT_ADDR, int gyroCS=-1, int magBus=BMM150_I2C_BUS, @@ -149,9 +150,9 @@ namespace upm { * @param bw One of the filtering BMG160::BW_T values. The default is * BMG160::BW_400_47. */ - void initGyroscope(BMG160::POWER_MODE_T pwr=BMG160::POWER_MODE_NORMAL, - BMG160::RANGE_T range=BMG160::RANGE_250, - BMG160::BW_T bw=BMG160::BW_400_47); + void initGyroscope(BMG160_POWER_MODE_T pwr=BMG160_POWER_MODE_NORMAL, + BMG160_RANGE_T range=BMG160_RANGE_250, + BMG160_BW_T bw=BMG160_BW_400_47); /** * Initialize the magnetometer and start operation. This function @@ -211,7 +212,7 @@ namespace upm { * @return A floating point array containing x, y, and z in * that order. */ - float *getGyroscope(); + std::vector getGyroscope(); /** * Return magnetometer data in micro-Teslas (uT). update() must @@ -228,11 +229,10 @@ namespace upm { /** * Return magnetometer data in micro-Teslas (uT) in the form of a - * floating point array. The pointer returned by this function is - * statically allocated and will be rewritten on each call. - * update() must have been called prior to calling this method. + * floating point vector. update() must have been called prior to + * calling this method. * - * @return A floating point array containing x, y, and z in + * @return A floating point vector containing x, y, and z in * that order. */ float *getMagnetometer(); diff --git a/src/bmx055/javaupm_bmx055.i b/src/bmx055/javaupm_bmx055.i index 4a160cc3..5d514c30 100644 --- a/src/bmx055/javaupm_bmx055.i +++ b/src/bmx055/javaupm_bmx055.i @@ -4,6 +4,7 @@ %include "typemaps.i" %include "arrays_java.i"; %include "../java_buffer.i" +%include "../upm_vectortypes.i" %apply int {mraa::Edge}; %apply float *INOUT { float *x, float *y, float *z }; @@ -21,30 +22,20 @@ JCALL4(SetFloatArrayRegion, jenv, $result, 0, 3, $1); } -%typemap(out) float *getGyroscope { - $result = JCALL1(NewFloatArray, jenv, 3); - JCALL4(SetFloatArrayRegion, jenv, $result, 0, 3, $1); -} - %typemap(out) float *getMagnetometer { $result = JCALL1(NewFloatArray, jenv, 3); JCALL4(SetFloatArrayRegion, jenv, $result, 0, 3, $1); } %ignore getAccelerometer(float *, float *, float *); -%ignore getGyroscope(float *, float *, float *); %ignore getMagnetometer(float *, float *, float *); +%ignore getGyroscope(float *, float *, float *); %include "bma250e.hpp" %{ #include "bma250e.hpp" %} -%include "bmg160.hpp" -%{ - #include "bmg160.hpp" -%} - %include "bmm150.hpp" %{ #include "bmm150.hpp" diff --git a/src/bmx055/jsupm_bmx055.i b/src/bmx055/jsupm_bmx055.i index b59ccd65..8db068ba 100644 --- a/src/bmx055/jsupm_bmx055.i +++ b/src/bmx055/jsupm_bmx055.i @@ -11,11 +11,6 @@ #include "bma250e.hpp" %} -%include "bmg160.hpp" -%{ - #include "bmg160.hpp" -%} - %include "bmm150.hpp" %{ #include "bmm150.hpp" diff --git a/src/bmx055/pyupm_bmx055.i b/src/bmx055/pyupm_bmx055.i index 8250a66e..154a7654 100644 --- a/src/bmx055/pyupm_bmx055.i +++ b/src/bmx055/pyupm_bmx055.i @@ -21,11 +21,6 @@ #include "bma250e.hpp" %} -%include "bmg160.hpp" -%{ - #include "bmg160.hpp" -%} - %include "bmm150.hpp" %{ #include "bmm150.hpp"