LSM6DSO accelerometer and gyroscope sensor library

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3

Committer:
martlefebvre94
Date:
Tue Sep 17 12:29:47 2019 +0000
Revision:
5:213250c75a9e
Parent:
4:bcf0cf6e43a7
Functions to configure the LP and HP filters

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