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