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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Committer:
cparata
Date:
Mon Jun 03 09:16:08 2019 +0000
Revision:
2:4d14e9edf37e
Parent:
0:6d69e896ce38
Child:
3:4274d9103f1d
Disable by default I3C

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