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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
cparata
Date:
Thu Apr 15 16:16:36 2021 +0000
Revision:
5:97fea56292cd
Parent:
3:d89217a05f63
Fix issue on INT2 events

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 1:fe40aec6e97a 291 case LSM6DSOX_XL_ODR_1Hz6:
cparata 1:fe40aec6e97a 292 *odr = 1.6f;
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 1:fe40aec6e97a 350 return set_x_odr_with_mode(odr, LSM6DSOX_ACC_HIGH_PERFORMANCE_MODE);
cparata 1:fe40aec6e97a 351 }
cparata 1:fe40aec6e97a 352
cparata 1:fe40aec6e97a 353 /**
cparata 1:fe40aec6e97a 354 * @brief Set the LSM6DSOX accelerometer sensor output data rate with operating mode
cparata 1:fe40aec6e97a 355 * @param odr the output data rate value to be set
cparata 1:fe40aec6e97a 356 * @param mode the accelerometer operating mode
cparata 1:fe40aec6e97a 357 * @note This function switches off the gyroscope if Ultra Low Power Mode is set
cparata 1:fe40aec6e97a 358 * @retval 0 in case of success, an error code otherwise
cparata 1:fe40aec6e97a 359 */
cparata 1:fe40aec6e97a 360 int LSM6DSOXSensor::set_x_odr_with_mode(float odr, LSM6DSOX_ACC_Operating_Mode_t mode)
cparata 1:fe40aec6e97a 361 {
cparata 1:fe40aec6e97a 362 int ret = 0;
cparata 1:fe40aec6e97a 363
cparata 1:fe40aec6e97a 364 switch (mode)
cparata 1:fe40aec6e97a 365 {
cparata 1:fe40aec6e97a 366 case LSM6DSOX_ACC_HIGH_PERFORMANCE_MODE:
cparata 1:fe40aec6e97a 367 {
cparata 1:fe40aec6e97a 368 /* We must uncheck Low Power and Ultra Low Power bits if they are enabled */
cparata 1:fe40aec6e97a 369 lsm6dsox_ctrl5_c_t val1;
cparata 1:fe40aec6e97a 370 lsm6dsox_ctrl6_c_t val2;
cparata 1:fe40aec6e97a 371
cparata 1:fe40aec6e97a 372 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 373 {
cparata 1:fe40aec6e97a 374 return 1;
cparata 1:fe40aec6e97a 375 }
cparata 1:fe40aec6e97a 376
cparata 1:fe40aec6e97a 377 if (val1.xl_ulp_en)
cparata 1:fe40aec6e97a 378 {
cparata 1:fe40aec6e97a 379 /* Power off the accelerometer */
cparata 1:fe40aec6e97a 380 if (_x_is_enabled == 1U)
cparata 1:fe40aec6e97a 381 {
cparata 1:fe40aec6e97a 382 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, LSM6DSOX_XL_ODR_OFF) != 0)
cparata 1:fe40aec6e97a 383 {
cparata 1:fe40aec6e97a 384 return 1;
cparata 1:fe40aec6e97a 385 }
cparata 1:fe40aec6e97a 386 }
cparata 1:fe40aec6e97a 387
cparata 1:fe40aec6e97a 388 val1.xl_ulp_en = 0;
cparata 1:fe40aec6e97a 389 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 390 {
cparata 1:fe40aec6e97a 391 return 1;
cparata 1:fe40aec6e97a 392 }
cparata 1:fe40aec6e97a 393 }
cparata 1:fe40aec6e97a 394
cparata 1:fe40aec6e97a 395 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 396 {
cparata 1:fe40aec6e97a 397 return 1;
cparata 1:fe40aec6e97a 398 }
cparata 1:fe40aec6e97a 399
cparata 1:fe40aec6e97a 400 if (val2.xl_hm_mode)
cparata 1:fe40aec6e97a 401 {
cparata 1:fe40aec6e97a 402 val2.xl_hm_mode = 0;
cparata 1:fe40aec6e97a 403 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 404 {
cparata 1:fe40aec6e97a 405 return 1;
cparata 1:fe40aec6e97a 406 }
cparata 1:fe40aec6e97a 407 }
cparata 1:fe40aec6e97a 408
cparata 1:fe40aec6e97a 409 /* ODR should be at least 12.5Hz */
cparata 1:fe40aec6e97a 410 if (odr < 12.5f)
cparata 1:fe40aec6e97a 411 {
cparata 1:fe40aec6e97a 412 odr = 12.5f;
cparata 1:fe40aec6e97a 413 }
cparata 1:fe40aec6e97a 414 break;
cparata 1:fe40aec6e97a 415 }
cparata 1:fe40aec6e97a 416 case LSM6DSOX_ACC_LOW_POWER_NORMAL_MODE:
cparata 1:fe40aec6e97a 417 {
cparata 1:fe40aec6e97a 418 /* We must uncheck Ultra Low Power bit if it is enabled */
cparata 1:fe40aec6e97a 419 /* and check the Low Power bit if it is unchecked */
cparata 1:fe40aec6e97a 420 lsm6dsox_ctrl5_c_t val1;
cparata 1:fe40aec6e97a 421 lsm6dsox_ctrl6_c_t val2;
cparata 1:fe40aec6e97a 422
cparata 1:fe40aec6e97a 423 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 424 {
cparata 1:fe40aec6e97a 425 return 1;
cparata 1:fe40aec6e97a 426 }
cparata 1:fe40aec6e97a 427
cparata 1:fe40aec6e97a 428 if (val1.xl_ulp_en)
cparata 1:fe40aec6e97a 429 {
cparata 1:fe40aec6e97a 430 /* Power off the accelerometer */
cparata 1:fe40aec6e97a 431 if (_x_is_enabled == 1U)
cparata 1:fe40aec6e97a 432 {
cparata 1:fe40aec6e97a 433 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, LSM6DSOX_XL_ODR_OFF) != 0)
cparata 1:fe40aec6e97a 434 {
cparata 1:fe40aec6e97a 435 return 1;
cparata 1:fe40aec6e97a 436 }
cparata 1:fe40aec6e97a 437 }
cparata 1:fe40aec6e97a 438
cparata 1:fe40aec6e97a 439 val1.xl_ulp_en = 0;
cparata 1:fe40aec6e97a 440 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 441 {
cparata 1:fe40aec6e97a 442 return 1;
cparata 1:fe40aec6e97a 443 }
cparata 1:fe40aec6e97a 444 }
cparata 1:fe40aec6e97a 445
cparata 1:fe40aec6e97a 446 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 447 {
cparata 1:fe40aec6e97a 448 return 1;
cparata 1:fe40aec6e97a 449 }
cparata 1:fe40aec6e97a 450
cparata 1:fe40aec6e97a 451 if (!val2.xl_hm_mode)
cparata 1:fe40aec6e97a 452 {
cparata 1:fe40aec6e97a 453 val2.xl_hm_mode = 1U;
cparata 1:fe40aec6e97a 454 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 455 {
cparata 1:fe40aec6e97a 456 return 1;
cparata 1:fe40aec6e97a 457 }
cparata 1:fe40aec6e97a 458 }
cparata 1:fe40aec6e97a 459
cparata 1:fe40aec6e97a 460 /* Now we need to limit the ODR to 208 Hz if it is higher */
cparata 1:fe40aec6e97a 461 if (odr > 208.0f)
cparata 1:fe40aec6e97a 462 {
cparata 1:fe40aec6e97a 463 odr = 208.0f;
cparata 1:fe40aec6e97a 464 }
cparata 1:fe40aec6e97a 465 break;
cparata 1:fe40aec6e97a 466 }
cparata 1:fe40aec6e97a 467 case LSM6DSOX_ACC_ULTRA_LOW_POWER_MODE:
cparata 1:fe40aec6e97a 468 {
cparata 1:fe40aec6e97a 469 /* We must uncheck Low Power bit if it is enabled */
cparata 1:fe40aec6e97a 470 /* and check the Ultra Low Power bit if it is unchecked */
cparata 1:fe40aec6e97a 471 /* We must switch off gyro otherwise Ultra Low Power does not work */
cparata 1:fe40aec6e97a 472 lsm6dsox_ctrl5_c_t val1;
cparata 1:fe40aec6e97a 473 lsm6dsox_ctrl6_c_t val2;
cparata 1:fe40aec6e97a 474
cparata 1:fe40aec6e97a 475 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 476 {
cparata 1:fe40aec6e97a 477 return 1;
cparata 1:fe40aec6e97a 478 }
cparata 1:fe40aec6e97a 479
cparata 1:fe40aec6e97a 480 if (val2.xl_hm_mode)
cparata 1:fe40aec6e97a 481 {
cparata 1:fe40aec6e97a 482 val2.xl_hm_mode = 0;
cparata 1:fe40aec6e97a 483 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != 0)
cparata 1:fe40aec6e97a 484 {
cparata 1:fe40aec6e97a 485 return 1;
cparata 1:fe40aec6e97a 486 }
cparata 1:fe40aec6e97a 487 }
cparata 1:fe40aec6e97a 488
cparata 1:fe40aec6e97a 489 /* Disable Gyro */
cparata 1:fe40aec6e97a 490 if (_g_is_enabled == 1U)
cparata 1:fe40aec6e97a 491 {
cparata 1:fe40aec6e97a 492 if (disable_g() != 0)
cparata 1:fe40aec6e97a 493 {
cparata 1:fe40aec6e97a 494 return 1;
cparata 1:fe40aec6e97a 495 }
cparata 1:fe40aec6e97a 496 }
cparata 1:fe40aec6e97a 497
cparata 1:fe40aec6e97a 498 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 499 {
cparata 1:fe40aec6e97a 500 return 1;
cparata 1:fe40aec6e97a 501 }
cparata 1:fe40aec6e97a 502
cparata 1:fe40aec6e97a 503 if (!val1.xl_ulp_en)
cparata 1:fe40aec6e97a 504 {
cparata 1:fe40aec6e97a 505 /* Power off the accelerometer */
cparata 1:fe40aec6e97a 506 if (_x_is_enabled == 1U)
cparata 1:fe40aec6e97a 507 {
cparata 1:fe40aec6e97a 508 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, LSM6DSOX_XL_ODR_OFF) != 0)
cparata 1:fe40aec6e97a 509 {
cparata 1:fe40aec6e97a 510 return 1;
cparata 1:fe40aec6e97a 511 }
cparata 1:fe40aec6e97a 512 }
cparata 1:fe40aec6e97a 513
cparata 1:fe40aec6e97a 514 val1.xl_ulp_en = 1U;
cparata 1:fe40aec6e97a 515 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 516 {
cparata 1:fe40aec6e97a 517 return 1;
cparata 1:fe40aec6e97a 518 }
cparata 1:fe40aec6e97a 519 }
cparata 1:fe40aec6e97a 520
cparata 1:fe40aec6e97a 521 /* Now we need to limit the ODR to 208 Hz if it is higher */
cparata 1:fe40aec6e97a 522 if (odr > 208.0f)
cparata 1:fe40aec6e97a 523 {
cparata 1:fe40aec6e97a 524 odr = 208.0f;
cparata 1:fe40aec6e97a 525 }
cparata 1:fe40aec6e97a 526 break;
cparata 1:fe40aec6e97a 527 }
cparata 1:fe40aec6e97a 528 default:
cparata 1:fe40aec6e97a 529 ret = 1;
cparata 1:fe40aec6e97a 530 break;
cparata 1:fe40aec6e97a 531 }
cparata 1:fe40aec6e97a 532
cparata 0:f27ce43dee4f 533 /* Check if the component is enabled */
cparata 0:f27ce43dee4f 534 if (_x_is_enabled == 1U)
cparata 0:f27ce43dee4f 535 {
cparata 1:fe40aec6e97a 536 ret = set_x_odr_when_enabled(odr);
cparata 0:f27ce43dee4f 537 }
cparata 0:f27ce43dee4f 538 else
cparata 0:f27ce43dee4f 539 {
cparata 1:fe40aec6e97a 540 ret = set_x_odr_when_disabled(odr);
cparata 0:f27ce43dee4f 541 }
cparata 1:fe40aec6e97a 542
cparata 1:fe40aec6e97a 543 return ret;
cparata 0:f27ce43dee4f 544 }
cparata 0:f27ce43dee4f 545
cparata 0:f27ce43dee4f 546 /**
cparata 0:f27ce43dee4f 547 * @brief Set the LSM6DSOX accelerometer sensor output data rate when enabled
cparata 0:f27ce43dee4f 548 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 549 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 550 */
cparata 0:f27ce43dee4f 551 int LSM6DSOXSensor::set_x_odr_when_enabled(float odr)
cparata 0:f27ce43dee4f 552 {
cparata 0:f27ce43dee4f 553 lsm6dsox_odr_xl_t new_odr;
cparata 0:f27ce43dee4f 554
cparata 1:fe40aec6e97a 555 new_odr = (odr <= 1.6f) ? LSM6DSOX_XL_ODR_1Hz6
cparata 1:fe40aec6e97a 556 : (odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
cparata 0:f27ce43dee4f 557 : (odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
cparata 0:f27ce43dee4f 558 : (odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
cparata 0:f27ce43dee4f 559 : (odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
cparata 0:f27ce43dee4f 560 : (odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
cparata 0:f27ce43dee4f 561 : (odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
cparata 0:f27ce43dee4f 562 : (odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
cparata 0:f27ce43dee4f 563 : (odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
cparata 0:f27ce43dee4f 564 : (odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
cparata 0:f27ce43dee4f 565 : LSM6DSOX_XL_ODR_6667Hz;
cparata 0:f27ce43dee4f 566
cparata 0:f27ce43dee4f 567 /* Output data rate selection. */
cparata 0:f27ce43dee4f 568 if (lsm6dsox_xl_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:f27ce43dee4f 569 {
cparata 0:f27ce43dee4f 570 return 1;
cparata 0:f27ce43dee4f 571 }
cparata 0:f27ce43dee4f 572
cparata 0:f27ce43dee4f 573 return 0;
cparata 0:f27ce43dee4f 574 }
cparata 0:f27ce43dee4f 575
cparata 0:f27ce43dee4f 576 /**
cparata 0:f27ce43dee4f 577 * @brief Set the LSM6DSOX accelerometer sensor output data rate when disabled
cparata 0:f27ce43dee4f 578 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 579 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 580 */
cparata 0:f27ce43dee4f 581 int LSM6DSOXSensor::set_x_odr_when_disabled(float odr)
cparata 0:f27ce43dee4f 582 {
cparata 1:fe40aec6e97a 583 _x_last_odr = (odr <= 1.6f) ? LSM6DSOX_XL_ODR_1Hz6
cparata 1:fe40aec6e97a 584 : (odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
cparata 0:f27ce43dee4f 585 : (odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
cparata 0:f27ce43dee4f 586 : (odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
cparata 0:f27ce43dee4f 587 : (odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
cparata 0:f27ce43dee4f 588 : (odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
cparata 0:f27ce43dee4f 589 : (odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
cparata 0:f27ce43dee4f 590 : (odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
cparata 0:f27ce43dee4f 591 : (odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
cparata 0:f27ce43dee4f 592 : (odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
cparata 0:f27ce43dee4f 593 : LSM6DSOX_XL_ODR_6667Hz;
cparata 0:f27ce43dee4f 594
cparata 0:f27ce43dee4f 595 return 0;
cparata 0:f27ce43dee4f 596 }
cparata 0:f27ce43dee4f 597
cparata 0:f27ce43dee4f 598
cparata 0:f27ce43dee4f 599 /**
cparata 0:f27ce43dee4f 600 * @brief Get the LSM6DSOX accelerometer sensor full scale
cparata 0:f27ce43dee4f 601 * @param full_scale pointer where the full scale is written
cparata 0:f27ce43dee4f 602 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 603 */
cparata 0:f27ce43dee4f 604 int LSM6DSOXSensor::get_x_fs(float *full_scale)
cparata 0:f27ce43dee4f 605 {
cparata 0:f27ce43dee4f 606 int ret = 0;
cparata 0:f27ce43dee4f 607 lsm6dsox_fs_xl_t fs_low_level;
cparata 0:f27ce43dee4f 608
cparata 0:f27ce43dee4f 609 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 610 if (lsm6dsox_xl_full_scale_get(&_reg_ctx, &fs_low_level) != 0)
cparata 0:f27ce43dee4f 611 {
cparata 0:f27ce43dee4f 612 return 1;
cparata 0:f27ce43dee4f 613 }
cparata 0:f27ce43dee4f 614
cparata 0:f27ce43dee4f 615 switch (fs_low_level)
cparata 0:f27ce43dee4f 616 {
cparata 0:f27ce43dee4f 617 case LSM6DSOX_2g:
cparata 0:f27ce43dee4f 618 *full_scale = 2.0f;
cparata 0:f27ce43dee4f 619 break;
cparata 0:f27ce43dee4f 620
cparata 0:f27ce43dee4f 621 case LSM6DSOX_4g:
cparata 0:f27ce43dee4f 622 *full_scale = 4.0f;
cparata 0:f27ce43dee4f 623 break;
cparata 0:f27ce43dee4f 624
cparata 0:f27ce43dee4f 625 case LSM6DSOX_8g:
cparata 0:f27ce43dee4f 626 *full_scale = 8.0f;
cparata 0:f27ce43dee4f 627 break;
cparata 0:f27ce43dee4f 628
cparata 0:f27ce43dee4f 629 case LSM6DSOX_16g:
cparata 0:f27ce43dee4f 630 *full_scale = 16.0f;
cparata 0:f27ce43dee4f 631 break;
cparata 0:f27ce43dee4f 632
cparata 0:f27ce43dee4f 633 default:
cparata 0:f27ce43dee4f 634 ret = 1;
cparata 0:f27ce43dee4f 635 break;
cparata 0:f27ce43dee4f 636 }
cparata 0:f27ce43dee4f 637
cparata 0:f27ce43dee4f 638 return ret;
cparata 0:f27ce43dee4f 639 }
cparata 0:f27ce43dee4f 640
cparata 0:f27ce43dee4f 641 /**
cparata 0:f27ce43dee4f 642 * @brief Set the LSM6DSOX accelerometer sensor full scale
cparata 0:f27ce43dee4f 643 * @param full_scale the functional full scale to be set
cparata 0:f27ce43dee4f 644 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 645 */
cparata 0:f27ce43dee4f 646 int LSM6DSOXSensor::set_x_fs(float full_scale)
cparata 0:f27ce43dee4f 647 {
cparata 0:f27ce43dee4f 648 lsm6dsox_fs_xl_t new_fs;
cparata 0:f27ce43dee4f 649
cparata 0:f27ce43dee4f 650 /* Seems like MISRA C-2012 rule 14.3a violation but only from single file statical analysis point of view because
cparata 0:f27ce43dee4f 651 the parameter passed to the function is not known at the moment of analysis */
cparata 0:f27ce43dee4f 652 new_fs = (full_scale <= 2.0f) ? LSM6DSOX_2g
cparata 0:f27ce43dee4f 653 : (full_scale <= 4.0f) ? LSM6DSOX_4g
cparata 0:f27ce43dee4f 654 : (full_scale <= 8.0f) ? LSM6DSOX_8g
cparata 0:f27ce43dee4f 655 : LSM6DSOX_16g;
cparata 0:f27ce43dee4f 656
cparata 0:f27ce43dee4f 657 if (lsm6dsox_xl_full_scale_set(&_reg_ctx, new_fs) != 0)
cparata 0:f27ce43dee4f 658 {
cparata 0:f27ce43dee4f 659 return 1;
cparata 0:f27ce43dee4f 660 }
cparata 0:f27ce43dee4f 661
cparata 0:f27ce43dee4f 662 return 0;
cparata 0:f27ce43dee4f 663 }
cparata 0:f27ce43dee4f 664
cparata 0:f27ce43dee4f 665 /**
cparata 0:f27ce43dee4f 666 * @brief Get the LSM6DSOX accelerometer sensor raw axes
cparata 0:f27ce43dee4f 667 * @param value pointer where the raw values of the axes are written
cparata 0:f27ce43dee4f 668 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 669 */
cparata 0:f27ce43dee4f 670 int LSM6DSOXSensor::get_x_axes_raw(int16_t *value)
cparata 0:f27ce43dee4f 671 {
cparata 2:6f62c931be0b 672 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 673
cparata 0:f27ce43dee4f 674 /* Read raw data values. */
cparata 0:f27ce43dee4f 675 if (lsm6dsox_acceleration_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 676 {
cparata 0:f27ce43dee4f 677 return 1;
cparata 0:f27ce43dee4f 678 }
cparata 0:f27ce43dee4f 679
cparata 0:f27ce43dee4f 680 /* Format the data. */
cparata 0:f27ce43dee4f 681 value[0] = data_raw.i16bit[0];
cparata 0:f27ce43dee4f 682 value[1] = data_raw.i16bit[1];
cparata 0:f27ce43dee4f 683 value[2] = data_raw.i16bit[2];
cparata 0:f27ce43dee4f 684
cparata 0:f27ce43dee4f 685 return 0;
cparata 0:f27ce43dee4f 686 }
cparata 0:f27ce43dee4f 687
cparata 0:f27ce43dee4f 688
cparata 0:f27ce43dee4f 689 /**
cparata 0:f27ce43dee4f 690 * @brief Get the LSM6DSOX accelerometer sensor axes
cparata 0:f27ce43dee4f 691 * @param acceleration pointer where the values of the axes are written
cparata 0:f27ce43dee4f 692 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 693 */
cparata 0:f27ce43dee4f 694 int LSM6DSOXSensor::get_x_axes(int32_t *acceleration)
cparata 0:f27ce43dee4f 695 {
cparata 2:6f62c931be0b 696 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 697 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 698
cparata 0:f27ce43dee4f 699 /* Read raw data values. */
cparata 0:f27ce43dee4f 700 if (lsm6dsox_acceleration_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 701 {
cparata 0:f27ce43dee4f 702 return 1;
cparata 0:f27ce43dee4f 703 }
cparata 0:f27ce43dee4f 704
cparata 0:f27ce43dee4f 705 /* Get LSM6DSOX actual sensitivity. */
cparata 0:f27ce43dee4f 706 if (get_x_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 707 {
cparata 0:f27ce43dee4f 708 return 1;
cparata 0:f27ce43dee4f 709 }
cparata 0:f27ce43dee4f 710
cparata 0:f27ce43dee4f 711 /* Calculate the data. */
cparata 0:f27ce43dee4f 712 acceleration[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
cparata 0:f27ce43dee4f 713 acceleration[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
cparata 0:f27ce43dee4f 714 acceleration[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
cparata 0:f27ce43dee4f 715
cparata 0:f27ce43dee4f 716 return 0;
cparata 0:f27ce43dee4f 717 }
cparata 0:f27ce43dee4f 718
cparata 0:f27ce43dee4f 719
cparata 0:f27ce43dee4f 720 /**
cparata 0:f27ce43dee4f 721 * @brief Enable the LSM6DSOX gyroscope sensor
cparata 0:f27ce43dee4f 722 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 723 */
cparata 0:f27ce43dee4f 724 int LSM6DSOXSensor::enable_g()
cparata 0:f27ce43dee4f 725 {
cparata 0:f27ce43dee4f 726 /* Check if the component is already enabled */
cparata 0:f27ce43dee4f 727 if (_g_is_enabled == 1U)
cparata 0:f27ce43dee4f 728 {
cparata 0:f27ce43dee4f 729 return 0;
cparata 0:f27ce43dee4f 730 }
cparata 0:f27ce43dee4f 731
cparata 0:f27ce43dee4f 732 /* Output data rate selection. */
cparata 0:f27ce43dee4f 733 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, _g_last_odr) != 0)
cparata 0:f27ce43dee4f 734 {
cparata 0:f27ce43dee4f 735 return 1;
cparata 0:f27ce43dee4f 736 }
cparata 0:f27ce43dee4f 737
cparata 0:f27ce43dee4f 738 _g_is_enabled = 1;
cparata 0:f27ce43dee4f 739
cparata 0:f27ce43dee4f 740 return 0;
cparata 0:f27ce43dee4f 741 }
cparata 0:f27ce43dee4f 742
cparata 0:f27ce43dee4f 743
cparata 0:f27ce43dee4f 744 /**
cparata 0:f27ce43dee4f 745 * @brief Disable the LSM6DSOX gyroscope sensor
cparata 0:f27ce43dee4f 746 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 747 */
cparata 0:f27ce43dee4f 748 int LSM6DSOXSensor::disable_g()
cparata 0:f27ce43dee4f 749 {
cparata 0:f27ce43dee4f 750 /* Check if the component is already disabled */
cparata 0:f27ce43dee4f 751 if (_g_is_enabled == 0U)
cparata 0:f27ce43dee4f 752 {
cparata 0:f27ce43dee4f 753 return 0;
cparata 0:f27ce43dee4f 754 }
cparata 0:f27ce43dee4f 755
cparata 0:f27ce43dee4f 756 /* Get current output data rate. */
cparata 0:f27ce43dee4f 757 if (lsm6dsox_gy_data_rate_get(&_reg_ctx, &_g_last_odr) != 0)
cparata 0:f27ce43dee4f 758 {
cparata 0:f27ce43dee4f 759 return 1;
cparata 0:f27ce43dee4f 760 }
cparata 0:f27ce43dee4f 761
cparata 0:f27ce43dee4f 762 /* Output data rate selection - power down. */
cparata 0:f27ce43dee4f 763 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, LSM6DSOX_GY_ODR_OFF) != 0)
cparata 0:f27ce43dee4f 764 {
cparata 0:f27ce43dee4f 765 return 1;
cparata 0:f27ce43dee4f 766 }
cparata 0:f27ce43dee4f 767
cparata 0:f27ce43dee4f 768 _g_is_enabled = 0;
cparata 0:f27ce43dee4f 769
cparata 0:f27ce43dee4f 770 return 0;
cparata 0:f27ce43dee4f 771 }
cparata 0:f27ce43dee4f 772
cparata 0:f27ce43dee4f 773 /**
cparata 0:f27ce43dee4f 774 * @brief Get the LSM6DSOX gyroscope sensor sensitivity
cparata 0:f27ce43dee4f 775 * @param sensitivity pointer where the sensitivity is written
cparata 0:f27ce43dee4f 776 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 777 */
cparata 0:f27ce43dee4f 778 int LSM6DSOXSensor::get_g_sensitivity(float *sensitivity)
cparata 0:f27ce43dee4f 779 {
cparata 0:f27ce43dee4f 780 int ret = 0;
cparata 0:f27ce43dee4f 781 lsm6dsox_fs_g_t full_scale;
cparata 0:f27ce43dee4f 782
cparata 0:f27ce43dee4f 783 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 784 if (lsm6dsox_gy_full_scale_get(&_reg_ctx, &full_scale) != 0)
cparata 0:f27ce43dee4f 785 {
cparata 0:f27ce43dee4f 786 return 1;
cparata 0:f27ce43dee4f 787 }
cparata 0:f27ce43dee4f 788
cparata 0:f27ce43dee4f 789 /* Store the sensitivity based on actual full scale. */
cparata 0:f27ce43dee4f 790 switch (full_scale)
cparata 0:f27ce43dee4f 791 {
cparata 0:f27ce43dee4f 792 case LSM6DSOX_125dps:
cparata 0:f27ce43dee4f 793 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_125DPS;
cparata 0:f27ce43dee4f 794 break;
cparata 0:f27ce43dee4f 795
cparata 0:f27ce43dee4f 796 case LSM6DSOX_250dps:
cparata 0:f27ce43dee4f 797 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_250DPS;
cparata 0:f27ce43dee4f 798 break;
cparata 0:f27ce43dee4f 799
cparata 0:f27ce43dee4f 800 case LSM6DSOX_500dps:
cparata 0:f27ce43dee4f 801 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_500DPS;
cparata 0:f27ce43dee4f 802 break;
cparata 0:f27ce43dee4f 803
cparata 0:f27ce43dee4f 804 case LSM6DSOX_1000dps:
cparata 0:f27ce43dee4f 805 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_1000DPS;
cparata 0:f27ce43dee4f 806 break;
cparata 0:f27ce43dee4f 807
cparata 0:f27ce43dee4f 808 case LSM6DSOX_2000dps:
cparata 0:f27ce43dee4f 809 *sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_2000DPS;
cparata 0:f27ce43dee4f 810 break;
cparata 0:f27ce43dee4f 811
cparata 0:f27ce43dee4f 812 default:
cparata 0:f27ce43dee4f 813 ret = 1;
cparata 0:f27ce43dee4f 814 break;
cparata 0:f27ce43dee4f 815 }
cparata 0:f27ce43dee4f 816
cparata 0:f27ce43dee4f 817 return ret;
cparata 0:f27ce43dee4f 818 }
cparata 0:f27ce43dee4f 819
cparata 0:f27ce43dee4f 820 /**
cparata 0:f27ce43dee4f 821 * @brief Get the LSM6DSOX gyroscope sensor output data rate
cparata 0:f27ce43dee4f 822 * @param odr pointer where the output data rate is written
cparata 0:f27ce43dee4f 823 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 824 */
cparata 0:f27ce43dee4f 825 int LSM6DSOXSensor::get_g_odr(float *odr)
cparata 0:f27ce43dee4f 826 {
cparata 0:f27ce43dee4f 827 int ret = 0;
cparata 0:f27ce43dee4f 828 lsm6dsox_odr_g_t odr_low_level;
cparata 0:f27ce43dee4f 829
cparata 0:f27ce43dee4f 830 /* Get current output data rate. */
cparata 0:f27ce43dee4f 831 if (lsm6dsox_gy_data_rate_get(&_reg_ctx, &odr_low_level) != 0)
cparata 0:f27ce43dee4f 832 {
cparata 0:f27ce43dee4f 833 return 1;
cparata 0:f27ce43dee4f 834 }
cparata 0:f27ce43dee4f 835
cparata 0:f27ce43dee4f 836 switch (odr_low_level)
cparata 0:f27ce43dee4f 837 {
cparata 0:f27ce43dee4f 838 case LSM6DSOX_GY_ODR_OFF:
cparata 0:f27ce43dee4f 839 *odr = 0.0f;
cparata 0:f27ce43dee4f 840 break;
cparata 0:f27ce43dee4f 841
cparata 0:f27ce43dee4f 842 case LSM6DSOX_GY_ODR_12Hz5:
cparata 0:f27ce43dee4f 843 *odr = 12.5f;
cparata 0:f27ce43dee4f 844 break;
cparata 0:f27ce43dee4f 845
cparata 0:f27ce43dee4f 846 case LSM6DSOX_GY_ODR_26Hz:
cparata 0:f27ce43dee4f 847 *odr = 26.0f;
cparata 0:f27ce43dee4f 848 break;
cparata 0:f27ce43dee4f 849
cparata 0:f27ce43dee4f 850 case LSM6DSOX_GY_ODR_52Hz:
cparata 0:f27ce43dee4f 851 *odr = 52.0f;
cparata 0:f27ce43dee4f 852 break;
cparata 0:f27ce43dee4f 853
cparata 0:f27ce43dee4f 854 case LSM6DSOX_GY_ODR_104Hz:
cparata 0:f27ce43dee4f 855 *odr = 104.0f;
cparata 0:f27ce43dee4f 856 break;
cparata 0:f27ce43dee4f 857
cparata 0:f27ce43dee4f 858 case LSM6DSOX_GY_ODR_208Hz:
cparata 0:f27ce43dee4f 859 *odr = 208.0f;
cparata 0:f27ce43dee4f 860 break;
cparata 0:f27ce43dee4f 861
cparata 0:f27ce43dee4f 862 case LSM6DSOX_GY_ODR_417Hz:
cparata 0:f27ce43dee4f 863 *odr = 417.0f;
cparata 0:f27ce43dee4f 864 break;
cparata 0:f27ce43dee4f 865
cparata 0:f27ce43dee4f 866 case LSM6DSOX_GY_ODR_833Hz:
cparata 0:f27ce43dee4f 867 *odr = 833.0f;
cparata 0:f27ce43dee4f 868 break;
cparata 0:f27ce43dee4f 869
cparata 0:f27ce43dee4f 870 case LSM6DSOX_GY_ODR_1667Hz:
cparata 0:f27ce43dee4f 871 *odr = 1667.0f;
cparata 0:f27ce43dee4f 872 break;
cparata 0:f27ce43dee4f 873
cparata 0:f27ce43dee4f 874 case LSM6DSOX_GY_ODR_3333Hz:
cparata 0:f27ce43dee4f 875 *odr = 3333.0f;
cparata 0:f27ce43dee4f 876 break;
cparata 0:f27ce43dee4f 877
cparata 0:f27ce43dee4f 878 case LSM6DSOX_GY_ODR_6667Hz:
cparata 0:f27ce43dee4f 879 *odr = 6667.0f;
cparata 0:f27ce43dee4f 880 break;
cparata 0:f27ce43dee4f 881
cparata 0:f27ce43dee4f 882 default:
cparata 0:f27ce43dee4f 883 ret = 1;
cparata 0:f27ce43dee4f 884 break;
cparata 0:f27ce43dee4f 885 }
cparata 0:f27ce43dee4f 886
cparata 0:f27ce43dee4f 887 return ret;
cparata 0:f27ce43dee4f 888 }
cparata 0:f27ce43dee4f 889
cparata 0:f27ce43dee4f 890 /**
cparata 0:f27ce43dee4f 891 * @brief Set the LSM6DSOX gyroscope sensor output data rate
cparata 0:f27ce43dee4f 892 * @param odr the output data rate value to be set
cparata 0:f27ce43dee4f 893 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 894 */
cparata 0:f27ce43dee4f 895 int LSM6DSOXSensor::set_g_odr(float odr)
cparata 0:f27ce43dee4f 896 {
cparata 1:fe40aec6e97a 897 return set_g_odr_with_mode(odr, LSM6DSOX_GYRO_HIGH_PERFORMANCE_MODE);
cparata 1:fe40aec6e97a 898 }
cparata 1:fe40aec6e97a 899
cparata 1:fe40aec6e97a 900 /**
cparata 1:fe40aec6e97a 901 * @brief Set the LSM6DSOX gyroscope sensor output data rate with operating mode
cparata 1:fe40aec6e97a 902 * @param odr the output data rate value to be set
cparata 1:fe40aec6e97a 903 * @param mode the gyroscope operating mode
cparata 1:fe40aec6e97a 904 * @retval 0 in case of success, an error code otherwise
cparata 1:fe40aec6e97a 905 */
cparata 1:fe40aec6e97a 906 int LSM6DSOXSensor::set_g_odr_with_mode(float odr, LSM6DSOX_GYRO_Operating_Mode_t mode)
cparata 1:fe40aec6e97a 907 {
cparata 1:fe40aec6e97a 908 int ret = 0;
cparata 1:fe40aec6e97a 909
cparata 1:fe40aec6e97a 910 switch (mode)
cparata 1:fe40aec6e97a 911 {
cparata 1:fe40aec6e97a 912 case LSM6DSOX_GYRO_HIGH_PERFORMANCE_MODE:
cparata 1:fe40aec6e97a 913 {
cparata 1:fe40aec6e97a 914 /* We must uncheck Low Power bit if it is enabled */
cparata 1:fe40aec6e97a 915 lsm6dsox_ctrl7_g_t val1;
cparata 1:fe40aec6e97a 916
cparata 1:fe40aec6e97a 917 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 918 {
cparata 1:fe40aec6e97a 919 return 1;
cparata 1:fe40aec6e97a 920 }
cparata 1:fe40aec6e97a 921
cparata 1:fe40aec6e97a 922 if (val1.g_hm_mode)
cparata 1:fe40aec6e97a 923 {
cparata 1:fe40aec6e97a 924 val1.g_hm_mode = 0;
cparata 1:fe40aec6e97a 925 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 926 {
cparata 1:fe40aec6e97a 927 return 1;
cparata 1:fe40aec6e97a 928 }
cparata 1:fe40aec6e97a 929 }
cparata 1:fe40aec6e97a 930 break;
cparata 1:fe40aec6e97a 931 }
cparata 1:fe40aec6e97a 932 case LSM6DSOX_GYRO_LOW_POWER_NORMAL_MODE:
cparata 1:fe40aec6e97a 933 {
cparata 1:fe40aec6e97a 934 /* We must check the Low Power bit if it is unchecked */
cparata 1:fe40aec6e97a 935 lsm6dsox_ctrl7_g_t val1;
cparata 1:fe40aec6e97a 936
cparata 1:fe40aec6e97a 937 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 938 {
cparata 1:fe40aec6e97a 939 return 1;
cparata 1:fe40aec6e97a 940 }
cparata 1:fe40aec6e97a 941
cparata 1:fe40aec6e97a 942 if (!val1.g_hm_mode)
cparata 1:fe40aec6e97a 943 {
cparata 1:fe40aec6e97a 944 val1.g_hm_mode = 1U;
cparata 1:fe40aec6e97a 945 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != 0)
cparata 1:fe40aec6e97a 946 {
cparata 1:fe40aec6e97a 947 return 1;
cparata 1:fe40aec6e97a 948 }
cparata 1:fe40aec6e97a 949 }
cparata 1:fe40aec6e97a 950
cparata 1:fe40aec6e97a 951 /* Now we need to limit the ODR to 208 Hz if it is higher */
cparata 1:fe40aec6e97a 952 if (odr > 208.0f)
cparata 1:fe40aec6e97a 953 {
cparata 1:fe40aec6e97a 954 odr = 208.0f;
cparata 1:fe40aec6e97a 955 }
cparata 1:fe40aec6e97a 956 break;
cparata 1:fe40aec6e97a 957 }
cparata 1:fe40aec6e97a 958 default:
cparata 1:fe40aec6e97a 959 ret = 1;
cparata 1:fe40aec6e97a 960 break;
cparata 1:fe40aec6e97a 961 }
cparata 1:fe40aec6e97a 962
cparata 0:f27ce43dee4f 963 /* Check if the component is enabled */
cparata 0:f27ce43dee4f 964 if (_g_is_enabled == 1U)
cparata 0:f27ce43dee4f 965 {
cparata 1:fe40aec6e97a 966 ret = set_g_odr_when_enabled(odr);
cparata 0:f27ce43dee4f 967 }
cparata 0:f27ce43dee4f 968 else
cparata 0:f27ce43dee4f 969 {
cparata 1:fe40aec6e97a 970 ret = set_g_odr_when_disabled(odr);
cparata 0:f27ce43dee4f 971 }
cparata 1:fe40aec6e97a 972
cparata 1:fe40aec6e97a 973 return ret;
cparata 0:f27ce43dee4f 974 }
cparata 0:f27ce43dee4f 975
cparata 0:f27ce43dee4f 976 /**
cparata 0:f27ce43dee4f 977 * @brief Set the LSM6DSOX gyroscope sensor output data rate when enabled
cparata 0:f27ce43dee4f 978 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 979 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 980 */
cparata 0:f27ce43dee4f 981 int LSM6DSOXSensor::set_g_odr_when_enabled(float odr)
cparata 0:f27ce43dee4f 982 {
cparata 0:f27ce43dee4f 983 lsm6dsox_odr_g_t new_odr;
cparata 0:f27ce43dee4f 984
cparata 0:f27ce43dee4f 985 new_odr = (odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
cparata 0:f27ce43dee4f 986 : (odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
cparata 0:f27ce43dee4f 987 : (odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
cparata 0:f27ce43dee4f 988 : (odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
cparata 0:f27ce43dee4f 989 : (odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
cparata 0:f27ce43dee4f 990 : (odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
cparata 0:f27ce43dee4f 991 : (odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
cparata 0:f27ce43dee4f 992 : (odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
cparata 0:f27ce43dee4f 993 : (odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
cparata 0:f27ce43dee4f 994 : LSM6DSOX_GY_ODR_6667Hz;
cparata 0:f27ce43dee4f 995
cparata 0:f27ce43dee4f 996 /* Output data rate selection. */
cparata 0:f27ce43dee4f 997 if (lsm6dsox_gy_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:f27ce43dee4f 998 {
cparata 0:f27ce43dee4f 999 return 1;
cparata 0:f27ce43dee4f 1000 }
cparata 0:f27ce43dee4f 1001
cparata 0:f27ce43dee4f 1002 return 0;
cparata 0:f27ce43dee4f 1003 }
cparata 0:f27ce43dee4f 1004
cparata 0:f27ce43dee4f 1005 /**
cparata 0:f27ce43dee4f 1006 * @brief Set the LSM6DSOX gyroscope sensor output data rate when disabled
cparata 0:f27ce43dee4f 1007 * @param odr the functional output data rate to be set
cparata 0:f27ce43dee4f 1008 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1009 */
cparata 0:f27ce43dee4f 1010 int LSM6DSOXSensor::set_g_odr_when_disabled(float odr)
cparata 0:f27ce43dee4f 1011 {
cparata 0:f27ce43dee4f 1012 _g_last_odr = (odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
cparata 0:f27ce43dee4f 1013 : (odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
cparata 0:f27ce43dee4f 1014 : (odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
cparata 0:f27ce43dee4f 1015 : (odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
cparata 0:f27ce43dee4f 1016 : (odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
cparata 0:f27ce43dee4f 1017 : (odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
cparata 0:f27ce43dee4f 1018 : (odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
cparata 0:f27ce43dee4f 1019 : (odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
cparata 0:f27ce43dee4f 1020 : (odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
cparata 0:f27ce43dee4f 1021 : LSM6DSOX_GY_ODR_6667Hz;
cparata 0:f27ce43dee4f 1022
cparata 0:f27ce43dee4f 1023 return 0;
cparata 0:f27ce43dee4f 1024 }
cparata 0:f27ce43dee4f 1025
cparata 0:f27ce43dee4f 1026
cparata 0:f27ce43dee4f 1027 /**
cparata 0:f27ce43dee4f 1028 * @brief Get the LSM6DSOX gyroscope sensor full scale
cparata 0:f27ce43dee4f 1029 * @param full_scale pointer where the full scale is written
cparata 0:f27ce43dee4f 1030 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1031 */
cparata 0:f27ce43dee4f 1032 int LSM6DSOXSensor::get_g_fs(float *full_scale)
cparata 0:f27ce43dee4f 1033 {
cparata 0:f27ce43dee4f 1034 int ret = 0;
cparata 0:f27ce43dee4f 1035 lsm6dsox_fs_g_t fs_low_level;
cparata 0:f27ce43dee4f 1036
cparata 0:f27ce43dee4f 1037 /* Read actual full scale selection from sensor. */
cparata 0:f27ce43dee4f 1038 if (lsm6dsox_gy_full_scale_get(&_reg_ctx, &fs_low_level) != 0)
cparata 0:f27ce43dee4f 1039 {
cparata 0:f27ce43dee4f 1040 return 1;
cparata 0:f27ce43dee4f 1041 }
cparata 0:f27ce43dee4f 1042
cparata 0:f27ce43dee4f 1043 switch (fs_low_level)
cparata 0:f27ce43dee4f 1044 {
cparata 0:f27ce43dee4f 1045 case LSM6DSOX_125dps:
cparata 0:f27ce43dee4f 1046 *full_scale = 125.0f;
cparata 0:f27ce43dee4f 1047 break;
cparata 0:f27ce43dee4f 1048
cparata 0:f27ce43dee4f 1049 case LSM6DSOX_250dps:
cparata 0:f27ce43dee4f 1050 *full_scale = 250.0f;
cparata 0:f27ce43dee4f 1051 break;
cparata 0:f27ce43dee4f 1052
cparata 0:f27ce43dee4f 1053 case LSM6DSOX_500dps:
cparata 0:f27ce43dee4f 1054 *full_scale = 500.0f;
cparata 0:f27ce43dee4f 1055 break;
cparata 0:f27ce43dee4f 1056
cparata 0:f27ce43dee4f 1057 case LSM6DSOX_1000dps:
cparata 0:f27ce43dee4f 1058 *full_scale = 1000.0f;
cparata 0:f27ce43dee4f 1059 break;
cparata 0:f27ce43dee4f 1060
cparata 0:f27ce43dee4f 1061 case LSM6DSOX_2000dps:
cparata 0:f27ce43dee4f 1062 *full_scale = 2000.0f;
cparata 0:f27ce43dee4f 1063 break;
cparata 0:f27ce43dee4f 1064
cparata 0:f27ce43dee4f 1065 default:
cparata 0:f27ce43dee4f 1066 ret = 1;
cparata 0:f27ce43dee4f 1067 break;
cparata 0:f27ce43dee4f 1068 }
cparata 0:f27ce43dee4f 1069
cparata 0:f27ce43dee4f 1070 return ret;
cparata 0:f27ce43dee4f 1071 }
cparata 0:f27ce43dee4f 1072
cparata 0:f27ce43dee4f 1073 /**
cparata 0:f27ce43dee4f 1074 * @brief Set the LSM6DSOX gyroscope sensor full scale
cparata 0:f27ce43dee4f 1075 * @param full_scale the functional full scale to be set
cparata 0:f27ce43dee4f 1076 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1077 */
cparata 0:f27ce43dee4f 1078 int LSM6DSOXSensor::set_g_fs(float full_scale)
cparata 0:f27ce43dee4f 1079 {
cparata 0:f27ce43dee4f 1080 lsm6dsox_fs_g_t new_fs;
cparata 0:f27ce43dee4f 1081
cparata 0:f27ce43dee4f 1082 new_fs = (full_scale <= 125.0f) ? LSM6DSOX_125dps
cparata 0:f27ce43dee4f 1083 : (full_scale <= 250.0f) ? LSM6DSOX_250dps
cparata 0:f27ce43dee4f 1084 : (full_scale <= 500.0f) ? LSM6DSOX_500dps
cparata 0:f27ce43dee4f 1085 : (full_scale <= 1000.0f) ? LSM6DSOX_1000dps
cparata 0:f27ce43dee4f 1086 : LSM6DSOX_2000dps;
cparata 0:f27ce43dee4f 1087
cparata 0:f27ce43dee4f 1088 if (lsm6dsox_gy_full_scale_set(&_reg_ctx, new_fs) != 0)
cparata 0:f27ce43dee4f 1089 {
cparata 0:f27ce43dee4f 1090 return 1;
cparata 0:f27ce43dee4f 1091 }
cparata 0:f27ce43dee4f 1092
cparata 0:f27ce43dee4f 1093 return 0;
cparata 0:f27ce43dee4f 1094 }
cparata 0:f27ce43dee4f 1095
cparata 0:f27ce43dee4f 1096 /**
cparata 0:f27ce43dee4f 1097 * @brief Get the LSM6DSOX gyroscope sensor raw axes
cparata 0:f27ce43dee4f 1098 * @param value pointer where the raw values of the axes are written
cparata 0:f27ce43dee4f 1099 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1100 */
cparata 0:f27ce43dee4f 1101 int LSM6DSOXSensor::get_g_axes_raw(int16_t *value)
cparata 0:f27ce43dee4f 1102 {
cparata 2:6f62c931be0b 1103 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 1104
cparata 0:f27ce43dee4f 1105 /* Read raw data values. */
cparata 0:f27ce43dee4f 1106 if (lsm6dsox_angular_rate_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 1107 {
cparata 0:f27ce43dee4f 1108 return 1;
cparata 0:f27ce43dee4f 1109 }
cparata 0:f27ce43dee4f 1110
cparata 0:f27ce43dee4f 1111 /* Format the data. */
cparata 0:f27ce43dee4f 1112 value[0] = data_raw.i16bit[0];
cparata 0:f27ce43dee4f 1113 value[1] = data_raw.i16bit[1];
cparata 0:f27ce43dee4f 1114 value[2] = data_raw.i16bit[2];
cparata 0:f27ce43dee4f 1115
cparata 0:f27ce43dee4f 1116 return 0;
cparata 0:f27ce43dee4f 1117 }
cparata 0:f27ce43dee4f 1118
cparata 0:f27ce43dee4f 1119
cparata 0:f27ce43dee4f 1120 /**
cparata 0:f27ce43dee4f 1121 * @brief Get the LSM6DSOX gyroscope sensor axes
cparata 0:f27ce43dee4f 1122 * @param angular_rate pointer where the values of the axes are written
cparata 0:f27ce43dee4f 1123 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1124 */
cparata 0:f27ce43dee4f 1125 int LSM6DSOXSensor::get_g_axes(int32_t *angular_rate)
cparata 0:f27ce43dee4f 1126 {
cparata 2:6f62c931be0b 1127 axis3bit16_t data_raw;
cparata 0:f27ce43dee4f 1128 float sensitivity;
cparata 0:f27ce43dee4f 1129
cparata 0:f27ce43dee4f 1130 /* Read raw data values. */
cparata 0:f27ce43dee4f 1131 if (lsm6dsox_angular_rate_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:f27ce43dee4f 1132 {
cparata 0:f27ce43dee4f 1133 return 1;
cparata 0:f27ce43dee4f 1134 }
cparata 0:f27ce43dee4f 1135
cparata 0:f27ce43dee4f 1136 /* Get LSM6DSOX actual sensitivity. */
cparata 0:f27ce43dee4f 1137 if (get_g_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 1138 {
cparata 0:f27ce43dee4f 1139 return 1;
cparata 0:f27ce43dee4f 1140 }
cparata 0:f27ce43dee4f 1141
cparata 0:f27ce43dee4f 1142 /* Calculate the data. */
cparata 0:f27ce43dee4f 1143 angular_rate[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
cparata 0:f27ce43dee4f 1144 angular_rate[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
cparata 0:f27ce43dee4f 1145 angular_rate[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
cparata 0:f27ce43dee4f 1146
cparata 0:f27ce43dee4f 1147 return 0;
cparata 0:f27ce43dee4f 1148 }
cparata 0:f27ce43dee4f 1149
cparata 0:f27ce43dee4f 1150
cparata 0:f27ce43dee4f 1151 /**
cparata 0:f27ce43dee4f 1152 * @brief Get the LSM6DSOX register value
cparata 0:f27ce43dee4f 1153 * @param reg address to be read
cparata 0:f27ce43dee4f 1154 * @param data pointer where the value is written
cparata 0:f27ce43dee4f 1155 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1156 */
cparata 0:f27ce43dee4f 1157 int LSM6DSOXSensor::read_reg(uint8_t reg, uint8_t *data)
cparata 0:f27ce43dee4f 1158 {
cparata 0:f27ce43dee4f 1159 if (lsm6dsox_read_reg(&_reg_ctx, reg, data, 1) != 0)
cparata 0:f27ce43dee4f 1160 {
cparata 0:f27ce43dee4f 1161 return 1;
cparata 0:f27ce43dee4f 1162 }
cparata 0:f27ce43dee4f 1163
cparata 0:f27ce43dee4f 1164 return 0;
cparata 0:f27ce43dee4f 1165 }
cparata 0:f27ce43dee4f 1166
cparata 0:f27ce43dee4f 1167
cparata 0:f27ce43dee4f 1168 /**
cparata 0:f27ce43dee4f 1169 * @brief Set the LSM6DSOX register value
cparata 0:f27ce43dee4f 1170 * @param reg address to be written
cparata 0:f27ce43dee4f 1171 * @param data value to be written
cparata 0:f27ce43dee4f 1172 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1173 */
cparata 0:f27ce43dee4f 1174 int LSM6DSOXSensor::write_reg(uint8_t reg, uint8_t data)
cparata 0:f27ce43dee4f 1175 {
cparata 0:f27ce43dee4f 1176 if (lsm6dsox_write_reg(&_reg_ctx, reg, &data, 1) != 0)
cparata 0:f27ce43dee4f 1177 {
cparata 0:f27ce43dee4f 1178 return 1;
cparata 0:f27ce43dee4f 1179 }
cparata 0:f27ce43dee4f 1180
cparata 0:f27ce43dee4f 1181 return 0;
cparata 0:f27ce43dee4f 1182 }
cparata 0:f27ce43dee4f 1183
cparata 0:f27ce43dee4f 1184 /**
cparata 0:f27ce43dee4f 1185 * @brief Set the interrupt latch
cparata 0:f27ce43dee4f 1186 * @param status value to be written
cparata 0:f27ce43dee4f 1187 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1188 */
cparata 0:f27ce43dee4f 1189 int LSM6DSOXSensor::set_interrupt_latch(uint8_t status)
cparata 0:f27ce43dee4f 1190 {
cparata 0:f27ce43dee4f 1191 if (status > 1U)
cparata 0:f27ce43dee4f 1192 {
cparata 0:f27ce43dee4f 1193 return 1;
cparata 0:f27ce43dee4f 1194 }
cparata 0:f27ce43dee4f 1195
cparata 0:f27ce43dee4f 1196 if (lsm6dsox_int_notification_set(&_reg_ctx, (lsm6dsox_lir_t)status) != 0)
cparata 0:f27ce43dee4f 1197 {
cparata 0:f27ce43dee4f 1198 return 1;
cparata 0:f27ce43dee4f 1199 }
cparata 0:f27ce43dee4f 1200
cparata 0:f27ce43dee4f 1201 return 0;
cparata 0:f27ce43dee4f 1202 }
cparata 0:f27ce43dee4f 1203
cparata 0:f27ce43dee4f 1204 /**
cparata 0:f27ce43dee4f 1205 * @brief Enable free fall detection
cparata 0:f27ce43dee4f 1206 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1207 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1208 */
cparata 0:f27ce43dee4f 1209 int LSM6DSOXSensor::enable_free_fall_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1210 {
cparata 0:f27ce43dee4f 1211 int ret = 0;
cparata 0:f27ce43dee4f 1212 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1213 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1214
cparata 0:f27ce43dee4f 1215 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1216 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1217 {
cparata 0:f27ce43dee4f 1218 return 1;
cparata 0:f27ce43dee4f 1219 }
cparata 0:f27ce43dee4f 1220
cparata 0:f27ce43dee4f 1221 /* Full scale selection */
cparata 0:f27ce43dee4f 1222 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1223 {
cparata 0:f27ce43dee4f 1224 return 1;
cparata 0:f27ce43dee4f 1225 }
cparata 0:f27ce43dee4f 1226
cparata 0:f27ce43dee4f 1227 /* FF_DUR setting */
cparata 0:f27ce43dee4f 1228 if (lsm6dsox_ff_dur_set(&_reg_ctx, 0x06) != 0)
cparata 0:f27ce43dee4f 1229 {
cparata 0:f27ce43dee4f 1230 return 1;
cparata 0:f27ce43dee4f 1231 }
cparata 0:f27ce43dee4f 1232
cparata 0:f27ce43dee4f 1233 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 1234 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1235 {
cparata 0:f27ce43dee4f 1236 return 1;
cparata 0:f27ce43dee4f 1237 }
cparata 0:f27ce43dee4f 1238
cparata 0:f27ce43dee4f 1239 /* SLEEP_DUR setting */
cparata 0:f27ce43dee4f 1240 if (lsm6dsox_act_sleep_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1241 {
cparata 0:f27ce43dee4f 1242 return 1;
cparata 0:f27ce43dee4f 1243 }
cparata 0:f27ce43dee4f 1244
cparata 0:f27ce43dee4f 1245 /* FF_THS setting */
cparata 0:f27ce43dee4f 1246 if (lsm6dsox_ff_threshold_set(&_reg_ctx, LSM6DSOX_FF_TSH_312mg) != 0)
cparata 0:f27ce43dee4f 1247 {
cparata 0:f27ce43dee4f 1248 return 1;
cparata 0:f27ce43dee4f 1249 }
cparata 0:f27ce43dee4f 1250
cparata 0:f27ce43dee4f 1251 /* Enable free fall event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1252 switch (int_pin)
cparata 0:f27ce43dee4f 1253 {
cparata 0:f27ce43dee4f 1254 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1255 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1256 {
cparata 0:f27ce43dee4f 1257 return 1;
cparata 0:f27ce43dee4f 1258 }
cparata 0:f27ce43dee4f 1259
cparata 1:fe40aec6e97a 1260 val1.free_fall = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1261
cparata 1:fe40aec6e97a 1262 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1263 {
cparata 0:f27ce43dee4f 1264 return 1;
cparata 0:f27ce43dee4f 1265 }
cparata 0:f27ce43dee4f 1266 break;
cparata 0:f27ce43dee4f 1267
cparata 0:f27ce43dee4f 1268 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 1269 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1270 {
cparata 0:f27ce43dee4f 1271 return 1;
cparata 0:f27ce43dee4f 1272 }
cparata 0:f27ce43dee4f 1273
cparata 1:fe40aec6e97a 1274 val2.free_fall = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1275
cparata 1:fe40aec6e97a 1276 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1277 {
cparata 0:f27ce43dee4f 1278 return 1;
cparata 0:f27ce43dee4f 1279 }
cparata 0:f27ce43dee4f 1280 break;
cparata 0:f27ce43dee4f 1281
cparata 0:f27ce43dee4f 1282 default:
cparata 0:f27ce43dee4f 1283 ret = 1;
cparata 0:f27ce43dee4f 1284 break;
cparata 0:f27ce43dee4f 1285 }
cparata 0:f27ce43dee4f 1286
cparata 0:f27ce43dee4f 1287 return ret;
cparata 0:f27ce43dee4f 1288 }
cparata 0:f27ce43dee4f 1289
cparata 0:f27ce43dee4f 1290 /**
cparata 0:f27ce43dee4f 1291 * @brief Disable free fall detection
cparata 0:f27ce43dee4f 1292 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1293 */
cparata 0:f27ce43dee4f 1294 int LSM6DSOXSensor::disable_free_fall_detection()
cparata 0:f27ce43dee4f 1295 {
cparata 0:f27ce43dee4f 1296 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1297 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1298
cparata 0:f27ce43dee4f 1299 /* Disable free fall event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1300 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1301 {
cparata 0:f27ce43dee4f 1302 return 1;
cparata 0:f27ce43dee4f 1303 }
cparata 0:f27ce43dee4f 1304
cparata 1:fe40aec6e97a 1305 val1.free_fall = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1306
cparata 1:fe40aec6e97a 1307 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1308 {
cparata 0:f27ce43dee4f 1309 return 1;
cparata 0:f27ce43dee4f 1310 }
cparata 0:f27ce43dee4f 1311
cparata 1:fe40aec6e97a 1312 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1313 {
cparata 0:f27ce43dee4f 1314 return 1;
cparata 0:f27ce43dee4f 1315 }
cparata 0:f27ce43dee4f 1316
cparata 1:fe40aec6e97a 1317 val2.free_fall = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1318
cparata 1:fe40aec6e97a 1319 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1320 {
cparata 0:f27ce43dee4f 1321 return 1;
cparata 0:f27ce43dee4f 1322 }
cparata 0:f27ce43dee4f 1323
cparata 0:f27ce43dee4f 1324 /* FF_DUR setting */
cparata 0:f27ce43dee4f 1325 if (lsm6dsox_ff_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1326 {
cparata 0:f27ce43dee4f 1327 return 1;
cparata 0:f27ce43dee4f 1328 }
cparata 0:f27ce43dee4f 1329
cparata 0:f27ce43dee4f 1330 /* FF_THS setting */
cparata 0:f27ce43dee4f 1331 if (lsm6dsox_ff_threshold_set(&_reg_ctx, LSM6DSOX_FF_TSH_156mg) != 0)
cparata 0:f27ce43dee4f 1332 {
cparata 0:f27ce43dee4f 1333 return 1;
cparata 0:f27ce43dee4f 1334 }
cparata 0:f27ce43dee4f 1335
cparata 0:f27ce43dee4f 1336 return 0;
cparata 0:f27ce43dee4f 1337 }
cparata 0:f27ce43dee4f 1338
cparata 0:f27ce43dee4f 1339 /**
cparata 0:f27ce43dee4f 1340 * @brief Set free fall threshold
cparata 0:f27ce43dee4f 1341 * @param thr free fall detection threshold
cparata 0:f27ce43dee4f 1342 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1343 */
cparata 0:f27ce43dee4f 1344 int LSM6DSOXSensor::set_free_fall_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 1345 {
cparata 0:f27ce43dee4f 1346 if (lsm6dsox_ff_threshold_set(&_reg_ctx, (lsm6dsox_ff_ths_t)thr) != 0)
cparata 0:f27ce43dee4f 1347 {
cparata 0:f27ce43dee4f 1348 return 1;
cparata 0:f27ce43dee4f 1349 }
cparata 0:f27ce43dee4f 1350
cparata 0:f27ce43dee4f 1351 return 0;
cparata 0:f27ce43dee4f 1352 }
cparata 0:f27ce43dee4f 1353
cparata 0:f27ce43dee4f 1354
cparata 0:f27ce43dee4f 1355 /**
cparata 0:f27ce43dee4f 1356 * @brief Set free fall duration
cparata 0:f27ce43dee4f 1357 * @param dur free fall detection duration
cparata 0:f27ce43dee4f 1358 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1359 */
cparata 0:f27ce43dee4f 1360 int LSM6DSOXSensor::set_free_fall_duration(uint8_t dur)
cparata 0:f27ce43dee4f 1361 {
cparata 0:f27ce43dee4f 1362 if (lsm6dsox_ff_dur_set(&_reg_ctx, dur) != 0)
cparata 0:f27ce43dee4f 1363 {
cparata 0:f27ce43dee4f 1364 return 1;
cparata 0:f27ce43dee4f 1365 }
cparata 0:f27ce43dee4f 1366
cparata 0:f27ce43dee4f 1367 return 0;
cparata 0:f27ce43dee4f 1368 }
cparata 0:f27ce43dee4f 1369
cparata 0:f27ce43dee4f 1370
cparata 0:f27ce43dee4f 1371 /**
cparata 0:f27ce43dee4f 1372 * @brief Enable pedometer
cparata 0:f27ce43dee4f 1373 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1374 */
cparata 0:f27ce43dee4f 1375 int LSM6DSOXSensor::enable_pedometer()
cparata 0:f27ce43dee4f 1376 {
cparata 1:fe40aec6e97a 1377 lsm6dsox_pin_int1_route_t val;
cparata 1:fe40aec6e97a 1378 lsm6dsox_emb_sens_t emb_sens;
cparata 0:f27ce43dee4f 1379
cparata 0:f27ce43dee4f 1380 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1381 if (set_x_odr(26.0f) != 0)
cparata 0:f27ce43dee4f 1382 {
cparata 0:f27ce43dee4f 1383 return 1;
cparata 0:f27ce43dee4f 1384 }
cparata 0:f27ce43dee4f 1385
cparata 0:f27ce43dee4f 1386 /* Full scale selection */
cparata 0:f27ce43dee4f 1387 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1388 {
cparata 0:f27ce43dee4f 1389 return 1;
cparata 0:f27ce43dee4f 1390 }
cparata 0:f27ce43dee4f 1391
cparata 1:fe40aec6e97a 1392 /* Save current embedded features */
cparata 1:fe40aec6e97a 1393 if (lsm6dsox_embedded_sens_get(&_reg_ctx, &emb_sens) != 0)
cparata 1:fe40aec6e97a 1394 {
cparata 1:fe40aec6e97a 1395 return 1;
cparata 1:fe40aec6e97a 1396 }
cparata 1:fe40aec6e97a 1397
cparata 1:fe40aec6e97a 1398 /* Turn off embedded features */
cparata 1:fe40aec6e97a 1399 if (lsm6dsox_embedded_sens_off(&_reg_ctx) != 0)
cparata 1:fe40aec6e97a 1400 {
cparata 1:fe40aec6e97a 1401 return 1;
cparata 1:fe40aec6e97a 1402 }
cparata 1:fe40aec6e97a 1403
cparata 1:fe40aec6e97a 1404 /* Wait for 10 ms */
cparata 1:fe40aec6e97a 1405 ThisThread::sleep_for(10);
cparata 1:fe40aec6e97a 1406
cparata 0:f27ce43dee4f 1407 /* Enable pedometer algorithm. */
cparata 1:fe40aec6e97a 1408 emb_sens.step = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1409
cparata 0:f27ce43dee4f 1410 if (lsm6dsox_pedo_sens_set(&_reg_ctx, LSM6DSOX_PEDO_BASE_MODE) != 0)
cparata 0:f27ce43dee4f 1411 {
cparata 0:f27ce43dee4f 1412 return 1;
cparata 0:f27ce43dee4f 1413 }
cparata 0:f27ce43dee4f 1414
cparata 1:fe40aec6e97a 1415 /* Turn on embedded features */
cparata 1:fe40aec6e97a 1416 if (lsm6dsox_embedded_sens_set(&_reg_ctx, &emb_sens) != 0)
cparata 1:fe40aec6e97a 1417 {
cparata 1:fe40aec6e97a 1418 return 1;
cparata 1:fe40aec6e97a 1419 }
cparata 1:fe40aec6e97a 1420
cparata 0:f27ce43dee4f 1421 /* Enable step detector on INT1 pin */
cparata 0:f27ce43dee4f 1422 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val) != 0)
cparata 0:f27ce43dee4f 1423 {
cparata 0:f27ce43dee4f 1424 return 1;
cparata 0:f27ce43dee4f 1425 }
cparata 0:f27ce43dee4f 1426
cparata 1:fe40aec6e97a 1427 val.step_detector = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1428
cparata 1:fe40aec6e97a 1429 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val) != 0)
cparata 0:f27ce43dee4f 1430 {
cparata 0:f27ce43dee4f 1431 return 1;
cparata 0:f27ce43dee4f 1432 }
cparata 0:f27ce43dee4f 1433
cparata 0:f27ce43dee4f 1434 return 0;
cparata 0:f27ce43dee4f 1435 }
cparata 0:f27ce43dee4f 1436
cparata 0:f27ce43dee4f 1437 /**
cparata 0:f27ce43dee4f 1438 * @brief Disable pedometer
cparata 0:f27ce43dee4f 1439 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1440 */
cparata 0:f27ce43dee4f 1441 int LSM6DSOXSensor::disable_pedometer()
cparata 0:f27ce43dee4f 1442 {
cparata 0:f27ce43dee4f 1443 lsm6dsox_pin_int1_route_t val1;
cparata 1:fe40aec6e97a 1444 lsm6dsox_emb_sens_t emb_sens;
cparata 0:f27ce43dee4f 1445
cparata 0:f27ce43dee4f 1446 /* Disable step detector on INT1 pin */
cparata 0:f27ce43dee4f 1447 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1448 {
cparata 0:f27ce43dee4f 1449 return 1;
cparata 0:f27ce43dee4f 1450 }
cparata 0:f27ce43dee4f 1451
cparata 1:fe40aec6e97a 1452 val1.step_detector = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1453
cparata 1:fe40aec6e97a 1454 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 1:fe40aec6e97a 1455 {
cparata 1:fe40aec6e97a 1456 return 1;
cparata 1:fe40aec6e97a 1457 }
cparata 1:fe40aec6e97a 1458
cparata 1:fe40aec6e97a 1459 /* Save current embedded features */
cparata 1:fe40aec6e97a 1460 if (lsm6dsox_embedded_sens_get(&_reg_ctx, &emb_sens) != 0)
cparata 0:f27ce43dee4f 1461 {
cparata 0:f27ce43dee4f 1462 return 1;
cparata 0:f27ce43dee4f 1463 }
cparata 0:f27ce43dee4f 1464
cparata 0:f27ce43dee4f 1465 /* Disable pedometer algorithm. */
cparata 1:fe40aec6e97a 1466 emb_sens.step = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1467
cparata 1:fe40aec6e97a 1468 if (lsm6dsox_embedded_sens_set(&_reg_ctx, &emb_sens) != 0)
cparata 0:f27ce43dee4f 1469 {
cparata 0:f27ce43dee4f 1470 return 1;
cparata 0:f27ce43dee4f 1471 }
cparata 0:f27ce43dee4f 1472
cparata 0:f27ce43dee4f 1473 return 0;
cparata 0:f27ce43dee4f 1474 }
cparata 0:f27ce43dee4f 1475
cparata 0:f27ce43dee4f 1476 /**
cparata 0:f27ce43dee4f 1477 * @brief Get step count
cparata 0:f27ce43dee4f 1478 * @param step_count step counter
cparata 0:f27ce43dee4f 1479 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1480 */
cparata 0:f27ce43dee4f 1481 int LSM6DSOXSensor::get_step_counter(uint16_t *step_count)
cparata 0:f27ce43dee4f 1482 {
cparata 0:f27ce43dee4f 1483 if (lsm6dsox_number_of_steps_get(&_reg_ctx, (uint8_t *)step_count) != 0)
cparata 0:f27ce43dee4f 1484 {
cparata 0:f27ce43dee4f 1485 return 1;
cparata 0:f27ce43dee4f 1486 }
cparata 0:f27ce43dee4f 1487
cparata 0:f27ce43dee4f 1488 return 0;
cparata 0:f27ce43dee4f 1489 }
cparata 0:f27ce43dee4f 1490
cparata 0:f27ce43dee4f 1491 /**
cparata 0:f27ce43dee4f 1492 * @brief Enable step counter reset
cparata 0:f27ce43dee4f 1493 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1494 */
cparata 0:f27ce43dee4f 1495 int LSM6DSOXSensor::reset_step_counter()
cparata 0:f27ce43dee4f 1496 {
cparata 0:f27ce43dee4f 1497 if (lsm6dsox_steps_reset(&_reg_ctx) != 0)
cparata 0:f27ce43dee4f 1498 {
cparata 0:f27ce43dee4f 1499 return 1;
cparata 0:f27ce43dee4f 1500 }
cparata 0:f27ce43dee4f 1501
cparata 0:f27ce43dee4f 1502 return 0;
cparata 0:f27ce43dee4f 1503 }
cparata 0:f27ce43dee4f 1504
cparata 0:f27ce43dee4f 1505 /**
cparata 0:f27ce43dee4f 1506 * @brief Enable tilt detection
cparata 0:f27ce43dee4f 1507 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1508 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1509 */
cparata 0:f27ce43dee4f 1510 int LSM6DSOXSensor::enable_tilt_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1511 {
cparata 0:f27ce43dee4f 1512 int ret = 0;
cparata 0:f27ce43dee4f 1513 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1514 lsm6dsox_pin_int2_route_t val2;
cparata 1:fe40aec6e97a 1515 lsm6dsox_emb_sens_t emb_sens;
cparata 0:f27ce43dee4f 1516
cparata 0:f27ce43dee4f 1517 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1518 if (set_x_odr(26.0f) != 0)
cparata 0:f27ce43dee4f 1519 {
cparata 0:f27ce43dee4f 1520 return 1;
cparata 0:f27ce43dee4f 1521 }
cparata 0:f27ce43dee4f 1522
cparata 0:f27ce43dee4f 1523 /* Full scale selection */
cparata 0:f27ce43dee4f 1524 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1525 {
cparata 0:f27ce43dee4f 1526 return 1;
cparata 0:f27ce43dee4f 1527 }
cparata 0:f27ce43dee4f 1528
cparata 1:fe40aec6e97a 1529 /* Save current embedded features */
cparata 1:fe40aec6e97a 1530 if (lsm6dsox_embedded_sens_get(&_reg_ctx, &emb_sens) != 0)
cparata 1:fe40aec6e97a 1531 {
cparata 1:fe40aec6e97a 1532 return 1;
cparata 1:fe40aec6e97a 1533 }
cparata 1:fe40aec6e97a 1534
cparata 1:fe40aec6e97a 1535 /* Turn off embedded features */
cparata 1:fe40aec6e97a 1536 if (lsm6dsox_embedded_sens_off(&_reg_ctx) != 0)
cparata 1:fe40aec6e97a 1537 {
cparata 1:fe40aec6e97a 1538 return 1;
cparata 1:fe40aec6e97a 1539 }
cparata 1:fe40aec6e97a 1540
cparata 1:fe40aec6e97a 1541 /* Wait for 10 ms */
cparata 1:fe40aec6e97a 1542 ThisThread::sleep_for(10);
cparata 1:fe40aec6e97a 1543
cparata 1:fe40aec6e97a 1544 /* Enable tilt algorithm. */
cparata 1:fe40aec6e97a 1545 emb_sens.tilt = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1546
cparata 1:fe40aec6e97a 1547 /* Turn on embedded features */
cparata 1:fe40aec6e97a 1548 if (lsm6dsox_embedded_sens_set(&_reg_ctx, &emb_sens) != 0)
cparata 0:f27ce43dee4f 1549 {
cparata 0:f27ce43dee4f 1550 return 1;
cparata 0:f27ce43dee4f 1551 }
cparata 0:f27ce43dee4f 1552
cparata 0:f27ce43dee4f 1553 /* Enable tilt event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1554 switch (int_pin)
cparata 0:f27ce43dee4f 1555 {
cparata 0:f27ce43dee4f 1556 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1557 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1558 {
cparata 0:f27ce43dee4f 1559 return 1;
cparata 0:f27ce43dee4f 1560 }
cparata 0:f27ce43dee4f 1561
cparata 1:fe40aec6e97a 1562 val1.tilt = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1563
cparata 1:fe40aec6e97a 1564 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1565 {
cparata 0:f27ce43dee4f 1566 return 1;
cparata 0:f27ce43dee4f 1567 }
cparata 0:f27ce43dee4f 1568 break;
cparata 0:f27ce43dee4f 1569
cparata 0:f27ce43dee4f 1570 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 1571 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1572 {
cparata 0:f27ce43dee4f 1573 return 1;
cparata 0:f27ce43dee4f 1574 }
cparata 0:f27ce43dee4f 1575
cparata 1:fe40aec6e97a 1576 val2.tilt = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1577
cparata 1:fe40aec6e97a 1578 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1579 {
cparata 0:f27ce43dee4f 1580 return 1;
cparata 0:f27ce43dee4f 1581 }
cparata 0:f27ce43dee4f 1582 break;
cparata 0:f27ce43dee4f 1583
cparata 0:f27ce43dee4f 1584 default:
cparata 0:f27ce43dee4f 1585 ret = 1;
cparata 0:f27ce43dee4f 1586 break;
cparata 0:f27ce43dee4f 1587 }
cparata 0:f27ce43dee4f 1588
cparata 0:f27ce43dee4f 1589 return ret;
cparata 0:f27ce43dee4f 1590 }
cparata 0:f27ce43dee4f 1591
cparata 0:f27ce43dee4f 1592 /**
cparata 0:f27ce43dee4f 1593 * @brief Disable tilt detection
cparata 0:f27ce43dee4f 1594 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1595 */
cparata 0:f27ce43dee4f 1596 int LSM6DSOXSensor::disable_tilt_detection()
cparata 0:f27ce43dee4f 1597 {
cparata 0:f27ce43dee4f 1598 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1599 lsm6dsox_pin_int2_route_t val2;
cparata 1:fe40aec6e97a 1600 lsm6dsox_emb_sens_t emb_sens;
cparata 0:f27ce43dee4f 1601
cparata 0:f27ce43dee4f 1602 /* Disable tilt event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1603 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1604 {
cparata 0:f27ce43dee4f 1605 return 1;
cparata 0:f27ce43dee4f 1606 }
cparata 0:f27ce43dee4f 1607
cparata 1:fe40aec6e97a 1608 val1.tilt = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1609
cparata 1:fe40aec6e97a 1610 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1611 {
cparata 0:f27ce43dee4f 1612 return 1;
cparata 0:f27ce43dee4f 1613 }
cparata 0:f27ce43dee4f 1614
cparata 1:fe40aec6e97a 1615 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1616 {
cparata 0:f27ce43dee4f 1617 return 1;
cparata 0:f27ce43dee4f 1618 }
cparata 0:f27ce43dee4f 1619
cparata 1:fe40aec6e97a 1620 val2.tilt = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1621
cparata 1:fe40aec6e97a 1622 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1623 {
cparata 0:f27ce43dee4f 1624 return 1;
cparata 0:f27ce43dee4f 1625 }
cparata 0:f27ce43dee4f 1626
cparata 1:fe40aec6e97a 1627 /* Save current embedded features */
cparata 1:fe40aec6e97a 1628 if (lsm6dsox_embedded_sens_get(&_reg_ctx, &emb_sens) != 0)
cparata 1:fe40aec6e97a 1629 {
cparata 1:fe40aec6e97a 1630 return 1;
cparata 1:fe40aec6e97a 1631 }
cparata 1:fe40aec6e97a 1632
cparata 1:fe40aec6e97a 1633 /* Disable tilt algorithm. */
cparata 1:fe40aec6e97a 1634 emb_sens.tilt = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1635
cparata 1:fe40aec6e97a 1636 if (lsm6dsox_embedded_sens_set(&_reg_ctx, &emb_sens) != 0)
cparata 0:f27ce43dee4f 1637 {
cparata 0:f27ce43dee4f 1638 return 1;
cparata 0:f27ce43dee4f 1639 }
cparata 0:f27ce43dee4f 1640
cparata 0:f27ce43dee4f 1641 return 0;
cparata 0:f27ce43dee4f 1642 }
cparata 0:f27ce43dee4f 1643
cparata 0:f27ce43dee4f 1644 /**
cparata 0:f27ce43dee4f 1645 * @brief Enable wake up detection
cparata 0:f27ce43dee4f 1646 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1647 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1648 */
cparata 0:f27ce43dee4f 1649 int LSM6DSOXSensor::enable_wake_up_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1650 {
cparata 0:f27ce43dee4f 1651 int ret = 0;
cparata 0:f27ce43dee4f 1652 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1653 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1654
cparata 0:f27ce43dee4f 1655 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1656 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1657 {
cparata 0:f27ce43dee4f 1658 return 1;
cparata 0:f27ce43dee4f 1659 }
cparata 0:f27ce43dee4f 1660
cparata 0:f27ce43dee4f 1661 /* Full scale selection */
cparata 0:f27ce43dee4f 1662 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1663 {
cparata 0:f27ce43dee4f 1664 return 1;
cparata 0:f27ce43dee4f 1665 }
cparata 0:f27ce43dee4f 1666
cparata 0:f27ce43dee4f 1667 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 1668 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1669 {
cparata 0:f27ce43dee4f 1670 return 1;
cparata 0:f27ce43dee4f 1671 }
cparata 0:f27ce43dee4f 1672
cparata 0:f27ce43dee4f 1673 /* Set wake up threshold. */
cparata 0:f27ce43dee4f 1674 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, 0x02) != 0)
cparata 0:f27ce43dee4f 1675 {
cparata 0:f27ce43dee4f 1676 return 1;
cparata 0:f27ce43dee4f 1677 }
cparata 0:f27ce43dee4f 1678
cparata 0:f27ce43dee4f 1679 /* Enable wake up event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1680 switch (int_pin)
cparata 0:f27ce43dee4f 1681 {
cparata 0:f27ce43dee4f 1682 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1683 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1684 {
cparata 0:f27ce43dee4f 1685 return 1;
cparata 0:f27ce43dee4f 1686 }
cparata 0:f27ce43dee4f 1687
cparata 1:fe40aec6e97a 1688 val1.wake_up = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1689
cparata 1:fe40aec6e97a 1690 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1691 {
cparata 0:f27ce43dee4f 1692 return 1;
cparata 0:f27ce43dee4f 1693 }
cparata 0:f27ce43dee4f 1694 break;
cparata 0:f27ce43dee4f 1695
cparata 0:f27ce43dee4f 1696 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 1697 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1698 {
cparata 0:f27ce43dee4f 1699 return 1;
cparata 0:f27ce43dee4f 1700 }
cparata 0:f27ce43dee4f 1701
cparata 1:fe40aec6e97a 1702 val2.wake_up = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1703
cparata 1:fe40aec6e97a 1704 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1705 {
cparata 0:f27ce43dee4f 1706 return 1;
cparata 0:f27ce43dee4f 1707 }
cparata 0:f27ce43dee4f 1708 break;
cparata 0:f27ce43dee4f 1709
cparata 0:f27ce43dee4f 1710 default:
cparata 0:f27ce43dee4f 1711 ret = 1;
cparata 0:f27ce43dee4f 1712 break;
cparata 0:f27ce43dee4f 1713 }
cparata 0:f27ce43dee4f 1714
cparata 0:f27ce43dee4f 1715 return ret;
cparata 0:f27ce43dee4f 1716 }
cparata 0:f27ce43dee4f 1717
cparata 0:f27ce43dee4f 1718
cparata 0:f27ce43dee4f 1719 /**
cparata 0:f27ce43dee4f 1720 * @brief Disable wake up detection
cparata 0:f27ce43dee4f 1721 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1722 */
cparata 0:f27ce43dee4f 1723 int LSM6DSOXSensor::disable_wake_up_detection()
cparata 0:f27ce43dee4f 1724 {
cparata 1:fe40aec6e97a 1725 lsm6dsox_pin_int1_route_t val1;
cparata 1:fe40aec6e97a 1726 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1727
cparata 0:f27ce43dee4f 1728 /* Disable wake up event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1729 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1730 {
cparata 0:f27ce43dee4f 1731 return 1;
cparata 0:f27ce43dee4f 1732 }
cparata 0:f27ce43dee4f 1733
cparata 1:fe40aec6e97a 1734 val1.wake_up = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1735
cparata 1:fe40aec6e97a 1736 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1737 {
cparata 0:f27ce43dee4f 1738 return 1;
cparata 0:f27ce43dee4f 1739 }
cparata 0:f27ce43dee4f 1740
cparata 1:fe40aec6e97a 1741 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1742 {
cparata 0:f27ce43dee4f 1743 return 1;
cparata 0:f27ce43dee4f 1744 }
cparata 0:f27ce43dee4f 1745
cparata 1:fe40aec6e97a 1746 val2.wake_up = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1747
cparata 1:fe40aec6e97a 1748 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1749 {
cparata 0:f27ce43dee4f 1750 return 1;
cparata 0:f27ce43dee4f 1751 }
cparata 0:f27ce43dee4f 1752
cparata 0:f27ce43dee4f 1753 /* Reset wake up threshold. */
cparata 0:f27ce43dee4f 1754 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1755 {
cparata 0:f27ce43dee4f 1756 return 1;
cparata 0:f27ce43dee4f 1757 }
cparata 0:f27ce43dee4f 1758
cparata 0:f27ce43dee4f 1759 /* WAKE_DUR setting */
cparata 0:f27ce43dee4f 1760 if (lsm6dsox_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1761 {
cparata 0:f27ce43dee4f 1762 return 1;
cparata 0:f27ce43dee4f 1763 }
cparata 0:f27ce43dee4f 1764
cparata 0:f27ce43dee4f 1765 return 0;
cparata 0:f27ce43dee4f 1766 }
cparata 0:f27ce43dee4f 1767
cparata 0:f27ce43dee4f 1768 /**
cparata 0:f27ce43dee4f 1769 * @brief Set wake up threshold
cparata 0:f27ce43dee4f 1770 * @param thr wake up detection threshold
cparata 0:f27ce43dee4f 1771 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1772 */
cparata 0:f27ce43dee4f 1773 int LSM6DSOXSensor::set_wake_up_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 1774 {
cparata 0:f27ce43dee4f 1775 /* Set wake up threshold. */
cparata 0:f27ce43dee4f 1776 if (lsm6dsox_wkup_threshold_set(&_reg_ctx, thr) != 0)
cparata 0:f27ce43dee4f 1777 {
cparata 0:f27ce43dee4f 1778 return 1;
cparata 0:f27ce43dee4f 1779 }
cparata 0:f27ce43dee4f 1780
cparata 0:f27ce43dee4f 1781 return 0;
cparata 0:f27ce43dee4f 1782 }
cparata 0:f27ce43dee4f 1783
cparata 0:f27ce43dee4f 1784 /**
cparata 0:f27ce43dee4f 1785 * @brief Set wake up duration
cparata 0:f27ce43dee4f 1786 * @param dur wake up detection duration
cparata 0:f27ce43dee4f 1787 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1788 */
cparata 0:f27ce43dee4f 1789 int LSM6DSOXSensor::set_wake_up_duration(uint8_t dur)
cparata 0:f27ce43dee4f 1790 {
cparata 0:f27ce43dee4f 1791 /* Set wake up duration. */
cparata 0:f27ce43dee4f 1792 if (lsm6dsox_wkup_dur_set(&_reg_ctx, dur) != 0)
cparata 0:f27ce43dee4f 1793 {
cparata 0:f27ce43dee4f 1794 return 1;
cparata 0:f27ce43dee4f 1795 }
cparata 0:f27ce43dee4f 1796
cparata 0:f27ce43dee4f 1797 return 0;
cparata 0:f27ce43dee4f 1798 }
cparata 0:f27ce43dee4f 1799
cparata 0:f27ce43dee4f 1800 /**
cparata 0:f27ce43dee4f 1801 * @brief Enable single tap detection
cparata 0:f27ce43dee4f 1802 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1803 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1804 */
cparata 0:f27ce43dee4f 1805 int LSM6DSOXSensor::enable_single_tap_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1806 {
cparata 0:f27ce43dee4f 1807 int ret = 0;
cparata 0:f27ce43dee4f 1808 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1809 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1810
cparata 0:f27ce43dee4f 1811 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1812 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1813 {
cparata 0:f27ce43dee4f 1814 return 1;
cparata 0:f27ce43dee4f 1815 }
cparata 0:f27ce43dee4f 1816
cparata 0:f27ce43dee4f 1817 /* Full scale selection */
cparata 0:f27ce43dee4f 1818 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1819 {
cparata 0:f27ce43dee4f 1820 return 1;
cparata 0:f27ce43dee4f 1821 }
cparata 0:f27ce43dee4f 1822
cparata 0:f27ce43dee4f 1823 /* Enable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1824 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1825 {
cparata 0:f27ce43dee4f 1826 return 1;
cparata 0:f27ce43dee4f 1827 }
cparata 0:f27ce43dee4f 1828
cparata 0:f27ce43dee4f 1829 /* Enable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1830 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1831 {
cparata 0:f27ce43dee4f 1832 return 1;
cparata 0:f27ce43dee4f 1833 }
cparata 0:f27ce43dee4f 1834
cparata 0:f27ce43dee4f 1835 /* Enable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1836 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 1837 {
cparata 0:f27ce43dee4f 1838 return 1;
cparata 0:f27ce43dee4f 1839 }
cparata 0:f27ce43dee4f 1840
cparata 0:f27ce43dee4f 1841 /* Set tap threshold. */
cparata 0:f27ce43dee4f 1842 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 1843 {
cparata 0:f27ce43dee4f 1844 return 1;
cparata 0:f27ce43dee4f 1845 }
cparata 0:f27ce43dee4f 1846
cparata 0:f27ce43dee4f 1847 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 1848 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x02) != 0)
cparata 0:f27ce43dee4f 1849 {
cparata 0:f27ce43dee4f 1850 return 1;
cparata 0:f27ce43dee4f 1851 }
cparata 0:f27ce43dee4f 1852
cparata 0:f27ce43dee4f 1853 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 1854 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x01) != 0)
cparata 0:f27ce43dee4f 1855 {
cparata 0:f27ce43dee4f 1856 return 1;
cparata 0:f27ce43dee4f 1857 }
cparata 0:f27ce43dee4f 1858
cparata 0:f27ce43dee4f 1859 /* _NOTE_: Tap duration time window - don't care for single tap. */
cparata 0:f27ce43dee4f 1860
cparata 0:f27ce43dee4f 1861 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
cparata 0:f27ce43dee4f 1862
cparata 0:f27ce43dee4f 1863 /* Enable single tap event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 1864 switch (int_pin)
cparata 0:f27ce43dee4f 1865 {
cparata 0:f27ce43dee4f 1866 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 1867 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1868 {
cparata 0:f27ce43dee4f 1869 return 1;
cparata 0:f27ce43dee4f 1870 }
cparata 0:f27ce43dee4f 1871
cparata 1:fe40aec6e97a 1872 val1.single_tap = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1873
cparata 1:fe40aec6e97a 1874 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1875 {
cparata 0:f27ce43dee4f 1876 return 1;
cparata 0:f27ce43dee4f 1877 }
cparata 0:f27ce43dee4f 1878 break;
cparata 0:f27ce43dee4f 1879
cparata 0:f27ce43dee4f 1880 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 1881 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1882 {
cparata 0:f27ce43dee4f 1883 return 1;
cparata 0:f27ce43dee4f 1884 }
cparata 0:f27ce43dee4f 1885
cparata 1:fe40aec6e97a 1886 val2.single_tap = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 1887
cparata 1:fe40aec6e97a 1888 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1889 {
cparata 0:f27ce43dee4f 1890 return 1;
cparata 0:f27ce43dee4f 1891 }
cparata 0:f27ce43dee4f 1892 break;
cparata 0:f27ce43dee4f 1893
cparata 0:f27ce43dee4f 1894 default:
cparata 0:f27ce43dee4f 1895 ret = 1;
cparata 0:f27ce43dee4f 1896 break;
cparata 0:f27ce43dee4f 1897 }
cparata 0:f27ce43dee4f 1898
cparata 0:f27ce43dee4f 1899 return ret;
cparata 0:f27ce43dee4f 1900 }
cparata 0:f27ce43dee4f 1901
cparata 0:f27ce43dee4f 1902 /**
cparata 0:f27ce43dee4f 1903 * @brief Disable single tap detection
cparata 0:f27ce43dee4f 1904 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1905 */
cparata 0:f27ce43dee4f 1906 int LSM6DSOXSensor::disable_single_tap_detection()
cparata 0:f27ce43dee4f 1907 {
cparata 1:fe40aec6e97a 1908 lsm6dsox_pin_int1_route_t val1;
cparata 1:fe40aec6e97a 1909 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1910
cparata 0:f27ce43dee4f 1911 /* Disable single tap event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 1912 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 1913 {
cparata 0:f27ce43dee4f 1914 return 1;
cparata 0:f27ce43dee4f 1915 }
cparata 0:f27ce43dee4f 1916
cparata 1:fe40aec6e97a 1917 val1.single_tap = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1918
cparata 1:fe40aec6e97a 1919 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 1920 {
cparata 0:f27ce43dee4f 1921 return 1;
cparata 0:f27ce43dee4f 1922 }
cparata 0:f27ce43dee4f 1923
cparata 1:fe40aec6e97a 1924 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 1925 {
cparata 0:f27ce43dee4f 1926 return 1;
cparata 0:f27ce43dee4f 1927 }
cparata 0:f27ce43dee4f 1928
cparata 1:fe40aec6e97a 1929 val2.single_tap = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 1930
cparata 1:fe40aec6e97a 1931 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 1932 {
cparata 0:f27ce43dee4f 1933 return 1;
cparata 0:f27ce43dee4f 1934 }
cparata 0:f27ce43dee4f 1935
cparata 0:f27ce43dee4f 1936 /* Reset tap quiet time window. */
cparata 0:f27ce43dee4f 1937 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1938 {
cparata 0:f27ce43dee4f 1939 return 1;
cparata 0:f27ce43dee4f 1940 }
cparata 0:f27ce43dee4f 1941
cparata 0:f27ce43dee4f 1942 /* Reset tap shock time window. */
cparata 0:f27ce43dee4f 1943 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1944 {
cparata 0:f27ce43dee4f 1945 return 1;
cparata 0:f27ce43dee4f 1946 }
cparata 0:f27ce43dee4f 1947
cparata 0:f27ce43dee4f 1948 /* Reset tap threshold. */
cparata 0:f27ce43dee4f 1949 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 1950 {
cparata 0:f27ce43dee4f 1951 return 1;
cparata 0:f27ce43dee4f 1952 }
cparata 0:f27ce43dee4f 1953
cparata 0:f27ce43dee4f 1954 /* Disable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 1955 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1956 {
cparata 0:f27ce43dee4f 1957 return 1;
cparata 0:f27ce43dee4f 1958 }
cparata 0:f27ce43dee4f 1959
cparata 0:f27ce43dee4f 1960 /* Disable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 1961 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1962 {
cparata 0:f27ce43dee4f 1963 return 1;
cparata 0:f27ce43dee4f 1964 }
cparata 0:f27ce43dee4f 1965
cparata 0:f27ce43dee4f 1966 /* Disable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1967 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 1968 {
cparata 0:f27ce43dee4f 1969 return 1;
cparata 0:f27ce43dee4f 1970 }
cparata 0:f27ce43dee4f 1971
cparata 0:f27ce43dee4f 1972 return 0;
cparata 0:f27ce43dee4f 1973 }
cparata 0:f27ce43dee4f 1974
cparata 0:f27ce43dee4f 1975 /**
cparata 0:f27ce43dee4f 1976 * @brief Enable double tap detection
cparata 0:f27ce43dee4f 1977 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 1978 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 1979 */
cparata 0:f27ce43dee4f 1980 int LSM6DSOXSensor::enable_double_tap_detection(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 1981 {
cparata 0:f27ce43dee4f 1982 int ret = 0;
cparata 0:f27ce43dee4f 1983 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 1984 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 1985
cparata 0:f27ce43dee4f 1986 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 1987 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 1988 {
cparata 0:f27ce43dee4f 1989 return 1;
cparata 0:f27ce43dee4f 1990 }
cparata 0:f27ce43dee4f 1991
cparata 0:f27ce43dee4f 1992 /* Full scale selection */
cparata 0:f27ce43dee4f 1993 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 1994 {
cparata 0:f27ce43dee4f 1995 return 1;
cparata 0:f27ce43dee4f 1996 }
cparata 0:f27ce43dee4f 1997
cparata 0:f27ce43dee4f 1998 /* Enable X direction in tap recognition. */
cparata 0:f27ce43dee4f 1999 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 2000 {
cparata 0:f27ce43dee4f 2001 return 1;
cparata 0:f27ce43dee4f 2002 }
cparata 0:f27ce43dee4f 2003
cparata 0:f27ce43dee4f 2004 /* Enable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 2005 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 2006 {
cparata 0:f27ce43dee4f 2007 return 1;
cparata 0:f27ce43dee4f 2008 }
cparata 0:f27ce43dee4f 2009
cparata 0:f27ce43dee4f 2010 /* Enable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 2011 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:f27ce43dee4f 2012 {
cparata 0:f27ce43dee4f 2013 return 1;
cparata 0:f27ce43dee4f 2014 }
cparata 0:f27ce43dee4f 2015
cparata 0:f27ce43dee4f 2016 /* Set tap threshold. */
cparata 0:f27ce43dee4f 2017 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 2018 {
cparata 0:f27ce43dee4f 2019 return 1;
cparata 0:f27ce43dee4f 2020 }
cparata 0:f27ce43dee4f 2021
cparata 0:f27ce43dee4f 2022 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 2023 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x03) != 0)
cparata 0:f27ce43dee4f 2024 {
cparata 0:f27ce43dee4f 2025 return 1;
cparata 0:f27ce43dee4f 2026 }
cparata 0:f27ce43dee4f 2027
cparata 0:f27ce43dee4f 2028 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 2029 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x03) != 0)
cparata 0:f27ce43dee4f 2030 {
cparata 0:f27ce43dee4f 2031 return 1;
cparata 0:f27ce43dee4f 2032 }
cparata 0:f27ce43dee4f 2033
cparata 0:f27ce43dee4f 2034 /* Set tap duration time window. */
cparata 0:f27ce43dee4f 2035 if (lsm6dsox_tap_dur_set(&_reg_ctx, 0x08) != 0)
cparata 0:f27ce43dee4f 2036 {
cparata 0:f27ce43dee4f 2037 return 1;
cparata 0:f27ce43dee4f 2038 }
cparata 0:f27ce43dee4f 2039
cparata 0:f27ce43dee4f 2040 /* Single and double tap enabled. */
cparata 0:f27ce43dee4f 2041 if (lsm6dsox_tap_mode_set(&_reg_ctx, LSM6DSOX_BOTH_SINGLE_DOUBLE) != 0)
cparata 0:f27ce43dee4f 2042 {
cparata 0:f27ce43dee4f 2043 return 1;
cparata 0:f27ce43dee4f 2044 }
cparata 0:f27ce43dee4f 2045
cparata 0:f27ce43dee4f 2046 /* Enable double tap event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 2047 switch (int_pin)
cparata 0:f27ce43dee4f 2048 {
cparata 0:f27ce43dee4f 2049 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 2050 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 2051 {
cparata 0:f27ce43dee4f 2052 return 1;
cparata 0:f27ce43dee4f 2053 }
cparata 0:f27ce43dee4f 2054
cparata 1:fe40aec6e97a 2055 val1.double_tap = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 2056
cparata 1:fe40aec6e97a 2057 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 2058 {
cparata 0:f27ce43dee4f 2059 return 1;
cparata 0:f27ce43dee4f 2060 }
cparata 0:f27ce43dee4f 2061 break;
cparata 0:f27ce43dee4f 2062
cparata 0:f27ce43dee4f 2063 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 2064 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 2065 {
cparata 0:f27ce43dee4f 2066 return 1;
cparata 0:f27ce43dee4f 2067 }
cparata 0:f27ce43dee4f 2068
cparata 1:fe40aec6e97a 2069 val2.double_tap = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 2070
cparata 1:fe40aec6e97a 2071 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 2072 {
cparata 0:f27ce43dee4f 2073 return 1;
cparata 0:f27ce43dee4f 2074 }
cparata 0:f27ce43dee4f 2075 break;
cparata 0:f27ce43dee4f 2076
cparata 0:f27ce43dee4f 2077 default:
cparata 0:f27ce43dee4f 2078 ret = 1;
cparata 0:f27ce43dee4f 2079 break;
cparata 0:f27ce43dee4f 2080 }
cparata 0:f27ce43dee4f 2081
cparata 0:f27ce43dee4f 2082 return ret;
cparata 0:f27ce43dee4f 2083 }
cparata 0:f27ce43dee4f 2084
cparata 0:f27ce43dee4f 2085 /**
cparata 0:f27ce43dee4f 2086 * @brief Disable double tap detection
cparata 0:f27ce43dee4f 2087 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2088 */
cparata 0:f27ce43dee4f 2089 int LSM6DSOXSensor::disable_double_tap_detection()
cparata 0:f27ce43dee4f 2090 {
cparata 0:f27ce43dee4f 2091 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 2092 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 2093
cparata 0:f27ce43dee4f 2094 /* Disable double tap event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 2095 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 2096 {
cparata 0:f27ce43dee4f 2097 return 1;
cparata 0:f27ce43dee4f 2098 }
cparata 0:f27ce43dee4f 2099
cparata 1:fe40aec6e97a 2100 val1.double_tap = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 2101
cparata 1:fe40aec6e97a 2102 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 2103 {
cparata 0:f27ce43dee4f 2104 return 1;
cparata 0:f27ce43dee4f 2105 }
cparata 0:f27ce43dee4f 2106
cparata 1:fe40aec6e97a 2107 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 2108 {
cparata 0:f27ce43dee4f 2109 return 1;
cparata 0:f27ce43dee4f 2110 }
cparata 0:f27ce43dee4f 2111
cparata 1:fe40aec6e97a 2112 val2.double_tap = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 2113
cparata 1:fe40aec6e97a 2114 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 2115 {
cparata 0:f27ce43dee4f 2116 return 1;
cparata 0:f27ce43dee4f 2117 }
cparata 0:f27ce43dee4f 2118
cparata 0:f27ce43dee4f 2119 /* Only single tap enabled. */
cparata 0:f27ce43dee4f 2120 if (lsm6dsox_tap_mode_set(&_reg_ctx, LSM6DSOX_ONLY_SINGLE) != 0)
cparata 0:f27ce43dee4f 2121 {
cparata 0:f27ce43dee4f 2122 return 1;
cparata 0:f27ce43dee4f 2123 }
cparata 0:f27ce43dee4f 2124
cparata 0:f27ce43dee4f 2125 /* Reset tap duration time window. */
cparata 0:f27ce43dee4f 2126 if (lsm6dsox_tap_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 2127 {
cparata 0:f27ce43dee4f 2128 return 1;
cparata 0:f27ce43dee4f 2129 }
cparata 0:f27ce43dee4f 2130
cparata 0:f27ce43dee4f 2131 /* Reset tap quiet time window. */
cparata 0:f27ce43dee4f 2132 if (lsm6dsox_tap_quiet_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 2133 {
cparata 0:f27ce43dee4f 2134 return 1;
cparata 0:f27ce43dee4f 2135 }
cparata 0:f27ce43dee4f 2136
cparata 0:f27ce43dee4f 2137 /* Reset tap shock time window. */
cparata 0:f27ce43dee4f 2138 if (lsm6dsox_tap_shock_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 2139 {
cparata 0:f27ce43dee4f 2140 return 1;
cparata 0:f27ce43dee4f 2141 }
cparata 0:f27ce43dee4f 2142
cparata 0:f27ce43dee4f 2143 /* Reset tap threshold. */
cparata 0:f27ce43dee4f 2144 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, 0x00) != 0)
cparata 0:f27ce43dee4f 2145 {
cparata 0:f27ce43dee4f 2146 return 1;
cparata 0:f27ce43dee4f 2147 }
cparata 0:f27ce43dee4f 2148
cparata 0:f27ce43dee4f 2149 /* Disable Z direction in tap recognition. */
cparata 0:f27ce43dee4f 2150 if (lsm6dsox_tap_detection_on_z_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 2151 {
cparata 0:f27ce43dee4f 2152 return 1;
cparata 0:f27ce43dee4f 2153 }
cparata 0:f27ce43dee4f 2154
cparata 0:f27ce43dee4f 2155 /* Disable Y direction in tap recognition. */
cparata 0:f27ce43dee4f 2156 if (lsm6dsox_tap_detection_on_y_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 2157 {
cparata 0:f27ce43dee4f 2158 return 1;
cparata 0:f27ce43dee4f 2159 }
cparata 0:f27ce43dee4f 2160
cparata 0:f27ce43dee4f 2161 /* Disable X direction in tap recognition. */
cparata 0:f27ce43dee4f 2162 if (lsm6dsox_tap_detection_on_x_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:f27ce43dee4f 2163 {
cparata 0:f27ce43dee4f 2164 return 1;
cparata 0:f27ce43dee4f 2165 }
cparata 0:f27ce43dee4f 2166
cparata 0:f27ce43dee4f 2167 return 0;
cparata 0:f27ce43dee4f 2168 }
cparata 0:f27ce43dee4f 2169
cparata 0:f27ce43dee4f 2170 /**
cparata 0:f27ce43dee4f 2171 * @brief Set tap threshold
cparata 0:f27ce43dee4f 2172 * @param thr tap threshold
cparata 0:f27ce43dee4f 2173 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2174 */
cparata 0:f27ce43dee4f 2175 int LSM6DSOXSensor::set_tap_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 2176 {
cparata 0:f27ce43dee4f 2177 /* Set tap threshold. */
cparata 0:f27ce43dee4f 2178 if (lsm6dsox_tap_threshold_x_set(&_reg_ctx, thr) != 0)
cparata 0:f27ce43dee4f 2179 {
cparata 0:f27ce43dee4f 2180 return 1;
cparata 0:f27ce43dee4f 2181 }
cparata 0:f27ce43dee4f 2182
cparata 0:f27ce43dee4f 2183 return 0;
cparata 0:f27ce43dee4f 2184 }
cparata 0:f27ce43dee4f 2185
cparata 0:f27ce43dee4f 2186 /**
cparata 0:f27ce43dee4f 2187 * @brief Set tap shock time
cparata 0:f27ce43dee4f 2188 * @param time tap shock time
cparata 0:f27ce43dee4f 2189 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2190 */
cparata 0:f27ce43dee4f 2191 int LSM6DSOXSensor::set_tap_shock_time(uint8_t time)
cparata 0:f27ce43dee4f 2192 {
cparata 0:f27ce43dee4f 2193 /* Set tap shock time window. */
cparata 0:f27ce43dee4f 2194 if (lsm6dsox_tap_shock_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 2195 {
cparata 0:f27ce43dee4f 2196 return 1;
cparata 0:f27ce43dee4f 2197 }
cparata 0:f27ce43dee4f 2198
cparata 0:f27ce43dee4f 2199 return 0;
cparata 0:f27ce43dee4f 2200 }
cparata 0:f27ce43dee4f 2201
cparata 0:f27ce43dee4f 2202 /**
cparata 0:f27ce43dee4f 2203 * @brief Set tap quiet time
cparata 0:f27ce43dee4f 2204 * @param time tap quiet time
cparata 0:f27ce43dee4f 2205 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2206 */
cparata 0:f27ce43dee4f 2207 int LSM6DSOXSensor::set_tap_quiet_time(uint8_t time)
cparata 0:f27ce43dee4f 2208 {
cparata 0:f27ce43dee4f 2209 /* Set tap quiet time window. */
cparata 0:f27ce43dee4f 2210 if (lsm6dsox_tap_quiet_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 2211 {
cparata 0:f27ce43dee4f 2212 return 1;
cparata 0:f27ce43dee4f 2213 }
cparata 0:f27ce43dee4f 2214
cparata 0:f27ce43dee4f 2215 return 0;
cparata 0:f27ce43dee4f 2216 }
cparata 0:f27ce43dee4f 2217
cparata 0:f27ce43dee4f 2218 /**
cparata 0:f27ce43dee4f 2219 * @brief Set tap duration time
cparata 0:f27ce43dee4f 2220 * @param time tap duration time
cparata 0:f27ce43dee4f 2221 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2222 */
cparata 0:f27ce43dee4f 2223 int LSM6DSOXSensor::set_tap_duration_time(uint8_t time)
cparata 0:f27ce43dee4f 2224 {
cparata 0:f27ce43dee4f 2225 /* Set tap duration time window. */
cparata 0:f27ce43dee4f 2226 if (lsm6dsox_tap_dur_set(&_reg_ctx, time) != 0)
cparata 0:f27ce43dee4f 2227 {
cparata 0:f27ce43dee4f 2228 return 1;
cparata 0:f27ce43dee4f 2229 }
cparata 0:f27ce43dee4f 2230
cparata 0:f27ce43dee4f 2231 return 0;
cparata 0:f27ce43dee4f 2232 }
cparata 0:f27ce43dee4f 2233
cparata 0:f27ce43dee4f 2234 /**
cparata 0:f27ce43dee4f 2235 * @brief Enable 6D orientation detection
cparata 0:f27ce43dee4f 2236 * @param int_pin interrupt pin line to be used
cparata 0:f27ce43dee4f 2237 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2238 */
cparata 0:f27ce43dee4f 2239 int LSM6DSOXSensor::enable_6d_orientation(LSM6DSOX_Interrupt_Pin_t int_pin)
cparata 0:f27ce43dee4f 2240 {
cparata 0:f27ce43dee4f 2241 int ret = 0;
cparata 0:f27ce43dee4f 2242 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 2243 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 2244
cparata 0:f27ce43dee4f 2245 /* Output Data Rate selection */
cparata 0:f27ce43dee4f 2246 if (set_x_odr(416.0f) != 0)
cparata 0:f27ce43dee4f 2247 {
cparata 0:f27ce43dee4f 2248 return 1;
cparata 0:f27ce43dee4f 2249 }
cparata 0:f27ce43dee4f 2250
cparata 0:f27ce43dee4f 2251 /* Full scale selection */
cparata 0:f27ce43dee4f 2252 if (set_x_fs(2.0f) != 0)
cparata 0:f27ce43dee4f 2253 {
cparata 0:f27ce43dee4f 2254 return 1;
cparata 0:f27ce43dee4f 2255 }
cparata 0:f27ce43dee4f 2256
cparata 0:f27ce43dee4f 2257 /* 6D orientation enabled. */
cparata 0:f27ce43dee4f 2258 if (lsm6dsox_6d_threshold_set(&_reg_ctx, LSM6DSOX_DEG_60) != 0)
cparata 0:f27ce43dee4f 2259 {
cparata 0:f27ce43dee4f 2260 return 1;
cparata 0:f27ce43dee4f 2261 }
cparata 0:f27ce43dee4f 2262
cparata 0:f27ce43dee4f 2263 /* Enable 6D orientation event on either INT1 or INT2 pin */
cparata 0:f27ce43dee4f 2264 switch (int_pin)
cparata 0:f27ce43dee4f 2265 {
cparata 0:f27ce43dee4f 2266 case LSM6DSOX_INT1_PIN:
cparata 0:f27ce43dee4f 2267 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 2268 {
cparata 0:f27ce43dee4f 2269 return 1;
cparata 0:f27ce43dee4f 2270 }
cparata 0:f27ce43dee4f 2271
cparata 1:fe40aec6e97a 2272 val1.six_d = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 2273
cparata 1:fe40aec6e97a 2274 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 2275 {
cparata 0:f27ce43dee4f 2276 return 1;
cparata 0:f27ce43dee4f 2277 }
cparata 0:f27ce43dee4f 2278 break;
cparata 0:f27ce43dee4f 2279
cparata 0:f27ce43dee4f 2280 case LSM6DSOX_INT2_PIN:
cparata 1:fe40aec6e97a 2281 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 2282 {
cparata 0:f27ce43dee4f 2283 return 1;
cparata 0:f27ce43dee4f 2284 }
cparata 0:f27ce43dee4f 2285
cparata 1:fe40aec6e97a 2286 val2.six_d = PROPERTY_ENABLE;
cparata 1:fe40aec6e97a 2287
cparata 1:fe40aec6e97a 2288 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 2289 {
cparata 0:f27ce43dee4f 2290 return 1;
cparata 0:f27ce43dee4f 2291 }
cparata 0:f27ce43dee4f 2292 break;
cparata 0:f27ce43dee4f 2293
cparata 0:f27ce43dee4f 2294 default:
cparata 0:f27ce43dee4f 2295 ret = 1;
cparata 0:f27ce43dee4f 2296 break;
cparata 0:f27ce43dee4f 2297 }
cparata 0:f27ce43dee4f 2298
cparata 0:f27ce43dee4f 2299 return ret;
cparata 0:f27ce43dee4f 2300 }
cparata 0:f27ce43dee4f 2301
cparata 0:f27ce43dee4f 2302 /**
cparata 0:f27ce43dee4f 2303 * @brief Disable 6D orientation detection
cparata 0:f27ce43dee4f 2304 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2305 */
cparata 0:f27ce43dee4f 2306 int LSM6DSOXSensor::disable_6d_orientation()
cparata 0:f27ce43dee4f 2307 {
cparata 0:f27ce43dee4f 2308 lsm6dsox_pin_int1_route_t val1;
cparata 0:f27ce43dee4f 2309 lsm6dsox_pin_int2_route_t val2;
cparata 0:f27ce43dee4f 2310
cparata 0:f27ce43dee4f 2311 /* Disable 6D orientation event on both INT1 and INT2 pins */
cparata 0:f27ce43dee4f 2312 if (lsm6dsox_pin_int1_route_get(&_reg_ctx, &val1) != 0)
cparata 0:f27ce43dee4f 2313 {
cparata 0:f27ce43dee4f 2314 return 1;
cparata 0:f27ce43dee4f 2315 }
cparata 0:f27ce43dee4f 2316
cparata 1:fe40aec6e97a 2317 val1.six_d = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 2318
cparata 1:fe40aec6e97a 2319 if (lsm6dsox_pin_int1_route_set(&_reg_ctx, val1) != 0)
cparata 0:f27ce43dee4f 2320 {
cparata 0:f27ce43dee4f 2321 return 1;
cparata 0:f27ce43dee4f 2322 }
cparata 0:f27ce43dee4f 2323
cparata 1:fe40aec6e97a 2324 if (lsm6dsox_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0)
cparata 0:f27ce43dee4f 2325 {
cparata 0:f27ce43dee4f 2326 return 1;
cparata 0:f27ce43dee4f 2327 }
cparata 0:f27ce43dee4f 2328
cparata 1:fe40aec6e97a 2329 val2.six_d = PROPERTY_DISABLE;
cparata 1:fe40aec6e97a 2330
cparata 1:fe40aec6e97a 2331 if (lsm6dsox_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0)
cparata 0:f27ce43dee4f 2332 {
cparata 0:f27ce43dee4f 2333 return 1;
cparata 0:f27ce43dee4f 2334 }
cparata 0:f27ce43dee4f 2335
cparata 0:f27ce43dee4f 2336 /* Reset 6D orientation. */
cparata 0:f27ce43dee4f 2337 if (lsm6dsox_6d_threshold_set(&_reg_ctx, LSM6DSOX_DEG_80) != 0)
cparata 0:f27ce43dee4f 2338 {
cparata 0:f27ce43dee4f 2339 return 1;
cparata 0:f27ce43dee4f 2340 }
cparata 0:f27ce43dee4f 2341
cparata 0:f27ce43dee4f 2342 return 0;
cparata 0:f27ce43dee4f 2343 }
cparata 0:f27ce43dee4f 2344
cparata 0:f27ce43dee4f 2345 /**
cparata 0:f27ce43dee4f 2346 * @brief Set 6D orientation threshold
cparata 0:f27ce43dee4f 2347 * @param thr 6D Orientation detection threshold
cparata 0:f27ce43dee4f 2348 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2349 */
cparata 0:f27ce43dee4f 2350 int LSM6DSOXSensor::set_6d_orientation_threshold(uint8_t thr)
cparata 0:f27ce43dee4f 2351 {
cparata 0:f27ce43dee4f 2352 if (lsm6dsox_6d_threshold_set(&_reg_ctx, (lsm6dsox_sixd_ths_t)thr) != 0)
cparata 0:f27ce43dee4f 2353 {
cparata 0:f27ce43dee4f 2354 return 1;
cparata 0:f27ce43dee4f 2355 }
cparata 0:f27ce43dee4f 2356
cparata 0:f27ce43dee4f 2357 return 0;
cparata 0:f27ce43dee4f 2358 }
cparata 0:f27ce43dee4f 2359
cparata 0:f27ce43dee4f 2360 /**
cparata 0:f27ce43dee4f 2361 * @brief Get the status of XLow orientation
cparata 0:f27ce43dee4f 2362 * @param xl the status of XLow orientation
cparata 0:f27ce43dee4f 2363 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2364 */
cparata 0:f27ce43dee4f 2365 int LSM6DSOXSensor::get_6d_orientation_xl(uint8_t *xl)
cparata 0:f27ce43dee4f 2366 {
cparata 0:f27ce43dee4f 2367 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2368
cparata 0:f27ce43dee4f 2369 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2370 {
cparata 0:f27ce43dee4f 2371 return 1;
cparata 0:f27ce43dee4f 2372 }
cparata 0:f27ce43dee4f 2373
cparata 0:f27ce43dee4f 2374 *xl = data.xl;
cparata 0:f27ce43dee4f 2375
cparata 0:f27ce43dee4f 2376 return 0;
cparata 0:f27ce43dee4f 2377 }
cparata 0:f27ce43dee4f 2378
cparata 0:f27ce43dee4f 2379 /**
cparata 0:f27ce43dee4f 2380 * @brief Get the status of XHigh orientation
cparata 0:f27ce43dee4f 2381 * @param xh the status of XHigh orientation
cparata 0:f27ce43dee4f 2382 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2383 */
cparata 0:f27ce43dee4f 2384 int LSM6DSOXSensor::get_6d_orientation_xh(uint8_t *xh)
cparata 0:f27ce43dee4f 2385 {
cparata 0:f27ce43dee4f 2386 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2387
cparata 0:f27ce43dee4f 2388 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2389 {
cparata 0:f27ce43dee4f 2390 return 1;
cparata 0:f27ce43dee4f 2391 }
cparata 0:f27ce43dee4f 2392
cparata 0:f27ce43dee4f 2393 *xh = data.xh;
cparata 0:f27ce43dee4f 2394
cparata 0:f27ce43dee4f 2395 return 0;
cparata 0:f27ce43dee4f 2396 }
cparata 0:f27ce43dee4f 2397
cparata 0:f27ce43dee4f 2398 /**
cparata 0:f27ce43dee4f 2399 * @brief Get the status of YLow orientation
cparata 0:f27ce43dee4f 2400 * @param yl the status of YLow orientation
cparata 0:f27ce43dee4f 2401 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2402 */
cparata 0:f27ce43dee4f 2403 int LSM6DSOXSensor::get_6d_orientation_yl(uint8_t *yl)
cparata 0:f27ce43dee4f 2404 {
cparata 0:f27ce43dee4f 2405 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2406
cparata 0:f27ce43dee4f 2407 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2408 {
cparata 0:f27ce43dee4f 2409 return 1;
cparata 0:f27ce43dee4f 2410 }
cparata 0:f27ce43dee4f 2411
cparata 0:f27ce43dee4f 2412 *yl = data.yl;
cparata 0:f27ce43dee4f 2413
cparata 0:f27ce43dee4f 2414 return 0;
cparata 0:f27ce43dee4f 2415 }
cparata 0:f27ce43dee4f 2416
cparata 0:f27ce43dee4f 2417 /**
cparata 0:f27ce43dee4f 2418 * @brief Get the status of YHigh orientation
cparata 0:f27ce43dee4f 2419 * @param yh the status of YHigh orientation
cparata 0:f27ce43dee4f 2420 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2421 */
cparata 0:f27ce43dee4f 2422 int LSM6DSOXSensor::get_6d_orientation_yh(uint8_t *yh)
cparata 0:f27ce43dee4f 2423 {
cparata 0:f27ce43dee4f 2424 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2425
cparata 0:f27ce43dee4f 2426 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2427 {
cparata 0:f27ce43dee4f 2428 return 1;
cparata 0:f27ce43dee4f 2429 }
cparata 0:f27ce43dee4f 2430
cparata 0:f27ce43dee4f 2431 *yh = data.yh;
cparata 0:f27ce43dee4f 2432
cparata 0:f27ce43dee4f 2433 return 0;
cparata 0:f27ce43dee4f 2434 }
cparata 0:f27ce43dee4f 2435
cparata 0:f27ce43dee4f 2436 /**
cparata 0:f27ce43dee4f 2437 * @brief Get the status of ZLow orientation
cparata 0:f27ce43dee4f 2438 * @param zl the status of ZLow orientation
cparata 0:f27ce43dee4f 2439 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2440 */
cparata 0:f27ce43dee4f 2441 int LSM6DSOXSensor::get_6d_orientation_zl(uint8_t *zl)
cparata 0:f27ce43dee4f 2442 {
cparata 0:f27ce43dee4f 2443 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2444
cparata 0:f27ce43dee4f 2445 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2446 {
cparata 0:f27ce43dee4f 2447 return 1;
cparata 0:f27ce43dee4f 2448 }
cparata 0:f27ce43dee4f 2449
cparata 0:f27ce43dee4f 2450 *zl = data.zl;
cparata 0:f27ce43dee4f 2451
cparata 0:f27ce43dee4f 2452 return 0;
cparata 0:f27ce43dee4f 2453 }
cparata 0:f27ce43dee4f 2454
cparata 0:f27ce43dee4f 2455 /**
cparata 0:f27ce43dee4f 2456 * @brief Get the status of ZHigh orientation
cparata 0:f27ce43dee4f 2457 * @param zh the status of ZHigh orientation
cparata 0:f27ce43dee4f 2458 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2459 */
cparata 0:f27ce43dee4f 2460 int LSM6DSOXSensor::get_6d_orientation_zh(uint8_t *zh)
cparata 0:f27ce43dee4f 2461 {
cparata 0:f27ce43dee4f 2462 lsm6dsox_d6d_src_t data;
cparata 0:f27ce43dee4f 2463
cparata 0:f27ce43dee4f 2464 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:f27ce43dee4f 2465 {
cparata 0:f27ce43dee4f 2466 return 1;
cparata 0:f27ce43dee4f 2467 }
cparata 0:f27ce43dee4f 2468
cparata 0:f27ce43dee4f 2469 *zh = data.zh;
cparata 0:f27ce43dee4f 2470
cparata 0:f27ce43dee4f 2471 return 0;
cparata 0:f27ce43dee4f 2472 }
cparata 0:f27ce43dee4f 2473
cparata 0:f27ce43dee4f 2474 /**
cparata 0:f27ce43dee4f 2475 * @brief Get the LSM6DSOX ACC data ready bit value
cparata 0:f27ce43dee4f 2476 * @param status the status of data ready bit
cparata 0:f27ce43dee4f 2477 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2478 */
cparata 0:f27ce43dee4f 2479 int LSM6DSOXSensor::get_x_drdy_status(uint8_t *status)
cparata 0:f27ce43dee4f 2480 {
cparata 0:f27ce43dee4f 2481 if (lsm6dsox_xl_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2482 {
cparata 0:f27ce43dee4f 2483 return 1;
cparata 0:f27ce43dee4f 2484 }
cparata 0:f27ce43dee4f 2485
cparata 0:f27ce43dee4f 2486 return 0;
cparata 0:f27ce43dee4f 2487 }
cparata 0:f27ce43dee4f 2488
cparata 0:f27ce43dee4f 2489 /**
cparata 0:f27ce43dee4f 2490 * @brief Get the status of all hardware events
cparata 0:f27ce43dee4f 2491 * @param status the status of all hardware events
cparata 0:f27ce43dee4f 2492 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2493 */
cparata 0:f27ce43dee4f 2494 int LSM6DSOXSensor::get_event_status(LSM6DSOX_Event_Status_t *status)
cparata 0:f27ce43dee4f 2495 {
cparata 0:f27ce43dee4f 2496 uint8_t tilt_ia = 0U;
cparata 0:f27ce43dee4f 2497 lsm6dsox_wake_up_src_t wake_up_src;
cparata 0:f27ce43dee4f 2498 lsm6dsox_tap_src_t tap_src;
cparata 0:f27ce43dee4f 2499 lsm6dsox_d6d_src_t d6d_src;
cparata 0:f27ce43dee4f 2500 lsm6dsox_emb_func_src_t func_src;
cparata 0:f27ce43dee4f 2501 lsm6dsox_md1_cfg_t md1_cfg;
cparata 0:f27ce43dee4f 2502 lsm6dsox_md2_cfg_t md2_cfg;
cparata 0:f27ce43dee4f 2503 lsm6dsox_emb_func_int1_t int1_ctrl;
cparata 0:f27ce43dee4f 2504 lsm6dsox_emb_func_int2_t int2_ctrl;
cparata 0:f27ce43dee4f 2505
cparata 0:f27ce43dee4f 2506 (void)memset((void *)status, 0x0, sizeof(LSM6DSOX_Event_Status_t));
cparata 0:f27ce43dee4f 2507
cparata 0:f27ce43dee4f 2508 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_WAKE_UP_SRC, (uint8_t *)&wake_up_src, 1) != 0)
cparata 0:f27ce43dee4f 2509 {
cparata 0:f27ce43dee4f 2510 return 1;
cparata 0:f27ce43dee4f 2511 }
cparata 0:f27ce43dee4f 2512
cparata 0:f27ce43dee4f 2513 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_TAP_SRC, (uint8_t *)&tap_src, 1) != 0)
cparata 0:f27ce43dee4f 2514 {
cparata 0:f27ce43dee4f 2515 return 1;
cparata 0:f27ce43dee4f 2516 }
cparata 0:f27ce43dee4f 2517
cparata 0:f27ce43dee4f 2518 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&d6d_src, 1) != 0)
cparata 0:f27ce43dee4f 2519 {
cparata 0:f27ce43dee4f 2520 return 1;
cparata 0:f27ce43dee4f 2521 }
cparata 0:f27ce43dee4f 2522
cparata 0:f27ce43dee4f 2523 if (lsm6dsox_mem_bank_set(&_reg_ctx, LSM6DSOX_EMBEDDED_FUNC_BANK) != 0)
cparata 0:f27ce43dee4f 2524 {
cparata 0:f27ce43dee4f 2525 return 1;
cparata 0:f27ce43dee4f 2526 }
cparata 0:f27ce43dee4f 2527
cparata 0:f27ce43dee4f 2528 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_SRC, (uint8_t *)&func_src, 1) != 0)
cparata 0:f27ce43dee4f 2529 {
cparata 0:f27ce43dee4f 2530 return 1;
cparata 0:f27ce43dee4f 2531 }
cparata 0:f27ce43dee4f 2532
cparata 0:f27ce43dee4f 2533 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_INT1, (uint8_t *)&int1_ctrl, 1) != 0)
cparata 0:f27ce43dee4f 2534 {
cparata 0:f27ce43dee4f 2535 return 1;
cparata 0:f27ce43dee4f 2536 }
cparata 0:f27ce43dee4f 2537
cparata 0:f27ce43dee4f 2538 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_EMB_FUNC_INT2, (uint8_t *)&int2_ctrl, 1) != 0)
cparata 0:f27ce43dee4f 2539 {
cparata 0:f27ce43dee4f 2540 return 1;
cparata 0:f27ce43dee4f 2541 }
cparata 0:f27ce43dee4f 2542
cparata 0:f27ce43dee4f 2543 if (lsm6dsox_mem_bank_set(&_reg_ctx, LSM6DSOX_USER_BANK) != 0)
cparata 0:f27ce43dee4f 2544 {
cparata 0:f27ce43dee4f 2545 return 1;
cparata 0:f27ce43dee4f 2546 }
cparata 0:f27ce43dee4f 2547
cparata 0:f27ce43dee4f 2548 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_MD1_CFG, (uint8_t *)&md1_cfg, 1) != 0)
cparata 0:f27ce43dee4f 2549 {
cparata 0:f27ce43dee4f 2550 return 1;
cparata 0:f27ce43dee4f 2551 }
cparata 0:f27ce43dee4f 2552
cparata 0:f27ce43dee4f 2553 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_MD2_CFG, (uint8_t *)&md2_cfg, 1) != 0)
cparata 0:f27ce43dee4f 2554 {
cparata 0:f27ce43dee4f 2555 return 1;
cparata 0:f27ce43dee4f 2556 }
cparata 0:f27ce43dee4f 2557
cparata 0:f27ce43dee4f 2558 if (lsm6dsox_tilt_flag_data_ready_get(&_reg_ctx, &tilt_ia) != 0)
cparata 0:f27ce43dee4f 2559 {
cparata 0:f27ce43dee4f 2560 return 1;
cparata 0:f27ce43dee4f 2561 }
cparata 0:f27ce43dee4f 2562
cparata 0:f27ce43dee4f 2563 if ((md1_cfg.int1_ff == 1U) || (md2_cfg.int2_ff == 1U))
cparata 0:f27ce43dee4f 2564 {
cparata 0:f27ce43dee4f 2565 if (wake_up_src.ff_ia == 1U)
cparata 0:f27ce43dee4f 2566 {
cparata 0:f27ce43dee4f 2567 status->FreeFallStatus = 1;
cparata 0:f27ce43dee4f 2568 }
cparata 0:f27ce43dee4f 2569 }
cparata 0:f27ce43dee4f 2570
cparata 0:f27ce43dee4f 2571 if ((md1_cfg.int1_wu == 1U) || (md2_cfg.int2_wu == 1U))
cparata 0:f27ce43dee4f 2572 {
cparata 0:f27ce43dee4f 2573 if (wake_up_src.wu_ia == 1U)
cparata 0:f27ce43dee4f 2574 {
cparata 0:f27ce43dee4f 2575 status->WakeUpStatus = 1;
cparata 0:f27ce43dee4f 2576 }
cparata 0:f27ce43dee4f 2577 }
cparata 0:f27ce43dee4f 2578
cparata 0:f27ce43dee4f 2579 if ((md1_cfg.int1_single_tap == 1U) || (md2_cfg.int2_single_tap == 1U))
cparata 0:f27ce43dee4f 2580 {
cparata 0:f27ce43dee4f 2581 if (tap_src.single_tap == 1U)
cparata 0:f27ce43dee4f 2582 {
cparata 0:f27ce43dee4f 2583 status->TapStatus = 1;
cparata 0:f27ce43dee4f 2584 }
cparata 0:f27ce43dee4f 2585 }
cparata 0:f27ce43dee4f 2586
cparata 0:f27ce43dee4f 2587 if ((md1_cfg.int1_double_tap == 1U) || (md2_cfg.int2_double_tap == 1U))
cparata 0:f27ce43dee4f 2588 {
cparata 0:f27ce43dee4f 2589 if (tap_src.double_tap == 1U)
cparata 0:f27ce43dee4f 2590 {
cparata 0:f27ce43dee4f 2591 status->DoubleTapStatus = 1;
cparata 0:f27ce43dee4f 2592 }
cparata 0:f27ce43dee4f 2593 }
cparata 0:f27ce43dee4f 2594
cparata 0:f27ce43dee4f 2595 if ((md1_cfg.int1_6d == 1U) || (md2_cfg.int2_6d == 1U))
cparata 0:f27ce43dee4f 2596 {
cparata 0:f27ce43dee4f 2597 if (d6d_src.d6d_ia == 1U)
cparata 0:f27ce43dee4f 2598 {
cparata 0:f27ce43dee4f 2599 status->D6DOrientationStatus = 1;
cparata 0:f27ce43dee4f 2600 }
cparata 0:f27ce43dee4f 2601 }
cparata 0:f27ce43dee4f 2602
cparata 0:f27ce43dee4f 2603 if (int1_ctrl.int1_step_detector == 1U)
cparata 0:f27ce43dee4f 2604 {
cparata 0:f27ce43dee4f 2605 if (func_src.step_detected == 1U)
cparata 0:f27ce43dee4f 2606 {
cparata 0:f27ce43dee4f 2607 status->StepStatus = 1;
cparata 0:f27ce43dee4f 2608 }
cparata 0:f27ce43dee4f 2609 }
cparata 0:f27ce43dee4f 2610
cparata 0:f27ce43dee4f 2611 if ((int1_ctrl.int1_tilt == 1U) || (int2_ctrl.int2_tilt == 1U))
cparata 0:f27ce43dee4f 2612 {
cparata 0:f27ce43dee4f 2613 if (tilt_ia == 1U)
cparata 0:f27ce43dee4f 2614 {
cparata 0:f27ce43dee4f 2615 status->TiltStatus = 1;
cparata 0:f27ce43dee4f 2616 }
cparata 0:f27ce43dee4f 2617 }
cparata 0:f27ce43dee4f 2618
cparata 0:f27ce43dee4f 2619 return 0;
cparata 0:f27ce43dee4f 2620 }
cparata 0:f27ce43dee4f 2621
cparata 0:f27ce43dee4f 2622 /**
cparata 0:f27ce43dee4f 2623 * @brief Set self test
cparata 0:f27ce43dee4f 2624 * @param val the value of st_xl in reg CTRL5_C
cparata 0:f27ce43dee4f 2625 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2626 */
cparata 0:f27ce43dee4f 2627 int LSM6DSOXSensor::set_x_self_test(uint8_t val)
cparata 0:f27ce43dee4f 2628 {
cparata 0:f27ce43dee4f 2629 lsm6dsox_st_xl_t reg;
cparata 0:f27ce43dee4f 2630
cparata 0:f27ce43dee4f 2631 reg = (val == 0U) ? LSM6DSOX_XL_ST_DISABLE
cparata 0:f27ce43dee4f 2632 : (val == 1U) ? LSM6DSOX_XL_ST_POSITIVE
cparata 0:f27ce43dee4f 2633 : (val == 2U) ? LSM6DSOX_XL_ST_NEGATIVE
cparata 0:f27ce43dee4f 2634 : LSM6DSOX_XL_ST_DISABLE;
cparata 0:f27ce43dee4f 2635
cparata 0:f27ce43dee4f 2636 if (lsm6dsox_xl_self_test_set(&_reg_ctx, reg) != 0)
cparata 0:f27ce43dee4f 2637 {
cparata 0:f27ce43dee4f 2638 return 1;
cparata 0:f27ce43dee4f 2639 }
cparata 0:f27ce43dee4f 2640
cparata 0:f27ce43dee4f 2641 return 0;
cparata 0:f27ce43dee4f 2642 }
cparata 0:f27ce43dee4f 2643
cparata 0:f27ce43dee4f 2644 /**
cparata 0:f27ce43dee4f 2645 * @brief Get the LSM6DSOX GYRO data ready bit value
cparata 0:f27ce43dee4f 2646 * @param status the status of data ready bit
cparata 0:f27ce43dee4f 2647 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2648 */
cparata 0:f27ce43dee4f 2649 int LSM6DSOXSensor::get_g_drdy_status(uint8_t *status)
cparata 0:f27ce43dee4f 2650 {
cparata 0:f27ce43dee4f 2651 if (lsm6dsox_gy_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2652 {
cparata 0:f27ce43dee4f 2653 return 1;
cparata 0:f27ce43dee4f 2654 }
cparata 0:f27ce43dee4f 2655
cparata 0:f27ce43dee4f 2656 return 0;
cparata 0:f27ce43dee4f 2657 }
cparata 0:f27ce43dee4f 2658
cparata 0:f27ce43dee4f 2659 /**
cparata 0:f27ce43dee4f 2660 * @brief Set self test
cparata 0:f27ce43dee4f 2661 * @param val the value of st_xl in reg CTRL5_C
cparata 0:f27ce43dee4f 2662 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2663 */
cparata 0:f27ce43dee4f 2664 int LSM6DSOXSensor::set_g_self_test(uint8_t val)
cparata 0:f27ce43dee4f 2665 {
cparata 0:f27ce43dee4f 2666 lsm6dsox_st_g_t reg;
cparata 0:f27ce43dee4f 2667
cparata 0:f27ce43dee4f 2668 reg = (val == 0U) ? LSM6DSOX_GY_ST_DISABLE
cparata 0:f27ce43dee4f 2669 : (val == 1U) ? LSM6DSOX_GY_ST_POSITIVE
cparata 0:f27ce43dee4f 2670 : (val == 2U) ? LSM6DSOX_GY_ST_NEGATIVE
cparata 0:f27ce43dee4f 2671 : LSM6DSOX_GY_ST_DISABLE;
cparata 0:f27ce43dee4f 2672
cparata 0:f27ce43dee4f 2673
cparata 0:f27ce43dee4f 2674 if (lsm6dsox_gy_self_test_set(&_reg_ctx, reg) != 0)
cparata 0:f27ce43dee4f 2675 {
cparata 0:f27ce43dee4f 2676 return 1;
cparata 0:f27ce43dee4f 2677 }
cparata 0:f27ce43dee4f 2678
cparata 0:f27ce43dee4f 2679 return 0;
cparata 0:f27ce43dee4f 2680 }
cparata 0:f27ce43dee4f 2681
cparata 0:f27ce43dee4f 2682 /**
cparata 0:f27ce43dee4f 2683 * @brief Get the LSM6DSOX FIFO number of samples
cparata 0:f27ce43dee4f 2684 * @param num_samples number of samples
cparata 0:f27ce43dee4f 2685 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2686 */
cparata 0:f27ce43dee4f 2687 int LSM6DSOXSensor::get_fifo_num_samples(uint16_t *num_samples)
cparata 0:f27ce43dee4f 2688 {
cparata 0:f27ce43dee4f 2689 if (lsm6dsox_fifo_data_level_get(&_reg_ctx, num_samples) != 0)
cparata 0:f27ce43dee4f 2690 {
cparata 0:f27ce43dee4f 2691 return 1;
cparata 0:f27ce43dee4f 2692 }
cparata 0:f27ce43dee4f 2693
cparata 0:f27ce43dee4f 2694 return 0;
cparata 0:f27ce43dee4f 2695 }
cparata 0:f27ce43dee4f 2696
cparata 0:f27ce43dee4f 2697 /**
cparata 0:f27ce43dee4f 2698 * @brief Get the LSM6DSOX FIFO full status
cparata 0:f27ce43dee4f 2699 * @param status FIFO full status
cparata 0:f27ce43dee4f 2700 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2701 */
cparata 0:f27ce43dee4f 2702 int LSM6DSOXSensor::get_fifo_full_status(uint8_t *status)
cparata 0:f27ce43dee4f 2703 {
cparata 0:f27ce43dee4f 2704 lsm6dsox_reg_t reg;
cparata 0:f27ce43dee4f 2705
cparata 0:f27ce43dee4f 2706 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_FIFO_STATUS2, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2707 {
cparata 0:f27ce43dee4f 2708 return 1;
cparata 0:f27ce43dee4f 2709 }
cparata 0:f27ce43dee4f 2710
cparata 0:f27ce43dee4f 2711 *status = reg.fifo_status2.fifo_full_ia;
cparata 0:f27ce43dee4f 2712
cparata 0:f27ce43dee4f 2713 return 0;
cparata 0:f27ce43dee4f 2714 }
cparata 0:f27ce43dee4f 2715
cparata 0:f27ce43dee4f 2716 /**
cparata 0:f27ce43dee4f 2717 * @brief Set the LSM6DSOX FIFO full interrupt on INT1 pin
cparata 0:f27ce43dee4f 2718 * @param status FIFO full interrupt on INT1 pin status
cparata 0:f27ce43dee4f 2719 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2720 */
cparata 0:f27ce43dee4f 2721 int LSM6DSOXSensor::set_fifo_int1_fifo_full(uint8_t status)
cparata 0:f27ce43dee4f 2722 {
cparata 0:f27ce43dee4f 2723 lsm6dsox_reg_t reg;
cparata 0:f27ce43dee4f 2724
cparata 0:f27ce43dee4f 2725 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_INT1_CTRL, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2726 {
cparata 0:f27ce43dee4f 2727 return 1;
cparata 0:f27ce43dee4f 2728 }
cparata 0:f27ce43dee4f 2729
cparata 0:f27ce43dee4f 2730 reg.int1_ctrl.int1_fifo_full = status;
cparata 0:f27ce43dee4f 2731
cparata 0:f27ce43dee4f 2732 if (lsm6dsox_write_reg(&_reg_ctx, LSM6DSOX_INT1_CTRL, &reg.byte, 1) != 0)
cparata 0:f27ce43dee4f 2733 {
cparata 0:f27ce43dee4f 2734 return 1;
cparata 0:f27ce43dee4f 2735 }
cparata 0:f27ce43dee4f 2736
cparata 0:f27ce43dee4f 2737 return 0;
cparata 0:f27ce43dee4f 2738 }
cparata 0:f27ce43dee4f 2739
cparata 0:f27ce43dee4f 2740 /**
cparata 0:f27ce43dee4f 2741 * @brief Set the LSM6DSOX FIFO watermark level
cparata 0:f27ce43dee4f 2742 * @param watermark FIFO watermark level
cparata 0:f27ce43dee4f 2743 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2744 */
cparata 0:f27ce43dee4f 2745 int LSM6DSOXSensor::set_fifo_watermark_level(uint16_t watermark)
cparata 0:f27ce43dee4f 2746 {
cparata 0:f27ce43dee4f 2747 if (lsm6dsox_fifo_watermark_set(&_reg_ctx, watermark) != 0)
cparata 0:f27ce43dee4f 2748 {
cparata 0:f27ce43dee4f 2749 return 1;
cparata 0:f27ce43dee4f 2750 }
cparata 0:f27ce43dee4f 2751
cparata 0:f27ce43dee4f 2752 return 0;
cparata 0:f27ce43dee4f 2753 }
cparata 0:f27ce43dee4f 2754
cparata 0:f27ce43dee4f 2755 /**
cparata 0:f27ce43dee4f 2756 * @brief Set the LSM6DSOX FIFO stop on watermark
cparata 0:f27ce43dee4f 2757 * @param status FIFO stop on watermark status
cparata 0:f27ce43dee4f 2758 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2759 */
cparata 0:f27ce43dee4f 2760 int LSM6DSOXSensor::set_fifo_stop_on_fth(uint8_t status)
cparata 0:f27ce43dee4f 2761 {
cparata 0:f27ce43dee4f 2762 if (lsm6dsox_fifo_stop_on_wtm_set(&_reg_ctx, status) != 0)
cparata 0:f27ce43dee4f 2763 {
cparata 0:f27ce43dee4f 2764 return 1;
cparata 0:f27ce43dee4f 2765 }
cparata 0:f27ce43dee4f 2766
cparata 0:f27ce43dee4f 2767 return 0;
cparata 0:f27ce43dee4f 2768 }
cparata 0:f27ce43dee4f 2769
cparata 0:f27ce43dee4f 2770 /**
cparata 0:f27ce43dee4f 2771 * @brief Set the LSM6DSOX FIFO mode
cparata 0:f27ce43dee4f 2772 * @param mode FIFO mode
cparata 0:f27ce43dee4f 2773 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2774 */
cparata 0:f27ce43dee4f 2775 int LSM6DSOXSensor::set_fifo_mode(uint8_t mode)
cparata 0:f27ce43dee4f 2776 {
cparata 0:f27ce43dee4f 2777 int ret = 0;
cparata 0:f27ce43dee4f 2778
cparata 0:f27ce43dee4f 2779 /* Verify that the passed parameter contains one of the valid values. */
cparata 0:f27ce43dee4f 2780 switch ((lsm6dsox_fifo_mode_t)mode)
cparata 0:f27ce43dee4f 2781 {
cparata 0:f27ce43dee4f 2782 case LSM6DSOX_BYPASS_MODE:
cparata 0:f27ce43dee4f 2783 case LSM6DSOX_FIFO_MODE:
cparata 0:f27ce43dee4f 2784 case LSM6DSOX_STREAM_TO_FIFO_MODE:
cparata 0:f27ce43dee4f 2785 case LSM6DSOX_BYPASS_TO_STREAM_MODE:
cparata 0:f27ce43dee4f 2786 case LSM6DSOX_STREAM_MODE:
cparata 0:f27ce43dee4f 2787 break;
cparata 0:f27ce43dee4f 2788
cparata 0:f27ce43dee4f 2789 default:
cparata 0:f27ce43dee4f 2790 ret = 1;
cparata 0:f27ce43dee4f 2791 break;
cparata 0:f27ce43dee4f 2792 }
cparata 0:f27ce43dee4f 2793
cparata 0:f27ce43dee4f 2794 if (ret == 1)
cparata 0:f27ce43dee4f 2795 {
cparata 0:f27ce43dee4f 2796 return ret;
cparata 0:f27ce43dee4f 2797 }
cparata 0:f27ce43dee4f 2798
cparata 0:f27ce43dee4f 2799 if (lsm6dsox_fifo_mode_set(&_reg_ctx, (lsm6dsox_fifo_mode_t)mode) != 0)
cparata 0:f27ce43dee4f 2800 {
cparata 0:f27ce43dee4f 2801 return 1;
cparata 0:f27ce43dee4f 2802 }
cparata 0:f27ce43dee4f 2803
cparata 0:f27ce43dee4f 2804 return ret;
cparata 0:f27ce43dee4f 2805 }
cparata 0:f27ce43dee4f 2806
cparata 0:f27ce43dee4f 2807 /**
cparata 0:f27ce43dee4f 2808 * @brief Get the LSM6DSOX FIFO tag
cparata 0:f27ce43dee4f 2809 * @param tag FIFO tag
cparata 0:f27ce43dee4f 2810 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2811 */
cparata 0:f27ce43dee4f 2812 int LSM6DSOXSensor::get_fifo_tag(uint8_t *tag)
cparata 0:f27ce43dee4f 2813 {
cparata 0:f27ce43dee4f 2814 lsm6dsox_fifo_tag_t tag_local;
cparata 0:f27ce43dee4f 2815
cparata 0:f27ce43dee4f 2816 if (lsm6dsox_fifo_sensor_tag_get(&_reg_ctx, &tag_local) != 0)
cparata 0:f27ce43dee4f 2817 {
cparata 0:f27ce43dee4f 2818 return 1;
cparata 0:f27ce43dee4f 2819 }
cparata 0:f27ce43dee4f 2820
cparata 0:f27ce43dee4f 2821 *tag = (uint8_t)tag_local;
cparata 0:f27ce43dee4f 2822
cparata 0:f27ce43dee4f 2823 return 0;
cparata 0:f27ce43dee4f 2824 }
cparata 0:f27ce43dee4f 2825
cparata 0:f27ce43dee4f 2826 /**
cparata 0:f27ce43dee4f 2827 * @brief Get the LSM6DSOX FIFO raw data
cparata 0:f27ce43dee4f 2828 * @param data FIFO raw data array [6]
cparata 0:f27ce43dee4f 2829 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2830 */
cparata 0:f27ce43dee4f 2831 int LSM6DSOXSensor::get_fifo_data(uint8_t *data)
cparata 0:f27ce43dee4f 2832 {
cparata 0:f27ce43dee4f 2833 if (lsm6dsox_read_reg(&_reg_ctx, LSM6DSOX_FIFO_DATA_OUT_X_L, data, 6) != 0)
cparata 0:f27ce43dee4f 2834 {
cparata 0:f27ce43dee4f 2835 return 1;
cparata 0:f27ce43dee4f 2836 }
cparata 0:f27ce43dee4f 2837
cparata 0:f27ce43dee4f 2838 return 0;
cparata 0:f27ce43dee4f 2839 }
cparata 0:f27ce43dee4f 2840
cparata 0:f27ce43dee4f 2841 /**
cparata 0:f27ce43dee4f 2842 * @brief Get the LSM6DSOX FIFO accelero single sample (16-bit data per 3 axes) and calculate acceleration [mg]
cparata 0:f27ce43dee4f 2843 * @param acceleration FIFO accelero axes [mg]
cparata 0:f27ce43dee4f 2844 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2845 */
cparata 0:f27ce43dee4f 2846 int LSM6DSOXSensor::get_fifo_x_axes(int32_t *acceleration)
cparata 0:f27ce43dee4f 2847 {
cparata 0:f27ce43dee4f 2848 uint8_t data[6];
cparata 0:f27ce43dee4f 2849 int16_t data_raw[3];
cparata 0:f27ce43dee4f 2850 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 2851 float acceleration_float[3];
cparata 0:f27ce43dee4f 2852
cparata 0:f27ce43dee4f 2853 if (get_fifo_data(data) != 0)
cparata 0:f27ce43dee4f 2854 {
cparata 0:f27ce43dee4f 2855 return 1;
cparata 0:f27ce43dee4f 2856 }
cparata 0:f27ce43dee4f 2857
cparata 0:f27ce43dee4f 2858 data_raw[0] = ((int16_t)data[1] << 8) | data[0];
cparata 0:f27ce43dee4f 2859 data_raw[1] = ((int16_t)data[3] << 8) | data[2];
cparata 0:f27ce43dee4f 2860 data_raw[2] = ((int16_t)data[5] << 8) | data[4];
cparata 0:f27ce43dee4f 2861
cparata 0:f27ce43dee4f 2862 if (get_x_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 2863 {
cparata 0:f27ce43dee4f 2864 return 1;
cparata 0:f27ce43dee4f 2865 }
cparata 0:f27ce43dee4f 2866
cparata 0:f27ce43dee4f 2867 acceleration_float[0] = (float)data_raw[0] * sensitivity;
cparata 0:f27ce43dee4f 2868 acceleration_float[1] = (float)data_raw[1] * sensitivity;
cparata 0:f27ce43dee4f 2869 acceleration_float[2] = (float)data_raw[2] * sensitivity;
cparata 0:f27ce43dee4f 2870
cparata 0:f27ce43dee4f 2871 acceleration[0] = (int32_t)acceleration_float[0];
cparata 0:f27ce43dee4f 2872 acceleration[1] = (int32_t)acceleration_float[1];
cparata 0:f27ce43dee4f 2873 acceleration[2] = (int32_t)acceleration_float[2];
cparata 0:f27ce43dee4f 2874
cparata 0:f27ce43dee4f 2875 return 0;
cparata 0:f27ce43dee4f 2876 }
cparata 0:f27ce43dee4f 2877
cparata 0:f27ce43dee4f 2878 /**
cparata 0:f27ce43dee4f 2879 * @brief Set the LSM6DSOX FIFO accelero BDR value
cparata 0:f27ce43dee4f 2880 * @param bdr FIFO accelero BDR value
cparata 0:f27ce43dee4f 2881 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2882 */
cparata 0:f27ce43dee4f 2883 int LSM6DSOXSensor::set_fifo_x_bdr(float bdr)
cparata 0:f27ce43dee4f 2884 {
cparata 0:f27ce43dee4f 2885 lsm6dsox_bdr_xl_t new_bdr;
cparata 0:f27ce43dee4f 2886
cparata 0:f27ce43dee4f 2887 new_bdr = (bdr <= 0.0f) ? LSM6DSOX_XL_NOT_BATCHED
cparata 0:f27ce43dee4f 2888 : (bdr <= 12.5f) ? LSM6DSOX_XL_BATCHED_AT_12Hz5
cparata 0:f27ce43dee4f 2889 : (bdr <= 26.0f) ? LSM6DSOX_XL_BATCHED_AT_26Hz
cparata 0:f27ce43dee4f 2890 : (bdr <= 52.0f) ? LSM6DSOX_XL_BATCHED_AT_52Hz
cparata 0:f27ce43dee4f 2891 : (bdr <= 104.0f) ? LSM6DSOX_XL_BATCHED_AT_104Hz
cparata 0:f27ce43dee4f 2892 : (bdr <= 208.0f) ? LSM6DSOX_XL_BATCHED_AT_208Hz
cparata 0:f27ce43dee4f 2893 : (bdr <= 416.0f) ? LSM6DSOX_XL_BATCHED_AT_417Hz
cparata 0:f27ce43dee4f 2894 : (bdr <= 833.0f) ? LSM6DSOX_XL_BATCHED_AT_833Hz
cparata 0:f27ce43dee4f 2895 : (bdr <= 1660.0f) ? LSM6DSOX_XL_BATCHED_AT_1667Hz
cparata 0:f27ce43dee4f 2896 : (bdr <= 3330.0f) ? LSM6DSOX_XL_BATCHED_AT_3333Hz
cparata 0:f27ce43dee4f 2897 : LSM6DSOX_XL_BATCHED_AT_6667Hz;
cparata 0:f27ce43dee4f 2898
cparata 0:f27ce43dee4f 2899 if (lsm6dsox_fifo_xl_batch_set(&_reg_ctx, new_bdr) != 0)
cparata 0:f27ce43dee4f 2900 {
cparata 0:f27ce43dee4f 2901 return 1;
cparata 0:f27ce43dee4f 2902 }
cparata 0:f27ce43dee4f 2903
cparata 0:f27ce43dee4f 2904 return 0;
cparata 0:f27ce43dee4f 2905 }
cparata 0:f27ce43dee4f 2906
cparata 0:f27ce43dee4f 2907 /**
cparata 0:f27ce43dee4f 2908 * @brief Get the LSM6DSOX FIFO gyro single sample (16-bit data per 3 axes) and calculate angular velocity [mDPS]
cparata 0:f27ce43dee4f 2909 * @param angular_velocity FIFO gyro axes [mDPS]
cparata 0:f27ce43dee4f 2910 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2911 */
cparata 0:f27ce43dee4f 2912 int LSM6DSOXSensor::get_fifo_g_axes(int32_t *angular_velocity)
cparata 0:f27ce43dee4f 2913 {
cparata 0:f27ce43dee4f 2914 uint8_t data[6];
cparata 0:f27ce43dee4f 2915 int16_t data_raw[3];
cparata 0:f27ce43dee4f 2916 float sensitivity = 0.0f;
cparata 0:f27ce43dee4f 2917 float angular_velocity_float[3];
cparata 0:f27ce43dee4f 2918
cparata 0:f27ce43dee4f 2919 if (get_fifo_data(data) != 0)
cparata 0:f27ce43dee4f 2920 {
cparata 0:f27ce43dee4f 2921 return 1;
cparata 0:f27ce43dee4f 2922 }
cparata 0:f27ce43dee4f 2923
cparata 0:f27ce43dee4f 2924 data_raw[0] = ((int16_t)data[1] << 8) | data[0];
cparata 0:f27ce43dee4f 2925 data_raw[1] = ((int16_t)data[3] << 8) | data[2];
cparata 0:f27ce43dee4f 2926 data_raw[2] = ((int16_t)data[5] << 8) | data[4];
cparata 0:f27ce43dee4f 2927
cparata 0:f27ce43dee4f 2928 if (get_g_sensitivity(&sensitivity) != 0)
cparata 0:f27ce43dee4f 2929 {
cparata 0:f27ce43dee4f 2930 return 1;
cparata 0:f27ce43dee4f 2931 }
cparata 0:f27ce43dee4f 2932
cparata 0:f27ce43dee4f 2933 angular_velocity_float[0] = (float)data_raw[0] * sensitivity;
cparata 0:f27ce43dee4f 2934 angular_velocity_float[1] = (float)data_raw[1] * sensitivity;
cparata 0:f27ce43dee4f 2935 angular_velocity_float[2] = (float)data_raw[2] * sensitivity;
cparata 0:f27ce43dee4f 2936
cparata 0:f27ce43dee4f 2937 angular_velocity[0] = (int32_t)angular_velocity_float[0];
cparata 0:f27ce43dee4f 2938 angular_velocity[1] = (int32_t)angular_velocity_float[1];
cparata 0:f27ce43dee4f 2939 angular_velocity[2] = (int32_t)angular_velocity_float[2];
cparata 0:f27ce43dee4f 2940
cparata 0:f27ce43dee4f 2941 return 0;
cparata 0:f27ce43dee4f 2942 }
cparata 0:f27ce43dee4f 2943
cparata 0:f27ce43dee4f 2944 /**
cparata 0:f27ce43dee4f 2945 * @brief Set the LSM6DSOX FIFO gyro BDR value
cparata 0:f27ce43dee4f 2946 * @param bdr FIFO gyro BDR value
cparata 0:f27ce43dee4f 2947 * @retval 0 in case of success, an error code otherwise
cparata 0:f27ce43dee4f 2948 */
cparata 0:f27ce43dee4f 2949 int LSM6DSOXSensor::set_fifo_g_bdr(float bdr)
cparata 0:f27ce43dee4f 2950 {
cparata 0:f27ce43dee4f 2951 lsm6dsox_bdr_gy_t new_bdr;
cparata 0:f27ce43dee4f 2952
cparata 0:f27ce43dee4f 2953 new_bdr = (bdr <= 0.0f) ? LSM6DSOX_GY_NOT_BATCHED
cparata 0:f27ce43dee4f 2954 : (bdr <= 12.5f) ? LSM6DSOX_GY_BATCHED_AT_12Hz5
cparata 0:f27ce43dee4f 2955 : (bdr <= 26.0f) ? LSM6DSOX_GY_BATCHED_AT_26Hz
cparata 0:f27ce43dee4f 2956 : (bdr <= 52.0f) ? LSM6DSOX_GY_BATCHED_AT_52Hz
cparata 0:f27ce43dee4f 2957 : (bdr <= 104.0f) ? LSM6DSOX_GY_BATCHED_AT_104Hz
cparata 0:f27ce43dee4f 2958 : (bdr <= 208.0f) ? LSM6DSOX_GY_BATCHED_AT_208Hz
cparata 0:f27ce43dee4f 2959 : (bdr <= 416.0f) ? LSM6DSOX_GY_BATCHED_AT_417Hz
cparata 0:f27ce43dee4f 2960 : (bdr <= 833.0f) ? LSM6DSOX_GY_BATCHED_AT_833Hz
cparata 0:f27ce43dee4f 2961 : (bdr <= 1660.0f) ? LSM6DSOX_GY_BATCHED_AT_1667Hz
cparata 0:f27ce43dee4f 2962 : (bdr <= 3330.0f) ? LSM6DSOX_GY_BATCHED_AT_3333Hz
cparata 0:f27ce43dee4f 2963 : LSM6DSOX_GY_BATCHED_AT_6667Hz;
cparata 0:f27ce43dee4f 2964
cparata 0:f27ce43dee4f 2965 if (lsm6dsox_fifo_gy_batch_set(&_reg_ctx, new_bdr) != 0)
cparata 0:f27ce43dee4f 2966 {
cparata 0:f27ce43dee4f 2967 return 1;
cparata 0:f27ce43dee4f 2968 }
cparata 0:f27ce43dee4f 2969
cparata 0:f27ce43dee4f 2970 return 0;
cparata 0:f27ce43dee4f 2971 }
cparata 0:f27ce43dee4f 2972
cparata 3:d89217a05f63 2973 /**
cparata 3:d89217a05f63 2974 * @brief Get the LSM6DSOX MLC status
cparata 3:d89217a05f63 2975 * @param status the status to be set
cparata 3:d89217a05f63 2976 * @retval 0 in case of success, an error code otherwise
cparata 3:d89217a05f63 2977 */
cparata 3:d89217a05f63 2978 int LSM6DSOXSensor::get_mlc_status(LSM6DSOX_MLC_Status_t *status)
cparata 3:d89217a05f63 2979 {
cparata 3:d89217a05f63 2980 if (lsm6dsox_mlc_status_get(&_reg_ctx, (lsm6dsox_mlc_status_mainpage_t *)status) != 0)
cparata 3:d89217a05f63 2981 {
cparata 3:d89217a05f63 2982 return 1;
cparata 3:d89217a05f63 2983 }
cparata 3:d89217a05f63 2984
cparata 3:d89217a05f63 2985 return 0;
cparata 3:d89217a05f63 2986 }
cparata 3:d89217a05f63 2987
cparata 3:d89217a05f63 2988 /**
cparata 3:d89217a05f63 2989 * @brief Get the LSM6DSOX MLC output
cparata 3:d89217a05f63 2990 * @param output the result of the MLC computation
cparata 3:d89217a05f63 2991 * @retval 0 in case of success, an error code otherwise
cparata 3:d89217a05f63 2992 */
cparata 3:d89217a05f63 2993 int LSM6DSOXSensor::get_mlc_output(uint8_t *output)
cparata 3:d89217a05f63 2994 {
cparata 3:d89217a05f63 2995 if (lsm6dsox_mlc_out_get(&_reg_ctx, output) != 0)
cparata 3:d89217a05f63 2996 {
cparata 3:d89217a05f63 2997 return 1;
cparata 3:d89217a05f63 2998 }
cparata 3:d89217a05f63 2999
cparata 3:d89217a05f63 3000 return 0;
cparata 3:d89217a05f63 3001 }
cparata 3:d89217a05f63 3002
cparata 0:f27ce43dee4f 3003
cparata 0:f27ce43dee4f 3004
cparata 0:f27ce43dee4f 3005 int32_t LSM6DSOX_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
cparata 0:f27ce43dee4f 3006 {
cparata 0:f27ce43dee4f 3007 return ((LSM6DSOXSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
cparata 0:f27ce43dee4f 3008 }
cparata 0:f27ce43dee4f 3009
cparata 0:f27ce43dee4f 3010 int32_t LSM6DSOX_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
cparata 0:f27ce43dee4f 3011 {
cparata 0:f27ce43dee4f 3012 return ((LSM6DSOXSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
cparata 0:f27ce43dee4f 3013 }