1765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* 2765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Author: Jon Trulson <jtrulson@ics.com> 3765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Copyright (c) 2015 Intel Corporation. 4765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * 5765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Permission is hereby granted, free of charge, to any person obtaining 6765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * a copy of this software and associated documentation files (the 7765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * "Software"), to deal in the Software without restriction, including 8765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * without limitation the rights to use, copy, modify, merge, publish, 9765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * distribute, sublicense, and/or sell copies of the Software, and to 10765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * permit persons to whom the Software is furnished to do so, subject to 11765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * the following conditions: 12765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * 13765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * The above copyright notice and this permission notice shall be 14765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * included in all copies or substantial portions of the Software. 15765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * 16765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang */ 24765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 25765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <unistd.h> 26765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <math.h> 27765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <iostream> 28765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <stdexcept> 29765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <string> 30765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 31765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include "h3lis331dl.h" 32765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 33765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangusing namespace upm; 34765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangusing namespace std; 35765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 36765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 37765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun ZhangH3LIS331DL::H3LIS331DL(int bus, uint8_t address): 38765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_i2c(bus) 39765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 40765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_addr = address; 41765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 42765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang mraa::Result rv; 43765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if ( (rv = m_i2c.address(m_addr)) != mraa::SUCCESS) 44765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 45765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 46765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.address() failed"); 47765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return; 48765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 49765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 50765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_rawX = m_rawY = m_rawZ = 0; 51765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang setAdjustmentOffsets(0, 0, 0); 52765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 53765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 54765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun ZhangH3LIS331DL::~H3LIS331DL() 55765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 56765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 57765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 58765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::init(DR_BITS_T odr, PM_BITS_T pm, FS_BITS_T fs) 59765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 60765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (!setDataRate(odr)) 61765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 62765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (!setPowerMode(pm)) 63765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 64765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (!setFullScale(fs)) 65765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 66765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 67765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // now enable X, Y, and Z axes 68765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enableAxis(REG1_XEN | REG1_YEN | REG1_ZEN)) 69765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 70765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 71765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 72765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 73765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 74765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhanguint8_t H3LIS331DL::getChipID() 75765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 76765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return m_i2c.readReg(REG_WHOAMI); 77765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 78765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 79765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setDataRate(DR_BITS_T odr) 80765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 81765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg1 = m_i2c.readReg(REG_REG1); 82765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 83765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 &= ~(REG1_DR0 | REG1_DR1); 84765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 |= (odr << REG1_DR_SHIFT); 85765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 86765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG1, reg1)) 87765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 88765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 89765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 90765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 91765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 92765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 93765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 94765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 95765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 96765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setPowerMode(PM_BITS_T pm) 97765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 98765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg1 = m_i2c.readReg(REG_REG1); 99765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 100765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 &= ~(REG1_PM0 | REG1_PM1 | REG1_PM2); 101765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 |= (pm << REG1_PM_SHIFT); 102765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 103765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG1, reg1)) 104765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 105765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 106765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 107765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 108765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 109765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 110765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 111765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 112765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 113765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableAxis(uint8_t axisEnable) 114765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 115765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg1 = m_i2c.readReg(REG_REG1); 116765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 117765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 &= ~(REG1_XEN | REG1_YEN | REG1_ZEN); 118765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg1 |= (axisEnable & (REG1_XEN | REG1_YEN | REG1_ZEN)); 119765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 120765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG1, reg1)) 121765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 122765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 123765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 124765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 125765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 126765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 127765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 128765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 129765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 130765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setFullScale(FS_BITS_T fs) 131765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 132765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg4 = m_i2c.readReg(REG_REG4); 133765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 134765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg4 &= ~(REG4_FS0 | REG4_FS1); 135765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg4 |= (fs << REG4_FS_SHIFT); 136765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 137765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG4, reg4)) 138765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 139765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 140765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 141765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 142765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 143765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 144765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 145765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 146765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 147765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setHPCF(HPCF_BITS_T val) 148765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 149765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 150765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 151765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~(REG2_HPCF0 | REG2_HPCF1); 152765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= (val << REG2_HPCF_SHIFT); 153765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 154765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 155765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 156765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 157765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 158765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 159765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 160765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 161765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 162765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 163765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 164765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setHPM(HPM_BITS_T val) 165765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 166765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 167765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 168765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~(REG2_HPM0 | REG2_HPM1); 169765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= (val << REG2_HPM_SHIFT); 170765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 171765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 172765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 173765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 174765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 175765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 176765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 177765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 178765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 179765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 180765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 181765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::boot() 182765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 183765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 184765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 185765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG2_BOOT; 186765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 187765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 188765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 189765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 190765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 191765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 192765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 193765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 194765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // wait for the boot bit to clear 195765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang do { 196765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg = m_i2c.readReg(REG_REG2); 197765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang usleep(200000); 198765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } while (reg & REG2_BOOT); 199765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 200765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 201765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 202765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 203765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableHPF1(bool enable) 204765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 205765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 206765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 207765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 208765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG2_HPEN1; 209765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 210765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG2_HPEN1; 211765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 212765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 213765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 214765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 215765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 216765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 217765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 218765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 219765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 220765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 221765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 222765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableHPF2(bool enable) 223765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 224765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 225765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 226765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 227765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG2_HPEN2; 228765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 229765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG2_HPEN2; 230765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 231765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 232765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 233765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 234765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 235765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 236765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 237765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 238765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 239765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 240765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 241765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableFDS(bool enable) 242765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 243765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG2); 244765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 245765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 246765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG2_FDS; 247765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 248765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG2_FDS; 249765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 250765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG2, reg)) 251765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 252765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 253765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 254765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 255765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 256765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 257765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 258765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 259765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 260765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterruptActiveLow(bool enable) 261765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 262765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 263765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 264765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 265765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG3_IHL; 266765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 267765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG3_IHL; 268765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 269765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 270765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 271765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 272765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 273765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 274765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 275765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 276765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 277765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 278765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 279765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterruptOpenDrain(bool enable) 280765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 281765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 282765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 283765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 284765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG3_PP_OD; 285765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 286765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG3_PP_OD; 287765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 288765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 289765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 290765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 291765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 292765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 293765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 294765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 295765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 296765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 297765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 298765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1Latch(bool enable) 299765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 300765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 301765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 302765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 303765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG3_LIR1; 304765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 305765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG3_LIR1; 306765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 307765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 308765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 309765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 310765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 311765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 312765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 313765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 314765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 315765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 316765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 317765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2Latch(bool enable) 318765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 319765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 320765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 321765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 322765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG3_LIR2; 323765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 324765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG3_LIR2; 325765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 326765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 327765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 328765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 329765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 330765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 331765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 332765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 333765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 334765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 335765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 336765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1PadConfig(I_CFG_BITS_T val) 337765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 338765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 339765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 340765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~(REG3_I1_CFG0 | REG3_I1_CFG1); 341765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= (val << REG3_I1_CFG_SHIFT); 342765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 343765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 344765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 345765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 346765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 347765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 348765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 349765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 350765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 351765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 352765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 353765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2PadConfig(I_CFG_BITS_T val) 354765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 355765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG3); 356765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 357765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~(REG3_I2_CFG0 | REG3_I2_CFG1); 358765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= (val << REG3_I2_CFG_SHIFT); 359765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 360765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG3, reg)) 361765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 362765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 363765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 364765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 365765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 366765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 367765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 368765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 369765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 370765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 371765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableBDU(bool enable) 372765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 373765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG4); 374765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 375765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 376765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG4_BDU; 377765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 378765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG4_BDU; 379765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 380765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG4, reg)) 381765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 382765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 383765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 384765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 385765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 386765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 387765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 388765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 389765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 390765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableBLE(bool enable) 391765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 392765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG4); 393765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 394765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 395765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= REG4_BLE; 396765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 397765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~REG4_BLE; 398765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 399765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG4, reg)) 400765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 401765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 402765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 403765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 404765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 405765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 406765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 407765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 408765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 409765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::enableSleepToWake(bool enable) 410765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 411765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_REG5); 412765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 413765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (enable) 414765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg |= (REG5_TURNON0 | REG5_TURNON1); 415765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else 416765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg &= ~(REG5_TURNON0 | REG5_TURNON1); 417765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 418765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_REG5, reg)) 419765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 420765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 421765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 422765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 423765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 424765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 425765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 426765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 427765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 428765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhanguint8_t H3LIS331DL::getStatus() 429765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 430765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return m_i2c.readReg(REG_STATUS); 431765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 432765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 433765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1Config(uint8_t val) 434765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 435765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_INT1_CFG); 436765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 437765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // mask off reserved bit 438765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg = (val & ~0x40); 439765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 440765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT1_CFG, reg)) 441765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 442765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 443765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 444765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 445765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 446765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 447765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 448765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 449765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 450765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1Source(uint8_t val) 451765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 452765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_INT1_SRC); 453765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 454765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // mask off reserved bit 455765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg = (val & ~0x80); 456765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 457765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT1_SRC, reg)) 458765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 459765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 460765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 461765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 462765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 463765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 464765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 465765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 466765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 467765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1Threshold(uint8_t val) 468765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 469765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT1_THS, val)) 470765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 471765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 472765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 473765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 474765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 475765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 476765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 477765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 478765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 479765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt1Duration(uint8_t val) 480765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 481765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT1_DUR, val)) 482765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 483765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 484765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 485765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 486765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 487765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 488765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 489765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 490765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 491765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2Config(uint8_t val) 492765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 493765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_INT2_CFG); 494765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 495765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // mask off reserved bit 496765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg = (val & ~0x40); 497765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 498765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT2_CFG, reg)) 499765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 500765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 501765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 502765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 503765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 504765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 505765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 506765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 507765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 508765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2Source(uint8_t val) 509765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 510765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t reg = m_i2c.readReg(REG_INT2_SRC); 511765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 512765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // mask off reserved bit 513765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang reg = (val & ~0x80); 514765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 515765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT2_SRC, reg)) 516765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 517765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 518765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 519765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 520765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 521765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 522765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 523765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 524765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 525765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2Threshold(uint8_t val) 526765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 527765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT2_THS, val)) 528765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 529765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 530765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 531765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 532765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 533765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 534765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 535765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 536765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 537765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangbool H3LIS331DL::setInterrupt2Duration(uint8_t val) 538765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 539765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (m_i2c.writeReg(REG_INT2_DUR, val)) 540765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang { 541765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang throw std::runtime_error(std::string(__FUNCTION__) + 542765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang ": I2c.writeReg() failed"); 543765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return false; 544765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang } 545765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 546765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return true; 547765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 548765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 549765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangvoid H3LIS331DL::update() 550765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 551765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang uint8_t low, high; 552765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 553765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // X 554765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang low = m_i2c.readReg(REG_OUT_X_L); 555765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang high = m_i2c.readReg(REG_OUT_X_H); 556765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_rawX = ((high << 8) | low); 557765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 558765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // Y 559765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang low = m_i2c.readReg(REG_OUT_Y_L); 560765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang high = m_i2c.readReg(REG_OUT_Y_H); 561765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_rawY = ((high << 8) | low); 562765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 563765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang // Z 564765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang low = m_i2c.readReg(REG_OUT_Z_L); 565765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang high = m_i2c.readReg(REG_OUT_Z_H); 566765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_rawZ = ((high << 8) | low); 567765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 568765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 569765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangvoid H3LIS331DL::setAdjustmentOffsets(int adjX, int adjY, int adjZ) 570765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 571765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_adjX = adjX; 572765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_adjY = adjY; 573765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang m_adjZ = adjZ; 574765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 575765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 576765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangvoid H3LIS331DL::getAcceleration(float *aX, float *aY, float *aZ) 577765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 578765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang const float gains = 0.003; // Seeed magic number? 579765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 580765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *aX = float(m_rawX - m_adjX) * gains; 581765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *aY = float(m_rawY - m_adjY) * gains; 582765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *aZ = float(m_rawZ - m_adjZ) * gains; 583765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 584765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 585765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangvoid H3LIS331DL::getRawXYZ(int *x, int *y, int*z) 586765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 587765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *x = m_rawX; 588765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *y = m_rawY; 589765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *z = m_rawZ; 590765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 591765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 592765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangvoid H3LIS331DL::getXYZ(int *x, int *y, int*z) 593765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 594765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *x = (m_rawX - m_adjX); 595765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *y = (m_rawY - m_adjY); 596765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *z = (m_rawZ - m_adjZ); 597765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 598765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 599765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#ifdef SWIGJAVA 600765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangfloat *H3LIS331DL::getAcceleration() 601765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 602765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang float *v = new float[3]; 603765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang getAcceleration(&v[0], &v[1], &v[2]); 604765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return v; 605765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 606765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 607765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangint *H3LIS331DL::getRawXYZ() 608765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 609765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang int *v = new int[3]; 610765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang getRawXYZ(&v[0], &v[1], &v[2]); 611765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return v; 612765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 613765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 614765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangint *H3LIS331DL::getXYZ() 615765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang{ 616765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang int *v = new int[3]; 617765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang getXYZ(&v[0], &v[1], &v[2]); 618765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang return v; 619765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} 620765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#endif 621