Example of single tap and double tap detection for LSM6DSL in X-NUCLEO-IKS01A2

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of SingleDoubleTap_IKS01A2 by ST Expansion SW Team

Single and Double Tap Demo Application based on sensor expansion board X-NUCLEO-IKS01A2

Main function is to show how to detect the single and double tap events using the sensor expansion board and send a notification using UART to a connected PC or Desktop and display it on terminal applications like TeraTerm.
After connection has been established:
- the user can try to tap the board and then view the notification using an hyper terminal. When the single tap is detected, the LED is switched on for a while.
- the user can press the user button to pass from the single tap detection to the double tap detection feature. The user can try to double tap the board and then view the notification using an hyper terminal. When the double tap is detected, the LED is switched on twice for a while.
- the user can press again the user button to disable the single and double tap detection feature.
- the user can press the user button to enable again the single tap detection feature and so on.

Committer:
cparata
Date:
Wed Nov 23 15:54:32 2016 +0000
Revision:
5:7da0dc121ec6
Parent:
4:05f28412d61b
Child:
6:2380444e4c75
Improve Multi Event Management

Who changed what in which revision?

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