summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/bma220/bma220.h
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/bma220/bma220.h')
-rw-r--r--peripheral/libupm/src/bma220/bma220.h831
1 files changed, 831 insertions, 0 deletions
diff --git a/peripheral/libupm/src/bma220/bma220.h b/peripheral/libupm/src/bma220/bma220.h
new file mode 100644
index 0000000..e361d48
--- /dev/null
+++ b/peripheral/libupm/src/bma220/bma220.h
@@ -0,0 +1,831 @@
+/*
+ * Author: Jon Trulson <jtrulson@ics.com>
+ * Copyright (c) 2015 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 <string>
+#include <mraa/common.hpp>
+#include <mraa/i2c.hpp>
+#include <mraa/gpio.hpp>
+
+#define BMA220_I2C_BUS 0
+#define BMA220_DEFAULT_ADDR 0x0a
+
+namespace upm {
+
+ /**
+ * @brief BMA220 Accelerometer library
+ * @defgroup bma220 libupm-bma220
+ * @ingroup i2c gpio accelerometer
+ */
+
+ /**
+ * @library bma220
+ * @sensor bma220
+ * @comname BMA220 3-axis Accelerometer
+ * @type accelerometer
+ * @man dfrobot
+ * @con i2c gpio
+ * @web http://www.dfrobot.com/index.php?route=product/product&product_id=1085
+ *
+ * @brief API for the BMA220 3-axis Accelerometer
+ *
+ * The BMA220 is a low cost, very small 3-axis accelerometer with 6
+ * bits of resolution. It can also detect orientation and tap events.
+ *
+ * The BMA220 has a linear acceleration full scale of
+ * 2g/4g/8g/16g.
+ *
+ * While not all of the functionality of this device is supported
+ * initially, methods and register definitions are provided that
+ * should allow an end user to implement whatever features are
+ * required.
+ *
+ * This driver was developed on a DFRobot BMA (Tiny).
+ *
+ * @image html bma220.jpg
+ * @snippet bma220.cxx Interesting
+ */
+
+ class BMA220 {
+ public:
+
+ // NOTE: reserved registers must not be written into or read from.
+ // Reserved bitfields must always be 0. The registers aren't
+ // named in the datasheet, so I made up some hopefully useful
+ // names for them. The whole I2C register map design is a little
+ // strange, IMO.
+
+ /**
+ * BMA220 Accelerometer registers
+ */
+ typedef enum {
+ REG_CHIPID = 0x00,
+ REG_REVISIONID = 0x02,
+
+ // 2 lsb bits of ACC regs are always 0, yeilding 6 bits resolution
+ REG_ACC_X = 0x04, // acceleration data
+ REG_ACC_Y = 0x06,
+ REG_ACC_Z = 0x08,
+
+ REG_H_HYST_DUR = 0x0a, // high hysteresis/dur
+ REG_THRESHOLD = 0x0c, // high/low threshold
+ REG_L_HYST_DUR = 0x0e, // low hysteresis/dur
+
+ REG_TAP_CONFIG = 0x10,
+
+ REG_SLOPE_CONFIG = 0x12,
+ REG_TAP_CONFIG2 = 0x14,
+
+ REG_INT_STATUS1 = 0x16,
+ REG_INT_STATUS2 = 0x18,
+
+ REG_ENABLE_CONFIG = 0x1a,
+ REG_ENABLE_CONFIG2 = 0x1c,
+ REG_ENABLE_CONFIG3 = 0x1e,
+
+ REG_FILTER_CONFIG = 0x20,
+
+ REG_SBIST_FSL_CONFIG = 0x22, // self test and full scale range
+
+ // 0x24 - 0x2c reserved
+
+ REG_I2C_WATCHDOG = 0x2e, // + SPI 3-wire mode
+
+ REG_SUSPEND = 0x30,
+ REG_SOFTRESET = 0x32
+ } REG_T;
+
+
+ /**
+ * REG_H_HYST_DUR bits
+ */
+ typedef enum {
+ H_HYST_DUR_HIGH_DUR0 = 0x01,
+ H_HYST_DUR_HIGH_DUR1 = 0x02,
+ H_HYST_DUR_HIGH_DUR2 = 0x04,
+ H_HYST_DUR_HIGH_DUR3 = 0x08,
+ H_HYST_DUR_HIGH_DUR4 = 0x10,
+ H_HYST_DUR_HIGH_DUR5 = 0x20,
+ _H_HYST_DUR_HIGH_DUR_MASK = 63,
+ _H_HYST_DUR_HIGH_DUR_SHIFT = 0,
+
+ H_HYST_DUR_HIGH_HY1 = 0x40,
+ H_HYST_DUR_HIGH_HY2 = 0x80,
+ _H_HYST_DUR_HIGH_HY_MASK = 3,
+ _H_HYST_DUR_HIGH_HY_SHIFT = 6
+ } H_HYST_DUR_HIGH_BITS_T;
+
+ /**
+ * REG_THRESHOLD bits
+ */
+ typedef enum {
+ THRESHOLD_HIGH0 = 0x01,
+ THRESHOLD_HIGH1 = 0x02,
+ THRESHOLD_HIGH2 = 0x04,
+ THRESHOLD_HIGH3 = 0x08,
+ _THRESHOLD_HIGH_MASK = 15,
+ _THRESHOLD_HIGH_SHIFT = 0,
+
+ THRESHOLD_LOW0 = 0x10,
+ THRESHOLD_LOW1 = 0x20,
+ THRESHOLD_LOW2 = 0x40,
+ THRESHOLD_LOW3 = 0x80,
+ _THRESHOLD_LOW_MASK = 15,
+ _THRESHOLD_LOW_SHIFT = 4
+ } THRESHOLD_BITS_T;
+
+ /**
+ * REG_L_HYST_DUR bits
+ */
+ typedef enum {
+ L_HYST_DUR_LOW_DUR0 = 0x01,
+ L_HYST_DUR_LOW_DUR1 = 0x02,
+ L_HYST_DUR_LOW_DUR2 = 0x04,
+ L_HYST_DUR_LOW_DUR3 = 0x08,
+ L_HYST_DUR_LOW_DUR4 = 0x10,
+ L_HYST_DUR_LOW_DUR5 = 0x20,
+ _L_HYST_DUR_LOW_DUR_MASK = 63,
+ _L_HYST_DUR_LOW_DUR_SHIFT = 0,
+
+ L_HYST_DUR_LOW_HY1 = 0x40,
+ L_HYST_DUR_LOW_HY2 = 0x80,
+ _L_HYST_DUR_LOW_HY_MASK = 3,
+ _L_HYST_DUR_LOW_HY_SHIFT = 6
+ } L_HYST_DUR_LOW_BITS_T;
+
+ /**
+ * REG_TAP_CONFIG bits
+ */
+ typedef enum {
+ TAP_CONFIG_DUR0 = 0x01,
+ TAP_CONFIG_DUR1 = 0x02,
+ TAP_CONFIG_DUR2 = 0x04,
+ _TAP_CONFIG_DUR_MASK = 7,
+ _TAP_CONFIG_DUR_SHIFT = 0,
+
+ TAP_CONFIG_THRESH0 = 0x08,
+ TAP_CONFIG_THRESH1 = 0x10,
+ TAP_CONFIG_THRESH2 = 0x20,
+ TAP_CONFIG_THRESH3 = 0x40,
+ _TAP_CONFIG_THRESH_MASK = 15,
+ _TAP_CONFIG_THRESH_SHIFT = 3,
+
+ TAP_CONFIG_FILTER = 0x80
+ } TAP_CONFIG_BITS_T;
+
+ /**
+ * REG_SLOPE_CONFIG bits
+ */
+ typedef enum {
+ SLOPE_CONFIG_DUR0 = 0x01,
+ SLOPE_CONFIG_DUR1 = 0x02,
+ _SLOPE_CONFIG_DUR_MASK = 3,
+ _SLOPE_CONFIG_DUR_SHIFT = 0,
+
+ SLOPE_CONFIG_THRESH0 = 0x04,
+ SLOPE_CONFIG_THRESH1 = 0x08,
+ SLOPE_CONFIG_THRESH2 = 0x10,
+ SLOPE_CONFIG_THRESH3 = 0x20,
+ _SLOPE_CONFIG_THRESH_MASK = 15,
+ _SLOPE_CONFIG_THRESH_SHIFT = 2,
+
+ SLOPE_CONFIG_FILTER = 0x40,
+ SLOPE_CONFIG_ORIENT_EX = 0x80 // exchange x and z axis for orient
+ } SLOPE_CONFIG_BITS_T;
+
+ /**
+ * REG_TAP_CONFIG2 bits
+ */
+ typedef enum {
+ TAP_CONFIG2_SAMP0 = 0x01,
+ TAP_CONFIG2_SAMP1 = 0x02,
+ _TAP_CONFIG2_SAMP_MASK = 3,
+ _TAP_CONFIG2_SAMP_SHIFT = 0,
+
+ TAP_CONFIG2_ORIENT_BLOCK0 = 0x04,
+ TAP_CONFIG2_ORIENT_BLOCK1 = 0x08,
+ _TAP_CONFIG2_ORIENT_BLOCK_MASK = 3,
+ _TAP_CONFIG2_ORIENT_BLOCK_SHIFT = 2,
+
+ TAP_CONFIG2_TIP_EN = 0x10
+
+ // 0x20-0x80 reserved
+ } TAP_CONFIG2_BITS_T;
+
+ /**
+ * TAP_CONFIG2_SAMP values
+ */
+ typedef enum {
+ TAP_SAMP_2 = 0, // 2 data samples after wakeup
+ TAP_SAMP_4 = 1,
+ TAP_SAMP_8 = 2,
+ TAP_SAMP_16 = 3
+ } TAP_SAMP_T;
+
+ /**
+ * TAP_CONFIG2_ORIENT_BLOCK values
+ *
+ */
+ typedef enum {
+ TAP_ORIENT_BLOCK_0 = 0, // orient blocking disabled
+ TAP_ORIENT_BLOCK_2 = 1, // |z|>0.9g OR |x|+|y| < 0.2g OR m<0.2g
+ TAP_ORIENT_BLOCK_3 = 2, // |z|>0.9g OR |x|+|y| < 0.3g OR m<0.3g
+ TAP_ORIENT_BLOCK_4 = 3, // |z|>0.9g OR |x|+|y| < 0.4g OR m<0.4g
+ } TAP_ORIENT_BLOCK_T;
+
+ /**
+ * REG_INT_STATUS1 bits
+ */
+ typedef enum {
+ INT_STATUS1_SIGN = 0x01,
+ INT_STATUS1_FIRST_Z = 0x02,
+ INT_STATUS1_FIRST_Y = 0x04,
+ INT_STATUS1_FIRST_X = 0x08,
+
+ INT_STATUS1_ORIENT0 = 0x10,
+ INT_STATUS1_ORIENT1 = 0x20,
+ INT_STATUS1_ORIENT2 = 0x40,
+ _INT_STATUS1_ORIENT_MASK = 7,
+ _INT_STATUS1_ORIENT_SHIFT = 4,
+
+ INT_STATUS1_ORIENT_INT = 0x80 // orient intr was generated
+ } INT_STATUS1_BITS_T;
+
+ /**
+ * INT_STATUS1_ORIENT values
+ *
+ * These are values reported by the device if orientation
+ * detection is enabled.
+ */
+ typedef enum {
+ CONFIG_ORI_UP_PORT_UPRIGHT = 0, // up portrait
+ CONFIG_ORI_UP_PORT_UPSIDE_DOWN = 1,
+ CONFIG_ORI_UP_LAND_LEFT = 2, // landscape
+ CONFIG_ORI_UP_LAND_RIGHT = 3,
+ CONFIG_ORI_DN_PORT_UPRIGHT = 4, // down portrait
+ CONFIG_ORI_DN_PORT_UPSIDE_DOWN = 5,
+ CONFIG_ORI_DN_LAND_LEFT = 6, // landscape
+ CONFIG_ORI_DN_LAND_RIGHT = 7
+ } CONFIG_ORIENT_T;
+
+ /**
+ * REG_INT_STATUS2 bits
+ */
+ typedef enum {
+ INT_STATUS2_SLOPE = 0x01,
+ INT_STATUS2_DATA = 0x02,
+ INT_STATUS2_HIGH = 0x04,
+ INT_STATUS2_LOW = 0x08,
+ INT_STATUS2_TAP = 0x10
+
+ // 0x20-0x80 reserved
+ } INT_STATUS2_BITS_T;
+
+ /**
+ * REG_ENABLE_CONFIG bits
+ */
+ typedef enum {
+ ENABLE_CONFIG_TT_Z = 0x01,
+ ENABLE_CONFIG_TT_Y = 0x02,
+ ENABLE_CONFIG_TT_X = 0x04,
+ ENABLE_CONFIG_SLOPE_Z = 0x08,
+ ENABLE_CONFIG_SLOPE_Y = 0x10,
+ ENABLE_CONFIG_SLOPE_X = 0x20,
+ ENABLE_CONFIG_ORIENT = 0x40,
+ ENABLE_CONFIG_DATA = 0x80
+ } ENABLE_CONFIG_BITS_T;
+
+ /**
+ * REG_ENABLE_CONFIG2 bits
+ */
+ typedef enum {
+ ENABLE_CONFIG2_HIGH_Z = 0x01,
+ ENABLE_CONFIG2_HIGH_Y = 0x02,
+ ENABLE_CONFIG2_HIGH_X = 0x04,
+
+ ENABLE_CONFIG2_LOW = 0x08,
+
+ ENABLE_CONFIG2_LAT_INT0 = 0x10, // interrupt latching
+ ENABLE_CONFIG2_LAT_INT1 = 0x20,
+ ENABLE_CONFIG2_LAT_INT2 = 0x40,
+ _ENABLE_CONFIG2_LAT_INT_MASK = 7,
+ _ENABLE_CONFIG2_LAT_INT_SHIFT = 4,
+
+ ENABLE_CONFIG2_RESET_INT = 0x80 // reset interrupts
+ } ENABLE_CONFIG2_BITS_T;
+
+ /**
+ * ENABLE_CONFIG2_LAT values
+ *
+ * These are values that define the interrupt latching behavior
+ */
+ typedef enum {
+ CONFIG2_LAT_UNLATCH = 0, // unlatched intrs
+ CONFIG2_LAT_0_25 = 1, // latch intr for 0.25s
+ CONFIG2_LAT_0_5 = 2, // latch intr for 0.5s
+ CONFIG2_LAT_1 = 3, // latch intr for 1s
+ CONFIG2_LAT_2 = 4, // latch intr for 2s
+ CONFIG2_LAT_4 = 5, // latch intr for 4s
+ CONFIG2_LAT_8 = 6, // latch intr for 8s
+ CONFIG2_LAT_PERM = 7 // latch permanently
+ } CONFIG2_LAT_T;
+
+ /**
+ * REG_ENABLE_CONFIG3 bits
+ */
+ typedef enum {
+ ENABLE_CONFIG3_Z_CHAN = 0x01,
+ ENABLE_CONFIG3_Y_CHAN = 0x02,
+ ENABLE_CONFIG3_X_CHAN = 0x04,
+
+ ENABLE_CONFIG3_SLEEP_DUR0 = 0x08,
+ ENABLE_CONFIG3_SLEEP_DUR1 = 0x10,
+ ENABLE_CONFIG3_SLEEP_DUR2 = 0x20,
+ _ENABLE_CONFIG3_SLEEP_DUR_MASK = 7,
+ _ENABLE_CONFIG3_SLEEP_DUR_SHIFT = 3,
+
+ ENABLE_CONFIG3_SLEEP_EN = 0x40
+
+ // 0x80 reserved
+ } ENABLE_CONFIG3_BITS_T;
+
+ /**
+ * ENABLE_CONFIG3_SLEEP_DUR values
+ *
+ * These are values that define the length of time the device
+ * sleeps before sampling when in sleep mode.
+ */
+ typedef enum {
+ SLEEP_DUR_2MS = 0, // 2 ms
+ SLEEP_DUR_10MS = 1,
+ SLEEP_DUR_25MS = 2,
+ SLEEP_DUR_50MS = 3,
+ SLEEP_DUR_100MS = 4,
+ SLEEP_DUR_500MS = 5,
+ SLEEP_DUR_1S = 6, // 1 second
+ SLEEP_DUR_2S = 7
+ } SLEEP_DUR_T;
+
+ /**
+ * REG_FILTER_CONFIG bits
+ */
+ typedef enum {
+ FILTER_CONFIG_FILTER0 = 0x01,
+ FILTER_CONFIG_FILTER1 = 0x02,
+ FILTER_CONFIG_FILTER2 = 0x04,
+ FILTER_CONFIG_FILTER3 = 0x08,
+ _FILTER_CONFIG_FILTER_MASK = 15,
+ _FILTER_CONFIG_FILTER_SHIFT = 0,
+
+ // 0x10-0x40 reserved
+
+ FILTER_CONFIG_SERIAL_HIGH_BW = 0x80
+ } FILTER_CONFIG_BITS_T;
+
+ /**
+ * FILTER_CONFIG_FILTER values
+ *
+ * These are values that define the digital filtering frequency
+ */
+ typedef enum {
+ FILTER_CONFIG_1KHZ = 0, // 1Khz
+ FILTER_CONFIG_500HZ = 1,
+ FILTER_CONFIG_250HZ = 2,
+ FILTER_CONFIG_125HZ = 3,
+ FILTER_CONFIG_64HZ = 4,
+ FILTER_CONFIG_32HZ = 5
+ } FILTER_CONFIG_T;
+
+ /**
+ * REG_SBIST_FSL_CONFIG bits
+ */
+ typedef enum {
+ REG_SBIST_FSL_RANGE0 = 0x01, // full scale range
+ REG_SBIST_FSL_RANGE1 = 0x02,
+ _REG_SBIST_FSL_RANGE_MASK = 3,
+ _REG_SBIST_FSL_RANGE_SHIFT = 0,
+
+ REG_SBIST_FSL_SBIST0 = 0x04, // self test enables
+ REG_SBIST_FSL_SBIST1 = 0x08,
+ _REG_SBIST_FSL_SBIST_MASK = 3,
+ _REG_SBIST_FSL_SBIST_SHIFT = 2,
+
+ REG_SBIST_FSL_SBIST_SIGN = 0x10 // signedness of self test
+
+ // 0x20-0x80 reserved
+ } SBIST_FSL_CONFIG_BITS_T;
+
+ /**
+ * REG_SBIST_FSL_RANGE values
+ *
+ * These are values that define the Full Scale configuration
+ */
+ typedef enum {
+ FSL_RANGE_2G = 0, // 2G FSL
+ FSL_RANGE_4G = 1,
+ FSL_RANGE_8G = 2,
+ FSL_RANGE_16G = 3
+ } FSL_RANGE_T;
+
+ /**
+ * REG_SBIST_FSL_SBIST values
+ *
+ * These are values that enable self test mode
+ */
+ typedef enum {
+ SBIST_OFF = 0, // self test off
+ SBIST_X = 1, // self test X
+ SBIST_Y = 2,
+ SBIST_Z = 3
+ } SBIST_T;
+
+ /**
+ * REG_I2C_WATCHDOG bits
+ */
+ typedef enum {
+ I2C_WATCHDOG_SPI3 = 0x01, // SPI 3wire mode (SPI not supported)
+
+ I2C_WATCHDOG_TO_SEL = 0x02,
+ I2C_WATCHDOG_TO_EN = 0x04
+
+ // 0x08-0x80 reserved
+ } I2C_WATCHDOG_BITS_T;
+
+
+ /**
+ * BMA220 constructor
+ *
+ * @param bus i2c bus to use
+ * @param address the address for this device
+ */
+ BMA220(int bus=BMA220_I2C_BUS, uint8_t addr=BMA220_DEFAULT_ADDR);
+
+ /**
+ * BMA220 Destructor
+ */
+ ~BMA220();
+
+ /**
+ * update the accelerometer values
+ */
+ void update();
+
+ /**
+ * read a register
+ *
+ * @param dev the device to access (XM or G)
+ * @param reg the register to read
+ * @return the value of the register
+ */
+ uint8_t readReg(uint8_t reg);
+
+ /**
+ * write to a register
+ *
+ * @param dev the device to access (XM or G)
+ * @param reg the register to write to
+ * @param val the value to write
+ * @return true if successful, false otherwise
+ */
+ bool writeReg(uint8_t reg, uint8_t val);
+
+ /**
+ * return the chip ID
+ *
+ * @return the chip ID (usually 0xdd)
+ */
+ uint8_t getChipID();
+
+ /**
+ * return the chip revision
+ *
+ * @return the chip revision (usually 0x00)
+ */
+ uint8_t getChipRevision();
+
+ /**
+ * set the scaling mode of the accelerometer (2g/4g/8g/16g)
+ *
+ * @param scale one of the FSL_RANGE_T values
+ * @return true if successful, false otherwise
+ */
+ bool setAccelerometerScale(FSL_RANGE_T scale);
+
+ /**
+ * get the accelerometer values in gravities
+ *
+ * @param x the returned x value, if arg is non-NULL
+ * @param y the returned y value, if arg is non-NULL
+ * @param z the returned z value, if arg is non-NULL
+ */
+ void getAccelerometer(float *x, float *y, float *z);
+
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+ /**
+ * get the accelerometer values in gravities
+ *
+ * @return Array containing X, Y, Z acceleration values
+ */
+ float *getAccelerometer();
+#endif
+
+ /**
+ * set the filtering configuration
+ *
+ * @param filter one of the FILTER_CONFIG_T values
+ * @return true if successful
+ */
+ bool setFilterConfig(FILTER_CONFIG_T filter);
+
+ /**
+ * enable or disable high bandwidth serial access (1Khz). This
+ * essentially disables filtering and makes the raw unfiltered
+ * data available in the axis registers.
+ *
+ * @param high true to enable high bw access, false otherwise
+ * @return true if successful
+ */
+ bool setSerialHighBW(bool high);
+
+ /**
+ * enable or disable axis channels
+ *
+ * @param xEn true to enable the axis, false otherwise
+ * @param yEn true to enable the axis, false otherwise
+ * @param zEn true to enable the axis, false otherwise
+ * @return true if successful
+ */
+ bool enableAxes(bool xEn, bool yEn, bool zEn);
+
+ /**
+ * place the device into, or take the device out of suspend mode
+ *
+ * @return 0x00 if the device was in active mode, 0xff if the
+ * device was in suspend mode
+ */
+ uint8_t suspend();
+
+ /**
+ * place the device into, or take the device out of soft reset mode
+ *
+ * @return 0x00 if the device was in active mode, 0xff if the
+ * device was in soft reset mode
+ */
+ uint8_t softReset();
+
+ /**
+ * place the device into, or take the device out of low power
+ * mode. See the datasheet for information on how low power mode
+ * is implemented on this device.
+ *
+ * @param enable true to set low power mode, false otherwise
+ * @return true if successful
+ */
+ bool sleep(bool enable);
+
+ /**
+ * when in low power (sleep) mode, specify how often the device
+ * wakes up to acquire samples.
+ *
+ * @param dur one of the SLEEP_DUR_T values
+ * @return true if successful
+ */
+ bool setSleepDuration(SLEEP_DUR_T dur);
+
+ /**
+ * specify the threshold for low G detection
+ *
+ * @param thresh see the datasheet
+ * @return true if successful
+ */
+ bool setLowGThreshold(uint8_t thresh);
+
+ /**
+ * specify the threshold for high G detection
+ *
+ * @param thresh see the datasheet
+ * @return true if successful
+ */
+ bool setHighGThreshold(uint8_t thresh);
+
+ /**
+ * specify the hysteresis for low G detection
+ *
+ * @param hyst 2 bit hysteresis value
+ * @return true if successful
+ */
+ bool setLowGHysteresis(uint8_t hyst);
+
+ /**
+ * specify the sample duration for low G detection
+ *
+ * @param dur the number of samples (depends on bandwidth)
+ * @return true if successful
+ */
+ bool setLowGDuration(uint8_t dur);
+
+ /**
+ * specify the hysteresis for high G detection
+ *
+ * @param hyst 2 bit hysteresis value
+ * @return true if successful
+ */
+ bool setHighGHysteresis(uint8_t hyst);
+
+ /**
+ * specify the sample duration for high G detection
+ *
+ * @param dur the number of samples (depends on bandwidth)
+ * @return true if successful
+ */
+ bool setHighGDuration(uint8_t dur);
+
+ /**
+ * specify the sample duration for tap detection
+ *
+ * @param dur the number of samples (depends on bandwidth)
+ * @return true if successful
+ */
+ bool setTapDuration(uint8_t dur);
+
+ /**
+ * specify the threshold for tap detection
+ *
+ * @param thresh see the datasheet
+ * @return true if successful
+ */
+ bool setTapThreshold(uint8_t thresh);
+
+ /**
+ * unable to disable tap filtering
+ *
+ * @param filt true to enable, false otherwise
+ * @return true if successful
+ */
+ bool enableTapFilter(bool filt);
+
+ /**
+ * specify the sample duration for slope detection
+ *
+ * @param dur the number of samples (depends on bandwidth)
+ * @return true if successful
+ */
+ bool setSlopeDuration(uint8_t dur);
+
+ /**
+ * specify the threshold for slope detection
+ *
+ * @param thresh see the datasheet
+ * @return true if successful
+ */
+ bool setSlopeThreshold(uint8_t thresh);
+
+ /**
+ * enable or disable slope filtering
+ *
+ * @param filt true to enable filtering, false otherwise
+ * @return true if successful
+ */
+ bool enableSlopeFilter(bool filt);
+
+ /**
+ * return a bitmask of the interrupt status 1 register
+ *
+ * @return bitmask of INT_STATUS1_BITS_T bits (minus the orient value)
+ */
+ uint8_t getInterruptStatus1();
+
+ /**
+ * return the orient value from the interrupt status 1 register
+ *
+ * @return one of the CONFIG_ORIENT_T values
+ */
+ CONFIG_ORIENT_T getOrient();
+
+ /**
+ * return a bitmask of the interrupt status 2 register
+ *
+ * @return bitmask of INT_STATUS2_BITS_T bits
+ */
+ uint8_t getInterruptStatus2();
+
+ /**
+ * enable interrupts for events in interrupt config register 1
+ *
+ * @param bits bitmask of ENABLE_CONFIG_BITS_T values
+ * @return true if successful
+ */
+ bool setInterruptEnables1(uint8_t bits);
+
+ /**
+ * return the enabled interrupts for events in interrupt config register 1
+ *
+ * @return bitmask of ENABLE_CONFIG_BITS_T values
+ */
+ uint8_t getInterruptEnables1();
+
+ /**
+ * enable interrupts for events in interrupt config register 2
+ *
+ * @param bits bitmask of ENABLE_CONFIG2_BITS_T values
+ * @return true if successful
+ */
+ bool setInterruptEnables2(uint8_t bits);
+
+ /**
+ * return the enabled interrupts for events in interrupt config register 2
+ *
+ * @return bitmask of ENABLE_CONFIG2_BITS_T values
+ */
+ uint8_t getInterruptEnables2();
+
+ /**
+ * configure interrupt latching behavior
+ *
+ * @param lat one of the CONFIG2_LAT_T values
+ * @return true if successful
+ */
+ bool setInterruptLatch(CONFIG2_LAT_T lat);
+
+ /**
+ * reset the interrupt controller. This should be called after
+ * any changes are made to interrupt configuration, or to reset
+ * interrupts if latched interrupts have been enabled and an
+ * interrupt has occurred..
+ *
+ * @return true if successful
+ */
+ bool resetInterrupts();
+
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+ void installISR(int gpio, mraa::Edge level, jobject runnable);
+#else
+ /**
+ * install an interrupt handler.
+ *
+ * @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(int gpio, mraa::Edge level,
+ void (*isr)(void *), void *arg);
+#endif
+
+ /**
+ * uninstall a previously installed interrupt handler
+ *
+ */
+ void uninstallISR();
+
+ protected:
+ mraa::I2c m_i2c;
+ mraa::Gpio *m_gpioIntr;
+ uint8_t m_addr;
+
+ // uncompensated accelerometer values
+ float m_accelX;
+ float m_accelY;
+ float m_accelZ;
+
+ // accelerometer full scale
+ float m_accelScale;
+
+ private:
+ /**
+ * update the accelerometer values
+ */
+ void updateAccelerometer();
+ // Adding a private function definition for java bindings
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+ void installISR(int gpio, mraa::Edge level,
+ void (*isr)(void *), void *arg);
+#endif
+
+ };
+}
+
+