Workshop example

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
JimCarver
Date:
Tue May 21 21:16:24 2019 +0000
Revision:
35:42b3fba640b1
Parent:
18:a15bfe7aaebd
Simple version for workshop

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 18:a15bfe7aaebd 1 /**
screamer 18:a15bfe7aaebd 2 ******************************************************************************
screamer 18:a15bfe7aaebd 3 * @file LSM6DSLSensor.cpp
screamer 18:a15bfe7aaebd 4 * @author CLab
screamer 18:a15bfe7aaebd 5 * @version V1.0.0
screamer 18:a15bfe7aaebd 6 * @date 5 August 2016
screamer 18:a15bfe7aaebd 7 * @brief Implementation of an LSM6DSL Inertial Measurement Unit (IMU) 6 axes
screamer 18:a15bfe7aaebd 8 * sensor.
screamer 18:a15bfe7aaebd 9 ******************************************************************************
screamer 18:a15bfe7aaebd 10 * @attention
screamer 18:a15bfe7aaebd 11 *
screamer 18:a15bfe7aaebd 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
screamer 18:a15bfe7aaebd 13 *
screamer 18:a15bfe7aaebd 14 * Redistribution and use in source and binary forms, with or without modification,
screamer 18:a15bfe7aaebd 15 * are permitted provided that the following conditions are met:
screamer 18:a15bfe7aaebd 16 * 1. Redistributions of source code must retain the above copyright notice,
screamer 18:a15bfe7aaebd 17 * this list of conditions and the following disclaimer.
screamer 18:a15bfe7aaebd 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
screamer 18:a15bfe7aaebd 19 * this list of conditions and the following disclaimer in the documentation
screamer 18:a15bfe7aaebd 20 * and/or other materials provided with the distribution.
screamer 18:a15bfe7aaebd 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
screamer 18:a15bfe7aaebd 22 * may be used to endorse or promote products derived from this software
screamer 18:a15bfe7aaebd 23 * without specific prior written permission.
screamer 18:a15bfe7aaebd 24 *
screamer 18:a15bfe7aaebd 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
screamer 18:a15bfe7aaebd 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
screamer 18:a15bfe7aaebd 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
screamer 18:a15bfe7aaebd 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
screamer 18:a15bfe7aaebd 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
screamer 18:a15bfe7aaebd 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
screamer 18:a15bfe7aaebd 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
screamer 18:a15bfe7aaebd 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
screamer 18:a15bfe7aaebd 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
screamer 18:a15bfe7aaebd 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
screamer 18:a15bfe7aaebd 35 *
screamer 18:a15bfe7aaebd 36 ******************************************************************************
screamer 18:a15bfe7aaebd 37 */
screamer 18:a15bfe7aaebd 38
screamer 18:a15bfe7aaebd 39
screamer 18:a15bfe7aaebd 40 /* Includes ------------------------------------------------------------------*/
screamer 18:a15bfe7aaebd 41
screamer 18:a15bfe7aaebd 42 #include "LSM6DSLSensor.h"
screamer 18:a15bfe7aaebd 43
screamer 18:a15bfe7aaebd 44
screamer 18:a15bfe7aaebd 45 /* Class Implementation ------------------------------------------------------*/
screamer 18:a15bfe7aaebd 46
screamer 18:a15bfe7aaebd 47 LSM6DSLSensor::LSM6DSLSensor(SPI *spi, PinName cs_pin, PinName int1_pin, PinName int2_pin, SPI_type_t spi_type ) :
screamer 18:a15bfe7aaebd 48 _dev_spi(spi), _cs_pin(cs_pin), _int1_irq(int1_pin), _int2_irq(int2_pin), _spi_type(spi_type)
screamer 18:a15bfe7aaebd 49 {
screamer 18:a15bfe7aaebd 50 assert (spi);
screamer 18:a15bfe7aaebd 51 if (cs_pin == NC)
screamer 18:a15bfe7aaebd 52 {
screamer 18:a15bfe7aaebd 53 printf ("ERROR LPS22HBSensor CS MUST NOT BE NC\n\r");
screamer 18:a15bfe7aaebd 54 _dev_spi = NULL;
screamer 18:a15bfe7aaebd 55 _dev_i2c=NULL;
screamer 18:a15bfe7aaebd 56 return;
screamer 18:a15bfe7aaebd 57 }
screamer 18:a15bfe7aaebd 58 _cs_pin = 1;
screamer 18:a15bfe7aaebd 59 _dev_i2c=NULL;
screamer 18:a15bfe7aaebd 60
screamer 18:a15bfe7aaebd 61 if (_spi_type == SPI3W) LSM6DSL_ACC_GYRO_W_SPI_Mode((void *)this, LSM6DSL_ACC_GYRO_SIM_3_WIRE);
screamer 18:a15bfe7aaebd 62 else LSM6DSL_ACC_GYRO_W_SPI_Mode((void *)this, LSM6DSL_ACC_GYRO_SIM_4_WIRE);
screamer 18:a15bfe7aaebd 63
screamer 18:a15bfe7aaebd 64 LSM6DSL_ACC_GYRO_W_I2C_MASTER_Enable((void *)this, LSM6DSL_ACC_GYRO_MASTER_ON_DISABLED);
screamer 18:a15bfe7aaebd 65 }
screamer 18:a15bfe7aaebd 66
screamer 18:a15bfe7aaebd 67 /** Constructor
screamer 18:a15bfe7aaebd 68 * @param i2c object of an helper class which handles the I2C peripheral
screamer 18:a15bfe7aaebd 69 * @param address the address of the component's instance
screamer 18:a15bfe7aaebd 70 */
screamer 18:a15bfe7aaebd 71 LSM6DSLSensor::LSM6DSLSensor(DevI2C *i2c, uint8_t address, PinName int1_pin, PinName int2_pin) :
screamer 18:a15bfe7aaebd 72 _dev_i2c(i2c), _address(address), _cs_pin(NC), _int1_irq(int1_pin), _int2_irq(int2_pin)
screamer 18:a15bfe7aaebd 73 {
screamer 18:a15bfe7aaebd 74 assert (i2c);
screamer 18:a15bfe7aaebd 75 _dev_spi = NULL;
screamer 18:a15bfe7aaebd 76 }
screamer 18:a15bfe7aaebd 77
screamer 18:a15bfe7aaebd 78 /**
screamer 18:a15bfe7aaebd 79 * @brief Initializing the component.
screamer 18:a15bfe7aaebd 80 * @param[in] init pointer to device specific initalization structure.
screamer 18:a15bfe7aaebd 81 * @retval "0" in case of success, an error code otherwise.
screamer 18:a15bfe7aaebd 82 */
screamer 18:a15bfe7aaebd 83 int LSM6DSLSensor::init(void *init)
screamer 18:a15bfe7aaebd 84 {
screamer 18:a15bfe7aaebd 85 /* Enable register address automatically incremented during a multiple byte
screamer 18:a15bfe7aaebd 86 access with a serial interface. */
screamer 18:a15bfe7aaebd 87 if ( LSM6DSL_ACC_GYRO_W_IF_Addr_Incr( (void *)this, LSM6DSL_ACC_GYRO_IF_INC_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 88 {
screamer 18:a15bfe7aaebd 89 return 1;
screamer 18:a15bfe7aaebd 90 }
screamer 18:a15bfe7aaebd 91
screamer 18:a15bfe7aaebd 92 /* Enable BDU */
screamer 18:a15bfe7aaebd 93 if ( LSM6DSL_ACC_GYRO_W_BDU( (void *)this, LSM6DSL_ACC_GYRO_BDU_BLOCK_UPDATE ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 94 {
screamer 18:a15bfe7aaebd 95 return 1;
screamer 18:a15bfe7aaebd 96 }
screamer 18:a15bfe7aaebd 97
screamer 18:a15bfe7aaebd 98 /* FIFO mode selection */
screamer 18:a15bfe7aaebd 99 if ( LSM6DSL_ACC_GYRO_W_FIFO_MODE( (void *)this, LSM6DSL_ACC_GYRO_FIFO_MODE_BYPASS ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 100 {
screamer 18:a15bfe7aaebd 101 return 1;
screamer 18:a15bfe7aaebd 102 }
screamer 18:a15bfe7aaebd 103
screamer 18:a15bfe7aaebd 104 /* Output data rate selection - power down. */
screamer 18:a15bfe7aaebd 105 if ( LSM6DSL_ACC_GYRO_W_ODR_XL( (void *)this, LSM6DSL_ACC_GYRO_ODR_XL_POWER_DOWN ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 106 {
screamer 18:a15bfe7aaebd 107 return 1;
screamer 18:a15bfe7aaebd 108 }
screamer 18:a15bfe7aaebd 109
screamer 18:a15bfe7aaebd 110 /* Full scale selection. */
screamer 18:a15bfe7aaebd 111 if ( set_x_fs( 2.0f ) == 1 )
screamer 18:a15bfe7aaebd 112 {
screamer 18:a15bfe7aaebd 113 return 1;
screamer 18:a15bfe7aaebd 114 }
screamer 18:a15bfe7aaebd 115
screamer 18:a15bfe7aaebd 116 /* Output data rate selection - power down */
screamer 18:a15bfe7aaebd 117 if ( LSM6DSL_ACC_GYRO_W_ODR_G( (void *)this, LSM6DSL_ACC_GYRO_ODR_G_POWER_DOWN ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 118 {
screamer 18:a15bfe7aaebd 119 return 1;
screamer 18:a15bfe7aaebd 120 }
screamer 18:a15bfe7aaebd 121
screamer 18:a15bfe7aaebd 122 /* Full scale selection. */
screamer 18:a15bfe7aaebd 123 if ( set_g_fs( 2000.0f ) == 1 )
screamer 18:a15bfe7aaebd 124 {
screamer 18:a15bfe7aaebd 125 return 1;
screamer 18:a15bfe7aaebd 126 }
screamer 18:a15bfe7aaebd 127
screamer 18:a15bfe7aaebd 128 _x_last_odr = 104.0f;
screamer 18:a15bfe7aaebd 129
screamer 18:a15bfe7aaebd 130 _x_is_enabled = 0;
screamer 18:a15bfe7aaebd 131
screamer 18:a15bfe7aaebd 132 _g_last_odr = 104.0f;
screamer 18:a15bfe7aaebd 133
screamer 18:a15bfe7aaebd 134 _g_is_enabled = 0;
screamer 18:a15bfe7aaebd 135
screamer 18:a15bfe7aaebd 136 return 0;
screamer 18:a15bfe7aaebd 137 }
screamer 18:a15bfe7aaebd 138
screamer 18:a15bfe7aaebd 139 /**
screamer 18:a15bfe7aaebd 140 * @brief Enable LSM6DSL Accelerator
screamer 18:a15bfe7aaebd 141 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 142 */
screamer 18:a15bfe7aaebd 143 int LSM6DSLSensor::enable_x(void)
screamer 18:a15bfe7aaebd 144 {
screamer 18:a15bfe7aaebd 145 /* Check if the component is already enabled */
screamer 18:a15bfe7aaebd 146 if ( _x_is_enabled == 1 )
screamer 18:a15bfe7aaebd 147 {
screamer 18:a15bfe7aaebd 148 return 0;
screamer 18:a15bfe7aaebd 149 }
screamer 18:a15bfe7aaebd 150
screamer 18:a15bfe7aaebd 151 /* Output data rate selection. */
screamer 18:a15bfe7aaebd 152 if ( set_x_odr_when_enabled( _x_last_odr ) == 1 )
screamer 18:a15bfe7aaebd 153 {
screamer 18:a15bfe7aaebd 154 return 1;
screamer 18:a15bfe7aaebd 155 }
screamer 18:a15bfe7aaebd 156
screamer 18:a15bfe7aaebd 157 _x_is_enabled = 1;
screamer 18:a15bfe7aaebd 158
screamer 18:a15bfe7aaebd 159 return 0;
screamer 18:a15bfe7aaebd 160 }
screamer 18:a15bfe7aaebd 161
screamer 18:a15bfe7aaebd 162 /**
screamer 18:a15bfe7aaebd 163 * @brief Enable LSM6DSL Gyroscope
screamer 18:a15bfe7aaebd 164 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 165 */
screamer 18:a15bfe7aaebd 166 int LSM6DSLSensor::enable_g(void)
screamer 18:a15bfe7aaebd 167 {
screamer 18:a15bfe7aaebd 168 /* Check if the component is already enabled */
screamer 18:a15bfe7aaebd 169 if ( _g_is_enabled == 1 )
screamer 18:a15bfe7aaebd 170 {
screamer 18:a15bfe7aaebd 171 return 0;
screamer 18:a15bfe7aaebd 172 }
screamer 18:a15bfe7aaebd 173
screamer 18:a15bfe7aaebd 174 /* Output data rate selection. */
screamer 18:a15bfe7aaebd 175 if ( set_g_odr_when_enabled( _g_last_odr ) == 1 )
screamer 18:a15bfe7aaebd 176 {
screamer 18:a15bfe7aaebd 177 return 1;
screamer 18:a15bfe7aaebd 178 }
screamer 18:a15bfe7aaebd 179
screamer 18:a15bfe7aaebd 180 _g_is_enabled = 1;
screamer 18:a15bfe7aaebd 181
screamer 18:a15bfe7aaebd 182 return 0;
screamer 18:a15bfe7aaebd 183 }
screamer 18:a15bfe7aaebd 184
screamer 18:a15bfe7aaebd 185 /**
screamer 18:a15bfe7aaebd 186 * @brief Disable LSM6DSL Accelerator
screamer 18:a15bfe7aaebd 187 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 188 */
screamer 18:a15bfe7aaebd 189 int LSM6DSLSensor::disable_x(void)
screamer 18:a15bfe7aaebd 190 {
screamer 18:a15bfe7aaebd 191 /* Check if the component is already disabled */
screamer 18:a15bfe7aaebd 192 if ( _x_is_enabled == 0 )
screamer 18:a15bfe7aaebd 193 {
screamer 18:a15bfe7aaebd 194 return 0;
screamer 18:a15bfe7aaebd 195 }
screamer 18:a15bfe7aaebd 196
screamer 18:a15bfe7aaebd 197 /* Store actual output data rate. */
screamer 18:a15bfe7aaebd 198 if ( get_x_odr( &_x_last_odr ) == 1 )
screamer 18:a15bfe7aaebd 199 {
screamer 18:a15bfe7aaebd 200 return 1;
screamer 18:a15bfe7aaebd 201 }
screamer 18:a15bfe7aaebd 202
screamer 18:a15bfe7aaebd 203 /* Output data rate selection - power down. */
screamer 18:a15bfe7aaebd 204 if ( LSM6DSL_ACC_GYRO_W_ODR_XL( (void *)this, LSM6DSL_ACC_GYRO_ODR_XL_POWER_DOWN ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 205 {
screamer 18:a15bfe7aaebd 206 return 1;
screamer 18:a15bfe7aaebd 207 }
screamer 18:a15bfe7aaebd 208
screamer 18:a15bfe7aaebd 209 _x_is_enabled = 0;
screamer 18:a15bfe7aaebd 210
screamer 18:a15bfe7aaebd 211 return 0;
screamer 18:a15bfe7aaebd 212 }
screamer 18:a15bfe7aaebd 213
screamer 18:a15bfe7aaebd 214 /**
screamer 18:a15bfe7aaebd 215 * @brief Disable LSM6DSL Gyroscope
screamer 18:a15bfe7aaebd 216 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 217 */
screamer 18:a15bfe7aaebd 218 int LSM6DSLSensor::disable_g(void)
screamer 18:a15bfe7aaebd 219 {
screamer 18:a15bfe7aaebd 220 /* Check if the component is already disabled */
screamer 18:a15bfe7aaebd 221 if ( _g_is_enabled == 0 )
screamer 18:a15bfe7aaebd 222 {
screamer 18:a15bfe7aaebd 223 return 0;
screamer 18:a15bfe7aaebd 224 }
screamer 18:a15bfe7aaebd 225
screamer 18:a15bfe7aaebd 226 /* Store actual output data rate. */
screamer 18:a15bfe7aaebd 227 if ( get_g_odr( &_g_last_odr ) == 1 )
screamer 18:a15bfe7aaebd 228 {
screamer 18:a15bfe7aaebd 229 return 1;
screamer 18:a15bfe7aaebd 230 }
screamer 18:a15bfe7aaebd 231
screamer 18:a15bfe7aaebd 232 /* Output data rate selection - power down */
screamer 18:a15bfe7aaebd 233 if ( LSM6DSL_ACC_GYRO_W_ODR_G( (void *)this, LSM6DSL_ACC_GYRO_ODR_G_POWER_DOWN ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 234 {
screamer 18:a15bfe7aaebd 235 return 1;
screamer 18:a15bfe7aaebd 236 }
screamer 18:a15bfe7aaebd 237
screamer 18:a15bfe7aaebd 238 _g_is_enabled = 0;
screamer 18:a15bfe7aaebd 239
screamer 18:a15bfe7aaebd 240 return 0;
screamer 18:a15bfe7aaebd 241 }
screamer 18:a15bfe7aaebd 242
screamer 18:a15bfe7aaebd 243 /**
screamer 18:a15bfe7aaebd 244 * @brief Read ID of LSM6DSL Accelerometer and Gyroscope
screamer 18:a15bfe7aaebd 245 * @param p_id the pointer where the ID of the device is stored
screamer 18:a15bfe7aaebd 246 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 247 */
screamer 18:a15bfe7aaebd 248 int LSM6DSLSensor::read_id(uint8_t *id)
screamer 18:a15bfe7aaebd 249 {
screamer 18:a15bfe7aaebd 250 if(!id)
screamer 18:a15bfe7aaebd 251 {
screamer 18:a15bfe7aaebd 252 return 1;
screamer 18:a15bfe7aaebd 253 }
screamer 18:a15bfe7aaebd 254
screamer 18:a15bfe7aaebd 255 /* Read WHO AM I register */
screamer 18:a15bfe7aaebd 256 if ( LSM6DSL_ACC_GYRO_R_WHO_AM_I( (void *)this, id ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 257 {
screamer 18:a15bfe7aaebd 258 return 1;
screamer 18:a15bfe7aaebd 259 }
screamer 18:a15bfe7aaebd 260
screamer 18:a15bfe7aaebd 261 return 0;
screamer 18:a15bfe7aaebd 262 }
screamer 18:a15bfe7aaebd 263
screamer 18:a15bfe7aaebd 264 /**
screamer 18:a15bfe7aaebd 265 * @brief Read data from LSM6DSL Accelerometer
screamer 18:a15bfe7aaebd 266 * @param pData the pointer where the accelerometer data are stored
screamer 18:a15bfe7aaebd 267 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 268 */
screamer 18:a15bfe7aaebd 269 int LSM6DSLSensor::get_x_axes(int32_t *pData)
screamer 18:a15bfe7aaebd 270 {
screamer 18:a15bfe7aaebd 271 int16_t dataRaw[3];
screamer 18:a15bfe7aaebd 272 float sensitivity = 0;
screamer 18:a15bfe7aaebd 273
screamer 18:a15bfe7aaebd 274 /* Read raw data from LSM6DSL output register. */
screamer 18:a15bfe7aaebd 275 if ( get_x_axes_raw( dataRaw ) == 1 )
screamer 18:a15bfe7aaebd 276 {
screamer 18:a15bfe7aaebd 277 return 1;
screamer 18:a15bfe7aaebd 278 }
screamer 18:a15bfe7aaebd 279
screamer 18:a15bfe7aaebd 280 /* Get LSM6DSL actual sensitivity. */
screamer 18:a15bfe7aaebd 281 if ( get_x_sensitivity( &sensitivity ) == 1 )
screamer 18:a15bfe7aaebd 282 {
screamer 18:a15bfe7aaebd 283 return 1;
screamer 18:a15bfe7aaebd 284 }
screamer 18:a15bfe7aaebd 285
screamer 18:a15bfe7aaebd 286 /* Calculate the data. */
screamer 18:a15bfe7aaebd 287 pData[0] = ( int32_t )( dataRaw[0] * sensitivity );
screamer 18:a15bfe7aaebd 288 pData[1] = ( int32_t )( dataRaw[1] * sensitivity );
screamer 18:a15bfe7aaebd 289 pData[2] = ( int32_t )( dataRaw[2] * sensitivity );
screamer 18:a15bfe7aaebd 290
screamer 18:a15bfe7aaebd 291 return 0;
screamer 18:a15bfe7aaebd 292 }
screamer 18:a15bfe7aaebd 293
screamer 18:a15bfe7aaebd 294 /**
screamer 18:a15bfe7aaebd 295 * @brief Read data from LSM6DSL Gyroscope
screamer 18:a15bfe7aaebd 296 * @param pData the pointer where the gyroscope data are stored
screamer 18:a15bfe7aaebd 297 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 298 */
screamer 18:a15bfe7aaebd 299 int LSM6DSLSensor::get_g_axes(int32_t *pData)
screamer 18:a15bfe7aaebd 300 {
screamer 18:a15bfe7aaebd 301 int16_t dataRaw[3];
screamer 18:a15bfe7aaebd 302 float sensitivity = 0;
screamer 18:a15bfe7aaebd 303
screamer 18:a15bfe7aaebd 304 /* Read raw data from LSM6DSL output register. */
screamer 18:a15bfe7aaebd 305 if ( get_g_axes_raw( dataRaw ) == 1 )
screamer 18:a15bfe7aaebd 306 {
screamer 18:a15bfe7aaebd 307 return 1;
screamer 18:a15bfe7aaebd 308 }
screamer 18:a15bfe7aaebd 309
screamer 18:a15bfe7aaebd 310 /* Get LSM6DSL actual sensitivity. */
screamer 18:a15bfe7aaebd 311 if ( get_g_sensitivity( &sensitivity ) == 1 )
screamer 18:a15bfe7aaebd 312 {
screamer 18:a15bfe7aaebd 313 return 1;
screamer 18:a15bfe7aaebd 314 }
screamer 18:a15bfe7aaebd 315
screamer 18:a15bfe7aaebd 316 /* Calculate the data. */
screamer 18:a15bfe7aaebd 317 pData[0] = ( int32_t )( dataRaw[0] * sensitivity );
screamer 18:a15bfe7aaebd 318 pData[1] = ( int32_t )( dataRaw[1] * sensitivity );
screamer 18:a15bfe7aaebd 319 pData[2] = ( int32_t )( dataRaw[2] * sensitivity );
screamer 18:a15bfe7aaebd 320
screamer 18:a15bfe7aaebd 321 return 0;
screamer 18:a15bfe7aaebd 322 }
screamer 18:a15bfe7aaebd 323
screamer 18:a15bfe7aaebd 324 /**
screamer 18:a15bfe7aaebd 325 * @brief Read Accelerometer Sensitivity
screamer 18:a15bfe7aaebd 326 * @param pfData the pointer where the accelerometer sensitivity is stored
screamer 18:a15bfe7aaebd 327 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 328 */
screamer 18:a15bfe7aaebd 329 int LSM6DSLSensor::get_x_sensitivity(float *pfData)
screamer 18:a15bfe7aaebd 330 {
screamer 18:a15bfe7aaebd 331 LSM6DSL_ACC_GYRO_FS_XL_t fullScale;
screamer 18:a15bfe7aaebd 332
screamer 18:a15bfe7aaebd 333 /* Read actual full scale selection from sensor. */
screamer 18:a15bfe7aaebd 334 if ( LSM6DSL_ACC_GYRO_R_FS_XL( (void *)this, &fullScale ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 335 {
screamer 18:a15bfe7aaebd 336 return 1;
screamer 18:a15bfe7aaebd 337 }
screamer 18:a15bfe7aaebd 338
screamer 18:a15bfe7aaebd 339 /* Store the sensitivity based on actual full scale. */
screamer 18:a15bfe7aaebd 340 switch( fullScale )
screamer 18:a15bfe7aaebd 341 {
screamer 18:a15bfe7aaebd 342 case LSM6DSL_ACC_GYRO_FS_XL_2g:
screamer 18:a15bfe7aaebd 343 *pfData = ( float )LSM6DSL_ACC_SENSITIVITY_FOR_FS_2G;
screamer 18:a15bfe7aaebd 344 break;
screamer 18:a15bfe7aaebd 345 case LSM6DSL_ACC_GYRO_FS_XL_4g:
screamer 18:a15bfe7aaebd 346 *pfData = ( float )LSM6DSL_ACC_SENSITIVITY_FOR_FS_4G;
screamer 18:a15bfe7aaebd 347 break;
screamer 18:a15bfe7aaebd 348 case LSM6DSL_ACC_GYRO_FS_XL_8g:
screamer 18:a15bfe7aaebd 349 *pfData = ( float )LSM6DSL_ACC_SENSITIVITY_FOR_FS_8G;
screamer 18:a15bfe7aaebd 350 break;
screamer 18:a15bfe7aaebd 351 case LSM6DSL_ACC_GYRO_FS_XL_16g:
screamer 18:a15bfe7aaebd 352 *pfData = ( float )LSM6DSL_ACC_SENSITIVITY_FOR_FS_16G;
screamer 18:a15bfe7aaebd 353 break;
screamer 18:a15bfe7aaebd 354 default:
screamer 18:a15bfe7aaebd 355 *pfData = -1.0f;
screamer 18:a15bfe7aaebd 356 return 1;
screamer 18:a15bfe7aaebd 357 }
screamer 18:a15bfe7aaebd 358
screamer 18:a15bfe7aaebd 359 return 0;
screamer 18:a15bfe7aaebd 360 }
screamer 18:a15bfe7aaebd 361
screamer 18:a15bfe7aaebd 362 /**
screamer 18:a15bfe7aaebd 363 * @brief Read Gyroscope Sensitivity
screamer 18:a15bfe7aaebd 364 * @param pfData the pointer where the gyroscope sensitivity is stored
screamer 18:a15bfe7aaebd 365 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 366 */
screamer 18:a15bfe7aaebd 367 int LSM6DSLSensor::get_g_sensitivity(float *pfData)
screamer 18:a15bfe7aaebd 368 {
screamer 18:a15bfe7aaebd 369 LSM6DSL_ACC_GYRO_FS_125_t fullScale125;
screamer 18:a15bfe7aaebd 370 LSM6DSL_ACC_GYRO_FS_G_t fullScale;
screamer 18:a15bfe7aaebd 371
screamer 18:a15bfe7aaebd 372 /* Read full scale 125 selection from sensor. */
screamer 18:a15bfe7aaebd 373 if ( LSM6DSL_ACC_GYRO_R_FS_125( (void *)this, &fullScale125 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 374 {
screamer 18:a15bfe7aaebd 375 return 1;
screamer 18:a15bfe7aaebd 376 }
screamer 18:a15bfe7aaebd 377
screamer 18:a15bfe7aaebd 378 if ( fullScale125 == LSM6DSL_ACC_GYRO_FS_125_ENABLED )
screamer 18:a15bfe7aaebd 379 {
screamer 18:a15bfe7aaebd 380 *pfData = ( float )LSM6DSL_GYRO_SENSITIVITY_FOR_FS_125DPS;
screamer 18:a15bfe7aaebd 381 }
screamer 18:a15bfe7aaebd 382
screamer 18:a15bfe7aaebd 383 else
screamer 18:a15bfe7aaebd 384 {
screamer 18:a15bfe7aaebd 385
screamer 18:a15bfe7aaebd 386 /* Read actual full scale selection from sensor. */
screamer 18:a15bfe7aaebd 387 if ( LSM6DSL_ACC_GYRO_R_FS_G( (void *)this, &fullScale ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 388 {
screamer 18:a15bfe7aaebd 389 return 1;
screamer 18:a15bfe7aaebd 390 }
screamer 18:a15bfe7aaebd 391
screamer 18:a15bfe7aaebd 392 /* Store the sensitivity based on actual full scale. */
screamer 18:a15bfe7aaebd 393 switch( fullScale )
screamer 18:a15bfe7aaebd 394 {
screamer 18:a15bfe7aaebd 395 case LSM6DSL_ACC_GYRO_FS_G_245dps:
screamer 18:a15bfe7aaebd 396 *pfData = ( float )LSM6DSL_GYRO_SENSITIVITY_FOR_FS_245DPS;
screamer 18:a15bfe7aaebd 397 break;
screamer 18:a15bfe7aaebd 398 case LSM6DSL_ACC_GYRO_FS_G_500dps:
screamer 18:a15bfe7aaebd 399 *pfData = ( float )LSM6DSL_GYRO_SENSITIVITY_FOR_FS_500DPS;
screamer 18:a15bfe7aaebd 400 break;
screamer 18:a15bfe7aaebd 401 case LSM6DSL_ACC_GYRO_FS_G_1000dps:
screamer 18:a15bfe7aaebd 402 *pfData = ( float )LSM6DSL_GYRO_SENSITIVITY_FOR_FS_1000DPS;
screamer 18:a15bfe7aaebd 403 break;
screamer 18:a15bfe7aaebd 404 case LSM6DSL_ACC_GYRO_FS_G_2000dps:
screamer 18:a15bfe7aaebd 405 *pfData = ( float )LSM6DSL_GYRO_SENSITIVITY_FOR_FS_2000DPS;
screamer 18:a15bfe7aaebd 406 break;
screamer 18:a15bfe7aaebd 407 default:
screamer 18:a15bfe7aaebd 408 *pfData = -1.0f;
screamer 18:a15bfe7aaebd 409 return 1;
screamer 18:a15bfe7aaebd 410 }
screamer 18:a15bfe7aaebd 411 }
screamer 18:a15bfe7aaebd 412
screamer 18:a15bfe7aaebd 413 return 0;
screamer 18:a15bfe7aaebd 414 }
screamer 18:a15bfe7aaebd 415
screamer 18:a15bfe7aaebd 416 /**
screamer 18:a15bfe7aaebd 417 * @brief Read raw data from LSM6DSL Accelerometer
screamer 18:a15bfe7aaebd 418 * @param pData the pointer where the accelerometer raw data are stored
screamer 18:a15bfe7aaebd 419 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 420 */
screamer 18:a15bfe7aaebd 421 int LSM6DSLSensor::get_x_axes_raw(int16_t *pData)
screamer 18:a15bfe7aaebd 422 {
screamer 18:a15bfe7aaebd 423 uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};
screamer 18:a15bfe7aaebd 424
screamer 18:a15bfe7aaebd 425 /* Read output registers from LSM6DSL_ACC_GYRO_OUTX_L_XL to LSM6DSL_ACC_GYRO_OUTZ_H_XL. */
screamer 18:a15bfe7aaebd 426 if ( LSM6DSL_ACC_GYRO_GetRawAccData( (void *)this, regValue ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 427 {
screamer 18:a15bfe7aaebd 428 return 1;
screamer 18:a15bfe7aaebd 429 }
screamer 18:a15bfe7aaebd 430
screamer 18:a15bfe7aaebd 431 /* Format the data. */
screamer 18:a15bfe7aaebd 432 pData[0] = ( ( ( ( int16_t )regValue[1] ) << 8 ) + ( int16_t )regValue[0] );
screamer 18:a15bfe7aaebd 433 pData[1] = ( ( ( ( int16_t )regValue[3] ) << 8 ) + ( int16_t )regValue[2] );
screamer 18:a15bfe7aaebd 434 pData[2] = ( ( ( ( int16_t )regValue[5] ) << 8 ) + ( int16_t )regValue[4] );
screamer 18:a15bfe7aaebd 435
screamer 18:a15bfe7aaebd 436 return 0;
screamer 18:a15bfe7aaebd 437 }
screamer 18:a15bfe7aaebd 438
screamer 18:a15bfe7aaebd 439 /**
screamer 18:a15bfe7aaebd 440 * @brief Read raw data from LSM6DSL Gyroscope
screamer 18:a15bfe7aaebd 441 * @param pData the pointer where the gyroscope raw data are stored
screamer 18:a15bfe7aaebd 442 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 443 */
screamer 18:a15bfe7aaebd 444 int LSM6DSLSensor::get_g_axes_raw(int16_t *pData)
screamer 18:a15bfe7aaebd 445 {
screamer 18:a15bfe7aaebd 446 uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};
screamer 18:a15bfe7aaebd 447
screamer 18:a15bfe7aaebd 448 /* Read output registers from LSM6DSL_ACC_GYRO_OUTX_L_G to LSM6DSL_ACC_GYRO_OUTZ_H_G. */
screamer 18:a15bfe7aaebd 449 if ( LSM6DSL_ACC_GYRO_GetRawGyroData( (void *)this, regValue ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 450 {
screamer 18:a15bfe7aaebd 451 return 1;
screamer 18:a15bfe7aaebd 452 }
screamer 18:a15bfe7aaebd 453
screamer 18:a15bfe7aaebd 454 /* Format the data. */
screamer 18:a15bfe7aaebd 455 pData[0] = ( ( ( ( int16_t )regValue[1] ) << 8 ) + ( int16_t )regValue[0] );
screamer 18:a15bfe7aaebd 456 pData[1] = ( ( ( ( int16_t )regValue[3] ) << 8 ) + ( int16_t )regValue[2] );
screamer 18:a15bfe7aaebd 457 pData[2] = ( ( ( ( int16_t )regValue[5] ) << 8 ) + ( int16_t )regValue[4] );
screamer 18:a15bfe7aaebd 458
screamer 18:a15bfe7aaebd 459 return 0;
screamer 18:a15bfe7aaebd 460 }
screamer 18:a15bfe7aaebd 461
screamer 18:a15bfe7aaebd 462 /**
screamer 18:a15bfe7aaebd 463 * @brief Read LSM6DSL Accelerometer output data rate
screamer 18:a15bfe7aaebd 464 * @param odr the pointer to the output data rate
screamer 18:a15bfe7aaebd 465 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 466 */
screamer 18:a15bfe7aaebd 467 int LSM6DSLSensor::get_x_odr(float* odr)
screamer 18:a15bfe7aaebd 468 {
screamer 18:a15bfe7aaebd 469 LSM6DSL_ACC_GYRO_ODR_XL_t odr_low_level;
screamer 18:a15bfe7aaebd 470
screamer 18:a15bfe7aaebd 471 if ( LSM6DSL_ACC_GYRO_R_ODR_XL( (void *)this, &odr_low_level ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 472 {
screamer 18:a15bfe7aaebd 473 return 1;
screamer 18:a15bfe7aaebd 474 }
screamer 18:a15bfe7aaebd 475
screamer 18:a15bfe7aaebd 476 switch( odr_low_level )
screamer 18:a15bfe7aaebd 477 {
screamer 18:a15bfe7aaebd 478 case LSM6DSL_ACC_GYRO_ODR_XL_POWER_DOWN:
screamer 18:a15bfe7aaebd 479 *odr = 0.0f;
screamer 18:a15bfe7aaebd 480 break;
screamer 18:a15bfe7aaebd 481 case LSM6DSL_ACC_GYRO_ODR_XL_13Hz:
screamer 18:a15bfe7aaebd 482 *odr = 13.0f;
screamer 18:a15bfe7aaebd 483 break;
screamer 18:a15bfe7aaebd 484 case LSM6DSL_ACC_GYRO_ODR_XL_26Hz:
screamer 18:a15bfe7aaebd 485 *odr = 26.0f;
screamer 18:a15bfe7aaebd 486 break;
screamer 18:a15bfe7aaebd 487 case LSM6DSL_ACC_GYRO_ODR_XL_52Hz:
screamer 18:a15bfe7aaebd 488 *odr = 52.0f;
screamer 18:a15bfe7aaebd 489 break;
screamer 18:a15bfe7aaebd 490 case LSM6DSL_ACC_GYRO_ODR_XL_104Hz:
screamer 18:a15bfe7aaebd 491 *odr = 104.0f;
screamer 18:a15bfe7aaebd 492 break;
screamer 18:a15bfe7aaebd 493 case LSM6DSL_ACC_GYRO_ODR_XL_208Hz:
screamer 18:a15bfe7aaebd 494 *odr = 208.0f;
screamer 18:a15bfe7aaebd 495 break;
screamer 18:a15bfe7aaebd 496 case LSM6DSL_ACC_GYRO_ODR_XL_416Hz:
screamer 18:a15bfe7aaebd 497 *odr = 416.0f;
screamer 18:a15bfe7aaebd 498 break;
screamer 18:a15bfe7aaebd 499 case LSM6DSL_ACC_GYRO_ODR_XL_833Hz:
screamer 18:a15bfe7aaebd 500 *odr = 833.0f;
screamer 18:a15bfe7aaebd 501 break;
screamer 18:a15bfe7aaebd 502 case LSM6DSL_ACC_GYRO_ODR_XL_1660Hz:
screamer 18:a15bfe7aaebd 503 *odr = 1660.0f;
screamer 18:a15bfe7aaebd 504 break;
screamer 18:a15bfe7aaebd 505 case LSM6DSL_ACC_GYRO_ODR_XL_3330Hz:
screamer 18:a15bfe7aaebd 506 *odr = 3330.0f;
screamer 18:a15bfe7aaebd 507 break;
screamer 18:a15bfe7aaebd 508 case LSM6DSL_ACC_GYRO_ODR_XL_6660Hz:
screamer 18:a15bfe7aaebd 509 *odr = 6660.0f;
screamer 18:a15bfe7aaebd 510 break;
screamer 18:a15bfe7aaebd 511 default:
screamer 18:a15bfe7aaebd 512 *odr = -1.0f;
screamer 18:a15bfe7aaebd 513 return 1;
screamer 18:a15bfe7aaebd 514 }
screamer 18:a15bfe7aaebd 515
screamer 18:a15bfe7aaebd 516 return 0;
screamer 18:a15bfe7aaebd 517 }
screamer 18:a15bfe7aaebd 518
screamer 18:a15bfe7aaebd 519 /**
screamer 18:a15bfe7aaebd 520 * @brief Read LSM6DSL Gyroscope output data rate
screamer 18:a15bfe7aaebd 521 * @param odr the pointer to the output data rate
screamer 18:a15bfe7aaebd 522 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 523 */
screamer 18:a15bfe7aaebd 524 int LSM6DSLSensor::get_g_odr(float* odr)
screamer 18:a15bfe7aaebd 525 {
screamer 18:a15bfe7aaebd 526 LSM6DSL_ACC_GYRO_ODR_G_t odr_low_level;
screamer 18:a15bfe7aaebd 527
screamer 18:a15bfe7aaebd 528 if ( LSM6DSL_ACC_GYRO_R_ODR_G( (void *)this, &odr_low_level ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 529 {
screamer 18:a15bfe7aaebd 530 return 1;
screamer 18:a15bfe7aaebd 531 }
screamer 18:a15bfe7aaebd 532
screamer 18:a15bfe7aaebd 533 switch( odr_low_level )
screamer 18:a15bfe7aaebd 534 {
screamer 18:a15bfe7aaebd 535 case LSM6DSL_ACC_GYRO_ODR_G_POWER_DOWN:
screamer 18:a15bfe7aaebd 536 *odr = 0.0f;
screamer 18:a15bfe7aaebd 537 break;
screamer 18:a15bfe7aaebd 538 case LSM6DSL_ACC_GYRO_ODR_G_13Hz:
screamer 18:a15bfe7aaebd 539 *odr = 13.0f;
screamer 18:a15bfe7aaebd 540 break;
screamer 18:a15bfe7aaebd 541 case LSM6DSL_ACC_GYRO_ODR_G_26Hz:
screamer 18:a15bfe7aaebd 542 *odr = 26.0f;
screamer 18:a15bfe7aaebd 543 break;
screamer 18:a15bfe7aaebd 544 case LSM6DSL_ACC_GYRO_ODR_G_52Hz:
screamer 18:a15bfe7aaebd 545 *odr = 52.0f;
screamer 18:a15bfe7aaebd 546 break;
screamer 18:a15bfe7aaebd 547 case LSM6DSL_ACC_GYRO_ODR_G_104Hz:
screamer 18:a15bfe7aaebd 548 *odr = 104.0f;
screamer 18:a15bfe7aaebd 549 break;
screamer 18:a15bfe7aaebd 550 case LSM6DSL_ACC_GYRO_ODR_G_208Hz:
screamer 18:a15bfe7aaebd 551 *odr = 208.0f;
screamer 18:a15bfe7aaebd 552 break;
screamer 18:a15bfe7aaebd 553 case LSM6DSL_ACC_GYRO_ODR_G_416Hz:
screamer 18:a15bfe7aaebd 554 *odr = 416.0f;
screamer 18:a15bfe7aaebd 555 break;
screamer 18:a15bfe7aaebd 556 case LSM6DSL_ACC_GYRO_ODR_G_833Hz:
screamer 18:a15bfe7aaebd 557 *odr = 833.0f;
screamer 18:a15bfe7aaebd 558 break;
screamer 18:a15bfe7aaebd 559 case LSM6DSL_ACC_GYRO_ODR_G_1660Hz:
screamer 18:a15bfe7aaebd 560 *odr = 1660.0f;
screamer 18:a15bfe7aaebd 561 break;
screamer 18:a15bfe7aaebd 562 case LSM6DSL_ACC_GYRO_ODR_G_3330Hz:
screamer 18:a15bfe7aaebd 563 *odr = 3330.0f;
screamer 18:a15bfe7aaebd 564 break;
screamer 18:a15bfe7aaebd 565 case LSM6DSL_ACC_GYRO_ODR_G_6660Hz:
screamer 18:a15bfe7aaebd 566 *odr = 6660.0f;
screamer 18:a15bfe7aaebd 567 break;
screamer 18:a15bfe7aaebd 568 default:
screamer 18:a15bfe7aaebd 569 *odr = -1.0f;
screamer 18:a15bfe7aaebd 570 return 1;
screamer 18:a15bfe7aaebd 571 }
screamer 18:a15bfe7aaebd 572
screamer 18:a15bfe7aaebd 573 return 0;
screamer 18:a15bfe7aaebd 574 }
screamer 18:a15bfe7aaebd 575
screamer 18:a15bfe7aaebd 576 /**
screamer 18:a15bfe7aaebd 577 * @brief Set LSM6DSL Accelerometer output data rate
screamer 18:a15bfe7aaebd 578 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 579 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 580 */
screamer 18:a15bfe7aaebd 581 int LSM6DSLSensor::set_x_odr(float odr)
screamer 18:a15bfe7aaebd 582 {
screamer 18:a15bfe7aaebd 583 if(_x_is_enabled == 1)
screamer 18:a15bfe7aaebd 584 {
screamer 18:a15bfe7aaebd 585 if(set_x_odr_when_enabled(odr) == 1)
screamer 18:a15bfe7aaebd 586 {
screamer 18:a15bfe7aaebd 587 return 1;
screamer 18:a15bfe7aaebd 588 }
screamer 18:a15bfe7aaebd 589 }
screamer 18:a15bfe7aaebd 590 else
screamer 18:a15bfe7aaebd 591 {
screamer 18:a15bfe7aaebd 592 if(set_x_odr_when_disabled(odr) == 1)
screamer 18:a15bfe7aaebd 593 {
screamer 18:a15bfe7aaebd 594 return 1;
screamer 18:a15bfe7aaebd 595 }
screamer 18:a15bfe7aaebd 596 }
screamer 18:a15bfe7aaebd 597
screamer 18:a15bfe7aaebd 598 return 0;
screamer 18:a15bfe7aaebd 599 }
screamer 18:a15bfe7aaebd 600
screamer 18:a15bfe7aaebd 601 /**
screamer 18:a15bfe7aaebd 602 * @brief Set LSM6DSL Accelerometer output data rate when enabled
screamer 18:a15bfe7aaebd 603 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 604 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 605 */
screamer 18:a15bfe7aaebd 606 int LSM6DSLSensor::set_x_odr_when_enabled(float odr)
screamer 18:a15bfe7aaebd 607 {
screamer 18:a15bfe7aaebd 608 LSM6DSL_ACC_GYRO_ODR_XL_t new_odr;
screamer 18:a15bfe7aaebd 609
screamer 18:a15bfe7aaebd 610 new_odr = ( odr <= 13.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_13Hz
screamer 18:a15bfe7aaebd 611 : ( odr <= 26.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_26Hz
screamer 18:a15bfe7aaebd 612 : ( odr <= 52.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_52Hz
screamer 18:a15bfe7aaebd 613 : ( odr <= 104.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_104Hz
screamer 18:a15bfe7aaebd 614 : ( odr <= 208.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_208Hz
screamer 18:a15bfe7aaebd 615 : ( odr <= 416.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_416Hz
screamer 18:a15bfe7aaebd 616 : ( odr <= 833.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_833Hz
screamer 18:a15bfe7aaebd 617 : ( odr <= 1660.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_1660Hz
screamer 18:a15bfe7aaebd 618 : ( odr <= 3330.0f ) ? LSM6DSL_ACC_GYRO_ODR_XL_3330Hz
screamer 18:a15bfe7aaebd 619 : LSM6DSL_ACC_GYRO_ODR_XL_6660Hz;
screamer 18:a15bfe7aaebd 620
screamer 18:a15bfe7aaebd 621 if ( LSM6DSL_ACC_GYRO_W_ODR_XL( (void *)this, new_odr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 622 {
screamer 18:a15bfe7aaebd 623 return 1;
screamer 18:a15bfe7aaebd 624 }
screamer 18:a15bfe7aaebd 625
screamer 18:a15bfe7aaebd 626 return 0;
screamer 18:a15bfe7aaebd 627 }
screamer 18:a15bfe7aaebd 628
screamer 18:a15bfe7aaebd 629 /**
screamer 18:a15bfe7aaebd 630 * @brief Set LSM6DSL Accelerometer output data rate when disabled
screamer 18:a15bfe7aaebd 631 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 632 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 633 */
screamer 18:a15bfe7aaebd 634 int LSM6DSLSensor::set_x_odr_when_disabled(float odr)
screamer 18:a15bfe7aaebd 635 {
screamer 18:a15bfe7aaebd 636 _x_last_odr = ( odr <= 13.0f ) ? 13.0f
screamer 18:a15bfe7aaebd 637 : ( odr <= 26.0f ) ? 26.0f
screamer 18:a15bfe7aaebd 638 : ( odr <= 52.0f ) ? 52.0f
screamer 18:a15bfe7aaebd 639 : ( odr <= 104.0f ) ? 104.0f
screamer 18:a15bfe7aaebd 640 : ( odr <= 208.0f ) ? 208.0f
screamer 18:a15bfe7aaebd 641 : ( odr <= 416.0f ) ? 416.0f
screamer 18:a15bfe7aaebd 642 : ( odr <= 833.0f ) ? 833.0f
screamer 18:a15bfe7aaebd 643 : ( odr <= 1660.0f ) ? 1660.0f
screamer 18:a15bfe7aaebd 644 : ( odr <= 3330.0f ) ? 3330.0f
screamer 18:a15bfe7aaebd 645 : 6660.0f;
screamer 18:a15bfe7aaebd 646
screamer 18:a15bfe7aaebd 647 return 0;
screamer 18:a15bfe7aaebd 648 }
screamer 18:a15bfe7aaebd 649
screamer 18:a15bfe7aaebd 650 /**
screamer 18:a15bfe7aaebd 651 * @brief Set LSM6DSL Gyroscope output data rate
screamer 18:a15bfe7aaebd 652 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 653 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 654 */
screamer 18:a15bfe7aaebd 655 int LSM6DSLSensor::set_g_odr(float odr)
screamer 18:a15bfe7aaebd 656 {
screamer 18:a15bfe7aaebd 657 if(_g_is_enabled == 1)
screamer 18:a15bfe7aaebd 658 {
screamer 18:a15bfe7aaebd 659 if(set_g_odr_when_enabled(odr) == 1)
screamer 18:a15bfe7aaebd 660 {
screamer 18:a15bfe7aaebd 661 return 1;
screamer 18:a15bfe7aaebd 662 }
screamer 18:a15bfe7aaebd 663 }
screamer 18:a15bfe7aaebd 664 else
screamer 18:a15bfe7aaebd 665 {
screamer 18:a15bfe7aaebd 666 if(set_g_odr_when_disabled(odr) == 1)
screamer 18:a15bfe7aaebd 667 {
screamer 18:a15bfe7aaebd 668 return 1;
screamer 18:a15bfe7aaebd 669 }
screamer 18:a15bfe7aaebd 670 }
screamer 18:a15bfe7aaebd 671
screamer 18:a15bfe7aaebd 672 return 0;
screamer 18:a15bfe7aaebd 673 }
screamer 18:a15bfe7aaebd 674
screamer 18:a15bfe7aaebd 675 /**
screamer 18:a15bfe7aaebd 676 * @brief Set LSM6DSL Gyroscope output data rate when enabled
screamer 18:a15bfe7aaebd 677 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 678 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 679 */
screamer 18:a15bfe7aaebd 680 int LSM6DSLSensor::set_g_odr_when_enabled(float odr)
screamer 18:a15bfe7aaebd 681 {
screamer 18:a15bfe7aaebd 682 LSM6DSL_ACC_GYRO_ODR_G_t new_odr;
screamer 18:a15bfe7aaebd 683
screamer 18:a15bfe7aaebd 684 new_odr = ( odr <= 13.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_13Hz
screamer 18:a15bfe7aaebd 685 : ( odr <= 26.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_26Hz
screamer 18:a15bfe7aaebd 686 : ( odr <= 52.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_52Hz
screamer 18:a15bfe7aaebd 687 : ( odr <= 104.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_104Hz
screamer 18:a15bfe7aaebd 688 : ( odr <= 208.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_208Hz
screamer 18:a15bfe7aaebd 689 : ( odr <= 416.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_416Hz
screamer 18:a15bfe7aaebd 690 : ( odr <= 833.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_833Hz
screamer 18:a15bfe7aaebd 691 : ( odr <= 1660.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_1660Hz
screamer 18:a15bfe7aaebd 692 : ( odr <= 3330.0f ) ? LSM6DSL_ACC_GYRO_ODR_G_3330Hz
screamer 18:a15bfe7aaebd 693 : LSM6DSL_ACC_GYRO_ODR_G_6660Hz;
screamer 18:a15bfe7aaebd 694
screamer 18:a15bfe7aaebd 695 if ( LSM6DSL_ACC_GYRO_W_ODR_G( (void *)this, new_odr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 696 {
screamer 18:a15bfe7aaebd 697 return 1;
screamer 18:a15bfe7aaebd 698 }
screamer 18:a15bfe7aaebd 699
screamer 18:a15bfe7aaebd 700 return 0;
screamer 18:a15bfe7aaebd 701 }
screamer 18:a15bfe7aaebd 702
screamer 18:a15bfe7aaebd 703 /**
screamer 18:a15bfe7aaebd 704 * @brief Set LSM6DSL Gyroscope output data rate when disabled
screamer 18:a15bfe7aaebd 705 * @param odr the output data rate to be set
screamer 18:a15bfe7aaebd 706 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 707 */
screamer 18:a15bfe7aaebd 708 int LSM6DSLSensor::set_g_odr_when_disabled(float odr)
screamer 18:a15bfe7aaebd 709 {
screamer 18:a15bfe7aaebd 710 _g_last_odr = ( odr <= 13.0f ) ? 13.0f
screamer 18:a15bfe7aaebd 711 : ( odr <= 26.0f ) ? 26.0f
screamer 18:a15bfe7aaebd 712 : ( odr <= 52.0f ) ? 52.0f
screamer 18:a15bfe7aaebd 713 : ( odr <= 104.0f ) ? 104.0f
screamer 18:a15bfe7aaebd 714 : ( odr <= 208.0f ) ? 208.0f
screamer 18:a15bfe7aaebd 715 : ( odr <= 416.0f ) ? 416.0f
screamer 18:a15bfe7aaebd 716 : ( odr <= 833.0f ) ? 833.0f
screamer 18:a15bfe7aaebd 717 : ( odr <= 1660.0f ) ? 1660.0f
screamer 18:a15bfe7aaebd 718 : ( odr <= 3330.0f ) ? 3330.0f
screamer 18:a15bfe7aaebd 719 : 6660.0f;
screamer 18:a15bfe7aaebd 720
screamer 18:a15bfe7aaebd 721 return 0;
screamer 18:a15bfe7aaebd 722 }
screamer 18:a15bfe7aaebd 723
screamer 18:a15bfe7aaebd 724 /**
screamer 18:a15bfe7aaebd 725 * @brief Read LSM6DSL Accelerometer full scale
screamer 18:a15bfe7aaebd 726 * @param fullScale the pointer to the full scale
screamer 18:a15bfe7aaebd 727 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 728 */
screamer 18:a15bfe7aaebd 729 int LSM6DSLSensor::get_x_fs(float* fullScale)
screamer 18:a15bfe7aaebd 730 {
screamer 18:a15bfe7aaebd 731 LSM6DSL_ACC_GYRO_FS_XL_t fs_low_level;
screamer 18:a15bfe7aaebd 732
screamer 18:a15bfe7aaebd 733 if ( LSM6DSL_ACC_GYRO_R_FS_XL( (void *)this, &fs_low_level ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 734 {
screamer 18:a15bfe7aaebd 735 return 1;
screamer 18:a15bfe7aaebd 736 }
screamer 18:a15bfe7aaebd 737
screamer 18:a15bfe7aaebd 738 switch( fs_low_level )
screamer 18:a15bfe7aaebd 739 {
screamer 18:a15bfe7aaebd 740 case LSM6DSL_ACC_GYRO_FS_XL_2g:
screamer 18:a15bfe7aaebd 741 *fullScale = 2.0f;
screamer 18:a15bfe7aaebd 742 break;
screamer 18:a15bfe7aaebd 743 case LSM6DSL_ACC_GYRO_FS_XL_4g:
screamer 18:a15bfe7aaebd 744 *fullScale = 4.0f;
screamer 18:a15bfe7aaebd 745 break;
screamer 18:a15bfe7aaebd 746 case LSM6DSL_ACC_GYRO_FS_XL_8g:
screamer 18:a15bfe7aaebd 747 *fullScale = 8.0f;
screamer 18:a15bfe7aaebd 748 break;
screamer 18:a15bfe7aaebd 749 case LSM6DSL_ACC_GYRO_FS_XL_16g:
screamer 18:a15bfe7aaebd 750 *fullScale = 16.0f;
screamer 18:a15bfe7aaebd 751 break;
screamer 18:a15bfe7aaebd 752 default:
screamer 18:a15bfe7aaebd 753 *fullScale = -1.0f;
screamer 18:a15bfe7aaebd 754 return 1;
screamer 18:a15bfe7aaebd 755 }
screamer 18:a15bfe7aaebd 756
screamer 18:a15bfe7aaebd 757 return 0;
screamer 18:a15bfe7aaebd 758 }
screamer 18:a15bfe7aaebd 759
screamer 18:a15bfe7aaebd 760 /**
screamer 18:a15bfe7aaebd 761 * @brief Read LSM6DSL Gyroscope full scale
screamer 18:a15bfe7aaebd 762 * @param fullScale the pointer to the full scale
screamer 18:a15bfe7aaebd 763 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 764 */
screamer 18:a15bfe7aaebd 765 int LSM6DSLSensor::get_g_fs(float* fullScale)
screamer 18:a15bfe7aaebd 766 {
screamer 18:a15bfe7aaebd 767 LSM6DSL_ACC_GYRO_FS_G_t fs_low_level;
screamer 18:a15bfe7aaebd 768 LSM6DSL_ACC_GYRO_FS_125_t fs_125;
screamer 18:a15bfe7aaebd 769
screamer 18:a15bfe7aaebd 770 if ( LSM6DSL_ACC_GYRO_R_FS_125( (void *)this, &fs_125 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 771 {
screamer 18:a15bfe7aaebd 772 return 1;
screamer 18:a15bfe7aaebd 773 }
screamer 18:a15bfe7aaebd 774 if ( LSM6DSL_ACC_GYRO_R_FS_G( (void *)this, &fs_low_level ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 775 {
screamer 18:a15bfe7aaebd 776 return 1;
screamer 18:a15bfe7aaebd 777 }
screamer 18:a15bfe7aaebd 778
screamer 18:a15bfe7aaebd 779 if ( fs_125 == LSM6DSL_ACC_GYRO_FS_125_ENABLED )
screamer 18:a15bfe7aaebd 780 {
screamer 18:a15bfe7aaebd 781 *fullScale = 125.0f;
screamer 18:a15bfe7aaebd 782 }
screamer 18:a15bfe7aaebd 783
screamer 18:a15bfe7aaebd 784 else
screamer 18:a15bfe7aaebd 785 {
screamer 18:a15bfe7aaebd 786 switch( fs_low_level )
screamer 18:a15bfe7aaebd 787 {
screamer 18:a15bfe7aaebd 788 case LSM6DSL_ACC_GYRO_FS_G_245dps:
screamer 18:a15bfe7aaebd 789 *fullScale = 245.0f;
screamer 18:a15bfe7aaebd 790 break;
screamer 18:a15bfe7aaebd 791 case LSM6DSL_ACC_GYRO_FS_G_500dps:
screamer 18:a15bfe7aaebd 792 *fullScale = 500.0f;
screamer 18:a15bfe7aaebd 793 break;
screamer 18:a15bfe7aaebd 794 case LSM6DSL_ACC_GYRO_FS_G_1000dps:
screamer 18:a15bfe7aaebd 795 *fullScale = 1000.0f;
screamer 18:a15bfe7aaebd 796 break;
screamer 18:a15bfe7aaebd 797 case LSM6DSL_ACC_GYRO_FS_G_2000dps:
screamer 18:a15bfe7aaebd 798 *fullScale = 2000.0f;
screamer 18:a15bfe7aaebd 799 break;
screamer 18:a15bfe7aaebd 800 default:
screamer 18:a15bfe7aaebd 801 *fullScale = -1.0f;
screamer 18:a15bfe7aaebd 802 return 1;
screamer 18:a15bfe7aaebd 803 }
screamer 18:a15bfe7aaebd 804 }
screamer 18:a15bfe7aaebd 805
screamer 18:a15bfe7aaebd 806 return 0;
screamer 18:a15bfe7aaebd 807 }
screamer 18:a15bfe7aaebd 808
screamer 18:a15bfe7aaebd 809 /**
screamer 18:a15bfe7aaebd 810 * @brief Set LSM6DSL Accelerometer full scale
screamer 18:a15bfe7aaebd 811 * @param fullScale the full scale to be set
screamer 18:a15bfe7aaebd 812 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 813 */
screamer 18:a15bfe7aaebd 814 int LSM6DSLSensor::set_x_fs(float fullScale)
screamer 18:a15bfe7aaebd 815 {
screamer 18:a15bfe7aaebd 816 LSM6DSL_ACC_GYRO_FS_XL_t new_fs;
screamer 18:a15bfe7aaebd 817
screamer 18:a15bfe7aaebd 818 new_fs = ( fullScale <= 2.0f ) ? LSM6DSL_ACC_GYRO_FS_XL_2g
screamer 18:a15bfe7aaebd 819 : ( fullScale <= 4.0f ) ? LSM6DSL_ACC_GYRO_FS_XL_4g
screamer 18:a15bfe7aaebd 820 : ( fullScale <= 8.0f ) ? LSM6DSL_ACC_GYRO_FS_XL_8g
screamer 18:a15bfe7aaebd 821 : LSM6DSL_ACC_GYRO_FS_XL_16g;
screamer 18:a15bfe7aaebd 822
screamer 18:a15bfe7aaebd 823 if ( LSM6DSL_ACC_GYRO_W_FS_XL( (void *)this, new_fs ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 824 {
screamer 18:a15bfe7aaebd 825 return 1;
screamer 18:a15bfe7aaebd 826 }
screamer 18:a15bfe7aaebd 827
screamer 18:a15bfe7aaebd 828 return 0;
screamer 18:a15bfe7aaebd 829 }
screamer 18:a15bfe7aaebd 830
screamer 18:a15bfe7aaebd 831 /**
screamer 18:a15bfe7aaebd 832 * @brief Set LSM6DSL Gyroscope full scale
screamer 18:a15bfe7aaebd 833 * @param fullScale the full scale to be set
screamer 18:a15bfe7aaebd 834 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 835 */
screamer 18:a15bfe7aaebd 836 int LSM6DSLSensor::set_g_fs(float fullScale)
screamer 18:a15bfe7aaebd 837 {
screamer 18:a15bfe7aaebd 838 LSM6DSL_ACC_GYRO_FS_G_t new_fs;
screamer 18:a15bfe7aaebd 839
screamer 18:a15bfe7aaebd 840 if ( fullScale <= 125.0f )
screamer 18:a15bfe7aaebd 841 {
screamer 18:a15bfe7aaebd 842 if ( LSM6DSL_ACC_GYRO_W_FS_125( (void *)this, LSM6DSL_ACC_GYRO_FS_125_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 843 {
screamer 18:a15bfe7aaebd 844 return 1;
screamer 18:a15bfe7aaebd 845 }
screamer 18:a15bfe7aaebd 846 }
screamer 18:a15bfe7aaebd 847 else
screamer 18:a15bfe7aaebd 848 {
screamer 18:a15bfe7aaebd 849 new_fs = ( fullScale <= 245.0f ) ? LSM6DSL_ACC_GYRO_FS_G_245dps
screamer 18:a15bfe7aaebd 850 : ( fullScale <= 500.0f ) ? LSM6DSL_ACC_GYRO_FS_G_500dps
screamer 18:a15bfe7aaebd 851 : ( fullScale <= 1000.0f ) ? LSM6DSL_ACC_GYRO_FS_G_1000dps
screamer 18:a15bfe7aaebd 852 : LSM6DSL_ACC_GYRO_FS_G_2000dps;
screamer 18:a15bfe7aaebd 853
screamer 18:a15bfe7aaebd 854 if ( LSM6DSL_ACC_GYRO_W_FS_125( (void *)this, LSM6DSL_ACC_GYRO_FS_125_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 855 {
screamer 18:a15bfe7aaebd 856 return 1;
screamer 18:a15bfe7aaebd 857 }
screamer 18:a15bfe7aaebd 858 if ( LSM6DSL_ACC_GYRO_W_FS_G( (void *)this, new_fs ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 859 {
screamer 18:a15bfe7aaebd 860 return 1;
screamer 18:a15bfe7aaebd 861 }
screamer 18:a15bfe7aaebd 862 }
screamer 18:a15bfe7aaebd 863
screamer 18:a15bfe7aaebd 864 return 0;
screamer 18:a15bfe7aaebd 865 }
screamer 18:a15bfe7aaebd 866
screamer 18:a15bfe7aaebd 867 /**
screamer 18:a15bfe7aaebd 868 * @brief Enable free fall detection
screamer 18:a15bfe7aaebd 869 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 870 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 871 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 872 */
screamer 18:a15bfe7aaebd 873 int LSM6DSLSensor::enable_free_fall_detection(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 874 {
screamer 18:a15bfe7aaebd 875 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 876 if(set_x_odr(416.0f) == 1)
screamer 18:a15bfe7aaebd 877 {
screamer 18:a15bfe7aaebd 878 return 1;
screamer 18:a15bfe7aaebd 879 }
screamer 18:a15bfe7aaebd 880
screamer 18:a15bfe7aaebd 881 /* Full scale selection */
screamer 18:a15bfe7aaebd 882 if ( LSM6DSL_ACC_GYRO_W_FS_XL( (void *)this, LSM6DSL_ACC_GYRO_FS_XL_2g ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 883 {
screamer 18:a15bfe7aaebd 884 return 1;
screamer 18:a15bfe7aaebd 885 }
screamer 18:a15bfe7aaebd 886
screamer 18:a15bfe7aaebd 887 /* FF_DUR setting */
screamer 18:a15bfe7aaebd 888 if ( LSM6DSL_ACC_GYRO_W_FF_Duration( (void *)this, 0x06 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 889 {
screamer 18:a15bfe7aaebd 890 return 1;
screamer 18:a15bfe7aaebd 891 }
screamer 18:a15bfe7aaebd 892
screamer 18:a15bfe7aaebd 893 /* WAKE_DUR setting */
screamer 18:a15bfe7aaebd 894 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 895 {
screamer 18:a15bfe7aaebd 896 return 1;
screamer 18:a15bfe7aaebd 897 }
screamer 18:a15bfe7aaebd 898
screamer 18:a15bfe7aaebd 899 /* TIMER_HR setting */
screamer 18:a15bfe7aaebd 900 if ( LSM6DSL_ACC_GYRO_W_TIMER_HR( (void *)this, LSM6DSL_ACC_GYRO_TIMER_HR_6_4ms ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 901 {
screamer 18:a15bfe7aaebd 902 return 1;
screamer 18:a15bfe7aaebd 903 }
screamer 18:a15bfe7aaebd 904
screamer 18:a15bfe7aaebd 905 /* SLEEP_DUR setting */
screamer 18:a15bfe7aaebd 906 if ( LSM6DSL_ACC_GYRO_W_SLEEP_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 907 {
screamer 18:a15bfe7aaebd 908 return 1;
screamer 18:a15bfe7aaebd 909 }
screamer 18:a15bfe7aaebd 910
screamer 18:a15bfe7aaebd 911 /* FF_THS setting */
screamer 18:a15bfe7aaebd 912 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, LSM6DSL_ACC_GYRO_FF_THS_312mg ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 913 {
screamer 18:a15bfe7aaebd 914 return 1;
screamer 18:a15bfe7aaebd 915 }
screamer 18:a15bfe7aaebd 916
screamer 18:a15bfe7aaebd 917 /* Enable basic Interrupts */
screamer 18:a15bfe7aaebd 918 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 919 {
screamer 18:a15bfe7aaebd 920 return 1;
screamer 18:a15bfe7aaebd 921 }
screamer 18:a15bfe7aaebd 922
screamer 18:a15bfe7aaebd 923 /* Enable free fall event on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 924 switch (pin)
screamer 18:a15bfe7aaebd 925 {
screamer 18:a15bfe7aaebd 926 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 927 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_FF_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 928 {
screamer 18:a15bfe7aaebd 929 return 1;
screamer 18:a15bfe7aaebd 930 }
screamer 18:a15bfe7aaebd 931 break;
screamer 18:a15bfe7aaebd 932
screamer 18:a15bfe7aaebd 933 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 934 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_FF_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 935 {
screamer 18:a15bfe7aaebd 936 return 1;
screamer 18:a15bfe7aaebd 937 }
screamer 18:a15bfe7aaebd 938 break;
screamer 18:a15bfe7aaebd 939
screamer 18:a15bfe7aaebd 940 default:
screamer 18:a15bfe7aaebd 941 return 1;
screamer 18:a15bfe7aaebd 942 }
screamer 18:a15bfe7aaebd 943
screamer 18:a15bfe7aaebd 944 return 0;
screamer 18:a15bfe7aaebd 945 }
screamer 18:a15bfe7aaebd 946
screamer 18:a15bfe7aaebd 947 /**
screamer 18:a15bfe7aaebd 948 * @brief Disable free fall detection
screamer 18:a15bfe7aaebd 949 * @param None
screamer 18:a15bfe7aaebd 950 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 951 */
screamer 18:a15bfe7aaebd 952 int LSM6DSLSensor::disable_free_fall_detection(void)
screamer 18:a15bfe7aaebd 953 {
screamer 18:a15bfe7aaebd 954 /* Disable free fall event on INT1 pin */
screamer 18:a15bfe7aaebd 955 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_FF_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 956 {
screamer 18:a15bfe7aaebd 957 return 1;
screamer 18:a15bfe7aaebd 958 }
screamer 18:a15bfe7aaebd 959
screamer 18:a15bfe7aaebd 960 /* Disable free fall event on INT2 pin */
screamer 18:a15bfe7aaebd 961 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_FF_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 962 {
screamer 18:a15bfe7aaebd 963 return 1;
screamer 18:a15bfe7aaebd 964 }
screamer 18:a15bfe7aaebd 965
screamer 18:a15bfe7aaebd 966 /* Disable basic Interrupts */
screamer 18:a15bfe7aaebd 967 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 968 {
screamer 18:a15bfe7aaebd 969 return 1;
screamer 18:a15bfe7aaebd 970 }
screamer 18:a15bfe7aaebd 971
screamer 18:a15bfe7aaebd 972 /* FF_DUR setting */
screamer 18:a15bfe7aaebd 973 if ( LSM6DSL_ACC_GYRO_W_FF_Duration( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 974 {
screamer 18:a15bfe7aaebd 975 return 1;
screamer 18:a15bfe7aaebd 976 }
screamer 18:a15bfe7aaebd 977
screamer 18:a15bfe7aaebd 978 /* FF_THS setting */
screamer 18:a15bfe7aaebd 979 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, LSM6DSL_ACC_GYRO_FF_THS_156mg ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 980 {
screamer 18:a15bfe7aaebd 981 return 1;
screamer 18:a15bfe7aaebd 982 }
screamer 18:a15bfe7aaebd 983
screamer 18:a15bfe7aaebd 984 return 0;
screamer 18:a15bfe7aaebd 985 }
screamer 18:a15bfe7aaebd 986
screamer 18:a15bfe7aaebd 987 /**
screamer 18:a15bfe7aaebd 988 * @brief Set the free fall detection threshold for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 989 * @param thr the threshold to be set
screamer 18:a15bfe7aaebd 990 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 991 */
screamer 18:a15bfe7aaebd 992 int LSM6DSLSensor::set_free_fall_threshold(uint8_t thr)
screamer 18:a15bfe7aaebd 993 {
screamer 18:a15bfe7aaebd 994
screamer 18:a15bfe7aaebd 995 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, (LSM6DSL_ACC_GYRO_FF_THS_t)thr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 996 {
screamer 18:a15bfe7aaebd 997 return 1;
screamer 18:a15bfe7aaebd 998 }
screamer 18:a15bfe7aaebd 999
screamer 18:a15bfe7aaebd 1000 return 0;
screamer 18:a15bfe7aaebd 1001 }
screamer 18:a15bfe7aaebd 1002
screamer 18:a15bfe7aaebd 1003 /**
screamer 18:a15bfe7aaebd 1004 * @brief Enable the pedometer feature for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1005 * @note This function sets the LSM6DSL accelerometer ODR to 26Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1006 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1007 */
screamer 18:a15bfe7aaebd 1008 int LSM6DSLSensor::enable_pedometer(void)
screamer 18:a15bfe7aaebd 1009 {
screamer 18:a15bfe7aaebd 1010 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1011 if( set_x_odr(26.0f) == 1 )
screamer 18:a15bfe7aaebd 1012 {
screamer 18:a15bfe7aaebd 1013 return 1;
screamer 18:a15bfe7aaebd 1014 }
screamer 18:a15bfe7aaebd 1015
screamer 18:a15bfe7aaebd 1016 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1017 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1018 {
screamer 18:a15bfe7aaebd 1019 return 1;
screamer 18:a15bfe7aaebd 1020 }
screamer 18:a15bfe7aaebd 1021
screamer 18:a15bfe7aaebd 1022 /* Set pedometer threshold. */
screamer 18:a15bfe7aaebd 1023 if ( set_pedometer_threshold(LSM6DSL_PEDOMETER_THRESHOLD_MID_HIGH) == 1 )
screamer 18:a15bfe7aaebd 1024 {
screamer 18:a15bfe7aaebd 1025 return 1;
screamer 18:a15bfe7aaebd 1026 }
screamer 18:a15bfe7aaebd 1027
screamer 18:a15bfe7aaebd 1028 /* Enable embedded functionalities. */
screamer 18:a15bfe7aaebd 1029 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1030 {
screamer 18:a15bfe7aaebd 1031 return 1;
screamer 18:a15bfe7aaebd 1032 }
screamer 18:a15bfe7aaebd 1033
screamer 18:a15bfe7aaebd 1034 /* Enable pedometer algorithm. */
screamer 18:a15bfe7aaebd 1035 if ( LSM6DSL_ACC_GYRO_W_PEDO( (void *)this, LSM6DSL_ACC_GYRO_PEDO_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1036 {
screamer 18:a15bfe7aaebd 1037 return 1;
screamer 18:a15bfe7aaebd 1038 }
screamer 18:a15bfe7aaebd 1039
screamer 18:a15bfe7aaebd 1040 /* Enable pedometer on INT1. */
screamer 18:a15bfe7aaebd 1041 if ( LSM6DSL_ACC_GYRO_W_STEP_DET_on_INT1( (void *)this, LSM6DSL_ACC_GYRO_INT1_PEDO_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1042 {
screamer 18:a15bfe7aaebd 1043 return 1;
screamer 18:a15bfe7aaebd 1044 }
screamer 18:a15bfe7aaebd 1045
screamer 18:a15bfe7aaebd 1046 return 0;
screamer 18:a15bfe7aaebd 1047 }
screamer 18:a15bfe7aaebd 1048
screamer 18:a15bfe7aaebd 1049 /**
screamer 18:a15bfe7aaebd 1050 * @brief Disable the pedometer feature for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1051 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1052 */
screamer 18:a15bfe7aaebd 1053 int LSM6DSLSensor::disable_pedometer(void)
screamer 18:a15bfe7aaebd 1054 {
screamer 18:a15bfe7aaebd 1055 /* Disable pedometer on INT1. */
screamer 18:a15bfe7aaebd 1056 if ( LSM6DSL_ACC_GYRO_W_STEP_DET_on_INT1( (void *)this, LSM6DSL_ACC_GYRO_INT1_PEDO_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1057 {
screamer 18:a15bfe7aaebd 1058 return 1;
screamer 18:a15bfe7aaebd 1059 }
screamer 18:a15bfe7aaebd 1060
screamer 18:a15bfe7aaebd 1061 /* Disable pedometer algorithm. */
screamer 18:a15bfe7aaebd 1062 if ( LSM6DSL_ACC_GYRO_W_PEDO( (void *)this, LSM6DSL_ACC_GYRO_PEDO_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1063 {
screamer 18:a15bfe7aaebd 1064 return 1;
screamer 18:a15bfe7aaebd 1065 }
screamer 18:a15bfe7aaebd 1066
screamer 18:a15bfe7aaebd 1067 /* Disable embedded functionalities. */
screamer 18:a15bfe7aaebd 1068 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1069 {
screamer 18:a15bfe7aaebd 1070 return 1;
screamer 18:a15bfe7aaebd 1071 }
screamer 18:a15bfe7aaebd 1072
screamer 18:a15bfe7aaebd 1073 /* Reset pedometer threshold. */
screamer 18:a15bfe7aaebd 1074 if ( set_pedometer_threshold(0x0) == 1 )
screamer 18:a15bfe7aaebd 1075 {
screamer 18:a15bfe7aaebd 1076 return 1;
screamer 18:a15bfe7aaebd 1077 }
screamer 18:a15bfe7aaebd 1078
screamer 18:a15bfe7aaebd 1079 return 0;
screamer 18:a15bfe7aaebd 1080 }
screamer 18:a15bfe7aaebd 1081
screamer 18:a15bfe7aaebd 1082 /**
screamer 18:a15bfe7aaebd 1083 * @brief Get the step counter for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1084 * @param step_count the pointer to the step counter
screamer 18:a15bfe7aaebd 1085 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1086 */
screamer 18:a15bfe7aaebd 1087 int LSM6DSLSensor::get_step_counter(uint16_t *step_count)
screamer 18:a15bfe7aaebd 1088 {
screamer 18:a15bfe7aaebd 1089 if ( LSM6DSL_ACC_GYRO_Get_GetStepCounter( (void *)this, ( uint8_t* )step_count ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1090 {
screamer 18:a15bfe7aaebd 1091 return 1;
screamer 18:a15bfe7aaebd 1092 }
screamer 18:a15bfe7aaebd 1093
screamer 18:a15bfe7aaebd 1094 return 0;
screamer 18:a15bfe7aaebd 1095 }
screamer 18:a15bfe7aaebd 1096
screamer 18:a15bfe7aaebd 1097 /**
screamer 18:a15bfe7aaebd 1098 * @brief Reset of the step counter for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1099 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1100 */
screamer 18:a15bfe7aaebd 1101 int LSM6DSLSensor::reset_step_counter(void)
screamer 18:a15bfe7aaebd 1102 {
screamer 18:a15bfe7aaebd 1103 if ( LSM6DSL_ACC_GYRO_W_PedoStepReset( (void *)this, LSM6DSL_ACC_GYRO_PEDO_RST_STEP_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1104 {
screamer 18:a15bfe7aaebd 1105 return 1;
screamer 18:a15bfe7aaebd 1106 }
screamer 18:a15bfe7aaebd 1107
screamer 18:a15bfe7aaebd 1108 wait_ms(10);
screamer 18:a15bfe7aaebd 1109
screamer 18:a15bfe7aaebd 1110 if ( LSM6DSL_ACC_GYRO_W_PedoStepReset( (void *)this, LSM6DSL_ACC_GYRO_PEDO_RST_STEP_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1111 {
screamer 18:a15bfe7aaebd 1112 return 1;
screamer 18:a15bfe7aaebd 1113 }
screamer 18:a15bfe7aaebd 1114
screamer 18:a15bfe7aaebd 1115 return 0;
screamer 18:a15bfe7aaebd 1116 }
screamer 18:a15bfe7aaebd 1117
screamer 18:a15bfe7aaebd 1118 /**
screamer 18:a15bfe7aaebd 1119 * @brief Set the pedometer threshold for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1120 * @param thr the threshold to be set
screamer 18:a15bfe7aaebd 1121 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1122 */
screamer 18:a15bfe7aaebd 1123 int LSM6DSLSensor::set_pedometer_threshold(uint8_t thr)
screamer 18:a15bfe7aaebd 1124 {
screamer 18:a15bfe7aaebd 1125 if ( LSM6DSL_ACC_GYRO_W_PedoThreshold( (void *)this, thr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1126 {
screamer 18:a15bfe7aaebd 1127 return 1;
screamer 18:a15bfe7aaebd 1128 }
screamer 18:a15bfe7aaebd 1129
screamer 18:a15bfe7aaebd 1130 return 0;
screamer 18:a15bfe7aaebd 1131 }
screamer 18:a15bfe7aaebd 1132
screamer 18:a15bfe7aaebd 1133 /**
screamer 18:a15bfe7aaebd 1134 * @brief Enable the tilt detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1135 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 1136 * @note This function sets the LSM6DSL accelerometer ODR to 26Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1137 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1138 */
screamer 18:a15bfe7aaebd 1139 int LSM6DSLSensor::enable_tilt_detection(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 1140 {
screamer 18:a15bfe7aaebd 1141 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1142 if( set_x_odr(26.0f) == 1 )
screamer 18:a15bfe7aaebd 1143 {
screamer 18:a15bfe7aaebd 1144 return 1;
screamer 18:a15bfe7aaebd 1145 }
screamer 18:a15bfe7aaebd 1146
screamer 18:a15bfe7aaebd 1147 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1148 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1149 {
screamer 18:a15bfe7aaebd 1150 return 1;
screamer 18:a15bfe7aaebd 1151 }
screamer 18:a15bfe7aaebd 1152
screamer 18:a15bfe7aaebd 1153 /* Enable embedded functionalities */
screamer 18:a15bfe7aaebd 1154 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1155 {
screamer 18:a15bfe7aaebd 1156 return 1;
screamer 18:a15bfe7aaebd 1157 }
screamer 18:a15bfe7aaebd 1158
screamer 18:a15bfe7aaebd 1159 /* Enable tilt calculation. */
screamer 18:a15bfe7aaebd 1160 if ( LSM6DSL_ACC_GYRO_W_TILT( (void *)this, LSM6DSL_ACC_GYRO_TILT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1161 {
screamer 18:a15bfe7aaebd 1162 return 1;
screamer 18:a15bfe7aaebd 1163 }
screamer 18:a15bfe7aaebd 1164
screamer 18:a15bfe7aaebd 1165 /* Enable tilt detection on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 1166 switch (pin)
screamer 18:a15bfe7aaebd 1167 {
screamer 18:a15bfe7aaebd 1168 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 1169 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TILT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1170 {
screamer 18:a15bfe7aaebd 1171 return 1;
screamer 18:a15bfe7aaebd 1172 }
screamer 18:a15bfe7aaebd 1173 break;
screamer 18:a15bfe7aaebd 1174
screamer 18:a15bfe7aaebd 1175 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 1176 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TILT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1177 {
screamer 18:a15bfe7aaebd 1178 return 1;
screamer 18:a15bfe7aaebd 1179 }
screamer 18:a15bfe7aaebd 1180 break;
screamer 18:a15bfe7aaebd 1181
screamer 18:a15bfe7aaebd 1182 default:
screamer 18:a15bfe7aaebd 1183 return 1;
screamer 18:a15bfe7aaebd 1184 }
screamer 18:a15bfe7aaebd 1185
screamer 18:a15bfe7aaebd 1186 return 0;
screamer 18:a15bfe7aaebd 1187 }
screamer 18:a15bfe7aaebd 1188
screamer 18:a15bfe7aaebd 1189 /**
screamer 18:a15bfe7aaebd 1190 * @brief Disable the tilt detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1191 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1192 */
screamer 18:a15bfe7aaebd 1193 int LSM6DSLSensor::disable_tilt_detection(void)
screamer 18:a15bfe7aaebd 1194 {
screamer 18:a15bfe7aaebd 1195 /* Disable tilt event on INT1. */
screamer 18:a15bfe7aaebd 1196 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TILT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1197 {
screamer 18:a15bfe7aaebd 1198 return 1;
screamer 18:a15bfe7aaebd 1199 }
screamer 18:a15bfe7aaebd 1200
screamer 18:a15bfe7aaebd 1201 /* Disable tilt event on INT2. */
screamer 18:a15bfe7aaebd 1202 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TILT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1203 {
screamer 18:a15bfe7aaebd 1204 return 1;
screamer 18:a15bfe7aaebd 1205 }
screamer 18:a15bfe7aaebd 1206
screamer 18:a15bfe7aaebd 1207 /* Disable tilt calculation. */
screamer 18:a15bfe7aaebd 1208 if ( LSM6DSL_ACC_GYRO_W_TILT( (void *)this, LSM6DSL_ACC_GYRO_TILT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1209 {
screamer 18:a15bfe7aaebd 1210 return 1;
screamer 18:a15bfe7aaebd 1211 }
screamer 18:a15bfe7aaebd 1212
screamer 18:a15bfe7aaebd 1213 /* Disable embedded functionalities */
screamer 18:a15bfe7aaebd 1214 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1215 {
screamer 18:a15bfe7aaebd 1216 return 1;
screamer 18:a15bfe7aaebd 1217 }
screamer 18:a15bfe7aaebd 1218
screamer 18:a15bfe7aaebd 1219 return 0;
screamer 18:a15bfe7aaebd 1220 }
screamer 18:a15bfe7aaebd 1221
screamer 18:a15bfe7aaebd 1222 /**
screamer 18:a15bfe7aaebd 1223 * @brief Enable the wake up detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1224 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 1225 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1226 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1227 */
screamer 18:a15bfe7aaebd 1228 int LSM6DSLSensor::enable_wake_up_detection(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 1229 {
screamer 18:a15bfe7aaebd 1230 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1231 if( set_x_odr(416.0f) == 1 )
screamer 18:a15bfe7aaebd 1232 {
screamer 18:a15bfe7aaebd 1233 return 1;
screamer 18:a15bfe7aaebd 1234 }
screamer 18:a15bfe7aaebd 1235
screamer 18:a15bfe7aaebd 1236 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1237 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1238 {
screamer 18:a15bfe7aaebd 1239 return 1;
screamer 18:a15bfe7aaebd 1240 }
screamer 18:a15bfe7aaebd 1241
screamer 18:a15bfe7aaebd 1242 /* WAKE_DUR setting */
screamer 18:a15bfe7aaebd 1243 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1244 {
screamer 18:a15bfe7aaebd 1245 return 1;
screamer 18:a15bfe7aaebd 1246 }
screamer 18:a15bfe7aaebd 1247
screamer 18:a15bfe7aaebd 1248 /* Set wake up threshold. */
screamer 18:a15bfe7aaebd 1249 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, 0x02 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1250 {
screamer 18:a15bfe7aaebd 1251 return 1;
screamer 18:a15bfe7aaebd 1252 }
screamer 18:a15bfe7aaebd 1253
screamer 18:a15bfe7aaebd 1254 /* Enable basic Interrupts */
screamer 18:a15bfe7aaebd 1255 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1256 {
screamer 18:a15bfe7aaebd 1257 return 1;
screamer 18:a15bfe7aaebd 1258 }
screamer 18:a15bfe7aaebd 1259
screamer 18:a15bfe7aaebd 1260 /* Enable wake up detection on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 1261 switch (pin)
screamer 18:a15bfe7aaebd 1262 {
screamer 18:a15bfe7aaebd 1263 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 1264 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1265 {
screamer 18:a15bfe7aaebd 1266 return 1;
screamer 18:a15bfe7aaebd 1267 }
screamer 18:a15bfe7aaebd 1268 break;
screamer 18:a15bfe7aaebd 1269
screamer 18:a15bfe7aaebd 1270 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 1271 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1272 {
screamer 18:a15bfe7aaebd 1273 return 1;
screamer 18:a15bfe7aaebd 1274 }
screamer 18:a15bfe7aaebd 1275 break;
screamer 18:a15bfe7aaebd 1276
screamer 18:a15bfe7aaebd 1277 default:
screamer 18:a15bfe7aaebd 1278 return 1;
screamer 18:a15bfe7aaebd 1279 }
screamer 18:a15bfe7aaebd 1280
screamer 18:a15bfe7aaebd 1281 return 0;
screamer 18:a15bfe7aaebd 1282 }
screamer 18:a15bfe7aaebd 1283
screamer 18:a15bfe7aaebd 1284 /**
screamer 18:a15bfe7aaebd 1285 * @brief Disable the wake up detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1286 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1287 */
screamer 18:a15bfe7aaebd 1288 int LSM6DSLSensor::disable_wake_up_detection(void)
screamer 18:a15bfe7aaebd 1289 {
screamer 18:a15bfe7aaebd 1290 /* Disable wake up event on INT1 */
screamer 18:a15bfe7aaebd 1291 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1292 {
screamer 18:a15bfe7aaebd 1293 return 1;
screamer 18:a15bfe7aaebd 1294 }
screamer 18:a15bfe7aaebd 1295
screamer 18:a15bfe7aaebd 1296 /* Disable wake up event on INT2 */
screamer 18:a15bfe7aaebd 1297 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1298 {
screamer 18:a15bfe7aaebd 1299 return 1;
screamer 18:a15bfe7aaebd 1300 }
screamer 18:a15bfe7aaebd 1301
screamer 18:a15bfe7aaebd 1302 /* Disable basic Interrupts */
screamer 18:a15bfe7aaebd 1303 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1304 {
screamer 18:a15bfe7aaebd 1305 return 1;
screamer 18:a15bfe7aaebd 1306 }
screamer 18:a15bfe7aaebd 1307
screamer 18:a15bfe7aaebd 1308 /* WU_DUR setting */
screamer 18:a15bfe7aaebd 1309 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1310 {
screamer 18:a15bfe7aaebd 1311 return 1;
screamer 18:a15bfe7aaebd 1312 }
screamer 18:a15bfe7aaebd 1313
screamer 18:a15bfe7aaebd 1314 /* WU_THS setting */
screamer 18:a15bfe7aaebd 1315 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, 0x00 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1316 {
screamer 18:a15bfe7aaebd 1317 return 1;
screamer 18:a15bfe7aaebd 1318 }
screamer 18:a15bfe7aaebd 1319
screamer 18:a15bfe7aaebd 1320 return 0;
screamer 18:a15bfe7aaebd 1321 }
screamer 18:a15bfe7aaebd 1322
screamer 18:a15bfe7aaebd 1323 /**
screamer 18:a15bfe7aaebd 1324 * @brief Set the wake up threshold for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1325 * @param thr the threshold to be set
screamer 18:a15bfe7aaebd 1326 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1327 */
screamer 18:a15bfe7aaebd 1328 int LSM6DSLSensor::set_wake_up_threshold(uint8_t thr)
screamer 18:a15bfe7aaebd 1329 {
screamer 18:a15bfe7aaebd 1330 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, thr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1331 {
screamer 18:a15bfe7aaebd 1332 return 1;
screamer 18:a15bfe7aaebd 1333 }
screamer 18:a15bfe7aaebd 1334
screamer 18:a15bfe7aaebd 1335 return 0;
screamer 18:a15bfe7aaebd 1336 }
screamer 18:a15bfe7aaebd 1337
screamer 18:a15bfe7aaebd 1338 /**
screamer 18:a15bfe7aaebd 1339 * @brief Enable the single tap detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1340 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 1341 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1342 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1343 */
screamer 18:a15bfe7aaebd 1344 int LSM6DSLSensor::enable_single_tap_detection(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 1345 {
screamer 18:a15bfe7aaebd 1346 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1347 if( set_x_odr(416.0f) == 1 )
screamer 18:a15bfe7aaebd 1348 {
screamer 18:a15bfe7aaebd 1349 return 1;
screamer 18:a15bfe7aaebd 1350 }
screamer 18:a15bfe7aaebd 1351
screamer 18:a15bfe7aaebd 1352 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1353 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1354 {
screamer 18:a15bfe7aaebd 1355 return 1;
screamer 18:a15bfe7aaebd 1356 }
screamer 18:a15bfe7aaebd 1357
screamer 18:a15bfe7aaebd 1358 /* Enable X direction in tap recognition. */
screamer 18:a15bfe7aaebd 1359 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1360 {
screamer 18:a15bfe7aaebd 1361 return 1;
screamer 18:a15bfe7aaebd 1362 }
screamer 18:a15bfe7aaebd 1363
screamer 18:a15bfe7aaebd 1364 /* Enable Y direction in tap recognition. */
screamer 18:a15bfe7aaebd 1365 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1366 {
screamer 18:a15bfe7aaebd 1367 return 1;
screamer 18:a15bfe7aaebd 1368 }
screamer 18:a15bfe7aaebd 1369
screamer 18:a15bfe7aaebd 1370 /* Enable Z direction in tap recognition. */
screamer 18:a15bfe7aaebd 1371 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1372 {
screamer 18:a15bfe7aaebd 1373 return 1;
screamer 18:a15bfe7aaebd 1374 }
screamer 18:a15bfe7aaebd 1375
screamer 18:a15bfe7aaebd 1376 /* Set tap threshold. */
screamer 18:a15bfe7aaebd 1377 if ( set_tap_threshold( LSM6DSL_TAP_THRESHOLD_MID_LOW ) == 1 )
screamer 18:a15bfe7aaebd 1378 {
screamer 18:a15bfe7aaebd 1379 return 1;
screamer 18:a15bfe7aaebd 1380 }
screamer 18:a15bfe7aaebd 1381
screamer 18:a15bfe7aaebd 1382 /* Set tap shock time window. */
screamer 18:a15bfe7aaebd 1383 if ( set_tap_shock_time( LSM6DSL_TAP_SHOCK_TIME_MID_HIGH ) == 1 )
screamer 18:a15bfe7aaebd 1384 {
screamer 18:a15bfe7aaebd 1385 return 1;
screamer 18:a15bfe7aaebd 1386 }
screamer 18:a15bfe7aaebd 1387
screamer 18:a15bfe7aaebd 1388 /* Set tap quiet time window. */
screamer 18:a15bfe7aaebd 1389 if ( set_tap_quiet_time( LSM6DSL_TAP_QUIET_TIME_MID_LOW ) == 1 )
screamer 18:a15bfe7aaebd 1390 {
screamer 18:a15bfe7aaebd 1391 return 1;
screamer 18:a15bfe7aaebd 1392 }
screamer 18:a15bfe7aaebd 1393
screamer 18:a15bfe7aaebd 1394 /* _NOTE_: Tap duration time window - don't care for single tap. */
screamer 18:a15bfe7aaebd 1395
screamer 18:a15bfe7aaebd 1396 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
screamer 18:a15bfe7aaebd 1397
screamer 18:a15bfe7aaebd 1398 /* Enable basic Interrupts */
screamer 18:a15bfe7aaebd 1399 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1400 {
screamer 18:a15bfe7aaebd 1401 return 1;
screamer 18:a15bfe7aaebd 1402 }
screamer 18:a15bfe7aaebd 1403
screamer 18:a15bfe7aaebd 1404 /* Enable single tap on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 1405 switch (pin)
screamer 18:a15bfe7aaebd 1406 {
screamer 18:a15bfe7aaebd 1407 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 1408 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1409 {
screamer 18:a15bfe7aaebd 1410 return 1;
screamer 18:a15bfe7aaebd 1411 }
screamer 18:a15bfe7aaebd 1412 break;
screamer 18:a15bfe7aaebd 1413
screamer 18:a15bfe7aaebd 1414 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 1415 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1416 {
screamer 18:a15bfe7aaebd 1417 return 1;
screamer 18:a15bfe7aaebd 1418 }
screamer 18:a15bfe7aaebd 1419 break;
screamer 18:a15bfe7aaebd 1420
screamer 18:a15bfe7aaebd 1421 default:
screamer 18:a15bfe7aaebd 1422 return 1;
screamer 18:a15bfe7aaebd 1423 }
screamer 18:a15bfe7aaebd 1424
screamer 18:a15bfe7aaebd 1425 return 0;
screamer 18:a15bfe7aaebd 1426 }
screamer 18:a15bfe7aaebd 1427
screamer 18:a15bfe7aaebd 1428 /**
screamer 18:a15bfe7aaebd 1429 * @brief Disable the single tap detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1430 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1431 */
screamer 18:a15bfe7aaebd 1432 int LSM6DSLSensor::disable_single_tap_detection(void)
screamer 18:a15bfe7aaebd 1433 {
screamer 18:a15bfe7aaebd 1434 /* Disable single tap interrupt on INT1 pin. */
screamer 18:a15bfe7aaebd 1435 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1436 {
screamer 18:a15bfe7aaebd 1437 return 1;
screamer 18:a15bfe7aaebd 1438 }
screamer 18:a15bfe7aaebd 1439
screamer 18:a15bfe7aaebd 1440 /* Disable single tap interrupt on INT2 pin. */
screamer 18:a15bfe7aaebd 1441 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1442 {
screamer 18:a15bfe7aaebd 1443 return 1;
screamer 18:a15bfe7aaebd 1444 }
screamer 18:a15bfe7aaebd 1445
screamer 18:a15bfe7aaebd 1446 /* Disable basic Interrupts */
screamer 18:a15bfe7aaebd 1447 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1448 {
screamer 18:a15bfe7aaebd 1449 return 1;
screamer 18:a15bfe7aaebd 1450 }
screamer 18:a15bfe7aaebd 1451
screamer 18:a15bfe7aaebd 1452 /* Reset tap threshold. */
screamer 18:a15bfe7aaebd 1453 if ( set_tap_threshold( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1454 {
screamer 18:a15bfe7aaebd 1455 return 1;
screamer 18:a15bfe7aaebd 1456 }
screamer 18:a15bfe7aaebd 1457
screamer 18:a15bfe7aaebd 1458 /* Reset tap shock time window. */
screamer 18:a15bfe7aaebd 1459 if ( set_tap_shock_time( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1460 {
screamer 18:a15bfe7aaebd 1461 return 1;
screamer 18:a15bfe7aaebd 1462 }
screamer 18:a15bfe7aaebd 1463
screamer 18:a15bfe7aaebd 1464 /* Reset tap quiet time window. */
screamer 18:a15bfe7aaebd 1465 if ( set_tap_quiet_time( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1466 {
screamer 18:a15bfe7aaebd 1467 return 1;
screamer 18:a15bfe7aaebd 1468 }
screamer 18:a15bfe7aaebd 1469
screamer 18:a15bfe7aaebd 1470 /* _NOTE_: Tap duration time window - don't care for single tap. */
screamer 18:a15bfe7aaebd 1471
screamer 18:a15bfe7aaebd 1472 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
screamer 18:a15bfe7aaebd 1473
screamer 18:a15bfe7aaebd 1474 /* Disable Z direction in tap recognition. */
screamer 18:a15bfe7aaebd 1475 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1476 {
screamer 18:a15bfe7aaebd 1477 return 1;
screamer 18:a15bfe7aaebd 1478 }
screamer 18:a15bfe7aaebd 1479
screamer 18:a15bfe7aaebd 1480 /* Disable Y direction in tap recognition. */
screamer 18:a15bfe7aaebd 1481 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1482 {
screamer 18:a15bfe7aaebd 1483 return 1;
screamer 18:a15bfe7aaebd 1484 }
screamer 18:a15bfe7aaebd 1485
screamer 18:a15bfe7aaebd 1486 /* Disable X direction in tap recognition. */
screamer 18:a15bfe7aaebd 1487 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1488 {
screamer 18:a15bfe7aaebd 1489 return 1;
screamer 18:a15bfe7aaebd 1490 }
screamer 18:a15bfe7aaebd 1491
screamer 18:a15bfe7aaebd 1492 return 0;
screamer 18:a15bfe7aaebd 1493 }
screamer 18:a15bfe7aaebd 1494
screamer 18:a15bfe7aaebd 1495 /**
screamer 18:a15bfe7aaebd 1496 * @brief Enable the double tap detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1497 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 1498 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1499 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1500 */
screamer 18:a15bfe7aaebd 1501 int LSM6DSLSensor::enable_double_tap_detection(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 1502 {
screamer 18:a15bfe7aaebd 1503 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1504 if( set_x_odr(416.0f) == 1 )
screamer 18:a15bfe7aaebd 1505 {
screamer 18:a15bfe7aaebd 1506 return 1;
screamer 18:a15bfe7aaebd 1507 }
screamer 18:a15bfe7aaebd 1508
screamer 18:a15bfe7aaebd 1509 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1510 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1511 {
screamer 18:a15bfe7aaebd 1512 return 1;
screamer 18:a15bfe7aaebd 1513 }
screamer 18:a15bfe7aaebd 1514
screamer 18:a15bfe7aaebd 1515 /* Enable X direction in tap recognition. */
screamer 18:a15bfe7aaebd 1516 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1517 {
screamer 18:a15bfe7aaebd 1518 return 1;
screamer 18:a15bfe7aaebd 1519 }
screamer 18:a15bfe7aaebd 1520
screamer 18:a15bfe7aaebd 1521 /* Enable Y direction in tap recognition. */
screamer 18:a15bfe7aaebd 1522 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1523 {
screamer 18:a15bfe7aaebd 1524 return 1;
screamer 18:a15bfe7aaebd 1525 }
screamer 18:a15bfe7aaebd 1526
screamer 18:a15bfe7aaebd 1527 /* Enable Z direction in tap recognition. */
screamer 18:a15bfe7aaebd 1528 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1529 {
screamer 18:a15bfe7aaebd 1530 return 1;
screamer 18:a15bfe7aaebd 1531 }
screamer 18:a15bfe7aaebd 1532
screamer 18:a15bfe7aaebd 1533 /* Set tap threshold. */
screamer 18:a15bfe7aaebd 1534 if ( set_tap_threshold( LSM6DSL_TAP_THRESHOLD_MID_LOW ) == 1 )
screamer 18:a15bfe7aaebd 1535 {
screamer 18:a15bfe7aaebd 1536 return 1;
screamer 18:a15bfe7aaebd 1537 }
screamer 18:a15bfe7aaebd 1538
screamer 18:a15bfe7aaebd 1539 /* Set tap shock time window. */
screamer 18:a15bfe7aaebd 1540 if ( set_tap_shock_time( LSM6DSL_TAP_SHOCK_TIME_HIGH ) == 1 )
screamer 18:a15bfe7aaebd 1541 {
screamer 18:a15bfe7aaebd 1542 return 1;
screamer 18:a15bfe7aaebd 1543 }
screamer 18:a15bfe7aaebd 1544
screamer 18:a15bfe7aaebd 1545 /* Set tap quiet time window. */
screamer 18:a15bfe7aaebd 1546 if ( set_tap_quiet_time( LSM6DSL_TAP_QUIET_TIME_HIGH ) == 1 )
screamer 18:a15bfe7aaebd 1547 {
screamer 18:a15bfe7aaebd 1548 return 1;
screamer 18:a15bfe7aaebd 1549 }
screamer 18:a15bfe7aaebd 1550
screamer 18:a15bfe7aaebd 1551 /* Set tap duration time window. */
screamer 18:a15bfe7aaebd 1552 if ( set_tap_duration_time( LSM6DSL_TAP_DURATION_TIME_MID ) == 1 )
screamer 18:a15bfe7aaebd 1553 {
screamer 18:a15bfe7aaebd 1554 return 1;
screamer 18:a15bfe7aaebd 1555 }
screamer 18:a15bfe7aaebd 1556
screamer 18:a15bfe7aaebd 1557 /* Single and double tap enabled. */
screamer 18:a15bfe7aaebd 1558 if ( LSM6DSL_ACC_GYRO_W_SINGLE_DOUBLE_TAP_EV( (void *)this, LSM6DSL_ACC_GYRO_SINGLE_DOUBLE_TAP_DOUBLE_TAP ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1559 {
screamer 18:a15bfe7aaebd 1560 return 1;
screamer 18:a15bfe7aaebd 1561 }
screamer 18:a15bfe7aaebd 1562
screamer 18:a15bfe7aaebd 1563 /* Enable basic Interrupts */
screamer 18:a15bfe7aaebd 1564 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1565 {
screamer 18:a15bfe7aaebd 1566 return 1;
screamer 18:a15bfe7aaebd 1567 }
screamer 18:a15bfe7aaebd 1568
screamer 18:a15bfe7aaebd 1569 /* Enable double tap on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 1570 switch (pin)
screamer 18:a15bfe7aaebd 1571 {
screamer 18:a15bfe7aaebd 1572 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 1573 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TAP_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1574 {
screamer 18:a15bfe7aaebd 1575 return 1;
screamer 18:a15bfe7aaebd 1576 }
screamer 18:a15bfe7aaebd 1577 break;
screamer 18:a15bfe7aaebd 1578
screamer 18:a15bfe7aaebd 1579 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 1580 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TAP_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1581 {
screamer 18:a15bfe7aaebd 1582 return 1;
screamer 18:a15bfe7aaebd 1583 }
screamer 18:a15bfe7aaebd 1584 break;
screamer 18:a15bfe7aaebd 1585
screamer 18:a15bfe7aaebd 1586 default:
screamer 18:a15bfe7aaebd 1587 return 1;
screamer 18:a15bfe7aaebd 1588 }
screamer 18:a15bfe7aaebd 1589
screamer 18:a15bfe7aaebd 1590 return 0;
screamer 18:a15bfe7aaebd 1591 }
screamer 18:a15bfe7aaebd 1592
screamer 18:a15bfe7aaebd 1593 /**
screamer 18:a15bfe7aaebd 1594 * @brief Disable the double tap detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1595 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1596 */
screamer 18:a15bfe7aaebd 1597 int LSM6DSLSensor::disable_double_tap_detection(void)
screamer 18:a15bfe7aaebd 1598 {
screamer 18:a15bfe7aaebd 1599 /* Disable double tap interrupt on INT1 pin. */
screamer 18:a15bfe7aaebd 1600 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TAP_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1601 {
screamer 18:a15bfe7aaebd 1602 return 1;
screamer 18:a15bfe7aaebd 1603 }
screamer 18:a15bfe7aaebd 1604
screamer 18:a15bfe7aaebd 1605 /* Disable double tap interrupt on INT2 pin. */
screamer 18:a15bfe7aaebd 1606 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TAP_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1607 {
screamer 18:a15bfe7aaebd 1608 return 1;
screamer 18:a15bfe7aaebd 1609 }
screamer 18:a15bfe7aaebd 1610
screamer 18:a15bfe7aaebd 1611 /* Disable basic Interrupts */
screamer 18:a15bfe7aaebd 1612 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1613 {
screamer 18:a15bfe7aaebd 1614 return 1;
screamer 18:a15bfe7aaebd 1615 }
screamer 18:a15bfe7aaebd 1616
screamer 18:a15bfe7aaebd 1617 /* Reset tap threshold. */
screamer 18:a15bfe7aaebd 1618 if ( set_tap_threshold( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1619 {
screamer 18:a15bfe7aaebd 1620 return 1;
screamer 18:a15bfe7aaebd 1621 }
screamer 18:a15bfe7aaebd 1622
screamer 18:a15bfe7aaebd 1623 /* Reset tap shock time window. */
screamer 18:a15bfe7aaebd 1624 if ( set_tap_shock_time( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1625 {
screamer 18:a15bfe7aaebd 1626 return 1;
screamer 18:a15bfe7aaebd 1627 }
screamer 18:a15bfe7aaebd 1628
screamer 18:a15bfe7aaebd 1629 /* Reset tap quiet time window. */
screamer 18:a15bfe7aaebd 1630 if ( set_tap_quiet_time( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1631 {
screamer 18:a15bfe7aaebd 1632 return 1;
screamer 18:a15bfe7aaebd 1633 }
screamer 18:a15bfe7aaebd 1634
screamer 18:a15bfe7aaebd 1635 /* Reset tap duration time window. */
screamer 18:a15bfe7aaebd 1636 if ( set_tap_duration_time( 0x0 ) == 1 )
screamer 18:a15bfe7aaebd 1637 {
screamer 18:a15bfe7aaebd 1638 return 1;
screamer 18:a15bfe7aaebd 1639 }
screamer 18:a15bfe7aaebd 1640
screamer 18:a15bfe7aaebd 1641 /* Only single tap enabled. */
screamer 18:a15bfe7aaebd 1642 if ( LSM6DSL_ACC_GYRO_W_SINGLE_DOUBLE_TAP_EV( (void *)this, LSM6DSL_ACC_GYRO_SINGLE_DOUBLE_TAP_SINGLE_TAP ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1643 {
screamer 18:a15bfe7aaebd 1644 return 1;
screamer 18:a15bfe7aaebd 1645 }
screamer 18:a15bfe7aaebd 1646
screamer 18:a15bfe7aaebd 1647 /* Disable Z direction in tap recognition. */
screamer 18:a15bfe7aaebd 1648 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1649 {
screamer 18:a15bfe7aaebd 1650 return 1;
screamer 18:a15bfe7aaebd 1651 }
screamer 18:a15bfe7aaebd 1652
screamer 18:a15bfe7aaebd 1653 /* Disable Y direction in tap recognition. */
screamer 18:a15bfe7aaebd 1654 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1655 {
screamer 18:a15bfe7aaebd 1656 return 1;
screamer 18:a15bfe7aaebd 1657 }
screamer 18:a15bfe7aaebd 1658
screamer 18:a15bfe7aaebd 1659 /* Disable X direction in tap recognition. */
screamer 18:a15bfe7aaebd 1660 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1661 {
screamer 18:a15bfe7aaebd 1662 return 1;
screamer 18:a15bfe7aaebd 1663 }
screamer 18:a15bfe7aaebd 1664
screamer 18:a15bfe7aaebd 1665 return 0;
screamer 18:a15bfe7aaebd 1666 }
screamer 18:a15bfe7aaebd 1667
screamer 18:a15bfe7aaebd 1668 /**
screamer 18:a15bfe7aaebd 1669 * @brief Set the tap threshold for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1670 * @param thr the threshold to be set
screamer 18:a15bfe7aaebd 1671 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1672 */
screamer 18:a15bfe7aaebd 1673 int LSM6DSLSensor::set_tap_threshold(uint8_t thr)
screamer 18:a15bfe7aaebd 1674 {
screamer 18:a15bfe7aaebd 1675 if ( LSM6DSL_ACC_GYRO_W_TAP_THS( (void *)this, thr ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1676 {
screamer 18:a15bfe7aaebd 1677 return 1;
screamer 18:a15bfe7aaebd 1678 }
screamer 18:a15bfe7aaebd 1679
screamer 18:a15bfe7aaebd 1680 return 0;
screamer 18:a15bfe7aaebd 1681 }
screamer 18:a15bfe7aaebd 1682
screamer 18:a15bfe7aaebd 1683 /**
screamer 18:a15bfe7aaebd 1684 * @brief Set the tap shock time window for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1685 * @param time the shock time window to be set
screamer 18:a15bfe7aaebd 1686 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1687 */
screamer 18:a15bfe7aaebd 1688 int LSM6DSLSensor::set_tap_shock_time(uint8_t time)
screamer 18:a15bfe7aaebd 1689 {
screamer 18:a15bfe7aaebd 1690 if ( LSM6DSL_ACC_GYRO_W_SHOCK_Duration( (void *)this, time ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1691 {
screamer 18:a15bfe7aaebd 1692 return 1;
screamer 18:a15bfe7aaebd 1693 }
screamer 18:a15bfe7aaebd 1694
screamer 18:a15bfe7aaebd 1695 return 0;
screamer 18:a15bfe7aaebd 1696 }
screamer 18:a15bfe7aaebd 1697
screamer 18:a15bfe7aaebd 1698 /**
screamer 18:a15bfe7aaebd 1699 * @brief Set the tap quiet time window for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1700 * @param time the quiet time window to be set
screamer 18:a15bfe7aaebd 1701 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1702 */
screamer 18:a15bfe7aaebd 1703 int LSM6DSLSensor::set_tap_quiet_time(uint8_t time)
screamer 18:a15bfe7aaebd 1704 {
screamer 18:a15bfe7aaebd 1705 if ( LSM6DSL_ACC_GYRO_W_QUIET_Duration( (void *)this, time ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1706 {
screamer 18:a15bfe7aaebd 1707 return 1;
screamer 18:a15bfe7aaebd 1708 }
screamer 18:a15bfe7aaebd 1709
screamer 18:a15bfe7aaebd 1710 return 0;
screamer 18:a15bfe7aaebd 1711 }
screamer 18:a15bfe7aaebd 1712
screamer 18:a15bfe7aaebd 1713 /**
screamer 18:a15bfe7aaebd 1714 * @brief Set the tap duration of the time window for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1715 * @param time the duration of the time window to be set
screamer 18:a15bfe7aaebd 1716 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1717 */
screamer 18:a15bfe7aaebd 1718 int LSM6DSLSensor::set_tap_duration_time(uint8_t time)
screamer 18:a15bfe7aaebd 1719 {
screamer 18:a15bfe7aaebd 1720 if ( LSM6DSL_ACC_GYRO_W_DUR( (void *)this, time ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1721 {
screamer 18:a15bfe7aaebd 1722 return 1;
screamer 18:a15bfe7aaebd 1723 }
screamer 18:a15bfe7aaebd 1724
screamer 18:a15bfe7aaebd 1725 return 0;
screamer 18:a15bfe7aaebd 1726 }
screamer 18:a15bfe7aaebd 1727
screamer 18:a15bfe7aaebd 1728 /**
screamer 18:a15bfe7aaebd 1729 * @brief Enable the 6D orientation detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1730 * @param pin the interrupt pin to be used
screamer 18:a15bfe7aaebd 1731 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
screamer 18:a15bfe7aaebd 1732 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1733 */
screamer 18:a15bfe7aaebd 1734 int LSM6DSLSensor::enable_6d_orientation(LSM6DSL_Interrupt_Pin_t pin)
screamer 18:a15bfe7aaebd 1735 {
screamer 18:a15bfe7aaebd 1736 /* Output Data Rate selection */
screamer 18:a15bfe7aaebd 1737 if( set_x_odr(416.0f) == 1 )
screamer 18:a15bfe7aaebd 1738 {
screamer 18:a15bfe7aaebd 1739 return 1;
screamer 18:a15bfe7aaebd 1740 }
screamer 18:a15bfe7aaebd 1741
screamer 18:a15bfe7aaebd 1742 /* Full scale selection. */
screamer 18:a15bfe7aaebd 1743 if( set_x_fs(2.0f) == 1 )
screamer 18:a15bfe7aaebd 1744 {
screamer 18:a15bfe7aaebd 1745 return 1;
screamer 18:a15bfe7aaebd 1746 }
screamer 18:a15bfe7aaebd 1747
screamer 18:a15bfe7aaebd 1748 /* Set 6D threshold. */
screamer 18:a15bfe7aaebd 1749 if ( LSM6DSL_ACC_GYRO_W_SIXD_THS( (void *)this, LSM6DSL_ACC_GYRO_SIXD_THS_60_degree ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1750 {
screamer 18:a15bfe7aaebd 1751 return 1;
screamer 18:a15bfe7aaebd 1752 }
screamer 18:a15bfe7aaebd 1753
screamer 18:a15bfe7aaebd 1754 /* Enable basic Interrupts */
screamer 18:a15bfe7aaebd 1755 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1756 {
screamer 18:a15bfe7aaebd 1757 return 1;
screamer 18:a15bfe7aaebd 1758 }
screamer 18:a15bfe7aaebd 1759
screamer 18:a15bfe7aaebd 1760 /* Enable 6D orientation on either INT1 or INT2 pin */
screamer 18:a15bfe7aaebd 1761 switch (pin)
screamer 18:a15bfe7aaebd 1762 {
screamer 18:a15bfe7aaebd 1763 case LSM6DSL_INT1_PIN:
screamer 18:a15bfe7aaebd 1764 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_6D_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1765 {
screamer 18:a15bfe7aaebd 1766 return 1;
screamer 18:a15bfe7aaebd 1767 }
screamer 18:a15bfe7aaebd 1768 break;
screamer 18:a15bfe7aaebd 1769
screamer 18:a15bfe7aaebd 1770 case LSM6DSL_INT2_PIN:
screamer 18:a15bfe7aaebd 1771 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_6D_ENABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1772 {
screamer 18:a15bfe7aaebd 1773 return 1;
screamer 18:a15bfe7aaebd 1774 }
screamer 18:a15bfe7aaebd 1775 break;
screamer 18:a15bfe7aaebd 1776
screamer 18:a15bfe7aaebd 1777 default:
screamer 18:a15bfe7aaebd 1778 return 1;
screamer 18:a15bfe7aaebd 1779 }
screamer 18:a15bfe7aaebd 1780
screamer 18:a15bfe7aaebd 1781 return 0;
screamer 18:a15bfe7aaebd 1782 }
screamer 18:a15bfe7aaebd 1783
screamer 18:a15bfe7aaebd 1784 /**
screamer 18:a15bfe7aaebd 1785 * @brief Disable the 6D orientation detection for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1786 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1787 */
screamer 18:a15bfe7aaebd 1788 int LSM6DSLSensor::disable_6d_orientation(void)
screamer 18:a15bfe7aaebd 1789 {
screamer 18:a15bfe7aaebd 1790 /* Disable 6D orientation interrupt on INT1 pin. */
screamer 18:a15bfe7aaebd 1791 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_6D_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1792 {
screamer 18:a15bfe7aaebd 1793 return 1;
screamer 18:a15bfe7aaebd 1794 }
screamer 18:a15bfe7aaebd 1795
screamer 18:a15bfe7aaebd 1796 /* Disable 6D orientation interrupt on INT2 pin. */
screamer 18:a15bfe7aaebd 1797 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_6D_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1798 {
screamer 18:a15bfe7aaebd 1799 return 1;
screamer 18:a15bfe7aaebd 1800 }
screamer 18:a15bfe7aaebd 1801
screamer 18:a15bfe7aaebd 1802 /* Disable basic Interrupts */
screamer 18:a15bfe7aaebd 1803 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1804 {
screamer 18:a15bfe7aaebd 1805 return 1;
screamer 18:a15bfe7aaebd 1806 }
screamer 18:a15bfe7aaebd 1807
screamer 18:a15bfe7aaebd 1808 /* Reset 6D threshold. */
screamer 18:a15bfe7aaebd 1809 if ( LSM6DSL_ACC_GYRO_W_SIXD_THS( (void *)this, LSM6DSL_ACC_GYRO_SIXD_THS_80_degree ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1810 {
screamer 18:a15bfe7aaebd 1811 return 1;
screamer 18:a15bfe7aaebd 1812 }
screamer 18:a15bfe7aaebd 1813
screamer 18:a15bfe7aaebd 1814 return 0;
screamer 18:a15bfe7aaebd 1815 }
screamer 18:a15bfe7aaebd 1816
screamer 18:a15bfe7aaebd 1817 /**
screamer 18:a15bfe7aaebd 1818 * @brief Get the 6D orientation XL axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1819 * @param xl the pointer to the 6D orientation XL axis
screamer 18:a15bfe7aaebd 1820 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1821 */
screamer 18:a15bfe7aaebd 1822 int LSM6DSLSensor::get_6d_orientation_xl(uint8_t *xl)
screamer 18:a15bfe7aaebd 1823 {
screamer 18:a15bfe7aaebd 1824 LSM6DSL_ACC_GYRO_DSD_XL_t xl_raw;
screamer 18:a15bfe7aaebd 1825
screamer 18:a15bfe7aaebd 1826 if ( LSM6DSL_ACC_GYRO_R_DSD_XL( (void *)this, &xl_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1827 {
screamer 18:a15bfe7aaebd 1828 return 1;
screamer 18:a15bfe7aaebd 1829 }
screamer 18:a15bfe7aaebd 1830
screamer 18:a15bfe7aaebd 1831 switch( xl_raw )
screamer 18:a15bfe7aaebd 1832 {
screamer 18:a15bfe7aaebd 1833 case LSM6DSL_ACC_GYRO_DSD_XL_DETECTED:
screamer 18:a15bfe7aaebd 1834 *xl = 1;
screamer 18:a15bfe7aaebd 1835 break;
screamer 18:a15bfe7aaebd 1836 case LSM6DSL_ACC_GYRO_DSD_XL_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1837 *xl = 0;
screamer 18:a15bfe7aaebd 1838 break;
screamer 18:a15bfe7aaebd 1839 default:
screamer 18:a15bfe7aaebd 1840 return 1;
screamer 18:a15bfe7aaebd 1841 }
screamer 18:a15bfe7aaebd 1842
screamer 18:a15bfe7aaebd 1843 return 0;
screamer 18:a15bfe7aaebd 1844 }
screamer 18:a15bfe7aaebd 1845
screamer 18:a15bfe7aaebd 1846 /**
screamer 18:a15bfe7aaebd 1847 * @brief Get the 6D orientation XH axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1848 * @param xh the pointer to the 6D orientation XH axis
screamer 18:a15bfe7aaebd 1849 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1850 */
screamer 18:a15bfe7aaebd 1851 int LSM6DSLSensor::get_6d_orientation_xh(uint8_t *xh)
screamer 18:a15bfe7aaebd 1852 {
screamer 18:a15bfe7aaebd 1853 LSM6DSL_ACC_GYRO_DSD_XH_t xh_raw;
screamer 18:a15bfe7aaebd 1854
screamer 18:a15bfe7aaebd 1855 if ( LSM6DSL_ACC_GYRO_R_DSD_XH( (void *)this, &xh_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1856 {
screamer 18:a15bfe7aaebd 1857 return 1;
screamer 18:a15bfe7aaebd 1858 }
screamer 18:a15bfe7aaebd 1859
screamer 18:a15bfe7aaebd 1860 switch( xh_raw )
screamer 18:a15bfe7aaebd 1861 {
screamer 18:a15bfe7aaebd 1862 case LSM6DSL_ACC_GYRO_DSD_XH_DETECTED:
screamer 18:a15bfe7aaebd 1863 *xh = 1;
screamer 18:a15bfe7aaebd 1864 break;
screamer 18:a15bfe7aaebd 1865 case LSM6DSL_ACC_GYRO_DSD_XH_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1866 *xh = 0;
screamer 18:a15bfe7aaebd 1867 break;
screamer 18:a15bfe7aaebd 1868 default:
screamer 18:a15bfe7aaebd 1869 return 1;
screamer 18:a15bfe7aaebd 1870 }
screamer 18:a15bfe7aaebd 1871
screamer 18:a15bfe7aaebd 1872 return 0;
screamer 18:a15bfe7aaebd 1873 }
screamer 18:a15bfe7aaebd 1874
screamer 18:a15bfe7aaebd 1875 /**
screamer 18:a15bfe7aaebd 1876 * @brief Get the 6D orientation YL axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1877 * @param yl the pointer to the 6D orientation YL axis
screamer 18:a15bfe7aaebd 1878 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1879 */
screamer 18:a15bfe7aaebd 1880 int LSM6DSLSensor::get_6d_orientation_yl(uint8_t *yl)
screamer 18:a15bfe7aaebd 1881 {
screamer 18:a15bfe7aaebd 1882 LSM6DSL_ACC_GYRO_DSD_YL_t yl_raw;
screamer 18:a15bfe7aaebd 1883
screamer 18:a15bfe7aaebd 1884 if ( LSM6DSL_ACC_GYRO_R_DSD_YL( (void *)this, &yl_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1885 {
screamer 18:a15bfe7aaebd 1886 return 1;
screamer 18:a15bfe7aaebd 1887 }
screamer 18:a15bfe7aaebd 1888
screamer 18:a15bfe7aaebd 1889 switch( yl_raw )
screamer 18:a15bfe7aaebd 1890 {
screamer 18:a15bfe7aaebd 1891 case LSM6DSL_ACC_GYRO_DSD_YL_DETECTED:
screamer 18:a15bfe7aaebd 1892 *yl = 1;
screamer 18:a15bfe7aaebd 1893 break;
screamer 18:a15bfe7aaebd 1894 case LSM6DSL_ACC_GYRO_DSD_YL_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1895 *yl = 0;
screamer 18:a15bfe7aaebd 1896 break;
screamer 18:a15bfe7aaebd 1897 default:
screamer 18:a15bfe7aaebd 1898 return 1;
screamer 18:a15bfe7aaebd 1899 }
screamer 18:a15bfe7aaebd 1900
screamer 18:a15bfe7aaebd 1901 return 0;
screamer 18:a15bfe7aaebd 1902 }
screamer 18:a15bfe7aaebd 1903
screamer 18:a15bfe7aaebd 1904 /**
screamer 18:a15bfe7aaebd 1905 * @brief Get the 6D orientation YH axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1906 * @param yh the pointer to the 6D orientation YH axis
screamer 18:a15bfe7aaebd 1907 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1908 */
screamer 18:a15bfe7aaebd 1909 int LSM6DSLSensor::get_6d_orientation_yh(uint8_t *yh)
screamer 18:a15bfe7aaebd 1910 {
screamer 18:a15bfe7aaebd 1911 LSM6DSL_ACC_GYRO_DSD_YH_t yh_raw;
screamer 18:a15bfe7aaebd 1912
screamer 18:a15bfe7aaebd 1913 if ( LSM6DSL_ACC_GYRO_R_DSD_YH( (void *)this, &yh_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1914 {
screamer 18:a15bfe7aaebd 1915 return 1;
screamer 18:a15bfe7aaebd 1916 }
screamer 18:a15bfe7aaebd 1917
screamer 18:a15bfe7aaebd 1918 switch( yh_raw )
screamer 18:a15bfe7aaebd 1919 {
screamer 18:a15bfe7aaebd 1920 case LSM6DSL_ACC_GYRO_DSD_YH_DETECTED:
screamer 18:a15bfe7aaebd 1921 *yh = 1;
screamer 18:a15bfe7aaebd 1922 break;
screamer 18:a15bfe7aaebd 1923 case LSM6DSL_ACC_GYRO_DSD_YH_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1924 *yh = 0;
screamer 18:a15bfe7aaebd 1925 break;
screamer 18:a15bfe7aaebd 1926 default:
screamer 18:a15bfe7aaebd 1927 return 1;
screamer 18:a15bfe7aaebd 1928 }
screamer 18:a15bfe7aaebd 1929
screamer 18:a15bfe7aaebd 1930 return 0;
screamer 18:a15bfe7aaebd 1931 }
screamer 18:a15bfe7aaebd 1932
screamer 18:a15bfe7aaebd 1933 /**
screamer 18:a15bfe7aaebd 1934 * @brief Get the 6D orientation ZL axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1935 * @param zl the pointer to the 6D orientation ZL axis
screamer 18:a15bfe7aaebd 1936 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1937 */
screamer 18:a15bfe7aaebd 1938 int LSM6DSLSensor::get_6d_orientation_zl(uint8_t *zl)
screamer 18:a15bfe7aaebd 1939 {
screamer 18:a15bfe7aaebd 1940 LSM6DSL_ACC_GYRO_DSD_ZL_t zl_raw;
screamer 18:a15bfe7aaebd 1941
screamer 18:a15bfe7aaebd 1942 if ( LSM6DSL_ACC_GYRO_R_DSD_ZL( (void *)this, &zl_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1943 {
screamer 18:a15bfe7aaebd 1944 return 1;
screamer 18:a15bfe7aaebd 1945 }
screamer 18:a15bfe7aaebd 1946
screamer 18:a15bfe7aaebd 1947 switch( zl_raw )
screamer 18:a15bfe7aaebd 1948 {
screamer 18:a15bfe7aaebd 1949 case LSM6DSL_ACC_GYRO_DSD_ZL_DETECTED:
screamer 18:a15bfe7aaebd 1950 *zl = 1;
screamer 18:a15bfe7aaebd 1951 break;
screamer 18:a15bfe7aaebd 1952 case LSM6DSL_ACC_GYRO_DSD_ZL_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1953 *zl = 0;
screamer 18:a15bfe7aaebd 1954 break;
screamer 18:a15bfe7aaebd 1955 default:
screamer 18:a15bfe7aaebd 1956 return 1;
screamer 18:a15bfe7aaebd 1957 }
screamer 18:a15bfe7aaebd 1958
screamer 18:a15bfe7aaebd 1959 return 0;
screamer 18:a15bfe7aaebd 1960 }
screamer 18:a15bfe7aaebd 1961
screamer 18:a15bfe7aaebd 1962 /**
screamer 18:a15bfe7aaebd 1963 * @brief Get the 6D orientation ZH axis for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1964 * @param zh the pointer to the 6D orientation ZH axis
screamer 18:a15bfe7aaebd 1965 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1966 */
screamer 18:a15bfe7aaebd 1967 int LSM6DSLSensor::get_6d_orientation_zh(uint8_t *zh)
screamer 18:a15bfe7aaebd 1968 {
screamer 18:a15bfe7aaebd 1969 LSM6DSL_ACC_GYRO_DSD_ZH_t zh_raw;
screamer 18:a15bfe7aaebd 1970
screamer 18:a15bfe7aaebd 1971 if ( LSM6DSL_ACC_GYRO_R_DSD_ZH( (void *)this, &zh_raw ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 1972 {
screamer 18:a15bfe7aaebd 1973 return 1;
screamer 18:a15bfe7aaebd 1974 }
screamer 18:a15bfe7aaebd 1975
screamer 18:a15bfe7aaebd 1976 switch( zh_raw )
screamer 18:a15bfe7aaebd 1977 {
screamer 18:a15bfe7aaebd 1978 case LSM6DSL_ACC_GYRO_DSD_ZH_DETECTED:
screamer 18:a15bfe7aaebd 1979 *zh = 1;
screamer 18:a15bfe7aaebd 1980 break;
screamer 18:a15bfe7aaebd 1981 case LSM6DSL_ACC_GYRO_DSD_ZH_NOT_DETECTED:
screamer 18:a15bfe7aaebd 1982 *zh = 0;
screamer 18:a15bfe7aaebd 1983 break;
screamer 18:a15bfe7aaebd 1984 default:
screamer 18:a15bfe7aaebd 1985 return 1;
screamer 18:a15bfe7aaebd 1986 }
screamer 18:a15bfe7aaebd 1987
screamer 18:a15bfe7aaebd 1988 return 0;
screamer 18:a15bfe7aaebd 1989 }
screamer 18:a15bfe7aaebd 1990
screamer 18:a15bfe7aaebd 1991 /**
screamer 18:a15bfe7aaebd 1992 * @brief Get the status of all hardware events for LSM6DSL accelerometer sensor
screamer 18:a15bfe7aaebd 1993 * @param status the pointer to the status of all hardware events
screamer 18:a15bfe7aaebd 1994 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 1995 */
screamer 18:a15bfe7aaebd 1996 int LSM6DSLSensor::get_event_status(LSM6DSL_Event_Status_t *status)
screamer 18:a15bfe7aaebd 1997 {
screamer 18:a15bfe7aaebd 1998 uint8_t Wake_Up_Src = 0, Tap_Src = 0, D6D_Src = 0, Func_Src = 0, Md1_Cfg = 0, Md2_Cfg = 0, Int1_Ctrl = 0;
screamer 18:a15bfe7aaebd 1999
screamer 18:a15bfe7aaebd 2000 memset((void *)status, 0x0, sizeof(LSM6DSL_Event_Status_t));
screamer 18:a15bfe7aaebd 2001
screamer 18:a15bfe7aaebd 2002 if(read_reg(LSM6DSL_ACC_GYRO_WAKE_UP_SRC, &Wake_Up_Src) != 0)
screamer 18:a15bfe7aaebd 2003 {
screamer 18:a15bfe7aaebd 2004 return 1;
screamer 18:a15bfe7aaebd 2005 }
screamer 18:a15bfe7aaebd 2006
screamer 18:a15bfe7aaebd 2007 if(read_reg(LSM6DSL_ACC_GYRO_TAP_SRC, &Tap_Src) != 0)
screamer 18:a15bfe7aaebd 2008 {
screamer 18:a15bfe7aaebd 2009 return 1;
screamer 18:a15bfe7aaebd 2010 }
screamer 18:a15bfe7aaebd 2011
screamer 18:a15bfe7aaebd 2012 if(read_reg(LSM6DSL_ACC_GYRO_D6D_SRC, &D6D_Src) != 0)
screamer 18:a15bfe7aaebd 2013 {
screamer 18:a15bfe7aaebd 2014 return 1;
screamer 18:a15bfe7aaebd 2015 }
screamer 18:a15bfe7aaebd 2016
screamer 18:a15bfe7aaebd 2017 if(read_reg(LSM6DSL_ACC_GYRO_FUNC_SRC, &Func_Src) != 0)
screamer 18:a15bfe7aaebd 2018 {
screamer 18:a15bfe7aaebd 2019 return 1;
screamer 18:a15bfe7aaebd 2020 }
screamer 18:a15bfe7aaebd 2021
screamer 18:a15bfe7aaebd 2022 if(read_reg(LSM6DSL_ACC_GYRO_MD1_CFG, &Md1_Cfg ) != 0 )
screamer 18:a15bfe7aaebd 2023 {
screamer 18:a15bfe7aaebd 2024 return 1;
screamer 18:a15bfe7aaebd 2025 }
screamer 18:a15bfe7aaebd 2026
screamer 18:a15bfe7aaebd 2027 if(read_reg(LSM6DSL_ACC_GYRO_MD2_CFG, &Md2_Cfg ) != 0)
screamer 18:a15bfe7aaebd 2028 {
screamer 18:a15bfe7aaebd 2029 return 1;
screamer 18:a15bfe7aaebd 2030 }
screamer 18:a15bfe7aaebd 2031
screamer 18:a15bfe7aaebd 2032 if(read_reg(LSM6DSL_ACC_GYRO_INT1_CTRL, &Int1_Ctrl ) != 0)
screamer 18:a15bfe7aaebd 2033 {
screamer 18:a15bfe7aaebd 2034 return 1;
screamer 18:a15bfe7aaebd 2035 }
screamer 18:a15bfe7aaebd 2036
screamer 18:a15bfe7aaebd 2037 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_FF_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_FF_MASK))
screamer 18:a15bfe7aaebd 2038 {
screamer 18:a15bfe7aaebd 2039 if((Wake_Up_Src & LSM6DSL_ACC_GYRO_FF_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2040 {
screamer 18:a15bfe7aaebd 2041 status->FreeFallStatus = 1;
screamer 18:a15bfe7aaebd 2042 }
screamer 18:a15bfe7aaebd 2043 }
screamer 18:a15bfe7aaebd 2044
screamer 18:a15bfe7aaebd 2045 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_WU_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_WU_MASK))
screamer 18:a15bfe7aaebd 2046 {
screamer 18:a15bfe7aaebd 2047 if((Wake_Up_Src & LSM6DSL_ACC_GYRO_WU_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2048 {
screamer 18:a15bfe7aaebd 2049 status->WakeUpStatus = 1;
screamer 18:a15bfe7aaebd 2050 }
screamer 18:a15bfe7aaebd 2051 }
screamer 18:a15bfe7aaebd 2052
screamer 18:a15bfe7aaebd 2053 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_MASK))
screamer 18:a15bfe7aaebd 2054 {
screamer 18:a15bfe7aaebd 2055 if((Tap_Src & LSM6DSL_ACC_GYRO_SINGLE_TAP_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2056 {
screamer 18:a15bfe7aaebd 2057 status->TapStatus = 1;
screamer 18:a15bfe7aaebd 2058 }
screamer 18:a15bfe7aaebd 2059 }
screamer 18:a15bfe7aaebd 2060
screamer 18:a15bfe7aaebd 2061 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TAP_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_TAP_MASK))
screamer 18:a15bfe7aaebd 2062 {
screamer 18:a15bfe7aaebd 2063 if((Tap_Src & LSM6DSL_ACC_GYRO_DOUBLE_TAP_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2064 {
screamer 18:a15bfe7aaebd 2065 status->DoubleTapStatus = 1;
screamer 18:a15bfe7aaebd 2066 }
screamer 18:a15bfe7aaebd 2067 }
screamer 18:a15bfe7aaebd 2068
screamer 18:a15bfe7aaebd 2069 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_6D_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_6D_MASK))
screamer 18:a15bfe7aaebd 2070 {
screamer 18:a15bfe7aaebd 2071 if((D6D_Src & LSM6DSL_ACC_GYRO_D6D_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2072 {
screamer 18:a15bfe7aaebd 2073 status->D6DOrientationStatus = 1;
screamer 18:a15bfe7aaebd 2074 }
screamer 18:a15bfe7aaebd 2075 }
screamer 18:a15bfe7aaebd 2076
screamer 18:a15bfe7aaebd 2077 if((Int1_Ctrl & LSM6DSL_ACC_GYRO_INT1_PEDO_MASK))
screamer 18:a15bfe7aaebd 2078 {
screamer 18:a15bfe7aaebd 2079 if((Func_Src & LSM6DSL_ACC_GYRO_PEDO_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2080 {
screamer 18:a15bfe7aaebd 2081 status->StepStatus = 1;
screamer 18:a15bfe7aaebd 2082 }
screamer 18:a15bfe7aaebd 2083 }
screamer 18:a15bfe7aaebd 2084
screamer 18:a15bfe7aaebd 2085 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TILT_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_TILT_MASK))
screamer 18:a15bfe7aaebd 2086 {
screamer 18:a15bfe7aaebd 2087 if((Func_Src & LSM6DSL_ACC_GYRO_TILT_EV_STATUS_MASK))
screamer 18:a15bfe7aaebd 2088 {
screamer 18:a15bfe7aaebd 2089 status->TiltStatus = 1;
screamer 18:a15bfe7aaebd 2090 }
screamer 18:a15bfe7aaebd 2091 }
screamer 18:a15bfe7aaebd 2092
screamer 18:a15bfe7aaebd 2093 return 0;
screamer 18:a15bfe7aaebd 2094 }
screamer 18:a15bfe7aaebd 2095
screamer 18:a15bfe7aaebd 2096 /**
screamer 18:a15bfe7aaebd 2097 * @brief Read the data from register
screamer 18:a15bfe7aaebd 2098 * @param reg register address
screamer 18:a15bfe7aaebd 2099 * @param data register data
screamer 18:a15bfe7aaebd 2100 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 2101 */
screamer 18:a15bfe7aaebd 2102 int LSM6DSLSensor::read_reg( uint8_t reg, uint8_t *data )
screamer 18:a15bfe7aaebd 2103 {
screamer 18:a15bfe7aaebd 2104
screamer 18:a15bfe7aaebd 2105 if ( LSM6DSL_ACC_GYRO_read_reg( (void *)this, reg, data, 1 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 2106 {
screamer 18:a15bfe7aaebd 2107 return 1;
screamer 18:a15bfe7aaebd 2108 }
screamer 18:a15bfe7aaebd 2109
screamer 18:a15bfe7aaebd 2110 return 0;
screamer 18:a15bfe7aaebd 2111 }
screamer 18:a15bfe7aaebd 2112
screamer 18:a15bfe7aaebd 2113 /**
screamer 18:a15bfe7aaebd 2114 * @brief Write the data to register
screamer 18:a15bfe7aaebd 2115 * @param reg register address
screamer 18:a15bfe7aaebd 2116 * @param data register data
screamer 18:a15bfe7aaebd 2117 * @retval 0 in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 2118 */
screamer 18:a15bfe7aaebd 2119 int LSM6DSLSensor::write_reg( uint8_t reg, uint8_t data )
screamer 18:a15bfe7aaebd 2120 {
screamer 18:a15bfe7aaebd 2121
screamer 18:a15bfe7aaebd 2122 if ( LSM6DSL_ACC_GYRO_write_reg( (void *)this, reg, &data, 1 ) == MEMS_ERROR )
screamer 18:a15bfe7aaebd 2123 {
screamer 18:a15bfe7aaebd 2124 return 1;
screamer 18:a15bfe7aaebd 2125 }
screamer 18:a15bfe7aaebd 2126
screamer 18:a15bfe7aaebd 2127 return 0;
screamer 18:a15bfe7aaebd 2128 }
screamer 18:a15bfe7aaebd 2129
screamer 18:a15bfe7aaebd 2130
screamer 18:a15bfe7aaebd 2131 uint8_t LSM6DSL_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
screamer 18:a15bfe7aaebd 2132 {
screamer 18:a15bfe7aaebd 2133 return ((LSM6DSLSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
screamer 18:a15bfe7aaebd 2134 }
screamer 18:a15bfe7aaebd 2135
screamer 18:a15bfe7aaebd 2136 uint8_t LSM6DSL_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
screamer 18:a15bfe7aaebd 2137 {
screamer 18:a15bfe7aaebd 2138 return ((LSM6DSLSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
screamer 18:a15bfe7aaebd 2139 }