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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Committer:
cparata
Date:
Tue Mar 05 16:26:47 2019 +0000
Revision:
0:6d69e896ce38
Child:
2:4d14e9edf37e
First version of the LSM6DSO library

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