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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Committer:
cparata
Date:
Thu Oct 29 12:50:52 2020 +0000
Revision:
4:77faf76e3cd8
Parent:
3:4274d9103f1d
Update PID and add low power modes

Who changed what in which revision?

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