iNEMO inertial module: 3D accelerometer and 3D gyroscope.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
cparata
Date:
Wed Jul 10 12:08:49 2019 +0000
Revision:
0:f27ce43dee4f
Child:
1:fe40aec6e97a
First release of LSM6DSOX mbed library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:f27ce43dee4f 1 /**
cparata 0:f27ce43dee4f 2 ******************************************************************************
cparata 0:f27ce43dee4f 3 * @file LSM6DSOXSensor.cpp
cparata 0:f27ce43dee4f 4 * @author SRA
cparata 0:f27ce43dee4f 5 * @version V1.0.0
cparata 0:f27ce43dee4f 6 * @date February 2019
cparata 0:f27ce43dee4f 7 * @brief Implementation of an LSM6DSOX Inertial Measurement Unit (IMU) 6 axes
cparata 0:f27ce43dee4f 8 * sensor.
cparata 0:f27ce43dee4f 9 ******************************************************************************
cparata 0:f27ce43dee4f 10 * @attention
cparata 0:f27ce43dee4f 11 *
cparata 0:f27ce43dee4f 12 * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
cparata 0:f27ce43dee4f 13 *
cparata 0:f27ce43dee4f 14 * Redistribution and use in source and binary forms, with or without modification,
cparata 0:f27ce43dee4f 15 * are permitted provided that the following conditions are met:
cparata 0:f27ce43dee4f 16 * 1. Redistributions of source code must retain the above copyright notice,
cparata 0:f27ce43dee4f 17 * this list of conditions and the following disclaimer.
cparata 0:f27ce43dee4f 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 0:f27ce43dee4f 19 * this list of conditions and the following disclaimer in the documentation
cparata 0:f27ce43dee4f 20 * and/or other materials provided with the distribution.
cparata 0:f27ce43dee4f 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 0:f27ce43dee4f 22 * may be used to endorse or promote products derived from this software
cparata 0:f27ce43dee4f 23 * without specific prior written permission.
cparata 0:f27ce43dee4f 24 *
cparata 0:f27ce43dee4f 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 0:f27ce43dee4f 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 0:f27ce43dee4f 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 0:f27ce43dee4f 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 0:f27ce43dee4f 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 0:f27ce43dee4f 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 0:f27ce43dee4f 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 0:f27ce43dee4f 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 0:f27ce43dee4f 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 0:f27ce43dee4f 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 0:f27ce43dee4f 35 *
cparata 0:f27ce43dee4f 36 ******************************************************************************
cparata 0:f27ce43dee4f 37 */
cparata 0:f27ce43dee4f 38
cparata 0:f27ce43dee4f 39
cparata 0:f27ce43dee4f 40 /* Includes ------------------------------------------------------------------*/
cparata 0:f27ce43dee4f 41
cparata 0:f27ce43dee4f 42 #include "LSM6DSOXSensor.h"
cparata 0:f27ce43dee4f 43
cparata 0:f27ce43dee4f 44
cparata 0:f27ce43dee4f 45 /* Class Implementation ------------------------------------------------------*/
cparata 0:f27ce43dee4f 46
cparata 0:f27ce43dee4f 47 /** Constructor
cparata 0:f27ce43dee4f 48 * @param spi object of an helper class which handles the SPI peripheral
cparata 0:f27ce43dee4f 49 * @param cs_pin the chip select pin
cparata 0:f27ce43dee4f 50 * @param int1_pin the interrupt 1 pin
cparata 0:f27ce43dee4f 51 * @param int2_pin the interrupt 2 pin
cparata 0:f27ce43dee4f 52 * @param spi_type the SPI type
cparata 0:f27ce43dee4f 53 */
cparata 0:f27ce43dee4f 54 LSM6DSOXSensor::LSM6DSOXSensor(SPI *spi, PinName cs_pin, PinName int1_pin, PinName int2_pin, SPI_type_t spi_type) : _dev_spi(spi), _cs_pin(cs_pin), _int1_irq(int1_pin), _int2_irq(int2_pin), _spi_type(spi_type)
cparata 0:f27ce43dee4f 55 {
cparata 0:f27ce43dee4f 56 assert (spi);
cparata 0:f27ce43dee4f 57 if (cs_pin == NC)
cparata 0:f27ce43dee4f 58 {
cparata 0:f27ce43dee4f 59 printf ("ERROR LSM6DSOX CS MUST NOT BE NC\n\r");
cparata 0:f27ce43dee4f 60 _dev_spi = NULL;
cparata 0:f27ce43dee4f 61 _dev_i2c = NULL;
cparata 0:f27ce43dee4f 62 return;
cparata 0:f27ce43dee4f 63 }
cparata 0:f27ce43dee4f 64
cparata 0:f27ce43dee4f 65 _reg_ctx.write_reg = LSM6DSOX_io_write;
cparata 0:f27ce43dee4f 66 _reg_ctx.read_reg = LSM6DSOX_io_read;
cparata 0:f27ce43dee4f 67 _reg_ctx.handle = (void *)this;
cparata 0:f27ce43dee4f 68 _cs_pin = 1;
cparata 0:f27ce43dee4f 69 _dev_i2c = NULL;
cparata 0:f27ce43dee4f 70 _address = 0;
cparata 0:f27ce43dee4f 71
cparata 0:f27ce43dee4f 72 if (_spi_type == SPI3W)
cparata 0:f27ce43dee4f 73 {
cparata 0:f27ce43dee4f 74 /* Enable SPI 3-Wires on the component */
cparata 0:f27ce43dee4f 75 uint8_t data = 0x0C;
cparata 0:f27ce43dee4f 76 lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL3_C, &data, 1);
cparata 0:f27ce43dee4f 77 }
cparata 0:f27ce43dee4f 78 }
cparata 0:f27ce43dee4f 79
cparata 0:f27ce43dee4f 80
cparata 0:f27ce43dee4f 81 /** Constructor
cparata 0:f27ce43dee4f 82 * @param i2c object of an helper class which handles the I2C peripheral
cparata 0:f27ce43dee4f 83 * @param address the address of the component's instance
cparata 0:f27ce43dee4f 84 * @param int1_pin the interrupt 1 pin
cparata 0:f27ce43dee4f 85 * @param int2_pin the interrupt 2 pin
cparata 0:f27ce43dee4f 86 */
cparata 0:f27ce43dee4f 87 LSM6DSOXSensor::LSM6DSOXSensor(DevI2C *i2c, uint8_t address, PinName int1_pin, PinName int2_pin) : _dev_i2c(i2c), _address(address), _cs_pin(NC), _int1_irq(int1_pin), _int2_irq(int2_pin)
cparata 0:f27ce43dee4f 88 {
cparata 0:f27ce43dee4f 89 assert (i2c);
cparata 0:f27ce43dee4f 90 _dev_spi = NULL;
cparata 0:f27ce43dee4f 91 _reg_ctx.write_reg = LSM6DSOX_io_write;
cparata 0:f27ce43dee4f 92 _reg_ctx.read_reg = LSM6DSOX_io_read;
cparata 0:f27ce43dee4f 93 _reg_ctx.handle = (void *)this;
cparata 0:f27ce43dee4f 94 }
cparata 0:f27ce43dee4f 95
cparata 0:f27ce43dee4f 96 /**
cparata 0:f27ce43dee4f 97 * @brief Initializing the component
cparata 0:f27ce43dee4f 98 * @param init pointer to device specific initalization structure
cparata 0:f27ce43dee4f 99 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 100 */
cparata 0:f27ce43dee4f 101 int LSM6DSOXSensor::init(void *init)
cparata 0:f27ce43dee4f 102 {
cparata 0:f27ce43dee4f 103 /* Enable register address automatically incremented during a multiple byte
cparata 0:f27ce43dee4f 104 access with a serial interface. */
cparata 0:f27ce43dee4f 105 if (lsm6dsox_auto_increment_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 106 {
cparata 0:f27ce43dee4f 107 return 1;
cparata 0:f27ce43dee4f 108 }
cparata 0:f27ce43dee4f 109
cparata 0:f27ce43dee4f 110 /* Enable BDU */
cparata 0:f27ce43dee4f 111 if (lsm6dsox_block_data_update_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 112 {
cparata 0:f27ce43dee4f 113 return 1;
cparata 0:f27ce43dee4f 114 }
cparata 0:f27ce43dee4f 115
cparata 0:f27ce43dee4f 116 /* FIFO mode selection */
cparata 0:f27ce43dee4f 117 if (lsm6dsox_fifo_mode_set(&_reg_ctx, LSM6DSOX_BYPASS_MODE) != 0)
cparata 0:f27ce43dee4f 118 {
cparata 0:f27ce43dee4f 119 return 1;
cparata 0:f27ce43dee4f 120 }
cparata 0:f27ce43dee4f 121
cparata 0:f27ce43dee4f 122 /* Output data rate selection - power down. */
cparata 0:f27ce43dee4f 123 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, LSM6DSOX_XL_ODR_OFF) != 0)
cparata 0:f27ce43dee4f 124 {
cparata 0:f27ce43dee4f 125 return 1;
cparata 0:f27ce43dee4f 126 }
cparata 0:f27ce43dee4f 127
cparata 0:f27ce43dee4f 128 /* Full scale selection. */
cparata 0:f27ce43dee4f 129 if (lsm6dsox_xl_full_scale_set(&_reg_ctx, LSM6DSOX_2g) != 0)
cparata 0:f27ce43dee4f 130 {
cparata 0:f27ce43dee4f 131 return 1;
cparata 0:f27ce43dee4f 132 }
cparata 0:f27ce43dee4f 133
cparata 0:f27ce43dee4f 134 /* Output data rate selection - power down. */
cparata 0:f27ce43dee4f 135 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, LSM6DSOX_GY_ODR_OFF) != 0)
cparata 0:f27ce43dee4f 136 {
cparata 0:f27ce43dee4f 137 return 1;
cparata 0:f27ce43dee4f 138 }
cparata 0:f27ce43dee4f 139
cparata 0:f27ce43dee4f 140 /* Full scale selection. */
cparata 0:f27ce43dee4f 141 if (lsm6dsox_gy_full_scale_set(&_reg_ctx, LSM6DSOX_2000dps) != 0)
cparata 0:f27ce43dee4f 142 {
cparata 0:f27ce43dee4f 143 return 1;
cparata 0:f27ce43dee4f 144 }
cparata 0:f27ce43dee4f 145
cparata 0:f27ce43dee4f 146 /* Select default output data rate. */
cparata 0:f27ce43dee4f 147 _x_last_odr = LSM6DSOX_XL_ODR_104Hz;
cparata 0:f27ce43dee4f 148
cparata 0:f27ce43dee4f 149 /* Select default output data rate. */
cparata 0:f27ce43dee4f 150 _g_last_odr = LSM6DSOX_GY_ODR_104Hz;
cparata 0:f27ce43dee4f 151
cparata 0:f27ce43dee4f 152 _x_is_enabled = 0;
cparata 0:f27ce43dee4f 153
cparata 0:f27ce43dee4f 154 _g_is_enabled = 0;
cparata 0:f27ce43dee4f 155
cparata 0:f27ce43dee4f 156 return 0;
cparata 0:f27ce43dee4f 157 }
cparata 0:f27ce43dee4f 158
cparata 0:f27ce43dee4f 159 /**
cparata 0:f27ce43dee4f 160 * @brief Read component ID
cparata 0:f27ce43dee4f 161 * @param id the WHO_AM_I value
cparata 0:f27ce43dee4f 162 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 163 */
cparata 0:f27ce43dee4f 164 int LSM6DSOXSensor::read_id(uint8_t *id)
cparata 0:f27ce43dee4f 165 {
cparata 0:f27ce43dee4f 166 if (lsm6dsox_device_id_get(&_reg_ctx, id) != 0)
cparata 0:f27ce43dee4f 167 {
cparata 0:f27ce43dee4f 168 return 1;
cparata 0:f27ce43dee4f 169 }
cparata 0:f27ce43dee4f 170
cparata 0:f27ce43dee4f 171 return 0;
cparata 0:f27ce43dee4f 172 }
cparata 0:f27ce43dee4f 173
cparata 0:f27ce43dee4f 174 /**
cparata 0:f27ce43dee4f 175 * @brief Enable the LSM6DSOX accelerometer sensor
cparata 0:f27ce43dee4f 176 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 177 */
cparata 0:f27ce43dee4f 178 int LSM6DSOXSensor::enable_x()
cparata 0:f27ce43dee4f 179 {
cparata 0:f27ce43dee4f 180 /* Check if the component is already enabled */
cparata 0:f27ce43dee4f 181 if (_x_is_enabled == 1U)
cparata 0:f27ce43dee4f 182 {
cparata 0:f27ce43dee4f 183 return 0;
cparata 0:f27ce43dee4f 184 }
cparata 0:f27ce43dee4f 185
cparata 0:f27ce43dee4f 186 /* Output data rate selection. */
cparata 0:f27ce43dee4f 187 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, _x_last_odr) != 0)
cparata 0:f27ce43dee4f 188 {
cparata 0:f27ce43dee4f 189 return 1;
cparata 0:f27ce43dee4f 190 }
cparata 0:f27ce43dee4f 191
cparata 0:f27ce43dee4f 192 _x_is_enabled = 1;
cparata 0:f27ce43dee4f 193
cparata 0:f27ce43dee4f 194 return 0;
cparata 0:f27ce43dee4f 195 }
cparata 0:f27ce43dee4f 196
cparata 0:f27ce43dee4f 197 /**
cparata 0:f27ce43dee4f 198 * @brief Disable the LSM6DSOX accelerometer sensor
cparata 0:f27ce43dee4f 199 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 200 */
cparata 0:f27ce43dee4f 201 int LSM6DSOXSensor::disable_x()
cparata 0:f27ce43dee4f 202 {
cparata 0:f27ce43dee4f 203 /* Check if the component is already disabled */
cparata 0:f27ce43dee4f 204 if (_x_is_enabled == 0U)
cparata 0:f27ce43dee4f 205 {
cparata 0:f27ce43dee4f 206 return 0;
cparata 0:f27ce43dee4f 207 }
cparata 0:f27ce43dee4f 208
cparata 0:f27ce43dee4f 209 /* Get current output data rate. */
cparata 0:f27ce43dee4f 210 if (lsm6dsox_xl_data_rate_get(&_reg_ctx, &_x_last_odr) != 0)
cparata 0:f27ce43dee4f 211 {
cparata 0:f27ce43dee4f 212 return 1;
cparata 0:f27ce43dee4f 213 }
cparata 0:f27ce43dee4f 214
cparata 0:f27ce43dee4f 215 /* Output data rate selection - power down. */
cparata 0:f27ce43dee4f 216 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, LSM6DSOX_XL_ODR_OFF) != 0)
cparata 0:f27ce43dee4f 217 {
cparata 0:f27ce43dee4f 218 return 1;
cparata 0:f27ce43dee4f 219 }
cparata 0:f27ce43dee4f 220
cparata 0:f27ce43dee4f 221 _x_is_enabled = 0;
cparata 0:f27ce43dee4f 222
cparata 0:f27ce43dee4f 223 return 0;
cparata 0:f27ce43dee4f 224 }
cparata 0:f27ce43dee4f 225
cparata 0:f27ce43dee4f 226 /**
cparata 0:f27ce43dee4f 227 * @brief Get the LSM6DSOX accelerometer sensor sensitivity
cparata 0:f27ce43dee4f 228 * @param sensitivity pointer where the sensitivity is written
cparata 0:f27ce43dee4f 229 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 230 */
cparata 0:f27ce43dee4f 231 int LSM6DSOXSensor::get_x_sensitivity(float *sensitivity)
cparata 0:f27ce43dee4f 232 {
cparata 0:f27ce43dee4f 233 int ret = 0;
cparata 0:f27ce43dee4f 234 lsm6dsox_fs_xl_t full_scale;
cparata 0:f27ce43dee4f 235
cparata 0:f27ce43dee4f 236 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 237 if (lsm6dsox_xl_full_scale_get(&_reg_ctx, &full_scale) != 0)
cparata 0:f27ce43dee4f 238 {
cparata 0:f27ce43dee4f 239 return 1;
cparata 0:f27ce43dee4f 240 }
cparata 0:f27ce43dee4f 241
cparata 0:f27ce43dee4f 242 /* Store the sensitivity based on actual full scale. */
cparata 0:f27ce43dee4f 243 switch (full_scale)
cparata 0:f27ce43dee4f 244 {
cparata 0:f27ce43dee4f 245 case LSM6DSOX_2g:
cparata 0:f27ce43dee4f 246 *sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_2G;
cparata 0:f27ce43dee4f 247 break;
cparata 0:f27ce43dee4f 248
cparata 0:f27ce43dee4f 249 case LSM6DSOX_4g:
cparata 0:f27ce43dee4f 250 *sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_4G;
cparata 0:f27ce43dee4f 251 break;
cparata 0:f27ce43dee4f 252
cparata 0:f27ce43dee4f 253 case LSM6DSOX_8g:
cparata 0:f27ce43dee4f 254 *sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_8G;
cparata 0:f27ce43dee4f 255 break;
cparata 0:f27ce43dee4f 256
cparata 0:f27ce43dee4f 257 case LSM6DSOX_16g:
cparata 0:f27ce43dee4f 258 *sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_16G;
cparata 0:f27ce43dee4f 259 break;
cparata 0:f27ce43dee4f 260
cparata 0:f27ce43dee4f 261 default:
cparata 0:f27ce43dee4f 262 ret = 1;
cparata 0:f27ce43dee4f 263 break;
cparata 0:f27ce43dee4f 264 }
cparata 0:f27ce43dee4f 265
cparata 0:f27ce43dee4f 266 return ret;
cparata 0:f27ce43dee4f 267 }
cparata 0:f27ce43dee4f 268
cparata 0:f27ce43dee4f 269 /**
cparata 0:f27ce43dee4f 270 * @brief Get the LSM6DSOX accelerometer sensor output data rate
cparata 0:f27ce43dee4f 271 * @param odr pointer where the output data rate is written
cparata 0:f27ce43dee4f 272 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 273 */
cparata 0:f27ce43dee4f 274 int LSM6DSOXSensor::get_x_odr(float *odr)
cparata 0:f27ce43dee4f 275 {
cparata 0:f27ce43dee4f 276 int ret = 0;
cparata 0:f27ce43dee4f 277 lsm6dsox_odr_xl_t odr_low_level;
cparata 0:f27ce43dee4f 278
cparata 0:f27ce43dee4f 279 /* Get current output data rate. */
cparata 0:f27ce43dee4f 280 if (lsm6dsox_xl_data_rate_get(&_reg_ctx, &odr_low_level) != 0)
cparata 0:f27ce43dee4f 281 {
cparata 0:f27ce43dee4f 282 return 1;
cparata 0:f27ce43dee4f 283 }
cparata 0:f27ce43dee4f 284
cparata 0:f27ce43dee4f 285 switch (odr_low_level)
cparata 0:f27ce43dee4f 286 {
cparata 0:f27ce43dee4f 287 case LSM6DSOX_XL_ODR_OFF:
cparata 0:f27ce43dee4f 288 *odr = 0.0f;
cparata 0:f27ce43dee4f 289 break;
cparata 0:f27ce43dee4f 290
cparata 0:f27ce43dee4f 291 case LSM6DSOX_XL_ODR_6Hz5:
cparata 0:f27ce43dee4f 292 *odr = 6.5f;
cparata 0:f27ce43dee4f 293 break;
cparata 0:f27ce43dee4f 294
cparata 0:f27ce43dee4f 295 case LSM6DSOX_XL_ODR_12Hz5:
cparata 0:f27ce43dee4f 296 *odr = 12.5f;
cparata 0:f27ce43dee4f 297 break;
cparata 0:f27ce43dee4f 298
cparata 0:f27ce43dee4f 299 case LSM6DSOX_XL_ODR_26Hz:
cparata 0:f27ce43dee4f 300 *odr = 26.0f;
cparata 0:f27ce43dee4f 301 break;
cparata 0:f27ce43dee4f 302
cparata 0:f27ce43dee4f 303 case LSM6DSOX_XL_ODR_52Hz:
cparata 0:f27ce43dee4f 304 *odr = 52.0f;
cparata 0:f27ce43dee4f 305 break;
cparata 0:f27ce43dee4f 306
cparata 0:f27ce43dee4f 307 case LSM6DSOX_XL_ODR_104Hz:
cparata 0:f27ce43dee4f 308 *odr = 104.0f;
cparata 0:f27ce43dee4f 309 break;
cparata 0:f27ce43dee4f 310
cparata 0:f27ce43dee4f 311 case LSM6DSOX_XL_ODR_208Hz:
cparata 0:f27ce43dee4f 312 *odr = 208.0f;
cparata 0:f27ce43dee4f 313 break;
cparata 0:f27ce43dee4f 314
cparata 0:f27ce43dee4f 315 case LSM6DSOX_XL_ODR_417Hz:
cparata 0:f27ce43dee4f 316 *odr = 417.0f;
cparata 0:f27ce43dee4f 317 break;
cparata 0:f27ce43dee4f 318
cparata 0:f27ce43dee4f 319 case LSM6DSOX_XL_ODR_833Hz:
cparata 0:f27ce43dee4f 320 *odr = 833.0f;
cparata 0:f27ce43dee4f 321 break;
cparata 0:f27ce43dee4f 322
cparata 0:f27ce43dee4f 323 case LSM6DSOX_XL_ODR_1667Hz:
cparata 0:f27ce43dee4f 324 *odr = 1667.0f;
cparata 0:f27ce43dee4f 325 break;
cparata 0:f27ce43dee4f 326
cparata 0:f27ce43dee4f 327 case LSM6DSOX_XL_ODR_3333Hz:
cparata 0:f27ce43dee4f 328 *odr = 3333.0f;
cparata 0:f27ce43dee4f 329 break;
cparata 0:f27ce43dee4f 330
cparata 0:f27ce43dee4f 331 case LSM6DSOX_XL_ODR_6667Hz:
cparata 0:f27ce43dee4f 332 *odr = 6667.0f;
cparata 0:f27ce43dee4f 333 break;
cparata 0:f27ce43dee4f 334
cparata 0:f27ce43dee4f 335 default:
cparata 0:f27ce43dee4f 336 ret = 1;
cparata 0:f27ce43dee4f 337 break;
cparata 0:f27ce43dee4f 338 }
cparata 0:f27ce43dee4f 339
cparata 0:f27ce43dee4f 340 return ret;
cparata 0:f27ce43dee4f 341 }
cparata 0:f27ce43dee4f 342
cparata 0:f27ce43dee4f 343 /**
cparata 0:f27ce43dee4f 344 * @brief Set the LSM6DSOX accelerometer sensor output data rate
cparata 0:f27ce43dee4f 345 * @param odr the output data rate value to be set
cparata 0:f27ce43dee4f 346 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 347 */
cparata 0:f27ce43dee4f 348 int LSM6DSOXSensor::set_x_odr(float odr)
cparata 0:f27ce43dee4f 349 {
cparata 0:f27ce43dee4f 350 /* Check if the component is enabled */
cparata 0:f27ce43dee4f 351 if (_x_is_enabled == 1U)
cparata 0:f27ce43dee4f 352 {
cparata 0:f27ce43dee4f 353 return set_x_odr_when_enabled(odr);
cparata 0:f27ce43dee4f 354 }
cparata 0:f27ce43dee4f 355 else
cparata 0:f27ce43dee4f 356 {
cparata 0:f27ce43dee4f 357 return set_x_odr_when_disabled(odr);
cparata 0:f27ce43dee4f 358 }
cparata 0:f27ce43dee4f 359 }
cparata 0:f27ce43dee4f 360
cparata 0:f27ce43dee4f 361 /**
cparata 0:f27ce43dee4f 362 * @brief Set the LSM6DSOX accelerometer sensor output data rate when enabled
cparata 0:f27ce43dee4f 363 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 364 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 365 */
cparata 0:f27ce43dee4f 366 int LSM6DSOXSensor::set_x_odr_when_enabled(float odr)
cparata 0:f27ce43dee4f 367 {
cparata 0:f27ce43dee4f 368 lsm6dsox_odr_xl_t new_odr;
cparata 0:f27ce43dee4f 369
cparata 0:f27ce43dee4f 370 new_odr = (odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
cparata 0:f27ce43dee4f 371 : (odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
cparata 0:f27ce43dee4f 372 : (odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
cparata 0:f27ce43dee4f 373 : (odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
cparata 0:f27ce43dee4f 374 : (odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
cparata 0:f27ce43dee4f 375 : (odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
cparata 0:f27ce43dee4f 376 : (odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
cparata 0:f27ce43dee4f 377 : (odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
cparata 0:f27ce43dee4f 378 : (odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
cparata 0:f27ce43dee4f 379 : LSM6DSOX_XL_ODR_6667Hz;
cparata 0:f27ce43dee4f 380
cparata 0:f27ce43dee4f 381 /* Output data rate selection. */
cparata 0:f27ce43dee4f 382 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:f27ce43dee4f 383 {
cparata 0:f27ce43dee4f 384 return 1;
cparata 0:f27ce43dee4f 385 }
cparata 0:f27ce43dee4f 386
cparata 0:f27ce43dee4f 387 return 0;
cparata 0:f27ce43dee4f 388 }
cparata 0:f27ce43dee4f 389
cparata 0:f27ce43dee4f 390 /**
cparata 0:f27ce43dee4f 391 * @brief Set the LSM6DSOX accelerometer sensor output data rate when disabled
cparata 0:f27ce43dee4f 392 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 393 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 394 */
cparata 0:f27ce43dee4f 395 int LSM6DSOXSensor::set_x_odr_when_disabled(float odr)
cparata 0:f27ce43dee4f 396 {
cparata 0:f27ce43dee4f 397 _x_last_odr = (odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
cparata 0:f27ce43dee4f 398 : (odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
cparata 0:f27ce43dee4f 399 : (odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
cparata 0:f27ce43dee4f 400 : (odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
cparata 0:f27ce43dee4f 401 : (odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
cparata 0:f27ce43dee4f 402 : (odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
cparata 0:f27ce43dee4f 403 : (odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
cparata 0:f27ce43dee4f 404 : (odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
cparata 0:f27ce43dee4f 405 : (odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
cparata 0:f27ce43dee4f 406 : LSM6DSOX_XL_ODR_6667Hz;
cparata 0:f27ce43dee4f 407
cparata 0:f27ce43dee4f 408 return 0;
cparata 0:f27ce43dee4f 409 }
cparata 0:f27ce43dee4f 410
cparata 0:f27ce43dee4f 411
cparata 0:f27ce43dee4f 412 /**
cparata 0:f27ce43dee4f 413 * @brief Get the LSM6DSOX accelerometer sensor full scale
cparata 0:f27ce43dee4f 414 * @param full_scale pointer where the full scale is written
cparata 0:f27ce43dee4f 415 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 416 */
cparata 0:f27ce43dee4f 417 int LSM6DSOXSensor::get_x_fs(float *full_scale)
cparata 0:f27ce43dee4f 418 {
cparata 0:f27ce43dee4f 419 int ret = 0;
cparata 0:f27ce43dee4f 420 lsm6dsox_fs_xl_t fs_low_level;
cparata 0:f27ce43dee4f 421
cparata 0:f27ce43dee4f 422 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 423 if (lsm6dsox_xl_full_scale_get(&_reg_ctx, &fs_low_level) != 0)
cparata 0:f27ce43dee4f 424 {
cparata 0:f27ce43dee4f 425 return 1;
cparata 0:f27ce43dee4f 426 }
cparata 0:f27ce43dee4f 427
cparata 0:f27ce43dee4f 428 switch (fs_low_level)
cparata 0:f27ce43dee4f 429 {
cparata 0:f27ce43dee4f 430 case LSM6DSOX_2g:
cparata 0:f27ce43dee4f 431 *full_scale = 2.0f;
cparata 0:f27ce43dee4f 432 break;
cparata 0:f27ce43dee4f 433
cparata 0:f27ce43dee4f 434 case LSM6DSOX_4g:
cparata 0:f27ce43dee4f 435 *full_scale = 4.0f;
cparata 0:f27ce43dee4f 436 break;
cparata 0:f27ce43dee4f 437
cparata 0:f27ce43dee4f 438 case LSM6DSOX_8g:
cparata 0:f27ce43dee4f 439 *full_scale = 8.0f;
cparata 0:f27ce43dee4f 440 break;
cparata 0:f27ce43dee4f 441
cparata 0:f27ce43dee4f 442 case LSM6DSOX_16g:
cparata 0:f27ce43dee4f 443 *full_scale = 16.0f;
cparata 0:f27ce43dee4f 444 break;
cparata 0:f27ce43dee4f 445
cparata 0:f27ce43dee4f 446 default:
cparata 0:f27ce43dee4f 447 ret = 1;
cparata 0:f27ce43dee4f 448 break;
cparata 0:f27ce43dee4f 449 }
cparata 0:f27ce43dee4f 450
cparata 0:f27ce43dee4f 451 return ret;
cparata 0:f27ce43dee4f 452 }
cparata 0:f27ce43dee4f 453
cparata 0:f27ce43dee4f 454 /**
cparata 0:f27ce43dee4f 455 * @brief Set the LSM6DSOX accelerometer sensor full scale
cparata 0:f27ce43dee4f 456 * @param full_scale the functional full scale to be set
cparata 0:f27ce43dee4f 457 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 458 */
cparata 0:f27ce43dee4f 459 int LSM6DSOXSensor::set_x_fs(float full_scale)
cparata 0:f27ce43dee4f 460 {
cparata 0:f27ce43dee4f 461 lsm6dsox_fs_xl_t new_fs;
cparata 0:f27ce43dee4f 462
cparata 0:f27ce43dee4f 463 /* Seems like MISRA C-2012 rule 14.3a violation but only from single file statical analysis point of view because
cparata 0:f27ce43dee4f 464 the parameter passed to the function is not known at the moment of analysis */
cparata 0:f27ce43dee4f 465 new_fs = (full_scale <= 2.0f) ? LSM6DSOX_2g
cparata 0:f27ce43dee4f 466 : (full_scale <= 4.0f) ? LSM6DSOX_4g
cparata 0:f27ce43dee4f 467 : (full_scale <= 8.0f) ? LSM6DSOX_8g
cparata 0:f27ce43dee4f 468 : LSM6DSOX_16g;
cparata 0:f27ce43dee4f 469
cparata 0:f27ce43dee4f 470 if (lsm6dsox_xl_full_scale_set(&_reg_ctx, new_fs) != 0)
cparata 0:f27ce43dee4f 471 {
cparata 0:f27ce43dee4f 472 return 1;
cparata 0:f27ce43dee4f 473 }
cparata 0:f27ce43dee4f 474
cparata 0:f27ce43dee4f 475 return 0;
cparata 0:f27ce43dee4f 476 }
cparata 0:f27ce43dee4f 477
cparata 0:f27ce43dee4f 478 /**
cparata 0:f27ce43dee4f 479 * @brief Get the LSM6DSOX accelerometer sensor raw axes
cparata 0:f27ce43dee4f 480 * @param value pointer where the raw values of the axes are written
cparata 0:f27ce43dee4f 481 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 482 */
cparata 0:f27ce43dee4f 483 int LSM6DSOXSensor::get_x_axes_raw(int16_t *value)
cparata 0:f27ce43dee4f 484 {
cparata 0:f27ce43dee4f 485 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 486
cparata 0:f27ce43dee4f 487 /* Read raw data values. */
cparata 0:f27ce43dee4f 488 if (lsm6dsox_acceleration_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 489 {
cparata 0:f27ce43dee4f 490 return 1;
cparata 0:f27ce43dee4f 491 }
cparata 0:f27ce43dee4f 492
cparata 0:f27ce43dee4f 493 /* Format the data. */
cparata 0:f27ce43dee4f 494 value[0] = data_raw.i16bit[0];
cparata 0:f27ce43dee4f 495 value[1] = data_raw.i16bit[1];
cparata 0:f27ce43dee4f 496 value[2] = data_raw.i16bit[2];
cparata 0:f27ce43dee4f 497
cparata 0:f27ce43dee4f 498 return 0;
cparata 0:f27ce43dee4f 499 }
cparata 0:f27ce43dee4f 500
cparata 0:f27ce43dee4f 501
cparata 0:f27ce43dee4f 502 /**
cparata 0:f27ce43dee4f 503 * @brief Get the LSM6DSOX accelerometer sensor axes
cparata 0:f27ce43dee4f 504 * @param acceleration pointer where the values of the axes are written
cparata 0:f27ce43dee4f 505 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 506 */
cparata 0:f27ce43dee4f 507 int LSM6DSOXSensor::get_x_axes(int32_t *acceleration)
cparata 0:f27ce43dee4f 508 {
cparata 0:f27ce43dee4f 509 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 510 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 511
cparata 0:f27ce43dee4f 512 /* Read raw data values. */
cparata 0:f27ce43dee4f 513 if (lsm6dsox_acceleration_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 514 {
cparata 0:f27ce43dee4f 515 return 1;
cparata 0:f27ce43dee4f 516 }
cparata 0:f27ce43dee4f 517
cparata 0:f27ce43dee4f 518 /* Get LSM6DSOX actual sensitivity. */
cparata 0:f27ce43dee4f 519 if (get_x_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 520 {
cparata 0:f27ce43dee4f 521 return 1;
cparata 0:f27ce43dee4f 522 }
cparata 0:f27ce43dee4f 523
cparata 0:f27ce43dee4f 524 /* Calculate the data. */
cparata 0:f27ce43dee4f 525 acceleration[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
cparata 0:f27ce43dee4f 526 acceleration[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
cparata 0:f27ce43dee4f 527 acceleration[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
cparata 0:f27ce43dee4f 528
cparata 0:f27ce43dee4f 529 return 0;
cparata 0:f27ce43dee4f 530 }
cparata 0:f27ce43dee4f 531
cparata 0:f27ce43dee4f 532
cparata 0:f27ce43dee4f 533 /**
cparata 0:f27ce43dee4f 534 * @brief Enable the LSM6DSOX gyroscope sensor
cparata 0:f27ce43dee4f 535 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 536 */
cparata 0:f27ce43dee4f 537 int LSM6DSOXSensor::enable_g()
cparata 0:f27ce43dee4f 538 {
cparata 0:f27ce43dee4f 539 /* Check if the component is already enabled */
cparata 0:f27ce43dee4f 540 if (_g_is_enabled == 1U)
cparata 0:f27ce43dee4f 541 {
cparata 0:f27ce43dee4f 542 return 0;
cparata 0:f27ce43dee4f 543 }
cparata 0:f27ce43dee4f 544
cparata 0:f27ce43dee4f 545 /* Output data rate selection. */
cparata 0:f27ce43dee4f 546 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, _g_last_odr) != 0)
cparata 0:f27ce43dee4f 547 {
cparata 0:f27ce43dee4f 548 return 1;
cparata 0:f27ce43dee4f 549 }
cparata 0:f27ce43dee4f 550
cparata 0:f27ce43dee4f 551 _g_is_enabled = 1;
cparata 0:f27ce43dee4f 552
cparata 0:f27ce43dee4f 553 return 0;
cparata 0:f27ce43dee4f 554 }
cparata 0:f27ce43dee4f 555
cparata 0:f27ce43dee4f 556
cparata 0:f27ce43dee4f 557 /**
cparata 0:f27ce43dee4f 558 * @brief Disable the LSM6DSOX gyroscope sensor
cparata 0:f27ce43dee4f 559 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 560 */
cparata 0:f27ce43dee4f 561 int LSM6DSOXSensor::disable_g()
cparata 0:f27ce43dee4f 562 {
cparata 0:f27ce43dee4f 563 /* Check if the component is already disabled */
cparata 0:f27ce43dee4f 564 if (_g_is_enabled == 0U)
cparata 0:f27ce43dee4f 565 {
cparata 0:f27ce43dee4f 566 return 0;
cparata 0:f27ce43dee4f 567 }
cparata 0:f27ce43dee4f 568
cparata 0:f27ce43dee4f 569 /* Get current output data rate. */
cparata 0:f27ce43dee4f 570 if (lsm6dsox_gy_data_rate_get(&_reg_ctx, &_g_last_odr) != 0)
cparata 0:f27ce43dee4f 571 {
cparata 0:f27ce43dee4f 572 return 1;
cparata 0:f27ce43dee4f 573 }
cparata 0:f27ce43dee4f 574
cparata 0:f27ce43dee4f 575 /* Output data rate selection - power down. */
cparata 0:f27ce43dee4f 576 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, LSM6DSOX_GY_ODR_OFF) != 0)
cparata 0:f27ce43dee4f 577 {
cparata 0:f27ce43dee4f 578 return 1;
cparata 0:f27ce43dee4f 579 }
cparata 0:f27ce43dee4f 580
cparata 0:f27ce43dee4f 581 _g_is_enabled = 0;
cparata 0:f27ce43dee4f 582
cparata 0:f27ce43dee4f 583 return 0;
cparata 0:f27ce43dee4f 584 }
cparata 0:f27ce43dee4f 585
cparata 0:f27ce43dee4f 586 /**
cparata 0:f27ce43dee4f 587 * @brief Get the LSM6DSOX gyroscope sensor sensitivity
cparata 0:f27ce43dee4f 588 * @param sensitivity pointer where the sensitivity is written
cparata 0:f27ce43dee4f 589 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 590 */
cparata 0:f27ce43dee4f 591 int LSM6DSOXSensor::get_g_sensitivity(float *sensitivity)
cparata 0:f27ce43dee4f 592 {
cparata 0:f27ce43dee4f 593 int ret = 0;
cparata 0:f27ce43dee4f 594 lsm6dsox_fs_g_t full_scale;
cparata 0:f27ce43dee4f 595
cparata 0:f27ce43dee4f 596 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 597 if (lsm6dsox_gy_full_scale_get(&_reg_ctx, &full_scale) != 0)
cparata 0:f27ce43dee4f 598 {
cparata 0:f27ce43dee4f 599 return 1;
cparata 0:f27ce43dee4f 600 }
cparata 0:f27ce43dee4f 601
cparata 0:f27ce43dee4f 602 /* Store the sensitivity based on actual full scale. */
cparata 0:f27ce43dee4f 603 switch (full_scale)
cparata 0:f27ce43dee4f 604 {
cparata 0:f27ce43dee4f 605 case LSM6DSOX_125dps:
cparata 0:f27ce43dee4f 606 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_125DPS;
cparata 0:f27ce43dee4f 607 break;
cparata 0:f27ce43dee4f 608
cparata 0:f27ce43dee4f 609 case LSM6DSOX_250dps:
cparata 0:f27ce43dee4f 610 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_250DPS;
cparata 0:f27ce43dee4f 611 break;
cparata 0:f27ce43dee4f 612
cparata 0:f27ce43dee4f 613 case LSM6DSOX_500dps:
cparata 0:f27ce43dee4f 614 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_500DPS;
cparata 0:f27ce43dee4f 615 break;
cparata 0:f27ce43dee4f 616
cparata 0:f27ce43dee4f 617 case LSM6DSOX_1000dps:
cparata 0:f27ce43dee4f 618 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_1000DPS;
cparata 0:f27ce43dee4f 619 break;
cparata 0:f27ce43dee4f 620
cparata 0:f27ce43dee4f 621 case LSM6DSOX_2000dps:
cparata 0:f27ce43dee4f 622 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_2000DPS;
cparata 0:f27ce43dee4f 623 break;
cparata 0:f27ce43dee4f 624
cparata 0:f27ce43dee4f 625 default:
cparata 0:f27ce43dee4f 626 ret = 1;
cparata 0:f27ce43dee4f 627 break;
cparata 0:f27ce43dee4f 628 }
cparata 0:f27ce43dee4f 629
cparata 0:f27ce43dee4f 630 return ret;
cparata 0:f27ce43dee4f 631 }
cparata 0:f27ce43dee4f 632
cparata 0:f27ce43dee4f 633 /**
cparata 0:f27ce43dee4f 634 * @brief Get the LSM6DSOX gyroscope sensor output data rate
cparata 0:f27ce43dee4f 635 * @param odr pointer where the output data rate is written
cparata 0:f27ce43dee4f 636 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 637 */
cparata 0:f27ce43dee4f 638 int LSM6DSOXSensor::get_g_odr(float *odr)
cparata 0:f27ce43dee4f 639 {
cparata 0:f27ce43dee4f 640 int ret = 0;
cparata 0:f27ce43dee4f 641 lsm6dsox_odr_g_t odr_low_level;
cparata 0:f27ce43dee4f 642
cparata 0:f27ce43dee4f 643 /* Get current output data rate. */
cparata 0:f27ce43dee4f 644 if (lsm6dsox_gy_data_rate_get(&_reg_ctx, &odr_low_level) != 0)
cparata 0:f27ce43dee4f 645 {
cparata 0:f27ce43dee4f 646 return 1;
cparata 0:f27ce43dee4f 647 }
cparata 0:f27ce43dee4f 648
cparata 0:f27ce43dee4f 649 switch (odr_low_level)
cparata 0:f27ce43dee4f 650 {
cparata 0:f27ce43dee4f 651 case LSM6DSOX_GY_ODR_OFF:
cparata 0:f27ce43dee4f 652 *odr = 0.0f;
cparata 0:f27ce43dee4f 653 break;
cparata 0:f27ce43dee4f 654
cparata 0:f27ce43dee4f 655 case LSM6DSOX_GY_ODR_12Hz5:
cparata 0:f27ce43dee4f 656 *odr = 12.5f;
cparata 0:f27ce43dee4f 657 break;
cparata 0:f27ce43dee4f 658
cparata 0:f27ce43dee4f 659 case LSM6DSOX_GY_ODR_26Hz:
cparata 0:f27ce43dee4f 660 *odr = 26.0f;
cparata 0:f27ce43dee4f 661 break;
cparata 0:f27ce43dee4f 662
cparata 0:f27ce43dee4f 663 case LSM6DSOX_GY_ODR_52Hz:
cparata 0:f27ce43dee4f 664 *odr = 52.0f;
cparata 0:f27ce43dee4f 665 break;
cparata 0:f27ce43dee4f 666
cparata 0:f27ce43dee4f 667 case LSM6DSOX_GY_ODR_104Hz:
cparata 0:f27ce43dee4f 668 *odr = 104.0f;
cparata 0:f27ce43dee4f 669 break;
cparata 0:f27ce43dee4f 670
cparata 0:f27ce43dee4f 671 case LSM6DSOX_GY_ODR_208Hz:
cparata 0:f27ce43dee4f 672 *odr = 208.0f;
cparata 0:f27ce43dee4f 673 break;
cparata 0:f27ce43dee4f 674
cparata 0:f27ce43dee4f 675 case LSM6DSOX_GY_ODR_417Hz:
cparata 0:f27ce43dee4f 676 *odr = 417.0f;
cparata 0:f27ce43dee4f 677 break;
cparata 0:f27ce43dee4f 678
cparata 0:f27ce43dee4f 679 case LSM6DSOX_GY_ODR_833Hz:
cparata 0:f27ce43dee4f 680 *odr = 833.0f;
cparata 0:f27ce43dee4f 681 break;
cparata 0:f27ce43dee4f 682
cparata 0:f27ce43dee4f 683 case LSM6DSOX_GY_ODR_1667Hz:
cparata 0:f27ce43dee4f 684 *odr = 1667.0f;
cparata 0:f27ce43dee4f 685 break;
cparata 0:f27ce43dee4f 686
cparata 0:f27ce43dee4f 687 case LSM6DSOX_GY_ODR_3333Hz:
cparata 0:f27ce43dee4f 688 *odr = 3333.0f;
cparata 0:f27ce43dee4f 689 break;
cparata 0:f27ce43dee4f 690
cparata 0:f27ce43dee4f 691 case LSM6DSOX_GY_ODR_6667Hz:
cparata 0:f27ce43dee4f 692 *odr = 6667.0f;
cparata 0:f27ce43dee4f 693 break;
cparata 0:f27ce43dee4f 694
cparata 0:f27ce43dee4f 695 default:
cparata 0:f27ce43dee4f 696 ret = 1;
cparata 0:f27ce43dee4f 697 break;
cparata 0:f27ce43dee4f 698 }
cparata 0:f27ce43dee4f 699
cparata 0:f27ce43dee4f 700 return ret;
cparata 0:f27ce43dee4f 701 }
cparata 0:f27ce43dee4f 702
cparata 0:f27ce43dee4f 703 /**
cparata 0:f27ce43dee4f 704 * @brief Set the LSM6DSOX gyroscope sensor output data rate
cparata 0:f27ce43dee4f 705 * @param odr the output data rate value to be set
cparata 0:f27ce43dee4f 706 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 707 */
cparata 0:f27ce43dee4f 708 int LSM6DSOXSensor::set_g_odr(float odr)
cparata 0:f27ce43dee4f 709 {
cparata 0:f27ce43dee4f 710 /* Check if the component is enabled */
cparata 0:f27ce43dee4f 711 if (_g_is_enabled == 1U)
cparata 0:f27ce43dee4f 712 {
cparata 0:f27ce43dee4f 713 return set_g_odr_when_enabled(odr);
cparata 0:f27ce43dee4f 714 }
cparata 0:f27ce43dee4f 715 else
cparata 0:f27ce43dee4f 716 {
cparata 0:f27ce43dee4f 717 return set_g_odr_when_disabled(odr);
cparata 0:f27ce43dee4f 718 }
cparata 0:f27ce43dee4f 719 }
cparata 0:f27ce43dee4f 720
cparata 0:f27ce43dee4f 721 /**
cparata 0:f27ce43dee4f 722 * @brief Set the LSM6DSOX gyroscope sensor output data rate when enabled
cparata 0:f27ce43dee4f 723 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 724 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 725 */
cparata 0:f27ce43dee4f 726 int LSM6DSOXSensor::set_g_odr_when_enabled(float odr)
cparata 0:f27ce43dee4f 727 {
cparata 0:f27ce43dee4f 728 lsm6dsox_odr_g_t new_odr;
cparata 0:f27ce43dee4f 729
cparata 0:f27ce43dee4f 730 new_odr = (odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
cparata 0:f27ce43dee4f 731 : (odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
cparata 0:f27ce43dee4f 732 : (odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
cparata 0:f27ce43dee4f 733 : (odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
cparata 0:f27ce43dee4f 734 : (odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
cparata 0:f27ce43dee4f 735 : (odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
cparata 0:f27ce43dee4f 736 : (odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
cparata 0:f27ce43dee4f 737 : (odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
cparata 0:f27ce43dee4f 738 : (odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
cparata 0:f27ce43dee4f 739 : LSM6DSOX_GY_ODR_6667Hz;
cparata 0:f27ce43dee4f 740
cparata 0:f27ce43dee4f 741 /* Output data rate selection. */
cparata 0:f27ce43dee4f 742 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:f27ce43dee4f 743 {
cparata 0:f27ce43dee4f 744 return 1;
cparata 0:f27ce43dee4f 745 }
cparata 0:f27ce43dee4f 746
cparata 0:f27ce43dee4f 747 return 0;
cparata 0:f27ce43dee4f 748 }
cparata 0:f27ce43dee4f 749
cparata 0:f27ce43dee4f 750 /**
cparata 0:f27ce43dee4f 751 * @brief Set the LSM6DSOX gyroscope sensor output data rate when disabled
cparata 0:f27ce43dee4f 752 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 753 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 754 */
cparata 0:f27ce43dee4f 755 int LSM6DSOXSensor::set_g_odr_when_disabled(float odr)
cparata 0:f27ce43dee4f 756 {
cparata 0:f27ce43dee4f 757 _g_last_odr = (odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
cparata 0:f27ce43dee4f 758 : (odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
cparata 0:f27ce43dee4f 759 : (odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
cparata 0:f27ce43dee4f 760 : (odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
cparata 0:f27ce43dee4f 761 : (odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
cparata 0:f27ce43dee4f 762 : (odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
cparata 0:f27ce43dee4f 763 : (odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
cparata 0:f27ce43dee4f 764 : (odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
cparata 0:f27ce43dee4f 765 : (odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
cparata 0:f27ce43dee4f 766 : LSM6DSOX_GY_ODR_6667Hz;
cparata 0:f27ce43dee4f 767
cparata 0:f27ce43dee4f 768 return 0;
cparata 0:f27ce43dee4f 769 }
cparata 0:f27ce43dee4f 770
cparata 0:f27ce43dee4f 771
cparata 0:f27ce43dee4f 772 /**
cparata 0:f27ce43dee4f 773 * @brief Get the LSM6DSOX gyroscope sensor full scale
cparata 0:f27ce43dee4f 774 * @param full_scale pointer where the full scale is written
cparata 0:f27ce43dee4f 775 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 776 */
cparata 0:f27ce43dee4f 777 int LSM6DSOXSensor::get_g_fs(float *full_scale)
cparata 0:f27ce43dee4f 778 {
cparata 0:f27ce43dee4f 779 int ret = 0;
cparata 0:f27ce43dee4f 780 lsm6dsox_fs_g_t fs_low_level;
cparata 0:f27ce43dee4f 781
cparata 0:f27ce43dee4f 782 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 783 if (lsm6dsox_gy_full_scale_get(&_reg_ctx, &fs_low_level) != 0)
cparata 0:f27ce43dee4f 784 {
cparata 0:f27ce43dee4f 785 return 1;
cparata 0:f27ce43dee4f 786 }
cparata 0:f27ce43dee4f 787
cparata 0:f27ce43dee4f 788 switch (fs_low_level)
cparata 0:f27ce43dee4f 789 {
cparata 0:f27ce43dee4f 790 case LSM6DSOX_125dps:
cparata 0:f27ce43dee4f 791 *full_scale = 125.0f;
cparata 0:f27ce43dee4f 792 break;
cparata 0:f27ce43dee4f 793
cparata 0:f27ce43dee4f 794 case LSM6DSOX_250dps:
cparata 0:f27ce43dee4f 795 *full_scale = 250.0f;
cparata 0:f27ce43dee4f 796 break;
cparata 0:f27ce43dee4f 797
cparata 0:f27ce43dee4f 798 case LSM6DSOX_500dps:
cparata 0:f27ce43dee4f 799 *full_scale = 500.0f;
cparata 0:f27ce43dee4f 800 break;
cparata 0:f27ce43dee4f 801
cparata 0:f27ce43dee4f 802 case LSM6DSOX_1000dps:
cparata 0:f27ce43dee4f 803 *full_scale = 1000.0f;
cparata 0:f27ce43dee4f 804 break;
cparata 0:f27ce43dee4f 805
cparata 0:f27ce43dee4f 806 case LSM6DSOX_2000dps:
cparata 0:f27ce43dee4f 807 *full_scale = 2000.0f;
cparata 0:f27ce43dee4f 808 break;
cparata 0:f27ce43dee4f 809
cparata 0:f27ce43dee4f 810 default:
cparata 0:f27ce43dee4f 811 ret = 1;
cparata 0:f27ce43dee4f 812 break;
cparata 0:f27ce43dee4f 813 }
cparata 0:f27ce43dee4f 814
cparata 0:f27ce43dee4f 815 return ret;
cparata 0:f27ce43dee4f 816 }
cparata 0:f27ce43dee4f 817
cparata 0:f27ce43dee4f 818 /**
cparata 0:f27ce43dee4f 819 * @brief Set the LSM6DSOX gyroscope sensor full scale
cparata 0:f27ce43dee4f 820 * @param full_scale the functional full scale to be set
cparata 0:f27ce43dee4f 821 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 822 */
cparata 0:f27ce43dee4f 823 int LSM6DSOXSensor::set_g_fs(float full_scale)
cparata 0:f27ce43dee4f 824 {
cparata 0:f27ce43dee4f 825 lsm6dsox_fs_g_t new_fs;
cparata 0:f27ce43dee4f 826
cparata 0:f27ce43dee4f 827 new_fs = (full_scale <= 125.0f) ? LSM6DSOX_125dps
cparata 0:f27ce43dee4f 828 : (full_scale <= 250.0f) ? LSM6DSOX_250dps
cparata 0:f27ce43dee4f 829 : (full_scale <= 500.0f) ? LSM6DSOX_500dps
cparata 0:f27ce43dee4f 830 : (full_scale <= 1000.0f) ? LSM6DSOX_1000dps
cparata 0:f27ce43dee4f 831 : LSM6DSOX_2000dps;
cparata 0:f27ce43dee4f 832
cparata 0:f27ce43dee4f 833 if (lsm6dsox_gy_full_scale_set(&_reg_ctx, new_fs) != 0)
cparata 0:f27ce43dee4f 834 {
cparata 0:f27ce43dee4f 835 return 1;
cparata 0:f27ce43dee4f 836 }
cparata 0:f27ce43dee4f 837
cparata 0:f27ce43dee4f 838 return 0;
cparata 0:f27ce43dee4f 839 }
cparata 0:f27ce43dee4f 840
cparata 0:f27ce43dee4f 841 /**
cparata 0:f27ce43dee4f 842 * @brief Get the LSM6DSOX gyroscope sensor raw axes
cparata 0:f27ce43dee4f 843 * @param value pointer where the raw values of the axes are written
cparata 0:f27ce43dee4f 844 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 845 */
cparata 0:f27ce43dee4f 846 int LSM6DSOXSensor::get_g_axes_raw(int16_t *value)
cparata 0:f27ce43dee4f 847 {
cparata 0:f27ce43dee4f 848 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 849
cparata 0:f27ce43dee4f 850 /* Read raw data values. */
cparata 0:f27ce43dee4f 851 if (lsm6dsox_angular_rate_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 852 {
cparata 0:f27ce43dee4f 853 return 1;
cparata 0:f27ce43dee4f 854 }
cparata 0:f27ce43dee4f 855
cparata 0:f27ce43dee4f 856 /* Format the data. */
cparata 0:f27ce43dee4f 857 value[0] = data_raw.i16bit[0];
cparata 0:f27ce43dee4f 858 value[1] = data_raw.i16bit[1];
cparata 0:f27ce43dee4f 859 value[2] = data_raw.i16bit[2];
cparata 0:f27ce43dee4f 860
cparata 0:f27ce43dee4f 861 return 0;
cparata 0:f27ce43dee4f 862 }
cparata 0:f27ce43dee4f 863
cparata 0:f27ce43dee4f 864
cparata 0:f27ce43dee4f 865 /**
cparata 0:f27ce43dee4f 866 * @brief Get the LSM6DSOX gyroscope sensor axes
cparata 0:f27ce43dee4f 867 * @param angular_rate pointer where the values of the axes are written
cparata 0:f27ce43dee4f 868 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 869 */
cparata 0:f27ce43dee4f 870 int LSM6DSOXSensor::get_g_axes(int32_t *angular_rate)
cparata 0:f27ce43dee4f 871 {
cparata 0:f27ce43dee4f 872 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 873 float sensitivity;
cparata 0:f27ce43dee4f 874
cparata 0:f27ce43dee4f 875 /* Read raw data values. */
cparata 0:f27ce43dee4f 876 if (lsm6dsox_angular_rate_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 877 {
cparata 0:f27ce43dee4f 878 return 1;
cparata 0:f27ce43dee4f 879 }
cparata 0:f27ce43dee4f 880
cparata 0:f27ce43dee4f 881 /* Get LSM6DSOX actual sensitivity. */
cparata 0:f27ce43dee4f 882 if (get_g_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 883 {
cparata 0:f27ce43dee4f 884 return 1;
cparata 0:f27ce43dee4f 885 }
cparata 0:f27ce43dee4f 886
cparata 0:f27ce43dee4f 887 /* Calculate the data. */
cparata 0:f27ce43dee4f 888 angular_rate[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
cparata 0:f27ce43dee4f 889 angular_rate[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
cparata 0:f27ce43dee4f 890 angular_rate[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
cparata 0:f27ce43dee4f 891
cparata 0:f27ce43dee4f 892 return 0;
cparata 0:f27ce43dee4f 893 }
cparata 0:f27ce43dee4f 894
cparata 0:f27ce43dee4f 895
cparata 0:f27ce43dee4f 896 /**
cparata 0:f27ce43dee4f 897 * @brief Get the LSM6DSOX register value
cparata 0:f27ce43dee4f 898 * @param reg address to be read
cparata 0:f27ce43dee4f 899 * @param data pointer where the value is written
cparata 0:f27ce43dee4f 900 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 901 */
cparata 0:f27ce43dee4f 902 int LSM6DSOXSensor::read_reg(uint8_t reg, uint8_t *data)
cparata 0:f27ce43dee4f 903 {
cparata 0:f27ce43dee4f 904 if (lsm6dsox_read_reg(&_reg_ctx, reg, data, 1) != 0)
cparata 0:f27ce43dee4f 905 {
cparata 0:f27ce43dee4f 906 return 1;
cparata 0:f27ce43dee4f 907 }
cparata 0:f27ce43dee4f 908
cparata 0:f27ce43dee4f 909 return 0;
cparata 0:f27ce43dee4f 910 }
cparata 0:f27ce43dee4f 911
cparata 0:f27ce43dee4f 912
cparata 0:f27ce43dee4f 913 /**
cparata 0:f27ce43dee4f 914 * @brief Set the LSM6DSOX register value
cparata 0:f27ce43dee4f 915 * @param reg address to be written
cparata 0:f27ce43dee4f 916 * @param data value to be written
cparata 0:f27ce43dee4f 917 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 918 */
cparata 0:f27ce43dee4f 919 int LSM6DSOXSensor::write_reg(uint8_t reg, uint8_t data)
cparata 0:f27ce43dee4f 920 {
cparata 0:f27ce43dee4f 921 if (lsm6dsox_write_reg(&_reg_ctx, reg, &data, 1) != 0)
cparata 0:f27ce43dee4f 922 {
cparata 0:f27ce43dee4f 923 return 1;
cparata 0:f27ce43dee4f 924 }
cparata 0:f27ce43dee4f 925
cparata 0:f27ce43dee4f 926 return 0;
cparata 0:f27ce43dee4f 927 }
cparata 0:f27ce43dee4f 928
cparata 0:f27ce43dee4f 929 /**
cparata 0:f27ce43dee4f 930 * @brief Set the interrupt latch
cparata 0:f27ce43dee4f 931 * @param status value to be written
cparata 0:f27ce43dee4f 932 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 933 */
cparata 0:f27ce43dee4f 934 int LSM6DSOXSensor::set_interrupt_latch(uint8_t status)
cparata 0:f27ce43dee4f 935 {
cparata 0:f27ce43dee4f 936 if (status > 1U)
cparata 0:f27ce43dee4f 937 {
cparata 0:f27ce43dee4f 938 return 1;
cparata 0:f27ce43dee4f 939 }
cparata 0:f27ce43dee4f 940
cparata 0:f27ce43dee4f 941 if (lsm6dsox_int_notification_set(&_reg_ctx, (lsm6dsox_lir_t)status) != 0)
cparata 0:f27ce43dee4f 942 {
cparata 0:f27ce43dee4f 943 return 1;
cparata 0:f27ce43dee4f 944 }
cparata 0:f27ce43dee4f 945
cparata 0:f27ce43dee4f 946 return 0;
cparata 0:f27ce43dee4f 947 }
cparata 0:f27ce43dee4f 948
cparata 0:f27ce43dee4f 949 /**
cparata 0:f27ce43dee4f 950 * @brief Enable free fall detection
cparata 0:f27ce43dee4f 951 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 952 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 953 */
cparata 0:f27ce43dee4f 954 int LSM6DSOXSensor::enable_free_fall_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 955 {
cparata 0:f27ce43dee4f 956 int ret = 0;
cparata 0:f27ce43dee4f 957 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 958 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 959
cparata 0:f27ce43dee4f 960 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 961 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 962 {
cparata 0:f27ce43dee4f 963 return 1;
cparata 0:f27ce43dee4f 964 }
cparata 0:f27ce43dee4f 965
cparata 0:f27ce43dee4f 966 /* Full scale selection */
cparata 0:f27ce43dee4f 967 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 968 {
cparata 0:f27ce43dee4f 969 return 1;
cparata 0:f27ce43dee4f 970 }
cparata 0:f27ce43dee4f 971
cparata 0:f27ce43dee4f 972 /* FF_DUR setting */
cparata 0:f27ce43dee4f 973 if (lsm6dsox_ff_dur_set(&_reg_ctx, 0x06) != 0)
cparata 0:f27ce43dee4f 974 {
cparata 0:f27ce43dee4f 975 return 1;
cparata 0:f27ce43dee4f 976 }
cparata 0:f27ce43dee4f 977
cparata 0:f27ce43dee4f 978 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 979 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 980 {
cparata 0:f27ce43dee4f 981 return 1;
cparata 0:f27ce43dee4f 982 }
cparata 0:f27ce43dee4f 983
cparata 0:f27ce43dee4f 984 /* SLEEP_DUR setting */
cparata 0:f27ce43dee4f 985 if (lsm6dsox_act_sleep_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 986 {
cparata 0:f27ce43dee4f 987 return 1;
cparata 0:f27ce43dee4f 988 }
cparata 0:f27ce43dee4f 989
cparata 0:f27ce43dee4f 990 /* FF_THS setting */
cparata 0:f27ce43dee4f 991 if (lsm6dsox_ff_threshold_set(&_reg_ctx, LSM6DSOX_FF_TSH_312mg) != 0)
cparata 0:f27ce43dee4f 992 {
cparata 0:f27ce43dee4f 993 return 1;
cparata 0:f27ce43dee4f 994 }
cparata 0:f27ce43dee4f 995
cparata 0:f27ce43dee4f 996 /* Enable free fall event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 997 switch (int_pin)
cparata 0:f27ce43dee4f 998 {
cparata 0:f27ce43dee4f 999 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1000 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1001 {
cparata 0:f27ce43dee4f 1002 return 1;
cparata 0:f27ce43dee4f 1003 }
cparata 0:f27ce43dee4f 1004
cparata 0:f27ce43dee4f 1005 val1.md1_cfg.int1_ff = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1006
cparata 0:f27ce43dee4f 1007 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1008 {
cparata 0:f27ce43dee4f 1009 return 1;
cparata 0:f27ce43dee4f 1010 }
cparata 0:f27ce43dee4f 1011 break;
cparata 0:f27ce43dee4f 1012
cparata 0:f27ce43dee4f 1013 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1014 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1015 {
cparata 0:f27ce43dee4f 1016 return 1;
cparata 0:f27ce43dee4f 1017 }
cparata 0:f27ce43dee4f 1018
cparata 0:f27ce43dee4f 1019 val2.md2_cfg.int2_ff = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1020
cparata 0:f27ce43dee4f 1021 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1022 {
cparata 0:f27ce43dee4f 1023 return 1;
cparata 0:f27ce43dee4f 1024 }
cparata 0:f27ce43dee4f 1025 break;
cparata 0:f27ce43dee4f 1026
cparata 0:f27ce43dee4f 1027 default:
cparata 0:f27ce43dee4f 1028 ret = 1;
cparata 0:f27ce43dee4f 1029 break;
cparata 0:f27ce43dee4f 1030 }
cparata 0:f27ce43dee4f 1031
cparata 0:f27ce43dee4f 1032 return ret;
cparata 0:f27ce43dee4f 1033 }
cparata 0:f27ce43dee4f 1034
cparata 0:f27ce43dee4f 1035 /**
cparata 0:f27ce43dee4f 1036 * @brief Disable free fall detection
cparata 0:f27ce43dee4f 1037 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1038 */
cparata 0:f27ce43dee4f 1039 int LSM6DSOXSensor::disable_free_fall_detection()
cparata 0:f27ce43dee4f 1040 {
cparata 0:f27ce43dee4f 1041 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1042 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1043
cparata 0:f27ce43dee4f 1044 /* Disable free fall event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1045 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1046 {
cparata 0:f27ce43dee4f 1047 return 1;
cparata 0:f27ce43dee4f 1048 }
cparata 0:f27ce43dee4f 1049
cparata 0:f27ce43dee4f 1050 val1.md1_cfg.int1_ff = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1051
cparata 0:f27ce43dee4f 1052 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1053 {
cparata 0:f27ce43dee4f 1054 return 1;
cparata 0:f27ce43dee4f 1055 }
cparata 0:f27ce43dee4f 1056
cparata 0:f27ce43dee4f 1057 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1058 {
cparata 0:f27ce43dee4f 1059 return 1;
cparata 0:f27ce43dee4f 1060 }
cparata 0:f27ce43dee4f 1061
cparata 0:f27ce43dee4f 1062 val2.md2_cfg.int2_ff = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1063
cparata 0:f27ce43dee4f 1064 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1065 {
cparata 0:f27ce43dee4f 1066 return 1;
cparata 0:f27ce43dee4f 1067 }
cparata 0:f27ce43dee4f 1068
cparata 0:f27ce43dee4f 1069 /* FF_DUR setting */
cparata 0:f27ce43dee4f 1070 if (lsm6dsox_ff_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1071 {
cparata 0:f27ce43dee4f 1072 return 1;
cparata 0:f27ce43dee4f 1073 }
cparata 0:f27ce43dee4f 1074
cparata 0:f27ce43dee4f 1075 /* FF_THS setting */
cparata 0:f27ce43dee4f 1076 if (lsm6dsox_ff_threshold_set(&_reg_ctx, LSM6DSOX_FF_TSH_156mg) != 0)
cparata 0:f27ce43dee4f 1077 {
cparata 0:f27ce43dee4f 1078 return 1;
cparata 0:f27ce43dee4f 1079 }
cparata 0:f27ce43dee4f 1080
cparata 0:f27ce43dee4f 1081 return 0;
cparata 0:f27ce43dee4f 1082 }
cparata 0:f27ce43dee4f 1083
cparata 0:f27ce43dee4f 1084 /**
cparata 0:f27ce43dee4f 1085 * @brief Set free fall threshold
cparata 0:f27ce43dee4f 1086 * @param thr free fall detection threshold
cparata 0:f27ce43dee4f 1087 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1088 */
cparata 0:f27ce43dee4f 1089 int LSM6DSOXSensor::set_free_fall_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 1090 {
cparata 0:f27ce43dee4f 1091 if (lsm6dsox_ff_threshold_set(&_reg_ctx, (lsm6dsox_ff_ths_t)thr) != 0)
cparata 0:f27ce43dee4f 1092 {
cparata 0:f27ce43dee4f 1093 return 1;
cparata 0:f27ce43dee4f 1094 }
cparata 0:f27ce43dee4f 1095
cparata 0:f27ce43dee4f 1096 return 0;
cparata 0:f27ce43dee4f 1097 }
cparata 0:f27ce43dee4f 1098
cparata 0:f27ce43dee4f 1099
cparata 0:f27ce43dee4f 1100 /**
cparata 0:f27ce43dee4f 1101 * @brief Set free fall duration
cparata 0:f27ce43dee4f 1102 * @param dur free fall detection duration
cparata 0:f27ce43dee4f 1103 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1104 */
cparata 0:f27ce43dee4f 1105 int LSM6DSOXSensor::set_free_fall_duration(uint8_t dur)
cparata 0:f27ce43dee4f 1106 {
cparata 0:f27ce43dee4f 1107 if (lsm6dsox_ff_dur_set(&_reg_ctx, dur) != 0)
cparata 0:f27ce43dee4f 1108 {
cparata 0:f27ce43dee4f 1109 return 1;
cparata 0:f27ce43dee4f 1110 }
cparata 0:f27ce43dee4f 1111
cparata 0:f27ce43dee4f 1112 return 0;
cparata 0:f27ce43dee4f 1113 }
cparata 0:f27ce43dee4f 1114
cparata 0:f27ce43dee4f 1115
cparata 0:f27ce43dee4f 1116 /**
cparata 0:f27ce43dee4f 1117 * @brief Enable pedometer
cparata 0:f27ce43dee4f 1118 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1119 */
cparata 0:f27ce43dee4f 1120 int LSM6DSOXSensor::enable_pedometer()
cparata 0:f27ce43dee4f 1121 {
cparata 0:f27ce43dee4f 1122 lsm6dsox_pin_int1_route_t val;
cparata 0:f27ce43dee4f 1123
cparata 0:f27ce43dee4f 1124 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1125 if (set_x_odr(26.0f) != 0)
cparata 0:f27ce43dee4f 1126 {
cparata 0:f27ce43dee4f 1127 return 1;
cparata 0:f27ce43dee4f 1128 }
cparata 0:f27ce43dee4f 1129
cparata 0:f27ce43dee4f 1130 /* Full scale selection */
cparata 0:f27ce43dee4f 1131 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1132 {
cparata 0:f27ce43dee4f 1133 return 1;
cparata 0:f27ce43dee4f 1134 }
cparata 0:f27ce43dee4f 1135
cparata 0:f27ce43dee4f 1136 /* Enable pedometer algorithm. */
cparata 0:f27ce43dee4f 1137 if (lsm6dsox_pedo_sens_set(&_reg_ctx, LSM6DSOX_PEDO_BASE_MODE) != 0)
cparata 0:f27ce43dee4f 1138 {
cparata 0:f27ce43dee4f 1139 return 1;
cparata 0:f27ce43dee4f 1140 }
cparata 0:f27ce43dee4f 1141
cparata 0:f27ce43dee4f 1142 /* Enable step detector on INT1 pin */
cparata 0:f27ce43dee4f 1143 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val) != 0)
cparata 0:f27ce43dee4f 1144 {
cparata 0:f27ce43dee4f 1145 return 1;
cparata 0:f27ce43dee4f 1146 }
cparata 0:f27ce43dee4f 1147
cparata 0:f27ce43dee4f 1148 val.emb_func_int1.int1_step_detector = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1149
cparata 0:f27ce43dee4f 1150 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val) != 0)
cparata 0:f27ce43dee4f 1151 {
cparata 0:f27ce43dee4f 1152 return 1;
cparata 0:f27ce43dee4f 1153 }
cparata 0:f27ce43dee4f 1154
cparata 0:f27ce43dee4f 1155 return 0;
cparata 0:f27ce43dee4f 1156 }
cparata 0:f27ce43dee4f 1157
cparata 0:f27ce43dee4f 1158 /**
cparata 0:f27ce43dee4f 1159 * @brief Disable pedometer
cparata 0:f27ce43dee4f 1160 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1161 */
cparata 0:f27ce43dee4f 1162 int LSM6DSOXSensor::disable_pedometer()
cparata 0:f27ce43dee4f 1163 {
cparata 0:f27ce43dee4f 1164 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1165
cparata 0:f27ce43dee4f 1166 /* Disable step detector on INT1 pin */
cparata 0:f27ce43dee4f 1167 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1168 {
cparata 0:f27ce43dee4f 1169 return 1;
cparata 0:f27ce43dee4f 1170 }
cparata 0:f27ce43dee4f 1171
cparata 0:f27ce43dee4f 1172 val1.emb_func_int1.int1_step_detector = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1173
cparata 0:f27ce43dee4f 1174 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1175 {
cparata 0:f27ce43dee4f 1176 return 1;
cparata 0:f27ce43dee4f 1177 }
cparata 0:f27ce43dee4f 1178
cparata 0:f27ce43dee4f 1179 /* Disable pedometer algorithm. */
cparata 0:f27ce43dee4f 1180 if (lsm6dsox_pedo_sens_set(&_reg_ctx, LSM6DSOX_PEDO_DISABLE) != 0)
cparata 0:f27ce43dee4f 1181 {
cparata 0:f27ce43dee4f 1182 return 1;
cparata 0:f27ce43dee4f 1183 }
cparata 0:f27ce43dee4f 1184
cparata 0:f27ce43dee4f 1185 return 0;
cparata 0:f27ce43dee4f 1186 }
cparata 0:f27ce43dee4f 1187
cparata 0:f27ce43dee4f 1188 /**
cparata 0:f27ce43dee4f 1189 * @brief Get step count
cparata 0:f27ce43dee4f 1190 * @param step_count step counter
cparata 0:f27ce43dee4f 1191 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1192 */
cparata 0:f27ce43dee4f 1193 int LSM6DSOXSensor::get_step_counter(uint16_t *step_count)
cparata 0:f27ce43dee4f 1194 {
cparata 0:f27ce43dee4f 1195 if (lsm6dsox_number_of_steps_get(&_reg_ctx, (uint8_t *)step_count) != 0)
cparata 0:f27ce43dee4f 1196 {
cparata 0:f27ce43dee4f 1197 return 1;
cparata 0:f27ce43dee4f 1198 }
cparata 0:f27ce43dee4f 1199
cparata 0:f27ce43dee4f 1200 return 0;
cparata 0:f27ce43dee4f 1201 }
cparata 0:f27ce43dee4f 1202
cparata 0:f27ce43dee4f 1203 /**
cparata 0:f27ce43dee4f 1204 * @brief Enable step counter reset
cparata 0:f27ce43dee4f 1205 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1206 */
cparata 0:f27ce43dee4f 1207 int LSM6DSOXSensor::reset_step_counter()
cparata 0:f27ce43dee4f 1208 {
cparata 0:f27ce43dee4f 1209 if (lsm6dsox_steps_reset(&_reg_ctx) != 0)
cparata 0:f27ce43dee4f 1210 {
cparata 0:f27ce43dee4f 1211 return 1;
cparata 0:f27ce43dee4f 1212 }
cparata 0:f27ce43dee4f 1213
cparata 0:f27ce43dee4f 1214 return 0;
cparata 0:f27ce43dee4f 1215 }
cparata 0:f27ce43dee4f 1216
cparata 0:f27ce43dee4f 1217 /**
cparata 0:f27ce43dee4f 1218 * @brief Enable tilt detection
cparata 0:f27ce43dee4f 1219 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1220 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1221 */
cparata 0:f27ce43dee4f 1222 int LSM6DSOXSensor::enable_tilt_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1223 {
cparata 0:f27ce43dee4f 1224 int ret = 0;
cparata 0:f27ce43dee4f 1225 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1226 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1227
cparata 0:f27ce43dee4f 1228 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1229 if (set_x_odr(26.0f) != 0)
cparata 0:f27ce43dee4f 1230 {
cparata 0:f27ce43dee4f 1231 return 1;
cparata 0:f27ce43dee4f 1232 }
cparata 0:f27ce43dee4f 1233
cparata 0:f27ce43dee4f 1234 /* Full scale selection */
cparata 0:f27ce43dee4f 1235 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1236 {
cparata 0:f27ce43dee4f 1237 return 1;
cparata 0:f27ce43dee4f 1238 }
cparata 0:f27ce43dee4f 1239
cparata 0:f27ce43dee4f 1240 /* Enable tilt calculation. */
cparata 0:f27ce43dee4f 1241 if (lsm6dsox_tilt_sens_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1242 {
cparata 0:f27ce43dee4f 1243 return 1;
cparata 0:f27ce43dee4f 1244 }
cparata 0:f27ce43dee4f 1245
cparata 0:f27ce43dee4f 1246 /* Enable tilt event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1247 switch (int_pin)
cparata 0:f27ce43dee4f 1248 {
cparata 0:f27ce43dee4f 1249 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1250 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1251 {
cparata 0:f27ce43dee4f 1252 return 1;
cparata 0:f27ce43dee4f 1253 }
cparata 0:f27ce43dee4f 1254
cparata 0:f27ce43dee4f 1255 val1.emb_func_int1.int1_tilt = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1256
cparata 0:f27ce43dee4f 1257 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1258 {
cparata 0:f27ce43dee4f 1259 return 1;
cparata 0:f27ce43dee4f 1260 }
cparata 0:f27ce43dee4f 1261 break;
cparata 0:f27ce43dee4f 1262
cparata 0:f27ce43dee4f 1263 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1264 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1265 {
cparata 0:f27ce43dee4f 1266 return 1;
cparata 0:f27ce43dee4f 1267 }
cparata 0:f27ce43dee4f 1268
cparata 0:f27ce43dee4f 1269 val2.emb_func_int2.int2_tilt = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1270
cparata 0:f27ce43dee4f 1271 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1272 {
cparata 0:f27ce43dee4f 1273 return 1;
cparata 0:f27ce43dee4f 1274 }
cparata 0:f27ce43dee4f 1275 break;
cparata 0:f27ce43dee4f 1276
cparata 0:f27ce43dee4f 1277 default:
cparata 0:f27ce43dee4f 1278 ret = 1;
cparata 0:f27ce43dee4f 1279 break;
cparata 0:f27ce43dee4f 1280 }
cparata 0:f27ce43dee4f 1281
cparata 0:f27ce43dee4f 1282 return ret;
cparata 0:f27ce43dee4f 1283 }
cparata 0:f27ce43dee4f 1284
cparata 0:f27ce43dee4f 1285 /**
cparata 0:f27ce43dee4f 1286 * @brief Disable tilt detection
cparata 0:f27ce43dee4f 1287 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1288 */
cparata 0:f27ce43dee4f 1289 int LSM6DSOXSensor::disable_tilt_detection()
cparata 0:f27ce43dee4f 1290 {
cparata 0:f27ce43dee4f 1291 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1292 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1293
cparata 0:f27ce43dee4f 1294 /* Disable tilt event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1295 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1296 {
cparata 0:f27ce43dee4f 1297 return 1;
cparata 0:f27ce43dee4f 1298 }
cparata 0:f27ce43dee4f 1299
cparata 0:f27ce43dee4f 1300 val1.emb_func_int1.int1_tilt = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1301
cparata 0:f27ce43dee4f 1302 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1303 {
cparata 0:f27ce43dee4f 1304 return 1;
cparata 0:f27ce43dee4f 1305 }
cparata 0:f27ce43dee4f 1306
cparata 0:f27ce43dee4f 1307 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1308 {
cparata 0:f27ce43dee4f 1309 return 1;
cparata 0:f27ce43dee4f 1310 }
cparata 0:f27ce43dee4f 1311
cparata 0:f27ce43dee4f 1312 val2.emb_func_int2.int2_tilt = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1313
cparata 0:f27ce43dee4f 1314 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1315 {
cparata 0:f27ce43dee4f 1316 return 1;
cparata 0:f27ce43dee4f 1317 }
cparata 0:f27ce43dee4f 1318
cparata 0:f27ce43dee4f 1319 /* Disable tilt calculation. */
cparata 0:f27ce43dee4f 1320 if (lsm6dsox_tilt_sens_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1321 {
cparata 0:f27ce43dee4f 1322 return 1;
cparata 0:f27ce43dee4f 1323 }
cparata 0:f27ce43dee4f 1324
cparata 0:f27ce43dee4f 1325 return 0;
cparata 0:f27ce43dee4f 1326 }
cparata 0:f27ce43dee4f 1327
cparata 0:f27ce43dee4f 1328 /**
cparata 0:f27ce43dee4f 1329 * @brief Enable wake up detection
cparata 0:f27ce43dee4f 1330 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1331 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1332 */
cparata 0:f27ce43dee4f 1333 int LSM6DSOXSensor::enable_wake_up_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1334 {
cparata 0:f27ce43dee4f 1335 int ret = 0;
cparata 0:f27ce43dee4f 1336 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1337 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1338
cparata 0:f27ce43dee4f 1339 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1340 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1341 {
cparata 0:f27ce43dee4f 1342 return 1;
cparata 0:f27ce43dee4f 1343 }
cparata 0:f27ce43dee4f 1344
cparata 0:f27ce43dee4f 1345 /* Full scale selection */
cparata 0:f27ce43dee4f 1346 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1347 {
cparata 0:f27ce43dee4f 1348 return 1;
cparata 0:f27ce43dee4f 1349 }
cparata 0:f27ce43dee4f 1350
cparata 0:f27ce43dee4f 1351 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 1352 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1353 {
cparata 0:f27ce43dee4f 1354 return 1;
cparata 0:f27ce43dee4f 1355 }
cparata 0:f27ce43dee4f 1356
cparata 0:f27ce43dee4f 1357 /* Set wake up threshold. */
cparata 0:f27ce43dee4f 1358 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, 0x02) != 0)
cparata 0:f27ce43dee4f 1359 {
cparata 0:f27ce43dee4f 1360 return 1;
cparata 0:f27ce43dee4f 1361 }
cparata 0:f27ce43dee4f 1362
cparata 0:f27ce43dee4f 1363 /* Enable wake up event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1364 switch (int_pin)
cparata 0:f27ce43dee4f 1365 {
cparata 0:f27ce43dee4f 1366 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1367 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1368 {
cparata 0:f27ce43dee4f 1369 return 1;
cparata 0:f27ce43dee4f 1370 }
cparata 0:f27ce43dee4f 1371
cparata 0:f27ce43dee4f 1372 val1.md1_cfg.int1_wu = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1373
cparata 0:f27ce43dee4f 1374 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1375 {
cparata 0:f27ce43dee4f 1376 return 1;
cparata 0:f27ce43dee4f 1377 }
cparata 0:f27ce43dee4f 1378 break;
cparata 0:f27ce43dee4f 1379
cparata 0:f27ce43dee4f 1380 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1381 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1382 {
cparata 0:f27ce43dee4f 1383 return 1;
cparata 0:f27ce43dee4f 1384 }
cparata 0:f27ce43dee4f 1385
cparata 0:f27ce43dee4f 1386 val2.md2_cfg.int2_wu = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1387
cparata 0:f27ce43dee4f 1388 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1389 {
cparata 0:f27ce43dee4f 1390 return 1;
cparata 0:f27ce43dee4f 1391 }
cparata 0:f27ce43dee4f 1392 break;
cparata 0:f27ce43dee4f 1393
cparata 0:f27ce43dee4f 1394 default:
cparata 0:f27ce43dee4f 1395 ret = 1;
cparata 0:f27ce43dee4f 1396 break;
cparata 0:f27ce43dee4f 1397 }
cparata 0:f27ce43dee4f 1398
cparata 0:f27ce43dee4f 1399 return ret;
cparata 0:f27ce43dee4f 1400 }
cparata 0:f27ce43dee4f 1401
cparata 0:f27ce43dee4f 1402
cparata 0:f27ce43dee4f 1403 /**
cparata 0:f27ce43dee4f 1404 * @brief Disable wake up detection
cparata 0:f27ce43dee4f 1405 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1406 */
cparata 0:f27ce43dee4f 1407 int LSM6DSOXSensor::disable_wake_up_detection()
cparata 0:f27ce43dee4f 1408 {
cparata 0:f27ce43dee4f 1409 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1410 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1411
cparata 0:f27ce43dee4f 1412 /* Disable wake up event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1413 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1414 {
cparata 0:f27ce43dee4f 1415 return 1;
cparata 0:f27ce43dee4f 1416 }
cparata 0:f27ce43dee4f 1417
cparata 0:f27ce43dee4f 1418 val1.md1_cfg.int1_wu = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1419
cparata 0:f27ce43dee4f 1420 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1421 {
cparata 0:f27ce43dee4f 1422 return 1;
cparata 0:f27ce43dee4f 1423 }
cparata 0:f27ce43dee4f 1424
cparata 0:f27ce43dee4f 1425 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1426 {
cparata 0:f27ce43dee4f 1427 return 1;
cparata 0:f27ce43dee4f 1428 }
cparata 0:f27ce43dee4f 1429
cparata 0:f27ce43dee4f 1430 val2.md2_cfg.int2_wu = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1431
cparata 0:f27ce43dee4f 1432 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1433 {
cparata 0:f27ce43dee4f 1434 return 1;
cparata 0:f27ce43dee4f 1435 }
cparata 0:f27ce43dee4f 1436
cparata 0:f27ce43dee4f 1437 /* Reset wake up threshold. */
cparata 0:f27ce43dee4f 1438 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1439 {
cparata 0:f27ce43dee4f 1440 return 1;
cparata 0:f27ce43dee4f 1441 }
cparata 0:f27ce43dee4f 1442
cparata 0:f27ce43dee4f 1443 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 1444 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1445 {
cparata 0:f27ce43dee4f 1446 return 1;
cparata 0:f27ce43dee4f 1447 }
cparata 0:f27ce43dee4f 1448
cparata 0:f27ce43dee4f 1449 return 0;
cparata 0:f27ce43dee4f 1450 }
cparata 0:f27ce43dee4f 1451
cparata 0:f27ce43dee4f 1452 /**
cparata 0:f27ce43dee4f 1453 * @brief Set wake up threshold
cparata 0:f27ce43dee4f 1454 * @param thr wake up detection threshold
cparata 0:f27ce43dee4f 1455 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1456 */
cparata 0:f27ce43dee4f 1457 int LSM6DSOXSensor::set_wake_up_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 1458 {
cparata 0:f27ce43dee4f 1459 /* Set wake up threshold. */
cparata 0:f27ce43dee4f 1460 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, thr) != 0)
cparata 0:f27ce43dee4f 1461 {
cparata 0:f27ce43dee4f 1462 return 1;
cparata 0:f27ce43dee4f 1463 }
cparata 0:f27ce43dee4f 1464
cparata 0:f27ce43dee4f 1465 return 0;
cparata 0:f27ce43dee4f 1466 }
cparata 0:f27ce43dee4f 1467
cparata 0:f27ce43dee4f 1468 /**
cparata 0:f27ce43dee4f 1469 * @brief Set wake up duration
cparata 0:f27ce43dee4f 1470 * @param dur wake up detection duration
cparata 0:f27ce43dee4f 1471 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1472 */
cparata 0:f27ce43dee4f 1473 int LSM6DSOXSensor::set_wake_up_duration(uint8_t dur)
cparata 0:f27ce43dee4f 1474 {
cparata 0:f27ce43dee4f 1475 /* Set wake up duration. */
cparata 0:f27ce43dee4f 1476 if (lsm6dsox_wkup_dur_set(&_reg_ctx, dur) != 0)
cparata 0:f27ce43dee4f 1477 {
cparata 0:f27ce43dee4f 1478 return 1;
cparata 0:f27ce43dee4f 1479 }
cparata 0:f27ce43dee4f 1480
cparata 0:f27ce43dee4f 1481 return 0;
cparata 0:f27ce43dee4f 1482 }
cparata 0:f27ce43dee4f 1483
cparata 0:f27ce43dee4f 1484 /**
cparata 0:f27ce43dee4f 1485 * @brief Enable single tap detection
cparata 0:f27ce43dee4f 1486 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1487 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1488 */
cparata 0:f27ce43dee4f 1489 int LSM6DSOXSensor::enable_single_tap_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1490 {
cparata 0:f27ce43dee4f 1491 int ret = 0;
cparata 0:f27ce43dee4f 1492 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1493 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1494
cparata 0:f27ce43dee4f 1495 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1496 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1497 {
cparata 0:f27ce43dee4f 1498 return 1;
cparata 0:f27ce43dee4f 1499 }
cparata 0:f27ce43dee4f 1500
cparata 0:f27ce43dee4f 1501 /* Full scale selection */
cparata 0:f27ce43dee4f 1502 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1503 {
cparata 0:f27ce43dee4f 1504 return 1;
cparata 0:f27ce43dee4f 1505 }
cparata 0:f27ce43dee4f 1506
cparata 0:f27ce43dee4f 1507 /* Enable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1508 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1509 {
cparata 0:f27ce43dee4f 1510 return 1;
cparata 0:f27ce43dee4f 1511 }
cparata 0:f27ce43dee4f 1512
cparata 0:f27ce43dee4f 1513 /* Enable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1514 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1515 {
cparata 0:f27ce43dee4f 1516 return 1;
cparata 0:f27ce43dee4f 1517 }
cparata 0:f27ce43dee4f 1518
cparata 0:f27ce43dee4f 1519 /* Enable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1520 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1521 {
cparata 0:f27ce43dee4f 1522 return 1;
cparata 0:f27ce43dee4f 1523 }
cparata 0:f27ce43dee4f 1524
cparata 0:f27ce43dee4f 1525 /* Set tap threshold. */
cparata 0:f27ce43dee4f 1526 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 1527 {
cparata 0:f27ce43dee4f 1528 return 1;
cparata 0:f27ce43dee4f 1529 }
cparata 0:f27ce43dee4f 1530
cparata 0:f27ce43dee4f 1531 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 1532 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x02) != 0)
cparata 0:f27ce43dee4f 1533 {
cparata 0:f27ce43dee4f 1534 return 1;
cparata 0:f27ce43dee4f 1535 }
cparata 0:f27ce43dee4f 1536
cparata 0:f27ce43dee4f 1537 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 1538 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x01) != 0)
cparata 0:f27ce43dee4f 1539 {
cparata 0:f27ce43dee4f 1540 return 1;
cparata 0:f27ce43dee4f 1541 }
cparata 0:f27ce43dee4f 1542
cparata 0:f27ce43dee4f 1543 /* _NOTE_: Tap duration time window - don't care for single tap. */
cparata 0:f27ce43dee4f 1544
cparata 0:f27ce43dee4f 1545 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
cparata 0:f27ce43dee4f 1546
cparata 0:f27ce43dee4f 1547 /* Enable single tap event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1548 switch (int_pin)
cparata 0:f27ce43dee4f 1549 {
cparata 0:f27ce43dee4f 1550 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1551 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1552 {
cparata 0:f27ce43dee4f 1553 return 1;
cparata 0:f27ce43dee4f 1554 }
cparata 0:f27ce43dee4f 1555
cparata 0:f27ce43dee4f 1556 val1.md1_cfg.int1_single_tap = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1557
cparata 0:f27ce43dee4f 1558 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1559 {
cparata 0:f27ce43dee4f 1560 return 1;
cparata 0:f27ce43dee4f 1561 }
cparata 0:f27ce43dee4f 1562 break;
cparata 0:f27ce43dee4f 1563
cparata 0:f27ce43dee4f 1564 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1565 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1566 {
cparata 0:f27ce43dee4f 1567 return 1;
cparata 0:f27ce43dee4f 1568 }
cparata 0:f27ce43dee4f 1569
cparata 0:f27ce43dee4f 1570 val2.md2_cfg.int2_single_tap = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1571
cparata 0:f27ce43dee4f 1572 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1573 {
cparata 0:f27ce43dee4f 1574 return 1;
cparata 0:f27ce43dee4f 1575 }
cparata 0:f27ce43dee4f 1576 break;
cparata 0:f27ce43dee4f 1577
cparata 0:f27ce43dee4f 1578 default:
cparata 0:f27ce43dee4f 1579 ret = 1;
cparata 0:f27ce43dee4f 1580 break;
cparata 0:f27ce43dee4f 1581 }
cparata 0:f27ce43dee4f 1582
cparata 0:f27ce43dee4f 1583 return ret;
cparata 0:f27ce43dee4f 1584 }
cparata 0:f27ce43dee4f 1585
cparata 0:f27ce43dee4f 1586 /**
cparata 0:f27ce43dee4f 1587 * @brief Disable single tap detection
cparata 0:f27ce43dee4f 1588 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1589 */
cparata 0:f27ce43dee4f 1590 int LSM6DSOXSensor::disable_single_tap_detection()
cparata 0:f27ce43dee4f 1591 {
cparata 0:f27ce43dee4f 1592 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1593 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1594
cparata 0:f27ce43dee4f 1595 /* Disable single tap event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1596 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1597 {
cparata 0:f27ce43dee4f 1598 return 1;
cparata 0:f27ce43dee4f 1599 }
cparata 0:f27ce43dee4f 1600
cparata 0:f27ce43dee4f 1601 val1.md1_cfg.int1_single_tap = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1602
cparata 0:f27ce43dee4f 1603 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1604 {
cparata 0:f27ce43dee4f 1605 return 1;
cparata 0:f27ce43dee4f 1606 }
cparata 0:f27ce43dee4f 1607
cparata 0:f27ce43dee4f 1608 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1609 {
cparata 0:f27ce43dee4f 1610 return 1;
cparata 0:f27ce43dee4f 1611 }
cparata 0:f27ce43dee4f 1612
cparata 0:f27ce43dee4f 1613 val2.md2_cfg.int2_single_tap = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1614
cparata 0:f27ce43dee4f 1615 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1616 {
cparata 0:f27ce43dee4f 1617 return 1;
cparata 0:f27ce43dee4f 1618 }
cparata 0:f27ce43dee4f 1619
cparata 0:f27ce43dee4f 1620 /* Reset tap quiet time window. */
cparata 0:f27ce43dee4f 1621 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1622 {
cparata 0:f27ce43dee4f 1623 return 1;
cparata 0:f27ce43dee4f 1624 }
cparata 0:f27ce43dee4f 1625
cparata 0:f27ce43dee4f 1626 /* Reset tap shock time window. */
cparata 0:f27ce43dee4f 1627 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1628 {
cparata 0:f27ce43dee4f 1629 return 1;
cparata 0:f27ce43dee4f 1630 }
cparata 0:f27ce43dee4f 1631
cparata 0:f27ce43dee4f 1632 /* Reset tap threshold. */
cparata 0:f27ce43dee4f 1633 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1634 {
cparata 0:f27ce43dee4f 1635 return 1;
cparata 0:f27ce43dee4f 1636 }
cparata 0:f27ce43dee4f 1637
cparata 0:f27ce43dee4f 1638 /* Disable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1639 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1640 {
cparata 0:f27ce43dee4f 1641 return 1;
cparata 0:f27ce43dee4f 1642 }
cparata 0:f27ce43dee4f 1643
cparata 0:f27ce43dee4f 1644 /* Disable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1645 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1646 {
cparata 0:f27ce43dee4f 1647 return 1;
cparata 0:f27ce43dee4f 1648 }
cparata 0:f27ce43dee4f 1649
cparata 0:f27ce43dee4f 1650 /* Disable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1651 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1652 {
cparata 0:f27ce43dee4f 1653 return 1;
cparata 0:f27ce43dee4f 1654 }
cparata 0:f27ce43dee4f 1655
cparata 0:f27ce43dee4f 1656 return 0;
cparata 0:f27ce43dee4f 1657 }
cparata 0:f27ce43dee4f 1658
cparata 0:f27ce43dee4f 1659 /**
cparata 0:f27ce43dee4f 1660 * @brief Enable double tap detection
cparata 0:f27ce43dee4f 1661 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1662 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1663 */
cparata 0:f27ce43dee4f 1664 int LSM6DSOXSensor::enable_double_tap_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1665 {
cparata 0:f27ce43dee4f 1666 int ret = 0;
cparata 0:f27ce43dee4f 1667 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1668 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1669
cparata 0:f27ce43dee4f 1670 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1671 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1672 {
cparata 0:f27ce43dee4f 1673 return 1;
cparata 0:f27ce43dee4f 1674 }
cparata 0:f27ce43dee4f 1675
cparata 0:f27ce43dee4f 1676 /* Full scale selection */
cparata 0:f27ce43dee4f 1677 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1678 {
cparata 0:f27ce43dee4f 1679 return 1;
cparata 0:f27ce43dee4f 1680 }
cparata 0:f27ce43dee4f 1681
cparata 0:f27ce43dee4f 1682 /* Enable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1683 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1684 {
cparata 0:f27ce43dee4f 1685 return 1;
cparata 0:f27ce43dee4f 1686 }
cparata 0:f27ce43dee4f 1687
cparata 0:f27ce43dee4f 1688 /* Enable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1689 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1690 {
cparata 0:f27ce43dee4f 1691 return 1;
cparata 0:f27ce43dee4f 1692 }
cparata 0:f27ce43dee4f 1693
cparata 0:f27ce43dee4f 1694 /* Enable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1695 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1696 {
cparata 0:f27ce43dee4f 1697 return 1;
cparata 0:f27ce43dee4f 1698 }
cparata 0:f27ce43dee4f 1699
cparata 0:f27ce43dee4f 1700 /* Set tap threshold. */
cparata 0:f27ce43dee4f 1701 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 1702 {
cparata 0:f27ce43dee4f 1703 return 1;
cparata 0:f27ce43dee4f 1704 }
cparata 0:f27ce43dee4f 1705
cparata 0:f27ce43dee4f 1706 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 1707 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x03) != 0)
cparata 0:f27ce43dee4f 1708 {
cparata 0:f27ce43dee4f 1709 return 1;
cparata 0:f27ce43dee4f 1710 }
cparata 0:f27ce43dee4f 1711
cparata 0:f27ce43dee4f 1712 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 1713 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x03) != 0)
cparata 0:f27ce43dee4f 1714 {
cparata 0:f27ce43dee4f 1715 return 1;
cparata 0:f27ce43dee4f 1716 }
cparata 0:f27ce43dee4f 1717
cparata 0:f27ce43dee4f 1718 /* Set tap duration time window. */
cparata 0:f27ce43dee4f 1719 if (lsm6dsox_tap_dur_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 1720 {
cparata 0:f27ce43dee4f 1721 return 1;
cparata 0:f27ce43dee4f 1722 }
cparata 0:f27ce43dee4f 1723
cparata 0:f27ce43dee4f 1724 /* Single and double tap enabled. */
cparata 0:f27ce43dee4f 1725 if (lsm6dsox_tap_mode_set(&_reg_ctx, LSM6DSOX_BOTH_SINGLE_DOUBLE) != 0)
cparata 0:f27ce43dee4f 1726 {
cparata 0:f27ce43dee4f 1727 return 1;
cparata 0:f27ce43dee4f 1728 }
cparata 0:f27ce43dee4f 1729
cparata 0:f27ce43dee4f 1730 /* Enable double tap event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1731 switch (int_pin)
cparata 0:f27ce43dee4f 1732 {
cparata 0:f27ce43dee4f 1733 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1734 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1735 {
cparata 0:f27ce43dee4f 1736 return 1;
cparata 0:f27ce43dee4f 1737 }
cparata 0:f27ce43dee4f 1738
cparata 0:f27ce43dee4f 1739 val1.md1_cfg.int1_double_tap = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1740
cparata 0:f27ce43dee4f 1741 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1742 {
cparata 0:f27ce43dee4f 1743 return 1;
cparata 0:f27ce43dee4f 1744 }
cparata 0:f27ce43dee4f 1745 break;
cparata 0:f27ce43dee4f 1746
cparata 0:f27ce43dee4f 1747 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1748 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1749 {
cparata 0:f27ce43dee4f 1750 return 1;
cparata 0:f27ce43dee4f 1751 }
cparata 0:f27ce43dee4f 1752
cparata 0:f27ce43dee4f 1753 val2.md2_cfg.int2_double_tap = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1754
cparata 0:f27ce43dee4f 1755 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1756 {
cparata 0:f27ce43dee4f 1757 return 1;
cparata 0:f27ce43dee4f 1758 }
cparata 0:f27ce43dee4f 1759 break;
cparata 0:f27ce43dee4f 1760
cparata 0:f27ce43dee4f 1761 default:
cparata 0:f27ce43dee4f 1762 ret = 1;
cparata 0:f27ce43dee4f 1763 break;
cparata 0:f27ce43dee4f 1764 }
cparata 0:f27ce43dee4f 1765
cparata 0:f27ce43dee4f 1766 return ret;
cparata 0:f27ce43dee4f 1767 }
cparata 0:f27ce43dee4f 1768
cparata 0:f27ce43dee4f 1769 /**
cparata 0:f27ce43dee4f 1770 * @brief Disable double tap detection
cparata 0:f27ce43dee4f 1771 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1772 */
cparata 0:f27ce43dee4f 1773 int LSM6DSOXSensor::disable_double_tap_detection()
cparata 0:f27ce43dee4f 1774 {
cparata 0:f27ce43dee4f 1775 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1776 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1777
cparata 0:f27ce43dee4f 1778 /* Disable double tap event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1779 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1780 {
cparata 0:f27ce43dee4f 1781 return 1;
cparata 0:f27ce43dee4f 1782 }
cparata 0:f27ce43dee4f 1783
cparata 0:f27ce43dee4f 1784 val1.md1_cfg.int1_double_tap = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1785
cparata 0:f27ce43dee4f 1786 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1787 {
cparata 0:f27ce43dee4f 1788 return 1;
cparata 0:f27ce43dee4f 1789 }
cparata 0:f27ce43dee4f 1790
cparata 0:f27ce43dee4f 1791 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1792 {
cparata 0:f27ce43dee4f 1793 return 1;
cparata 0:f27ce43dee4f 1794 }
cparata 0:f27ce43dee4f 1795
cparata 0:f27ce43dee4f 1796 val2.md2_cfg.int2_double_tap = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 1797
cparata 0:f27ce43dee4f 1798 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1799 {
cparata 0:f27ce43dee4f 1800 return 1;
cparata 0:f27ce43dee4f 1801 }
cparata 0:f27ce43dee4f 1802
cparata 0:f27ce43dee4f 1803 /* Only single tap enabled. */
cparata 0:f27ce43dee4f 1804 if (lsm6dsox_tap_mode_set(&_reg_ctx, LSM6DSOX_ONLY_SINGLE) != 0)
cparata 0:f27ce43dee4f 1805 {
cparata 0:f27ce43dee4f 1806 return 1;
cparata 0:f27ce43dee4f 1807 }
cparata 0:f27ce43dee4f 1808
cparata 0:f27ce43dee4f 1809 /* Reset tap duration time window. */
cparata 0:f27ce43dee4f 1810 if (lsm6dsox_tap_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1811 {
cparata 0:f27ce43dee4f 1812 return 1;
cparata 0:f27ce43dee4f 1813 }
cparata 0:f27ce43dee4f 1814
cparata 0:f27ce43dee4f 1815 /* Reset tap quiet time window. */
cparata 0:f27ce43dee4f 1816 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1817 {
cparata 0:f27ce43dee4f 1818 return 1;
cparata 0:f27ce43dee4f 1819 }
cparata 0:f27ce43dee4f 1820
cparata 0:f27ce43dee4f 1821 /* Reset tap shock time window. */
cparata 0:f27ce43dee4f 1822 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1823 {
cparata 0:f27ce43dee4f 1824 return 1;
cparata 0:f27ce43dee4f 1825 }
cparata 0:f27ce43dee4f 1826
cparata 0:f27ce43dee4f 1827 /* Reset tap threshold. */
cparata 0:f27ce43dee4f 1828 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1829 {
cparata 0:f27ce43dee4f 1830 return 1;
cparata 0:f27ce43dee4f 1831 }
cparata 0:f27ce43dee4f 1832
cparata 0:f27ce43dee4f 1833 /* Disable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1834 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1835 {
cparata 0:f27ce43dee4f 1836 return 1;
cparata 0:f27ce43dee4f 1837 }
cparata 0:f27ce43dee4f 1838
cparata 0:f27ce43dee4f 1839 /* Disable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1840 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1841 {
cparata 0:f27ce43dee4f 1842 return 1;
cparata 0:f27ce43dee4f 1843 }
cparata 0:f27ce43dee4f 1844
cparata 0:f27ce43dee4f 1845 /* Disable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1846 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1847 {
cparata 0:f27ce43dee4f 1848 return 1;
cparata 0:f27ce43dee4f 1849 }
cparata 0:f27ce43dee4f 1850
cparata 0:f27ce43dee4f 1851 return 0;
cparata 0:f27ce43dee4f 1852 }
cparata 0:f27ce43dee4f 1853
cparata 0:f27ce43dee4f 1854 /**
cparata 0:f27ce43dee4f 1855 * @brief Set tap threshold
cparata 0:f27ce43dee4f 1856 * @param thr tap threshold
cparata 0:f27ce43dee4f 1857 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1858 */
cparata 0:f27ce43dee4f 1859 int LSM6DSOXSensor::set_tap_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 1860 {
cparata 0:f27ce43dee4f 1861 /* Set tap threshold. */
cparata 0:f27ce43dee4f 1862 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, thr) != 0)
cparata 0:f27ce43dee4f 1863 {
cparata 0:f27ce43dee4f 1864 return 1;
cparata 0:f27ce43dee4f 1865 }
cparata 0:f27ce43dee4f 1866
cparata 0:f27ce43dee4f 1867 return 0;
cparata 0:f27ce43dee4f 1868 }
cparata 0:f27ce43dee4f 1869
cparata 0:f27ce43dee4f 1870 /**
cparata 0:f27ce43dee4f 1871 * @brief Set tap shock time
cparata 0:f27ce43dee4f 1872 * @param time tap shock time
cparata 0:f27ce43dee4f 1873 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1874 */
cparata 0:f27ce43dee4f 1875 int LSM6DSOXSensor::set_tap_shock_time(uint8_t time)
cparata 0:f27ce43dee4f 1876 {
cparata 0:f27ce43dee4f 1877 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 1878 if (lsm6dsox_tap_shock_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 1879 {
cparata 0:f27ce43dee4f 1880 return 1;
cparata 0:f27ce43dee4f 1881 }
cparata 0:f27ce43dee4f 1882
cparata 0:f27ce43dee4f 1883 return 0;
cparata 0:f27ce43dee4f 1884 }
cparata 0:f27ce43dee4f 1885
cparata 0:f27ce43dee4f 1886 /**
cparata 0:f27ce43dee4f 1887 * @brief Set tap quiet time
cparata 0:f27ce43dee4f 1888 * @param time tap quiet time
cparata 0:f27ce43dee4f 1889 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1890 */
cparata 0:f27ce43dee4f 1891 int LSM6DSOXSensor::set_tap_quiet_time(uint8_t time)
cparata 0:f27ce43dee4f 1892 {
cparata 0:f27ce43dee4f 1893 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 1894 if (lsm6dsox_tap_quiet_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 1895 {
cparata 0:f27ce43dee4f 1896 return 1;
cparata 0:f27ce43dee4f 1897 }
cparata 0:f27ce43dee4f 1898
cparata 0:f27ce43dee4f 1899 return 0;
cparata 0:f27ce43dee4f 1900 }
cparata 0:f27ce43dee4f 1901
cparata 0:f27ce43dee4f 1902 /**
cparata 0:f27ce43dee4f 1903 * @brief Set tap duration time
cparata 0:f27ce43dee4f 1904 * @param time tap duration time
cparata 0:f27ce43dee4f 1905 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1906 */
cparata 0:f27ce43dee4f 1907 int LSM6DSOXSensor::set_tap_duration_time(uint8_t time)
cparata 0:f27ce43dee4f 1908 {
cparata 0:f27ce43dee4f 1909 /* Set tap duration time window. */
cparata 0:f27ce43dee4f 1910 if (lsm6dsox_tap_dur_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 1911 {
cparata 0:f27ce43dee4f 1912 return 1;
cparata 0:f27ce43dee4f 1913 }
cparata 0:f27ce43dee4f 1914
cparata 0:f27ce43dee4f 1915 return 0;
cparata 0:f27ce43dee4f 1916 }
cparata 0:f27ce43dee4f 1917
cparata 0:f27ce43dee4f 1918 /**
cparata 0:f27ce43dee4f 1919 * @brief Enable 6D orientation detection
cparata 0:f27ce43dee4f 1920 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1921 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1922 */
cparata 0:f27ce43dee4f 1923 int LSM6DSOXSensor::enable_6d_orientation(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1924 {
cparata 0:f27ce43dee4f 1925 int ret = 0;
cparata 0:f27ce43dee4f 1926 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1927 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1928
cparata 0:f27ce43dee4f 1929 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1930 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1931 {
cparata 0:f27ce43dee4f 1932 return 1;
cparata 0:f27ce43dee4f 1933 }
cparata 0:f27ce43dee4f 1934
cparata 0:f27ce43dee4f 1935 /* Full scale selection */
cparata 0:f27ce43dee4f 1936 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1937 {
cparata 0:f27ce43dee4f 1938 return 1;
cparata 0:f27ce43dee4f 1939 }
cparata 0:f27ce43dee4f 1940
cparata 0:f27ce43dee4f 1941 /* 6D orientation enabled. */
cparata 0:f27ce43dee4f 1942 if (lsm6dsox_6d_threshold_set(&_reg_ctx, LSM6DSOX_DEG_60) != 0)
cparata 0:f27ce43dee4f 1943 {
cparata 0:f27ce43dee4f 1944 return 1;
cparata 0:f27ce43dee4f 1945 }
cparata 0:f27ce43dee4f 1946
cparata 0:f27ce43dee4f 1947 /* Enable 6D orientation event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1948 switch (int_pin)
cparata 0:f27ce43dee4f 1949 {
cparata 0:f27ce43dee4f 1950 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1951 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1952 {
cparata 0:f27ce43dee4f 1953 return 1;
cparata 0:f27ce43dee4f 1954 }
cparata 0:f27ce43dee4f 1955
cparata 0:f27ce43dee4f 1956 val1.md1_cfg.int1_6d = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1957
cparata 0:f27ce43dee4f 1958 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1959 {
cparata 0:f27ce43dee4f 1960 return 1;
cparata 0:f27ce43dee4f 1961 }
cparata 0:f27ce43dee4f 1962 break;
cparata 0:f27ce43dee4f 1963
cparata 0:f27ce43dee4f 1964 case LSM6DSOX_INT2_PIN:
cparata 0:f27ce43dee4f 1965 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1966 {
cparata 0:f27ce43dee4f 1967 return 1;
cparata 0:f27ce43dee4f 1968 }
cparata 0:f27ce43dee4f 1969
cparata 0:f27ce43dee4f 1970 val2.md2_cfg.int2_6d = PROPERTY_ENABLE;
cparata 0:f27ce43dee4f 1971
cparata 0:f27ce43dee4f 1972 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 1973 {
cparata 0:f27ce43dee4f 1974 return 1;
cparata 0:f27ce43dee4f 1975 }
cparata 0:f27ce43dee4f 1976 break;
cparata 0:f27ce43dee4f 1977
cparata 0:f27ce43dee4f 1978 default:
cparata 0:f27ce43dee4f 1979 ret = 1;
cparata 0:f27ce43dee4f 1980 break;
cparata 0:f27ce43dee4f 1981 }
cparata 0:f27ce43dee4f 1982
cparata 0:f27ce43dee4f 1983 return ret;
cparata 0:f27ce43dee4f 1984 }
cparata 0:f27ce43dee4f 1985
cparata 0:f27ce43dee4f 1986 /**
cparata 0:f27ce43dee4f 1987 * @brief Disable 6D orientation detection
cparata 0:f27ce43dee4f 1988 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1989 */
cparata 0:f27ce43dee4f 1990 int LSM6DSOXSensor::disable_6d_orientation()
cparata 0:f27ce43dee4f 1991 {
cparata 0:f27ce43dee4f 1992 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1993 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1994
cparata 0:f27ce43dee4f 1995 /* Disable 6D orientation event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1996 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1997 {
cparata 0:f27ce43dee4f 1998 return 1;
cparata 0:f27ce43dee4f 1999 }
cparata 0:f27ce43dee4f 2000
cparata 0:f27ce43dee4f 2001 val1.md1_cfg.int1_6d = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 2002
cparata 0:f27ce43dee4f 2003 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 2004 {
cparata 0:f27ce43dee4f 2005 return 1;
cparata 0:f27ce43dee4f 2006 }
cparata 0:f27ce43dee4f 2007
cparata 0:f27ce43dee4f 2008 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 2009 {
cparata 0:f27ce43dee4f 2010 return 1;
cparata 0:f27ce43dee4f 2011 }
cparata 0:f27ce43dee4f 2012
cparata 0:f27ce43dee4f 2013 val2.md2_cfg.int2_6d = PROPERTY_DISABLE;
cparata 0:f27ce43dee4f 2014
cparata 0:f27ce43dee4f 2015 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, &val2) != 0)
cparata 0:f27ce43dee4f 2016 {
cparata 0:f27ce43dee4f 2017 return 1;
cparata 0:f27ce43dee4f 2018 }
cparata 0:f27ce43dee4f 2019
cparata 0:f27ce43dee4f 2020 /* Reset 6D orientation. */
cparata 0:f27ce43dee4f 2021 if (lsm6dsox_6d_threshold_set(&_reg_ctx, LSM6DSOX_DEG_80) != 0)
cparata 0:f27ce43dee4f 2022 {
cparata 0:f27ce43dee4f 2023 return 1;
cparata 0:f27ce43dee4f 2024 }
cparata 0:f27ce43dee4f 2025
cparata 0:f27ce43dee4f 2026 return 0;
cparata 0:f27ce43dee4f 2027 }
cparata 0:f27ce43dee4f 2028
cparata 0:f27ce43dee4f 2029 /**
cparata 0:f27ce43dee4f 2030 * @brief Set 6D orientation threshold
cparata 0:f27ce43dee4f 2031 * @param thr 6D Orientation detection threshold
cparata 0:f27ce43dee4f 2032 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2033 */
cparata 0:f27ce43dee4f 2034 int LSM6DSOXSensor::set_6d_orientation_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 2035 {
cparata 0:f27ce43dee4f 2036 if (lsm6dsox_6d_threshold_set(&_reg_ctx, (lsm6dsox_sixd_ths_t)thr) != 0)
cparata 0:f27ce43dee4f 2037 {
cparata 0:f27ce43dee4f 2038 return 1;
cparata 0:f27ce43dee4f 2039 }
cparata 0:f27ce43dee4f 2040
cparata 0:f27ce43dee4f 2041 return 0;
cparata 0:f27ce43dee4f 2042 }
cparata 0:f27ce43dee4f 2043
cparata 0:f27ce43dee4f 2044 /**
cparata 0:f27ce43dee4f 2045 * @brief Get the status of XLow orientation
cparata 0:f27ce43dee4f 2046 * @param xl the status of XLow orientation
cparata 0:f27ce43dee4f 2047 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2048 */
cparata 0:f27ce43dee4f 2049 int LSM6DSOXSensor::get_6d_orientation_xl(uint8_t *xl)
cparata 0:f27ce43dee4f 2050 {
cparata 0:f27ce43dee4f 2051 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2052
cparata 0:f27ce43dee4f 2053 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2054 {
cparata 0:f27ce43dee4f 2055 return 1;
cparata 0:f27ce43dee4f 2056 }
cparata 0:f27ce43dee4f 2057
cparata 0:f27ce43dee4f 2058 *xl = data.xl;
cparata 0:f27ce43dee4f 2059
cparata 0:f27ce43dee4f 2060 return 0;
cparata 0:f27ce43dee4f 2061 }
cparata 0:f27ce43dee4f 2062
cparata 0:f27ce43dee4f 2063 /**
cparata 0:f27ce43dee4f 2064 * @brief Get the status of XHigh orientation
cparata 0:f27ce43dee4f 2065 * @param xh the status of XHigh orientation
cparata 0:f27ce43dee4f 2066 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2067 */
cparata 0:f27ce43dee4f 2068 int LSM6DSOXSensor::get_6d_orientation_xh(uint8_t *xh)
cparata 0:f27ce43dee4f 2069 {
cparata 0:f27ce43dee4f 2070 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2071
cparata 0:f27ce43dee4f 2072 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2073 {
cparata 0:f27ce43dee4f 2074 return 1;
cparata 0:f27ce43dee4f 2075 }
cparata 0:f27ce43dee4f 2076
cparata 0:f27ce43dee4f 2077 *xh = data.xh;
cparata 0:f27ce43dee4f 2078
cparata 0:f27ce43dee4f 2079 return 0;
cparata 0:f27ce43dee4f 2080 }
cparata 0:f27ce43dee4f 2081
cparata 0:f27ce43dee4f 2082 /**
cparata 0:f27ce43dee4f 2083 * @brief Get the status of YLow orientation
cparata 0:f27ce43dee4f 2084 * @param yl the status of YLow orientation
cparata 0:f27ce43dee4f 2085 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2086 */
cparata 0:f27ce43dee4f 2087 int LSM6DSOXSensor::get_6d_orientation_yl(uint8_t *yl)
cparata 0:f27ce43dee4f 2088 {
cparata 0:f27ce43dee4f 2089 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2090
cparata 0:f27ce43dee4f 2091 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2092 {
cparata 0:f27ce43dee4f 2093 return 1;
cparata 0:f27ce43dee4f 2094 }
cparata 0:f27ce43dee4f 2095
cparata 0:f27ce43dee4f 2096 *yl = data.yl;
cparata 0:f27ce43dee4f 2097
cparata 0:f27ce43dee4f 2098 return 0;
cparata 0:f27ce43dee4f 2099 }
cparata 0:f27ce43dee4f 2100
cparata 0:f27ce43dee4f 2101 /**
cparata 0:f27ce43dee4f 2102 * @brief Get the status of YHigh orientation
cparata 0:f27ce43dee4f 2103 * @param yh the status of YHigh orientation
cparata 0:f27ce43dee4f 2104 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2105 */
cparata 0:f27ce43dee4f 2106 int LSM6DSOXSensor::get_6d_orientation_yh(uint8_t *yh)
cparata 0:f27ce43dee4f 2107 {
cparata 0:f27ce43dee4f 2108 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2109
cparata 0:f27ce43dee4f 2110 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2111 {
cparata 0:f27ce43dee4f 2112 return 1;
cparata 0:f27ce43dee4f 2113 }
cparata 0:f27ce43dee4f 2114
cparata 0:f27ce43dee4f 2115 *yh = data.yh;
cparata 0:f27ce43dee4f 2116
cparata 0:f27ce43dee4f 2117 return 0;
cparata 0:f27ce43dee4f 2118 }
cparata 0:f27ce43dee4f 2119
cparata 0:f27ce43dee4f 2120 /**
cparata 0:f27ce43dee4f 2121 * @brief Get the status of ZLow orientation
cparata 0:f27ce43dee4f 2122 * @param zl the status of ZLow orientation
cparata 0:f27ce43dee4f 2123 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2124 */
cparata 0:f27ce43dee4f 2125 int LSM6DSOXSensor::get_6d_orientation_zl(uint8_t *zl)
cparata 0:f27ce43dee4f 2126 {
cparata 0:f27ce43dee4f 2127 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2128
cparata 0:f27ce43dee4f 2129 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2130 {
cparata 0:f27ce43dee4f 2131 return 1;
cparata 0:f27ce43dee4f 2132 }
cparata 0:f27ce43dee4f 2133
cparata 0:f27ce43dee4f 2134 *zl = data.zl;
cparata 0:f27ce43dee4f 2135
cparata 0:f27ce43dee4f 2136 return 0;
cparata 0:f27ce43dee4f 2137 }
cparata 0:f27ce43dee4f 2138
cparata 0:f27ce43dee4f 2139 /**
cparata 0:f27ce43dee4f 2140 * @brief Get the status of ZHigh orientation
cparata 0:f27ce43dee4f 2141 * @param zh the status of ZHigh orientation
cparata 0:f27ce43dee4f 2142 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2143 */
cparata 0:f27ce43dee4f 2144 int LSM6DSOXSensor::get_6d_orientation_zh(uint8_t *zh)
cparata 0:f27ce43dee4f 2145 {
cparata 0:f27ce43dee4f 2146 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2147
cparata 0:f27ce43dee4f 2148 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2149 {
cparata 0:f27ce43dee4f 2150 return 1;
cparata 0:f27ce43dee4f 2151 }
cparata 0:f27ce43dee4f 2152
cparata 0:f27ce43dee4f 2153 *zh = data.zh;
cparata 0:f27ce43dee4f 2154
cparata 0:f27ce43dee4f 2155 return 0;
cparata 0:f27ce43dee4f 2156 }
cparata 0:f27ce43dee4f 2157
cparata 0:f27ce43dee4f 2158 /**
cparata 0:f27ce43dee4f 2159 * @brief Get the LSM6DSOX ACC data ready bit value
cparata 0:f27ce43dee4f 2160 * @param status the status of data ready bit
cparata 0:f27ce43dee4f 2161 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2162 */
cparata 0:f27ce43dee4f 2163 int LSM6DSOXSensor::get_x_drdy_status(uint8_t *status)
cparata 0:f27ce43dee4f 2164 {
cparata 0:f27ce43dee4f 2165 if (lsm6dsox_xl_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2166 {
cparata 0:f27ce43dee4f 2167 return 1;
cparata 0:f27ce43dee4f 2168 }
cparata 0:f27ce43dee4f 2169
cparata 0:f27ce43dee4f 2170 return 0;
cparata 0:f27ce43dee4f 2171 }
cparata 0:f27ce43dee4f 2172
cparata 0:f27ce43dee4f 2173 /**
cparata 0:f27ce43dee4f 2174 * @brief Get the status of all hardware events
cparata 0:f27ce43dee4f 2175 * @param status the status of all hardware events
cparata 0:f27ce43dee4f 2176 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2177 */
cparata 0:f27ce43dee4f 2178 int LSM6DSOXSensor::get_event_status(LSM6DSOX_Event_Status_t *status)
cparata 0:f27ce43dee4f 2179 {
cparata 0:f27ce43dee4f 2180 uint8_t tilt_ia = 0U;
cparata 0:f27ce43dee4f 2181 lsm6dsox_wake_up_src_t wake_up_src;
cparata 0:f27ce43dee4f 2182 lsm6dsox_tap_src_t tap_src;
cparata 0:f27ce43dee4f 2183 lsm6dsox_d6d_src_t d6d_src;
cparata 0:f27ce43dee4f 2184 lsm6dsox_emb_func_src_t func_src;
cparata 0:f27ce43dee4f 2185 lsm6dsox_md1_cfg_t md1_cfg;
cparata 0:f27ce43dee4f 2186 lsm6dsox_md2_cfg_t md2_cfg;
cparata 0:f27ce43dee4f 2187 lsm6dsox_emb_func_int1_t int1_ctrl;
cparata 0:f27ce43dee4f 2188 lsm6dsox_emb_func_int2_t int2_ctrl;
cparata 0:f27ce43dee4f 2189
cparata 0:f27ce43dee4f 2190 (void)memset((void *)status, 0x0, sizeof(LSM6DSOX_Event_Status_t));
cparata 0:f27ce43dee4f 2191
cparata 0:f27ce43dee4f 2192 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_WAKE_UP_SRC, (uint8_t *)&wake_up_src, 1) != 0)
cparata 0:f27ce43dee4f 2193 {
cparata 0:f27ce43dee4f 2194 return 1;
cparata 0:f27ce43dee4f 2195 }
cparata 0:f27ce43dee4f 2196
cparata 0:f27ce43dee4f 2197 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_TAP_SRC, (uint8_t *)&tap_src, 1) != 0)
cparata 0:f27ce43dee4f 2198 {
cparata 0:f27ce43dee4f 2199 return 1;
cparata 0:f27ce43dee4f 2200 }
cparata 0:f27ce43dee4f 2201
cparata 0:f27ce43dee4f 2202 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&d6d_src, 1) != 0)
cparata 0:f27ce43dee4f 2203 {
cparata 0:f27ce43dee4f 2204 return 1;
cparata 0:f27ce43dee4f 2205 }
cparata 0:f27ce43dee4f 2206
cparata 0:f27ce43dee4f 2207 if (lsm6dsox_mem_bank_set(&_reg_ctx, LSM6DSOX_EMBEDDED_FUNC_BANK) != 0)
cparata 0:f27ce43dee4f 2208 {
cparata 0:f27ce43dee4f 2209 return 1;
cparata 0:f27ce43dee4f 2210 }
cparata 0:f27ce43dee4f 2211
cparata 0:f27ce43dee4f 2212 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_SRC, (uint8_t *)&func_src, 1) != 0)
cparata 0:f27ce43dee4f 2213 {
cparata 0:f27ce43dee4f 2214 return 1;
cparata 0:f27ce43dee4f 2215 }
cparata 0:f27ce43dee4f 2216
cparata 0:f27ce43dee4f 2217 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_INT1, (uint8_t *)&int1_ctrl, 1) != 0)
cparata 0:f27ce43dee4f 2218 {
cparata 0:f27ce43dee4f 2219 return 1;
cparata 0:f27ce43dee4f 2220 }
cparata 0:f27ce43dee4f 2221
cparata 0:f27ce43dee4f 2222 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_INT2, (uint8_t *)&int2_ctrl, 1) != 0)
cparata 0:f27ce43dee4f 2223 {
cparata 0:f27ce43dee4f 2224 return 1;
cparata 0:f27ce43dee4f 2225 }
cparata 0:f27ce43dee4f 2226
cparata 0:f27ce43dee4f 2227 if (lsm6dsox_mem_bank_set(&_reg_ctx, LSM6DSOX_USER_BANK) != 0)
cparata 0:f27ce43dee4f 2228 {
cparata 0:f27ce43dee4f 2229 return 1;
cparata 0:f27ce43dee4f 2230 }
cparata 0:f27ce43dee4f 2231
cparata 0:f27ce43dee4f 2232 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_MD1_CFG, (uint8_t *)&md1_cfg, 1) != 0)
cparata 0:f27ce43dee4f 2233 {
cparata 0:f27ce43dee4f 2234 return 1;
cparata 0:f27ce43dee4f 2235 }
cparata 0:f27ce43dee4f 2236
cparata 0:f27ce43dee4f 2237 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_MD2_CFG, (uint8_t *)&md2_cfg, 1) != 0)
cparata 0:f27ce43dee4f 2238 {
cparata 0:f27ce43dee4f 2239 return 1;
cparata 0:f27ce43dee4f 2240 }
cparata 0:f27ce43dee4f 2241
cparata 0:f27ce43dee4f 2242 if (lsm6dsox_tilt_flag_data_ready_get(&_reg_ctx, &tilt_ia) != 0)
cparata 0:f27ce43dee4f 2243 {
cparata 0:f27ce43dee4f 2244 return 1;
cparata 0:f27ce43dee4f 2245 }
cparata 0:f27ce43dee4f 2246
cparata 0:f27ce43dee4f 2247 if ((md1_cfg.int1_ff == 1U) || (md2_cfg.int2_ff == 1U))
cparata 0:f27ce43dee4f 2248 {
cparata 0:f27ce43dee4f 2249 if (wake_up_src.ff_ia == 1U)
cparata 0:f27ce43dee4f 2250 {
cparata 0:f27ce43dee4f 2251 status->FreeFallStatus = 1;
cparata 0:f27ce43dee4f 2252 }
cparata 0:f27ce43dee4f 2253 }
cparata 0:f27ce43dee4f 2254
cparata 0:f27ce43dee4f 2255 if ((md1_cfg.int1_wu == 1U) || (md2_cfg.int2_wu == 1U))
cparata 0:f27ce43dee4f 2256 {
cparata 0:f27ce43dee4f 2257 if (wake_up_src.wu_ia == 1U)
cparata 0:f27ce43dee4f 2258 {
cparata 0:f27ce43dee4f 2259 status->WakeUpStatus = 1;
cparata 0:f27ce43dee4f 2260 }
cparata 0:f27ce43dee4f 2261 }
cparata 0:f27ce43dee4f 2262
cparata 0:f27ce43dee4f 2263 if ((md1_cfg.int1_single_tap == 1U) || (md2_cfg.int2_single_tap == 1U))
cparata 0:f27ce43dee4f 2264 {
cparata 0:f27ce43dee4f 2265 if (tap_src.single_tap == 1U)
cparata 0:f27ce43dee4f 2266 {
cparata 0:f27ce43dee4f 2267 status->TapStatus = 1;
cparata 0:f27ce43dee4f 2268 }
cparata 0:f27ce43dee4f 2269 }
cparata 0:f27ce43dee4f 2270
cparata 0:f27ce43dee4f 2271 if ((md1_cfg.int1_double_tap == 1U) || (md2_cfg.int2_double_tap == 1U))
cparata 0:f27ce43dee4f 2272 {
cparata 0:f27ce43dee4f 2273 if (tap_src.double_tap == 1U)
cparata 0:f27ce43dee4f 2274 {
cparata 0:f27ce43dee4f 2275 status->DoubleTapStatus = 1;
cparata 0:f27ce43dee4f 2276 }
cparata 0:f27ce43dee4f 2277 }
cparata 0:f27ce43dee4f 2278
cparata 0:f27ce43dee4f 2279 if ((md1_cfg.int1_6d == 1U) || (md2_cfg.int2_6d == 1U))
cparata 0:f27ce43dee4f 2280 {
cparata 0:f27ce43dee4f 2281 if (d6d_src.d6d_ia == 1U)
cparata 0:f27ce43dee4f 2282 {
cparata 0:f27ce43dee4f 2283 status->D6DOrientationStatus = 1;
cparata 0:f27ce43dee4f 2284 }
cparata 0:f27ce43dee4f 2285 }
cparata 0:f27ce43dee4f 2286
cparata 0:f27ce43dee4f 2287 if (int1_ctrl.int1_step_detector == 1U)
cparata 0:f27ce43dee4f 2288 {
cparata 0:f27ce43dee4f 2289 if (func_src.step_detected == 1U)
cparata 0:f27ce43dee4f 2290 {
cparata 0:f27ce43dee4f 2291 status->StepStatus = 1;
cparata 0:f27ce43dee4f 2292 }
cparata 0:f27ce43dee4f 2293 }
cparata 0:f27ce43dee4f 2294
cparata 0:f27ce43dee4f 2295 if ((int1_ctrl.int1_tilt == 1U) || (int2_ctrl.int2_tilt == 1U))
cparata 0:f27ce43dee4f 2296 {
cparata 0:f27ce43dee4f 2297 if (tilt_ia == 1U)
cparata 0:f27ce43dee4f 2298 {
cparata 0:f27ce43dee4f 2299 status->TiltStatus = 1;
cparata 0:f27ce43dee4f 2300 }
cparata 0:f27ce43dee4f 2301 }
cparata 0:f27ce43dee4f 2302
cparata 0:f27ce43dee4f 2303 return 0;
cparata 0:f27ce43dee4f 2304 }
cparata 0:f27ce43dee4f 2305
cparata 0:f27ce43dee4f 2306 /**
cparata 0:f27ce43dee4f 2307 * @brief Set self test
cparata 0:f27ce43dee4f 2308 * @param val the value of st_xl in reg CTRL5_C
cparata 0:f27ce43dee4f 2309 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2310 */
cparata 0:f27ce43dee4f 2311 int LSM6DSOXSensor::set_x_self_test(uint8_t val)
cparata 0:f27ce43dee4f 2312 {
cparata 0:f27ce43dee4f 2313 lsm6dsox_st_xl_t reg;
cparata 0:f27ce43dee4f 2314
cparata 0:f27ce43dee4f 2315 reg = (val == 0U) ? LSM6DSOX_XL_ST_DISABLE
cparata 0:f27ce43dee4f 2316 : (val == 1U) ? LSM6DSOX_XL_ST_POSITIVE
cparata 0:f27ce43dee4f 2317 : (val == 2U) ? LSM6DSOX_XL_ST_NEGATIVE
cparata 0:f27ce43dee4f 2318 : LSM6DSOX_XL_ST_DISABLE;
cparata 0:f27ce43dee4f 2319
cparata 0:f27ce43dee4f 2320 if (lsm6dsox_xl_self_test_set(&_reg_ctx, reg) != 0)
cparata 0:f27ce43dee4f 2321 {
cparata 0:f27ce43dee4f 2322 return 1;
cparata 0:f27ce43dee4f 2323 }
cparata 0:f27ce43dee4f 2324
cparata 0:f27ce43dee4f 2325 return 0;
cparata 0:f27ce43dee4f 2326 }
cparata 0:f27ce43dee4f 2327
cparata 0:f27ce43dee4f 2328 /**
cparata 0:f27ce43dee4f 2329 * @brief Get the LSM6DSOX GYRO data ready bit value
cparata 0:f27ce43dee4f 2330 * @param status the status of data ready bit
cparata 0:f27ce43dee4f 2331 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2332 */
cparata 0:f27ce43dee4f 2333 int LSM6DSOXSensor::get_g_drdy_status(uint8_t *status)
cparata 0:f27ce43dee4f 2334 {
cparata 0:f27ce43dee4f 2335 if (lsm6dsox_gy_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2336 {
cparata 0:f27ce43dee4f 2337 return 1;
cparata 0:f27ce43dee4f 2338 }
cparata 0:f27ce43dee4f 2339
cparata 0:f27ce43dee4f 2340 return 0;
cparata 0:f27ce43dee4f 2341 }
cparata 0:f27ce43dee4f 2342
cparata 0:f27ce43dee4f 2343 /**
cparata 0:f27ce43dee4f 2344 * @brief Set self test
cparata 0:f27ce43dee4f 2345 * @param val the value of st_xl in reg CTRL5_C
cparata 0:f27ce43dee4f 2346 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2347 */
cparata 0:f27ce43dee4f 2348 int LSM6DSOXSensor::set_g_self_test(uint8_t val)
cparata 0:f27ce43dee4f 2349 {
cparata 0:f27ce43dee4f 2350 lsm6dsox_st_g_t reg;
cparata 0:f27ce43dee4f 2351
cparata 0:f27ce43dee4f 2352 reg = (val == 0U) ? LSM6DSOX_GY_ST_DISABLE
cparata 0:f27ce43dee4f 2353 : (val == 1U) ? LSM6DSOX_GY_ST_POSITIVE
cparata 0:f27ce43dee4f 2354 : (val == 2U) ? LSM6DSOX_GY_ST_NEGATIVE
cparata 0:f27ce43dee4f 2355 : LSM6DSOX_GY_ST_DISABLE;
cparata 0:f27ce43dee4f 2356
cparata 0:f27ce43dee4f 2357
cparata 0:f27ce43dee4f 2358 if (lsm6dsox_gy_self_test_set(&_reg_ctx, reg) != 0)
cparata 0:f27ce43dee4f 2359 {
cparata 0:f27ce43dee4f 2360 return 1;
cparata 0:f27ce43dee4f 2361 }
cparata 0:f27ce43dee4f 2362
cparata 0:f27ce43dee4f 2363 return 0;
cparata 0:f27ce43dee4f 2364 }
cparata 0:f27ce43dee4f 2365
cparata 0:f27ce43dee4f 2366 /**
cparata 0:f27ce43dee4f 2367 * @brief Get the LSM6DSOX FIFO number of samples
cparata 0:f27ce43dee4f 2368 * @param num_samples number of samples
cparata 0:f27ce43dee4f 2369 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2370 */
cparata 0:f27ce43dee4f 2371 int LSM6DSOXSensor::get_fifo_num_samples(uint16_t *num_samples)
cparata 0:f27ce43dee4f 2372 {
cparata 0:f27ce43dee4f 2373 if (lsm6dsox_fifo_data_level_get(&_reg_ctx, num_samples) != 0)
cparata 0:f27ce43dee4f 2374 {
cparata 0:f27ce43dee4f 2375 return 1;
cparata 0:f27ce43dee4f 2376 }
cparata 0:f27ce43dee4f 2377
cparata 0:f27ce43dee4f 2378 return 0;
cparata 0:f27ce43dee4f 2379 }
cparata 0:f27ce43dee4f 2380
cparata 0:f27ce43dee4f 2381 /**
cparata 0:f27ce43dee4f 2382 * @brief Get the LSM6DSOX FIFO full status
cparata 0:f27ce43dee4f 2383 * @param status FIFO full status
cparata 0:f27ce43dee4f 2384 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2385 */
cparata 0:f27ce43dee4f 2386 int LSM6DSOXSensor::get_fifo_full_status(uint8_t *status)
cparata 0:f27ce43dee4f 2387 {
cparata 0:f27ce43dee4f 2388 lsm6dsox_reg_t reg;
cparata 0:f27ce43dee4f 2389
cparata 0:f27ce43dee4f 2390 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_FIFO_STATUS2, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2391 {
cparata 0:f27ce43dee4f 2392 return 1;
cparata 0:f27ce43dee4f 2393 }
cparata 0:f27ce43dee4f 2394
cparata 0:f27ce43dee4f 2395 *status = reg.fifo_status2.fifo_full_ia;
cparata 0:f27ce43dee4f 2396
cparata 0:f27ce43dee4f 2397 return 0;
cparata 0:f27ce43dee4f 2398 }
cparata 0:f27ce43dee4f 2399
cparata 0:f27ce43dee4f 2400 /**
cparata 0:f27ce43dee4f 2401 * @brief Set the LSM6DSOX FIFO full interrupt on INT1 pin
cparata 0:f27ce43dee4f 2402 * @param status FIFO full interrupt on INT1 pin status
cparata 0:f27ce43dee4f 2403 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2404 */
cparata 0:f27ce43dee4f 2405 int LSM6DSOXSensor::set_fifo_int1_fifo_full(uint8_t status)
cparata 0:f27ce43dee4f 2406 {
cparata 0:f27ce43dee4f 2407 lsm6dsox_reg_t reg;
cparata 0:f27ce43dee4f 2408
cparata 0:f27ce43dee4f 2409 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_INT1_CTRL, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2410 {
cparata 0:f27ce43dee4f 2411 return 1;
cparata 0:f27ce43dee4f 2412 }
cparata 0:f27ce43dee4f 2413
cparata 0:f27ce43dee4f 2414 reg.int1_ctrl.int1_fifo_full = status;
cparata 0:f27ce43dee4f 2415
cparata 0:f27ce43dee4f 2416 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_INT1_CTRL, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2417 {
cparata 0:f27ce43dee4f 2418 return 1;
cparata 0:f27ce43dee4f 2419 }
cparata 0:f27ce43dee4f 2420
cparata 0:f27ce43dee4f 2421 return 0;
cparata 0:f27ce43dee4f 2422 }
cparata 0:f27ce43dee4f 2423
cparata 0:f27ce43dee4f 2424 /**
cparata 0:f27ce43dee4f 2425 * @brief Set the LSM6DSOX FIFO watermark level
cparata 0:f27ce43dee4f 2426 * @param watermark FIFO watermark level
cparata 0:f27ce43dee4f 2427 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2428 */
cparata 0:f27ce43dee4f 2429 int LSM6DSOXSensor::set_fifo_watermark_level(uint16_t watermark)
cparata 0:f27ce43dee4f 2430 {
cparata 0:f27ce43dee4f 2431 if (lsm6dsox_fifo_watermark_set(&_reg_ctx, watermark) != 0)
cparata 0:f27ce43dee4f 2432 {
cparata 0:f27ce43dee4f 2433 return 1;
cparata 0:f27ce43dee4f 2434 }
cparata 0:f27ce43dee4f 2435
cparata 0:f27ce43dee4f 2436 return 0;
cparata 0:f27ce43dee4f 2437 }
cparata 0:f27ce43dee4f 2438
cparata 0:f27ce43dee4f 2439 /**
cparata 0:f27ce43dee4f 2440 * @brief Set the LSM6DSOX FIFO stop on watermark
cparata 0:f27ce43dee4f 2441 * @param status FIFO stop on watermark status
cparata 0:f27ce43dee4f 2442 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2443 */
cparata 0:f27ce43dee4f 2444 int LSM6DSOXSensor::set_fifo_stop_on_fth(uint8_t status)
cparata 0:f27ce43dee4f 2445 {
cparata 0:f27ce43dee4f 2446 if (lsm6dsox_fifo_stop_on_wtm_set(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2447 {
cparata 0:f27ce43dee4f 2448 return 1;
cparata 0:f27ce43dee4f 2449 }
cparata 0:f27ce43dee4f 2450
cparata 0:f27ce43dee4f 2451 return 0;
cparata 0:f27ce43dee4f 2452 }
cparata 0:f27ce43dee4f 2453
cparata 0:f27ce43dee4f 2454 /**
cparata 0:f27ce43dee4f 2455 * @brief Set the LSM6DSOX FIFO mode
cparata 0:f27ce43dee4f 2456 * @param mode FIFO mode
cparata 0:f27ce43dee4f 2457 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2458 */
cparata 0:f27ce43dee4f 2459 int LSM6DSOXSensor::set_fifo_mode(uint8_t mode)
cparata 0:f27ce43dee4f 2460 {
cparata 0:f27ce43dee4f 2461 int ret = 0;
cparata 0:f27ce43dee4f 2462
cparata 0:f27ce43dee4f 2463 /* Verify that the passed parameter contains one of the valid values. */
cparata 0:f27ce43dee4f 2464 switch ((lsm6dsox_fifo_mode_t)mode)
cparata 0:f27ce43dee4f 2465 {
cparata 0:f27ce43dee4f 2466 case LSM6DSOX_BYPASS_MODE:
cparata 0:f27ce43dee4f 2467 case LSM6DSOX_FIFO_MODE:
cparata 0:f27ce43dee4f 2468 case LSM6DSOX_STREAM_TO_FIFO_MODE:
cparata 0:f27ce43dee4f 2469 case LSM6DSOX_BYPASS_TO_STREAM_MODE:
cparata 0:f27ce43dee4f 2470 case LSM6DSOX_STREAM_MODE:
cparata 0:f27ce43dee4f 2471 break;
cparata 0:f27ce43dee4f 2472
cparata 0:f27ce43dee4f 2473 default:
cparata 0:f27ce43dee4f 2474 ret = 1;
cparata 0:f27ce43dee4f 2475 break;
cparata 0:f27ce43dee4f 2476 }
cparata 0:f27ce43dee4f 2477
cparata 0:f27ce43dee4f 2478 if (ret == 1)
cparata 0:f27ce43dee4f 2479 {
cparata 0:f27ce43dee4f 2480 return ret;
cparata 0:f27ce43dee4f 2481 }
cparata 0:f27ce43dee4f 2482
cparata 0:f27ce43dee4f 2483 if (lsm6dsox_fifo_mode_set(&_reg_ctx, (lsm6dsox_fifo_mode_t)mode) != 0)
cparata 0:f27ce43dee4f 2484 {
cparata 0:f27ce43dee4f 2485 return 1;
cparata 0:f27ce43dee4f 2486 }
cparata 0:f27ce43dee4f 2487
cparata 0:f27ce43dee4f 2488 return ret;
cparata 0:f27ce43dee4f 2489 }
cparata 0:f27ce43dee4f 2490
cparata 0:f27ce43dee4f 2491 /**
cparata 0:f27ce43dee4f 2492 * @brief Get the LSM6DSOX FIFO tag
cparata 0:f27ce43dee4f 2493 * @param tag FIFO tag
cparata 0:f27ce43dee4f 2494 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2495 */
cparata 0:f27ce43dee4f 2496 int LSM6DSOXSensor::get_fifo_tag(uint8_t *tag)
cparata 0:f27ce43dee4f 2497 {
cparata 0:f27ce43dee4f 2498 lsm6dsox_fifo_tag_t tag_local;
cparata 0:f27ce43dee4f 2499
cparata 0:f27ce43dee4f 2500 if (lsm6dsox_fifo_sensor_tag_get(&_reg_ctx, &tag_local) != 0)
cparata 0:f27ce43dee4f 2501 {
cparata 0:f27ce43dee4f 2502 return 1;
cparata 0:f27ce43dee4f 2503 }
cparata 0:f27ce43dee4f 2504
cparata 0:f27ce43dee4f 2505 *tag = (uint8_t)tag_local;
cparata 0:f27ce43dee4f 2506
cparata 0:f27ce43dee4f 2507 return 0;
cparata 0:f27ce43dee4f 2508 }
cparata 0:f27ce43dee4f 2509
cparata 0:f27ce43dee4f 2510 /**
cparata 0:f27ce43dee4f 2511 * @brief Get the LSM6DSOX FIFO raw data
cparata 0:f27ce43dee4f 2512 * @param data FIFO raw data array [6]
cparata 0:f27ce43dee4f 2513 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2514 */
cparata 0:f27ce43dee4f 2515 int LSM6DSOXSensor::get_fifo_data(uint8_t *data)
cparata 0:f27ce43dee4f 2516 {
cparata 0:f27ce43dee4f 2517 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_FIFO_DATA_OUT_X_L, data, 6) != 0)
cparata 0:f27ce43dee4f 2518 {
cparata 0:f27ce43dee4f 2519 return 1;
cparata 0:f27ce43dee4f 2520 }
cparata 0:f27ce43dee4f 2521
cparata 0:f27ce43dee4f 2522 return 0;
cparata 0:f27ce43dee4f 2523 }
cparata 0:f27ce43dee4f 2524
cparata 0:f27ce43dee4f 2525 /**
cparata 0:f27ce43dee4f 2526 * @brief Get the LSM6DSOX FIFO accelero single sample (16-bit data per 3 axes) and calculate acceleration [mg]
cparata 0:f27ce43dee4f 2527 * @param acceleration FIFO accelero axes [mg]
cparata 0:f27ce43dee4f 2528 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2529 */
cparata 0:f27ce43dee4f 2530 int LSM6DSOXSensor::get_fifo_x_axes(int32_t *acceleration)
cparata 0:f27ce43dee4f 2531 {
cparata 0:f27ce43dee4f 2532 uint8_t data[6];
cparata 0:f27ce43dee4f 2533 int16_t data_raw[3];
cparata 0:f27ce43dee4f 2534 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 2535 float acceleration_float[3];
cparata 0:f27ce43dee4f 2536
cparata 0:f27ce43dee4f 2537 if (get_fifo_data(data) != 0)
cparata 0:f27ce43dee4f 2538 {
cparata 0:f27ce43dee4f 2539 return 1;
cparata 0:f27ce43dee4f 2540 }
cparata 0:f27ce43dee4f 2541
cparata 0:f27ce43dee4f 2542 data_raw[0] = ((int16_t)data[1] << 8) | data[0];
cparata 0:f27ce43dee4f 2543 data_raw[1] = ((int16_t)data[3] << 8) | data[2];
cparata 0:f27ce43dee4f 2544 data_raw[2] = ((int16_t)data[5] << 8) | data[4];
cparata 0:f27ce43dee4f 2545
cparata 0:f27ce43dee4f 2546 if (get_x_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 2547 {
cparata 0:f27ce43dee4f 2548 return 1;
cparata 0:f27ce43dee4f 2549 }
cparata 0:f27ce43dee4f 2550
cparata 0:f27ce43dee4f 2551 acceleration_float[0] = (float)data_raw[0] * sensitivity;
cparata 0:f27ce43dee4f 2552 acceleration_float[1] = (float)data_raw[1] * sensitivity;
cparata 0:f27ce43dee4f 2553 acceleration_float[2] = (float)data_raw[2] * sensitivity;
cparata 0:f27ce43dee4f 2554
cparata 0:f27ce43dee4f 2555 acceleration[0] = (int32_t)acceleration_float[0];
cparata 0:f27ce43dee4f 2556 acceleration[1] = (int32_t)acceleration_float[1];
cparata 0:f27ce43dee4f 2557 acceleration[2] = (int32_t)acceleration_float[2];
cparata 0:f27ce43dee4f 2558
cparata 0:f27ce43dee4f 2559 return 0;
cparata 0:f27ce43dee4f 2560 }
cparata 0:f27ce43dee4f 2561
cparata 0:f27ce43dee4f 2562 /**
cparata 0:f27ce43dee4f 2563 * @brief Set the LSM6DSOX FIFO accelero BDR value
cparata 0:f27ce43dee4f 2564 * @param bdr FIFO accelero BDR value
cparata 0:f27ce43dee4f 2565 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2566 */
cparata 0:f27ce43dee4f 2567 int LSM6DSOXSensor::set_fifo_x_bdr(float bdr)
cparata 0:f27ce43dee4f 2568 {
cparata 0:f27ce43dee4f 2569 lsm6dsox_bdr_xl_t new_bdr;
cparata 0:f27ce43dee4f 2570
cparata 0:f27ce43dee4f 2571 new_bdr = (bdr <= 0.0f) ? LSM6DSOX_XL_NOT_BATCHED
cparata 0:f27ce43dee4f 2572 : (bdr <= 12.5f) ? LSM6DSOX_XL_BATCHED_AT_12Hz5
cparata 0:f27ce43dee4f 2573 : (bdr <= 26.0f) ? LSM6DSOX_XL_BATCHED_AT_26Hz
cparata 0:f27ce43dee4f 2574 : (bdr <= 52.0f) ? LSM6DSOX_XL_BATCHED_AT_52Hz
cparata 0:f27ce43dee4f 2575 : (bdr <= 104.0f) ? LSM6DSOX_XL_BATCHED_AT_104Hz
cparata 0:f27ce43dee4f 2576 : (bdr <= 208.0f) ? LSM6DSOX_XL_BATCHED_AT_208Hz
cparata 0:f27ce43dee4f 2577 : (bdr <= 416.0f) ? LSM6DSOX_XL_BATCHED_AT_417Hz
cparata 0:f27ce43dee4f 2578 : (bdr <= 833.0f) ? LSM6DSOX_XL_BATCHED_AT_833Hz
cparata 0:f27ce43dee4f 2579 : (bdr <= 1660.0f) ? LSM6DSOX_XL_BATCHED_AT_1667Hz
cparata 0:f27ce43dee4f 2580 : (bdr <= 3330.0f) ? LSM6DSOX_XL_BATCHED_AT_3333Hz
cparata 0:f27ce43dee4f 2581 : LSM6DSOX_XL_BATCHED_AT_6667Hz;
cparata 0:f27ce43dee4f 2582
cparata 0:f27ce43dee4f 2583 if (lsm6dsox_fifo_xl_batch_set(&_reg_ctx, new_bdr) != 0)
cparata 0:f27ce43dee4f 2584 {
cparata 0:f27ce43dee4f 2585 return 1;
cparata 0:f27ce43dee4f 2586 }
cparata 0:f27ce43dee4f 2587
cparata 0:f27ce43dee4f 2588 return 0;
cparata 0:f27ce43dee4f 2589 }
cparata 0:f27ce43dee4f 2590
cparata 0:f27ce43dee4f 2591 /**
cparata 0:f27ce43dee4f 2592 * @brief Get the LSM6DSOX FIFO gyro single sample (16-bit data per 3 axes) and calculate angular velocity [mDPS]
cparata 0:f27ce43dee4f 2593 * @param angular_velocity FIFO gyro axes [mDPS]
cparata 0:f27ce43dee4f 2594 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2595 */
cparata 0:f27ce43dee4f 2596 int LSM6DSOXSensor::get_fifo_g_axes(int32_t *angular_velocity)
cparata 0:f27ce43dee4f 2597 {
cparata 0:f27ce43dee4f 2598 uint8_t data[6];
cparata 0:f27ce43dee4f 2599 int16_t data_raw[3];
cparata 0:f27ce43dee4f 2600 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 2601 float angular_velocity_float[3];
cparata 0:f27ce43dee4f 2602
cparata 0:f27ce43dee4f 2603 if (get_fifo_data(data) != 0)
cparata 0:f27ce43dee4f 2604 {
cparata 0:f27ce43dee4f 2605 return 1;
cparata 0:f27ce43dee4f 2606 }
cparata 0:f27ce43dee4f 2607
cparata 0:f27ce43dee4f 2608 data_raw[0] = ((int16_t)data[1] << 8) | data[0];
cparata 0:f27ce43dee4f 2609 data_raw[1] = ((int16_t)data[3] << 8) | data[2];
cparata 0:f27ce43dee4f 2610 data_raw[2] = ((int16_t)data[5] << 8) | data[4];
cparata 0:f27ce43dee4f 2611
cparata 0:f27ce43dee4f 2612 if (get_g_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 2613 {
cparata 0:f27ce43dee4f 2614 return 1;
cparata 0:f27ce43dee4f 2615 }
cparata 0:f27ce43dee4f 2616
cparata 0:f27ce43dee4f 2617 angular_velocity_float[0] = (float)data_raw[0] * sensitivity;
cparata 0:f27ce43dee4f 2618 angular_velocity_float[1] = (float)data_raw[1] * sensitivity;
cparata 0:f27ce43dee4f 2619 angular_velocity_float[2] = (float)data_raw[2] * sensitivity;
cparata 0:f27ce43dee4f 2620
cparata 0:f27ce43dee4f 2621 angular_velocity[0] = (int32_t)angular_velocity_float[0];
cparata 0:f27ce43dee4f 2622 angular_velocity[1] = (int32_t)angular_velocity_float[1];
cparata 0:f27ce43dee4f 2623 angular_velocity[2] = (int32_t)angular_velocity_float[2];
cparata 0:f27ce43dee4f 2624
cparata 0:f27ce43dee4f 2625 return 0;
cparata 0:f27ce43dee4f 2626 }
cparata 0:f27ce43dee4f 2627
cparata 0:f27ce43dee4f 2628 /**
cparata 0:f27ce43dee4f 2629 * @brief Set the LSM6DSOX FIFO gyro BDR value
cparata 0:f27ce43dee4f 2630 * @param bdr FIFO gyro BDR value
cparata 0:f27ce43dee4f 2631 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2632 */
cparata 0:f27ce43dee4f 2633 int LSM6DSOXSensor::set_fifo_g_bdr(float bdr)
cparata 0:f27ce43dee4f 2634 {
cparata 0:f27ce43dee4f 2635 lsm6dsox_bdr_gy_t new_bdr;
cparata 0:f27ce43dee4f 2636
cparata 0:f27ce43dee4f 2637 new_bdr = (bdr <= 0.0f) ? LSM6DSOX_GY_NOT_BATCHED
cparata 0:f27ce43dee4f 2638 : (bdr <= 12.5f) ? LSM6DSOX_GY_BATCHED_AT_12Hz5
cparata 0:f27ce43dee4f 2639 : (bdr <= 26.0f) ? LSM6DSOX_GY_BATCHED_AT_26Hz
cparata 0:f27ce43dee4f 2640 : (bdr <= 52.0f) ? LSM6DSOX_GY_BATCHED_AT_52Hz
cparata 0:f27ce43dee4f 2641 : (bdr <= 104.0f) ? LSM6DSOX_GY_BATCHED_AT_104Hz
cparata 0:f27ce43dee4f 2642 : (bdr <= 208.0f) ? LSM6DSOX_GY_BATCHED_AT_208Hz
cparata 0:f27ce43dee4f 2643 : (bdr <= 416.0f) ? LSM6DSOX_GY_BATCHED_AT_417Hz
cparata 0:f27ce43dee4f 2644 : (bdr <= 833.0f) ? LSM6DSOX_GY_BATCHED_AT_833Hz
cparata 0:f27ce43dee4f 2645 : (bdr <= 1660.0f) ? LSM6DSOX_GY_BATCHED_AT_1667Hz
cparata 0:f27ce43dee4f 2646 : (bdr <= 3330.0f) ? LSM6DSOX_GY_BATCHED_AT_3333Hz
cparata 0:f27ce43dee4f 2647 : LSM6DSOX_GY_BATCHED_AT_6667Hz;
cparata 0:f27ce43dee4f 2648
cparata 0:f27ce43dee4f 2649 if (lsm6dsox_fifo_gy_batch_set(&_reg_ctx, new_bdr) != 0)
cparata 0:f27ce43dee4f 2650 {
cparata 0:f27ce43dee4f 2651 return 1;
cparata 0:f27ce43dee4f 2652 }
cparata 0:f27ce43dee4f 2653
cparata 0:f27ce43dee4f 2654 return 0;
cparata 0:f27ce43dee4f 2655 }
cparata 0:f27ce43dee4f 2656
cparata 0:f27ce43dee4f 2657
cparata 0:f27ce43dee4f 2658
cparata 0:f27ce43dee4f 2659 int32_t LSM6DSOX_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
cparata 0:f27ce43dee4f 2660 {
cparata 0:f27ce43dee4f 2661 return ((LSM6DSOXSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
cparata 0:f27ce43dee4f 2662 }
cparata 0:f27ce43dee4f 2663
cparata 0:f27ce43dee4f 2664 int32_t LSM6DSOX_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
cparata 0:f27ce43dee4f 2665 {
cparata 0:f27ce43dee4f 2666 return ((LSM6DSOXSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
cparata 0:f27ce43dee4f 2667 }