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:
Thu Nov 24 16:45:55 2016 +0000
Revision:
7:4f512b172555
Parent:
6:2380444e4c75
Add possibility to choose the interrupt line for HW events

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 6:2380444e4c75 54 LSM6DSLSensor::LSM6DSLSensor(DevI2C &i2c, PinName INT1_pin, PinName INT2_pin) : dev_i2c(i2c), INT1_irq(INT1_pin), INT2_irq(INT2_pin)
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 6:2380444e4c75 63 LSM6DSLSensor::LSM6DSLSensor(DevI2C &i2c, PinName INT1_pin, PinName INT2_pin, uint8_t address) : dev_i2c(i2c), INT1_irq(INT1_pin), INT2_irq(INT2_pin), 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 7:4f512b172555 864 return Enable_Free_Fall_Detection(LSM6DSL_INT1_PIN);
cparata 7:4f512b172555 865 }
cparata 7:4f512b172555 866
cparata 7:4f512b172555 867 /**
cparata 7:4f512b172555 868 * @brief Enable free fall detection
cparata 7:4f512b172555 869 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 870 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 871 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 872 */
cparata 7:4f512b172555 873 int LSM6DSLSensor::Enable_Free_Fall_Detection(LSM6DSL_Interrupt_Pin_t pin)
cparata 7:4f512b172555 874 {
cparata 2:21a191bd1998 875 /* Output Data Rate selection */
cparata 2:21a191bd1998 876 if(Set_X_ODR(416.0f) == 1)
cparata 2:21a191bd1998 877 {
cparata 2:21a191bd1998 878 return 1;
cparata 2:21a191bd1998 879 }
cparata 2:21a191bd1998 880
cparata 2:21a191bd1998 881 /* Full scale selection */
cparata 2:21a191bd1998 882 if ( LSM6DSL_ACC_GYRO_W_FS_XL( (void *)this, LSM6DSL_ACC_GYRO_FS_XL_2g ) == MEMS_ERROR )
cparata 2:21a191bd1998 883 {
cparata 2:21a191bd1998 884 return 1;
cparata 2:21a191bd1998 885 }
cparata 2:21a191bd1998 886
cparata 2:21a191bd1998 887 /* FF_DUR setting */
cparata 2:21a191bd1998 888 if ( LSM6DSL_ACC_GYRO_W_FF_Duration( (void *)this, 0x06 ) == MEMS_ERROR )
cparata 2:21a191bd1998 889 {
cparata 2:21a191bd1998 890 return 1;
cparata 2:21a191bd1998 891 }
cparata 2:21a191bd1998 892
cparata 2:21a191bd1998 893 /* WAKE_DUR setting */
cparata 2:21a191bd1998 894 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 895 {
cparata 2:21a191bd1998 896 return 1;
cparata 2:21a191bd1998 897 }
cparata 2:21a191bd1998 898
cparata 2:21a191bd1998 899 /* TIMER_HR setting */
cparata 2:21a191bd1998 900 if ( LSM6DSL_ACC_GYRO_W_TIMER_HR( (void *)this, LSM6DSL_ACC_GYRO_TIMER_HR_6_4ms ) == MEMS_ERROR )
cparata 2:21a191bd1998 901 {
cparata 2:21a191bd1998 902 return 1;
cparata 2:21a191bd1998 903 }
cparata 2:21a191bd1998 904
cparata 2:21a191bd1998 905 /* SLEEP_DUR setting */
cparata 2:21a191bd1998 906 if ( LSM6DSL_ACC_GYRO_W_SLEEP_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 907 {
cparata 2:21a191bd1998 908 return 1;
cparata 2:21a191bd1998 909 }
cparata 2:21a191bd1998 910
cparata 2:21a191bd1998 911 /* FF_THS setting */
cparata 2:21a191bd1998 912 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, LSM6DSL_ACC_GYRO_FF_THS_312mg ) == MEMS_ERROR )
cparata 2:21a191bd1998 913 {
cparata 2:21a191bd1998 914 return 1;
cparata 2:21a191bd1998 915 }
cparata 2:21a191bd1998 916
cparata 2:21a191bd1998 917 /* Enable basic Interrupts */
cparata 2:21a191bd1998 918 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 919 {
cparata 2:21a191bd1998 920 return 1;
cparata 2:21a191bd1998 921 }
cparata 2:21a191bd1998 922
cparata 7:4f512b172555 923 /* Enable free fall event on either INT1 or INT2 pin */
cparata 7:4f512b172555 924 switch (pin)
cparata 2:21a191bd1998 925 {
cparata 7:4f512b172555 926 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 927 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_FF_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 928 {
cparata 7:4f512b172555 929 return 1;
cparata 7:4f512b172555 930 }
cparata 7:4f512b172555 931 break;
cparata 7:4f512b172555 932
cparata 7:4f512b172555 933 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 934 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_FF_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 935 {
cparata 7:4f512b172555 936 return 1;
cparata 7:4f512b172555 937 }
cparata 7:4f512b172555 938 break;
cparata 7:4f512b172555 939
cparata 7:4f512b172555 940 default:
cparata 2:21a191bd1998 941 return 1;
cparata 2:21a191bd1998 942 }
cparata 2:21a191bd1998 943
cparata 2:21a191bd1998 944 return 0;
cparata 2:21a191bd1998 945 }
cparata 2:21a191bd1998 946
cparata 2:21a191bd1998 947 /**
cparata 2:21a191bd1998 948 * @brief Disable free fall detection
cparata 2:21a191bd1998 949 * @param None
cparata 2:21a191bd1998 950 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 951 */
cparata 2:21a191bd1998 952 int LSM6DSLSensor::Disable_Free_Fall_Detection(void)
cparata 2:21a191bd1998 953 {
cparata 7:4f512b172555 954 /* Disable free fall event on INT1 pin */
cparata 2:21a191bd1998 955 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_FF_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 956 {
cparata 2:21a191bd1998 957 return 1;
cparata 2:21a191bd1998 958 }
cparata 2:21a191bd1998 959
cparata 7:4f512b172555 960 /* Disable free fall event on INT2 pin */
cparata 7:4f512b172555 961 if ( LSM6DSL_ACC_GYRO_W_FFEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_FF_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 962 {
cparata 7:4f512b172555 963 return 1;
cparata 7:4f512b172555 964 }
cparata 7:4f512b172555 965
cparata 2:21a191bd1998 966 /* Disable basic Interrupts */
cparata 2:21a191bd1998 967 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 968 {
cparata 2:21a191bd1998 969 return 1;
cparata 2:21a191bd1998 970 }
cparata 2:21a191bd1998 971
cparata 2:21a191bd1998 972 /* FF_DUR setting */
cparata 2:21a191bd1998 973 if ( LSM6DSL_ACC_GYRO_W_FF_Duration( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 974 {
cparata 2:21a191bd1998 975 return 1;
cparata 2:21a191bd1998 976 }
cparata 2:21a191bd1998 977
cparata 2:21a191bd1998 978 /* FF_THS setting */
cparata 2:21a191bd1998 979 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, LSM6DSL_ACC_GYRO_FF_THS_156mg ) == MEMS_ERROR )
cparata 2:21a191bd1998 980 {
cparata 2:21a191bd1998 981 return 1;
cparata 2:21a191bd1998 982 }
cparata 2:21a191bd1998 983
cparata 2:21a191bd1998 984 return 0;
cparata 2:21a191bd1998 985 }
cparata 2:21a191bd1998 986
cparata 2:21a191bd1998 987 /**
cparata 2:21a191bd1998 988 * @brief Set the free fall detection threshold for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 989 * @param thr the threshold to be set
cparata 2:21a191bd1998 990 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 991 */
cparata 2:21a191bd1998 992 int LSM6DSLSensor::Set_Free_Fall_Threshold(uint8_t thr)
cparata 2:21a191bd1998 993 {
cparata 2:21a191bd1998 994
cparata 2:21a191bd1998 995 if ( LSM6DSL_ACC_GYRO_W_FF_THS( (void *)this, (LSM6DSL_ACC_GYRO_FF_THS_t)thr ) == MEMS_ERROR )
cparata 2:21a191bd1998 996 {
cparata 2:21a191bd1998 997 return 1;
cparata 2:21a191bd1998 998 }
cparata 2:21a191bd1998 999
cparata 2:21a191bd1998 1000 return 0;
cparata 2:21a191bd1998 1001 }
cparata 2:21a191bd1998 1002
cparata 2:21a191bd1998 1003 /**
cparata 2:21a191bd1998 1004 * @brief Enable the pedometer feature for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1005 * @note This function sets the LSM6DSL accelerometer ODR to 26Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1006 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1007 */
cparata 2:21a191bd1998 1008 int LSM6DSLSensor::Enable_Pedometer(void)
cparata 2:21a191bd1998 1009 {
cparata 2:21a191bd1998 1010 /* Output Data Rate selection */
cparata 2:21a191bd1998 1011 if( Set_X_ODR(26.0f) == 1 )
cparata 2:21a191bd1998 1012 {
cparata 2:21a191bd1998 1013 return 1;
cparata 2:21a191bd1998 1014 }
cparata 2:21a191bd1998 1015
cparata 2:21a191bd1998 1016 /* Full scale selection. */
cparata 2:21a191bd1998 1017 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1018 {
cparata 2:21a191bd1998 1019 return 1;
cparata 2:21a191bd1998 1020 }
cparata 2:21a191bd1998 1021
cparata 2:21a191bd1998 1022 /* Set pedometer threshold. */
cparata 2:21a191bd1998 1023 if ( Set_Pedometer_Threshold(LSM6DSL_PEDOMETER_THRESHOLD_MID_HIGH) == 1 )
cparata 2:21a191bd1998 1024 {
cparata 2:21a191bd1998 1025 return 1;
cparata 2:21a191bd1998 1026 }
cparata 2:21a191bd1998 1027
cparata 2:21a191bd1998 1028 /* Enable embedded functionalities. */
cparata 2:21a191bd1998 1029 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1030 {
cparata 2:21a191bd1998 1031 return 1;
cparata 2:21a191bd1998 1032 }
cparata 2:21a191bd1998 1033
cparata 2:21a191bd1998 1034 /* Enable pedometer algorithm. */
cparata 2:21a191bd1998 1035 if ( LSM6DSL_ACC_GYRO_W_PEDO( (void *)this, LSM6DSL_ACC_GYRO_PEDO_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1036 {
cparata 2:21a191bd1998 1037 return 1;
cparata 2:21a191bd1998 1038 }
cparata 2:21a191bd1998 1039
cparata 2:21a191bd1998 1040 /* Enable pedometer on INT1. */
cparata 2:21a191bd1998 1041 if ( LSM6DSL_ACC_GYRO_W_STEP_DET_on_INT1( (void *)this, LSM6DSL_ACC_GYRO_INT1_PEDO_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1042 {
cparata 2:21a191bd1998 1043 return 1;
cparata 2:21a191bd1998 1044 }
cparata 2:21a191bd1998 1045
cparata 2:21a191bd1998 1046 return 0;
cparata 2:21a191bd1998 1047 }
cparata 2:21a191bd1998 1048
cparata 2:21a191bd1998 1049 /**
cparata 2:21a191bd1998 1050 * @brief Disable the pedometer feature for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1051 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1052 */
cparata 2:21a191bd1998 1053 int LSM6DSLSensor::Disable_Pedometer(void)
cparata 2:21a191bd1998 1054 {
cparata 2:21a191bd1998 1055 /* Disable pedometer on INT1. */
cparata 2:21a191bd1998 1056 if ( LSM6DSL_ACC_GYRO_W_STEP_DET_on_INT1( (void *)this, LSM6DSL_ACC_GYRO_INT1_PEDO_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1057 {
cparata 2:21a191bd1998 1058 return 1;
cparata 2:21a191bd1998 1059 }
cparata 2:21a191bd1998 1060
cparata 2:21a191bd1998 1061 /* Disable pedometer algorithm. */
cparata 2:21a191bd1998 1062 if ( LSM6DSL_ACC_GYRO_W_PEDO( (void *)this, LSM6DSL_ACC_GYRO_PEDO_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1063 {
cparata 2:21a191bd1998 1064 return 1;
cparata 2:21a191bd1998 1065 }
cparata 2:21a191bd1998 1066
cparata 2:21a191bd1998 1067 /* Disable embedded functionalities. */
cparata 2:21a191bd1998 1068 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1069 {
cparata 2:21a191bd1998 1070 return 1;
cparata 2:21a191bd1998 1071 }
cparata 2:21a191bd1998 1072
cparata 2:21a191bd1998 1073 /* Reset pedometer threshold. */
cparata 2:21a191bd1998 1074 if ( Set_Pedometer_Threshold(0x0) == 1 )
cparata 2:21a191bd1998 1075 {
cparata 2:21a191bd1998 1076 return 1;
cparata 2:21a191bd1998 1077 }
cparata 2:21a191bd1998 1078
cparata 2:21a191bd1998 1079 return 0;
cparata 2:21a191bd1998 1080 }
cparata 2:21a191bd1998 1081
cparata 2:21a191bd1998 1082 /**
cparata 2:21a191bd1998 1083 * @brief Get the step counter for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1084 * @param step_count the pointer to the step counter
cparata 2:21a191bd1998 1085 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1086 */
cparata 2:21a191bd1998 1087 int LSM6DSLSensor::Get_Step_Counter(uint16_t *step_count)
cparata 2:21a191bd1998 1088 {
cparata 2:21a191bd1998 1089 if ( LSM6DSL_ACC_GYRO_Get_GetStepCounter( (void *)this, ( uint8_t* )step_count ) == MEMS_ERROR )
cparata 2:21a191bd1998 1090 {
cparata 2:21a191bd1998 1091 return 1;
cparata 2:21a191bd1998 1092 }
cparata 2:21a191bd1998 1093
cparata 2:21a191bd1998 1094 return 0;
cparata 2:21a191bd1998 1095 }
cparata 2:21a191bd1998 1096
cparata 2:21a191bd1998 1097 /**
cparata 2:21a191bd1998 1098 * @brief Reset of the step counter for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1099 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1100 */
cparata 2:21a191bd1998 1101 int LSM6DSLSensor::Reset_Step_Counter(void)
cparata 2:21a191bd1998 1102 {
cparata 2:21a191bd1998 1103 if ( LSM6DSL_ACC_GYRO_W_PedoStepReset( (void *)this, LSM6DSL_ACC_GYRO_PEDO_RST_STEP_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1104 {
cparata 2:21a191bd1998 1105 return 1;
cparata 2:21a191bd1998 1106 }
cparata 2:21a191bd1998 1107
cparata 2:21a191bd1998 1108 wait_ms(10);
cparata 2:21a191bd1998 1109
cparata 2:21a191bd1998 1110 if ( LSM6DSL_ACC_GYRO_W_PedoStepReset( (void *)this, LSM6DSL_ACC_GYRO_PEDO_RST_STEP_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1111 {
cparata 2:21a191bd1998 1112 return 1;
cparata 2:21a191bd1998 1113 }
cparata 2:21a191bd1998 1114
cparata 2:21a191bd1998 1115 return 0;
cparata 2:21a191bd1998 1116 }
cparata 2:21a191bd1998 1117
cparata 2:21a191bd1998 1118 /**
cparata 2:21a191bd1998 1119 * @brief Set the pedometer threshold for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1120 * @param thr the threshold to be set
cparata 2:21a191bd1998 1121 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1122 */
cparata 2:21a191bd1998 1123 int LSM6DSLSensor::Set_Pedometer_Threshold(uint8_t thr)
cparata 2:21a191bd1998 1124 {
cparata 2:21a191bd1998 1125 if ( LSM6DSL_ACC_GYRO_W_PedoThreshold( (void *)this, thr ) == MEMS_ERROR )
cparata 2:21a191bd1998 1126 {
cparata 2:21a191bd1998 1127 return 1;
cparata 2:21a191bd1998 1128 }
cparata 2:21a191bd1998 1129
cparata 2:21a191bd1998 1130 return 0;
cparata 2:21a191bd1998 1131 }
cparata 2:21a191bd1998 1132
cparata 2:21a191bd1998 1133 /**
cparata 2:21a191bd1998 1134 * @brief Enable the tilt detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1135 * @note This function sets the LSM6DSL accelerometer ODR to 26Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1136 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1137 */
cparata 2:21a191bd1998 1138 int LSM6DSLSensor::Enable_Tilt_Detection(void)
cparata 7:4f512b172555 1139 {
cparata 7:4f512b172555 1140 return Enable_Tilt_Detection(LSM6DSL_INT1_PIN);
cparata 7:4f512b172555 1141 }
cparata 7:4f512b172555 1142
cparata 7:4f512b172555 1143 /**
cparata 7:4f512b172555 1144 * @brief Enable the tilt detection for LSM6DSL accelerometer sensor
cparata 7:4f512b172555 1145 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 1146 * @note This function sets the LSM6DSL accelerometer ODR to 26Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 1147 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 1148 */
cparata 7:4f512b172555 1149 int LSM6DSLSensor::Enable_Tilt_Detection(LSM6DSL_Interrupt_Pin_t pin)
cparata 2:21a191bd1998 1150 {
cparata 2:21a191bd1998 1151 /* Output Data Rate selection */
cparata 2:21a191bd1998 1152 if( Set_X_ODR(26.0f) == 1 )
cparata 2:21a191bd1998 1153 {
cparata 2:21a191bd1998 1154 return 1;
cparata 2:21a191bd1998 1155 }
cparata 2:21a191bd1998 1156
cparata 2:21a191bd1998 1157 /* Full scale selection. */
cparata 2:21a191bd1998 1158 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1159 {
cparata 2:21a191bd1998 1160 return 1;
cparata 2:21a191bd1998 1161 }
cparata 2:21a191bd1998 1162
cparata 2:21a191bd1998 1163 /* Enable embedded functionalities */
cparata 2:21a191bd1998 1164 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1165 {
cparata 2:21a191bd1998 1166 return 1;
cparata 2:21a191bd1998 1167 }
cparata 2:21a191bd1998 1168
cparata 2:21a191bd1998 1169 /* Enable tilt calculation. */
cparata 2:21a191bd1998 1170 if ( LSM6DSL_ACC_GYRO_W_TILT( (void *)this, LSM6DSL_ACC_GYRO_TILT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1171 {
cparata 2:21a191bd1998 1172 return 1;
cparata 2:21a191bd1998 1173 }
cparata 7:4f512b172555 1174
cparata 7:4f512b172555 1175 /* Enable tilt detection on either INT1 or INT2 pin */
cparata 7:4f512b172555 1176 switch (pin)
cparata 2:21a191bd1998 1177 {
cparata 7:4f512b172555 1178 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 1179 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TILT_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1180 {
cparata 7:4f512b172555 1181 return 1;
cparata 7:4f512b172555 1182 }
cparata 7:4f512b172555 1183 break;
cparata 7:4f512b172555 1184
cparata 7:4f512b172555 1185 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 1186 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TILT_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1187 {
cparata 7:4f512b172555 1188 return 1;
cparata 7:4f512b172555 1189 }
cparata 7:4f512b172555 1190 break;
cparata 7:4f512b172555 1191
cparata 7:4f512b172555 1192 default:
cparata 2:21a191bd1998 1193 return 1;
cparata 2:21a191bd1998 1194 }
cparata 7:4f512b172555 1195
cparata 2:21a191bd1998 1196 return 0;
cparata 2:21a191bd1998 1197 }
cparata 2:21a191bd1998 1198
cparata 2:21a191bd1998 1199 /**
cparata 2:21a191bd1998 1200 * @brief Disable the tilt detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1201 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1202 */
cparata 2:21a191bd1998 1203 int LSM6DSLSensor::Disable_Tilt_Detection(void)
cparata 2:21a191bd1998 1204 {
cparata 2:21a191bd1998 1205 /* Disable tilt event on INT1. */
cparata 2:21a191bd1998 1206 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TILT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1207 {
cparata 2:21a191bd1998 1208 return 1;
cparata 2:21a191bd1998 1209 }
cparata 2:21a191bd1998 1210
cparata 7:4f512b172555 1211 /* Disable tilt event on INT2. */
cparata 7:4f512b172555 1212 if ( LSM6DSL_ACC_GYRO_W_TiltEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TILT_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1213 {
cparata 7:4f512b172555 1214 return 1;
cparata 7:4f512b172555 1215 }
cparata 7:4f512b172555 1216
cparata 2:21a191bd1998 1217 /* Disable tilt calculation. */
cparata 2:21a191bd1998 1218 if ( LSM6DSL_ACC_GYRO_W_TILT( (void *)this, LSM6DSL_ACC_GYRO_TILT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1219 {
cparata 2:21a191bd1998 1220 return 1;
cparata 2:21a191bd1998 1221 }
cparata 2:21a191bd1998 1222
cparata 2:21a191bd1998 1223 /* Disable embedded functionalities */
cparata 2:21a191bd1998 1224 if ( LSM6DSL_ACC_GYRO_W_FUNC_EN( (void *)this, LSM6DSL_ACC_GYRO_FUNC_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1225 {
cparata 2:21a191bd1998 1226 return 1;
cparata 2:21a191bd1998 1227 }
cparata 2:21a191bd1998 1228
cparata 2:21a191bd1998 1229 return 0;
cparata 2:21a191bd1998 1230 }
cparata 2:21a191bd1998 1231
cparata 2:21a191bd1998 1232 /**
cparata 2:21a191bd1998 1233 * @brief Enable the wake up detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1234 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1235 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1236 */
cparata 2:21a191bd1998 1237 int LSM6DSLSensor::Enable_Wake_Up_Detection(void)
cparata 2:21a191bd1998 1238 {
cparata 7:4f512b172555 1239 return Enable_Wake_Up_Detection(LSM6DSL_INT2_PIN);
cparata 7:4f512b172555 1240 }
cparata 7:4f512b172555 1241
cparata 7:4f512b172555 1242 /**
cparata 7:4f512b172555 1243 * @brief Enable the wake up detection for LSM6DSL accelerometer sensor
cparata 7:4f512b172555 1244 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 1245 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 1246 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 1247 */
cparata 7:4f512b172555 1248 int LSM6DSLSensor::Enable_Wake_Up_Detection(LSM6DSL_Interrupt_Pin_t pin)
cparata 7:4f512b172555 1249 {
cparata 2:21a191bd1998 1250 /* Output Data Rate selection */
cparata 2:21a191bd1998 1251 if( Set_X_ODR(416.0f) == 1 )
cparata 2:21a191bd1998 1252 {
cparata 2:21a191bd1998 1253 return 1;
cparata 2:21a191bd1998 1254 }
cparata 2:21a191bd1998 1255
cparata 2:21a191bd1998 1256 /* Full scale selection. */
cparata 2:21a191bd1998 1257 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1258 {
cparata 2:21a191bd1998 1259 return 1;
cparata 2:21a191bd1998 1260 }
cparata 2:21a191bd1998 1261
cparata 2:21a191bd1998 1262 /* WAKE_DUR setting */
cparata 2:21a191bd1998 1263 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 1264 {
cparata 2:21a191bd1998 1265 return 1;
cparata 2:21a191bd1998 1266 }
cparata 2:21a191bd1998 1267
cparata 2:21a191bd1998 1268 /* Set wake up threshold. */
cparata 2:21a191bd1998 1269 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, 0x02 ) == MEMS_ERROR )
cparata 2:21a191bd1998 1270 {
cparata 2:21a191bd1998 1271 return 1;
cparata 2:21a191bd1998 1272 }
cparata 2:21a191bd1998 1273
cparata 2:21a191bd1998 1274 /* Enable basic Interrupts */
cparata 2:21a191bd1998 1275 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1276 {
cparata 2:21a191bd1998 1277 return 1;
cparata 2:21a191bd1998 1278 }
cparata 7:4f512b172555 1279
cparata 7:4f512b172555 1280 /* Enable wake up detection on either INT1 or INT2 pin */
cparata 7:4f512b172555 1281 switch (pin)
cparata 2:21a191bd1998 1282 {
cparata 7:4f512b172555 1283 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 1284 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1285 {
cparata 7:4f512b172555 1286 return 1;
cparata 7:4f512b172555 1287 }
cparata 7:4f512b172555 1288 break;
cparata 7:4f512b172555 1289
cparata 7:4f512b172555 1290 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 1291 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1292 {
cparata 7:4f512b172555 1293 return 1;
cparata 7:4f512b172555 1294 }
cparata 7:4f512b172555 1295 break;
cparata 7:4f512b172555 1296
cparata 7:4f512b172555 1297 default:
cparata 2:21a191bd1998 1298 return 1;
cparata 2:21a191bd1998 1299 }
cparata 2:21a191bd1998 1300
cparata 2:21a191bd1998 1301 return 0;
cparata 2:21a191bd1998 1302 }
cparata 2:21a191bd1998 1303
cparata 2:21a191bd1998 1304 /**
cparata 2:21a191bd1998 1305 * @brief Disable the wake up detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1306 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1307 */
cparata 2:21a191bd1998 1308 int LSM6DSLSensor::Disable_Wake_Up_Detection(void)
cparata 2:21a191bd1998 1309 {
cparata 7:4f512b172555 1310 /* Disable wake up event on INT1 */
cparata 7:4f512b172555 1311 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1312 {
cparata 7:4f512b172555 1313 return 1;
cparata 7:4f512b172555 1314 }
cparata 7:4f512b172555 1315
cparata 7:4f512b172555 1316 /* Disable wake up event on INT2 */
cparata 5:7da0dc121ec6 1317 if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1318 {
cparata 2:21a191bd1998 1319 return 1;
cparata 2:21a191bd1998 1320 }
cparata 2:21a191bd1998 1321
cparata 2:21a191bd1998 1322 /* Disable basic Interrupts */
cparata 2:21a191bd1998 1323 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1324 {
cparata 2:21a191bd1998 1325 return 1;
cparata 2:21a191bd1998 1326 }
cparata 2:21a191bd1998 1327
cparata 2:21a191bd1998 1328 /* WU_DUR setting */
cparata 2:21a191bd1998 1329 if ( LSM6DSL_ACC_GYRO_W_WAKE_DUR( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 1330 {
cparata 2:21a191bd1998 1331 return 1;
cparata 2:21a191bd1998 1332 }
cparata 2:21a191bd1998 1333
cparata 2:21a191bd1998 1334 /* WU_THS setting */
cparata 2:21a191bd1998 1335 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, 0x00 ) == MEMS_ERROR )
cparata 2:21a191bd1998 1336 {
cparata 2:21a191bd1998 1337 return 1;
cparata 2:21a191bd1998 1338 }
cparata 2:21a191bd1998 1339
cparata 2:21a191bd1998 1340 return 0;
cparata 2:21a191bd1998 1341 }
cparata 2:21a191bd1998 1342
cparata 2:21a191bd1998 1343 /**
cparata 2:21a191bd1998 1344 * @brief Set the wake up threshold for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1345 * @param thr the threshold to be set
cparata 2:21a191bd1998 1346 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1347 */
cparata 2:21a191bd1998 1348 int LSM6DSLSensor::Set_Wake_Up_Threshold(uint8_t thr)
cparata 2:21a191bd1998 1349 {
cparata 2:21a191bd1998 1350 if ( LSM6DSL_ACC_GYRO_W_WK_THS( (void *)this, thr ) == MEMS_ERROR )
cparata 2:21a191bd1998 1351 {
cparata 2:21a191bd1998 1352 return 1;
cparata 2:21a191bd1998 1353 }
cparata 2:21a191bd1998 1354
cparata 2:21a191bd1998 1355 return 0;
cparata 2:21a191bd1998 1356 }
cparata 2:21a191bd1998 1357
cparata 2:21a191bd1998 1358 /**
cparata 2:21a191bd1998 1359 * @brief Enable the single tap detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1360 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1361 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1362 */
cparata 2:21a191bd1998 1363 int LSM6DSLSensor::Enable_Single_Tap_Detection(void)
cparata 2:21a191bd1998 1364 {
cparata 7:4f512b172555 1365 return Enable_Single_Tap_Detection(LSM6DSL_INT1_PIN);
cparata 7:4f512b172555 1366 }
cparata 7:4f512b172555 1367
cparata 7:4f512b172555 1368 /**
cparata 7:4f512b172555 1369 * @brief Enable the single tap detection for LSM6DSL accelerometer sensor
cparata 7:4f512b172555 1370 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 1371 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 1372 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 1373 */
cparata 7:4f512b172555 1374 int LSM6DSLSensor::Enable_Single_Tap_Detection(LSM6DSL_Interrupt_Pin_t pin)
cparata 7:4f512b172555 1375 {
cparata 2:21a191bd1998 1376 /* Output Data Rate selection */
cparata 2:21a191bd1998 1377 if( Set_X_ODR(416.0f) == 1 )
cparata 2:21a191bd1998 1378 {
cparata 2:21a191bd1998 1379 return 1;
cparata 2:21a191bd1998 1380 }
cparata 2:21a191bd1998 1381
cparata 2:21a191bd1998 1382 /* Full scale selection. */
cparata 2:21a191bd1998 1383 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1384 {
cparata 2:21a191bd1998 1385 return 1;
cparata 2:21a191bd1998 1386 }
cparata 2:21a191bd1998 1387
cparata 2:21a191bd1998 1388 /* Enable 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_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1390 {
cparata 2:21a191bd1998 1391 return 1;
cparata 2:21a191bd1998 1392 }
cparata 2:21a191bd1998 1393
cparata 2:21a191bd1998 1394 /* Enable Y direction in tap recognition. */
cparata 2:21a191bd1998 1395 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1396 {
cparata 2:21a191bd1998 1397 return 1;
cparata 2:21a191bd1998 1398 }
cparata 2:21a191bd1998 1399
cparata 2:21a191bd1998 1400 /* Enable Z direction in tap recognition. */
cparata 2:21a191bd1998 1401 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1402 {
cparata 2:21a191bd1998 1403 return 1;
cparata 2:21a191bd1998 1404 }
cparata 2:21a191bd1998 1405
cparata 2:21a191bd1998 1406 /* Set tap threshold. */
cparata 2:21a191bd1998 1407 if ( Set_Tap_Threshold( LSM6DSL_TAP_THRESHOLD_MID_LOW ) == 1 )
cparata 2:21a191bd1998 1408 {
cparata 2:21a191bd1998 1409 return 1;
cparata 2:21a191bd1998 1410 }
cparata 2:21a191bd1998 1411
cparata 2:21a191bd1998 1412 /* Set tap shock time window. */
cparata 2:21a191bd1998 1413 if ( Set_Tap_Shock_Time( LSM6DSL_TAP_SHOCK_TIME_MID_HIGH ) == 1 )
cparata 2:21a191bd1998 1414 {
cparata 2:21a191bd1998 1415 return 1;
cparata 2:21a191bd1998 1416 }
cparata 2:21a191bd1998 1417
cparata 2:21a191bd1998 1418 /* Set tap quiet time window. */
cparata 2:21a191bd1998 1419 if ( Set_Tap_Quiet_Time( LSM6DSL_TAP_QUIET_TIME_MID_LOW ) == 1 )
cparata 2:21a191bd1998 1420 {
cparata 2:21a191bd1998 1421 return 1;
cparata 2:21a191bd1998 1422 }
cparata 2:21a191bd1998 1423
cparata 2:21a191bd1998 1424 /* _NOTE_: Tap duration time window - don't care for single tap. */
cparata 2:21a191bd1998 1425
cparata 2:21a191bd1998 1426 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
cparata 2:21a191bd1998 1427
cparata 2:21a191bd1998 1428 /* Enable basic Interrupts */
cparata 2:21a191bd1998 1429 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1430 {
cparata 2:21a191bd1998 1431 return 1;
cparata 2:21a191bd1998 1432 }
cparata 2:21a191bd1998 1433
cparata 7:4f512b172555 1434 /* Enable single tap on either INT1 or INT2 pin */
cparata 7:4f512b172555 1435 switch (pin)
cparata 2:21a191bd1998 1436 {
cparata 7:4f512b172555 1437 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 1438 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1439 {
cparata 7:4f512b172555 1440 return 1;
cparata 7:4f512b172555 1441 }
cparata 7:4f512b172555 1442 break;
cparata 7:4f512b172555 1443
cparata 7:4f512b172555 1444 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 1445 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1446 {
cparata 7:4f512b172555 1447 return 1;
cparata 7:4f512b172555 1448 }
cparata 7:4f512b172555 1449 break;
cparata 7:4f512b172555 1450
cparata 7:4f512b172555 1451 default:
cparata 2:21a191bd1998 1452 return 1;
cparata 2:21a191bd1998 1453 }
cparata 2:21a191bd1998 1454
cparata 2:21a191bd1998 1455 return 0;
cparata 2:21a191bd1998 1456 }
cparata 2:21a191bd1998 1457
cparata 2:21a191bd1998 1458 /**
cparata 2:21a191bd1998 1459 * @brief Disable the single tap detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1460 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1461 */
cparata 2:21a191bd1998 1462 int LSM6DSLSensor::Disable_Single_Tap_Detection(void)
cparata 2:21a191bd1998 1463 {
cparata 2:21a191bd1998 1464 /* Disable single tap interrupt on INT1 pin. */
cparata 2:21a191bd1998 1465 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1466 {
cparata 2:21a191bd1998 1467 return 1;
cparata 2:21a191bd1998 1468 }
cparata 2:21a191bd1998 1469
cparata 7:4f512b172555 1470 /* Disable single tap interrupt on INT2 pin. */
cparata 7:4f512b172555 1471 if ( LSM6DSL_ACC_GYRO_W_SingleTapOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1472 {
cparata 7:4f512b172555 1473 return 1;
cparata 7:4f512b172555 1474 }
cparata 7:4f512b172555 1475
cparata 2:21a191bd1998 1476 /* Disable basic Interrupts */
cparata 2:21a191bd1998 1477 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1478 {
cparata 2:21a191bd1998 1479 return 1;
cparata 2:21a191bd1998 1480 }
cparata 2:21a191bd1998 1481
cparata 2:21a191bd1998 1482 /* Reset tap threshold. */
cparata 2:21a191bd1998 1483 if ( Set_Tap_Threshold( 0x0 ) == 1 )
cparata 2:21a191bd1998 1484 {
cparata 2:21a191bd1998 1485 return 1;
cparata 2:21a191bd1998 1486 }
cparata 2:21a191bd1998 1487
cparata 2:21a191bd1998 1488 /* Reset tap shock time window. */
cparata 2:21a191bd1998 1489 if ( Set_Tap_Shock_Time( 0x0 ) == 1 )
cparata 2:21a191bd1998 1490 {
cparata 2:21a191bd1998 1491 return 1;
cparata 2:21a191bd1998 1492 }
cparata 2:21a191bd1998 1493
cparata 2:21a191bd1998 1494 /* Reset tap quiet time window. */
cparata 2:21a191bd1998 1495 if ( Set_Tap_Quiet_Time( 0x0 ) == 1 )
cparata 2:21a191bd1998 1496 {
cparata 2:21a191bd1998 1497 return 1;
cparata 2:21a191bd1998 1498 }
cparata 2:21a191bd1998 1499
cparata 2:21a191bd1998 1500 /* _NOTE_: Tap duration time window - don't care for single tap. */
cparata 2:21a191bd1998 1501
cparata 2:21a191bd1998 1502 /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
cparata 2:21a191bd1998 1503
cparata 2:21a191bd1998 1504 /* Disable Z direction in tap recognition. */
cparata 2:21a191bd1998 1505 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1506 {
cparata 2:21a191bd1998 1507 return 1;
cparata 2:21a191bd1998 1508 }
cparata 2:21a191bd1998 1509
cparata 2:21a191bd1998 1510 /* Disable Y direction in tap recognition. */
cparata 2:21a191bd1998 1511 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1512 {
cparata 2:21a191bd1998 1513 return 1;
cparata 2:21a191bd1998 1514 }
cparata 2:21a191bd1998 1515
cparata 2:21a191bd1998 1516 /* Disable X direction in tap recognition. */
cparata 2:21a191bd1998 1517 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1518 {
cparata 2:21a191bd1998 1519 return 1;
cparata 2:21a191bd1998 1520 }
cparata 2:21a191bd1998 1521
cparata 2:21a191bd1998 1522 return 0;
cparata 2:21a191bd1998 1523 }
cparata 2:21a191bd1998 1524
cparata 2:21a191bd1998 1525 /**
cparata 2:21a191bd1998 1526 * @brief Enable the double tap detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1527 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1528 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1529 */
cparata 2:21a191bd1998 1530 int LSM6DSLSensor::Enable_Double_Tap_Detection(void)
cparata 2:21a191bd1998 1531 {
cparata 7:4f512b172555 1532 return Enable_Double_Tap_Detection(LSM6DSL_INT1_PIN);
cparata 7:4f512b172555 1533 }
cparata 7:4f512b172555 1534
cparata 7:4f512b172555 1535 /**
cparata 7:4f512b172555 1536 * @brief Enable the double tap detection for LSM6DSL accelerometer sensor
cparata 7:4f512b172555 1537 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 1538 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 1539 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 1540 */
cparata 7:4f512b172555 1541 int LSM6DSLSensor::Enable_Double_Tap_Detection(LSM6DSL_Interrupt_Pin_t pin)
cparata 7:4f512b172555 1542 {
cparata 2:21a191bd1998 1543 /* Output Data Rate selection */
cparata 2:21a191bd1998 1544 if( Set_X_ODR(416.0f) == 1 )
cparata 2:21a191bd1998 1545 {
cparata 2:21a191bd1998 1546 return 1;
cparata 2:21a191bd1998 1547 }
cparata 2:21a191bd1998 1548
cparata 2:21a191bd1998 1549 /* Full scale selection. */
cparata 2:21a191bd1998 1550 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1551 {
cparata 2:21a191bd1998 1552 return 1;
cparata 2:21a191bd1998 1553 }
cparata 2:21a191bd1998 1554
cparata 2:21a191bd1998 1555 /* Enable X direction in tap recognition. */
cparata 2:21a191bd1998 1556 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1557 {
cparata 2:21a191bd1998 1558 return 1;
cparata 2:21a191bd1998 1559 }
cparata 2:21a191bd1998 1560
cparata 2:21a191bd1998 1561 /* Enable Y direction in tap recognition. */
cparata 2:21a191bd1998 1562 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1563 {
cparata 2:21a191bd1998 1564 return 1;
cparata 2:21a191bd1998 1565 }
cparata 2:21a191bd1998 1566
cparata 2:21a191bd1998 1567 /* Enable Z direction in tap recognition. */
cparata 2:21a191bd1998 1568 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1569 {
cparata 2:21a191bd1998 1570 return 1;
cparata 2:21a191bd1998 1571 }
cparata 2:21a191bd1998 1572
cparata 2:21a191bd1998 1573 /* Set tap threshold. */
cparata 2:21a191bd1998 1574 if ( Set_Tap_Threshold( LSM6DSL_TAP_THRESHOLD_MID_LOW ) == 1 )
cparata 2:21a191bd1998 1575 {
cparata 2:21a191bd1998 1576 return 1;
cparata 2:21a191bd1998 1577 }
cparata 2:21a191bd1998 1578
cparata 2:21a191bd1998 1579 /* Set tap shock time window. */
cparata 2:21a191bd1998 1580 if ( Set_Tap_Shock_Time( LSM6DSL_TAP_SHOCK_TIME_HIGH ) == 1 )
cparata 2:21a191bd1998 1581 {
cparata 2:21a191bd1998 1582 return 1;
cparata 2:21a191bd1998 1583 }
cparata 2:21a191bd1998 1584
cparata 2:21a191bd1998 1585 /* Set tap quiet time window. */
cparata 2:21a191bd1998 1586 if ( Set_Tap_Quiet_Time( LSM6DSL_TAP_QUIET_TIME_HIGH ) == 1 )
cparata 2:21a191bd1998 1587 {
cparata 2:21a191bd1998 1588 return 1;
cparata 2:21a191bd1998 1589 }
cparata 2:21a191bd1998 1590
cparata 2:21a191bd1998 1591 /* Set tap duration time window. */
cparata 2:21a191bd1998 1592 if ( Set_Tap_Duration_Time( LSM6DSL_TAP_DURATION_TIME_MID ) == 1 )
cparata 2:21a191bd1998 1593 {
cparata 2:21a191bd1998 1594 return 1;
cparata 2:21a191bd1998 1595 }
cparata 2:21a191bd1998 1596
cparata 2:21a191bd1998 1597 /* Single and double tap enabled. */
cparata 2:21a191bd1998 1598 if ( LSM6DSL_ACC_GYRO_W_SINGLE_DOUBLE_TAP_EV( (void *)this, LSM6DSL_ACC_GYRO_SINGLE_DOUBLE_TAP_DOUBLE_TAP ) == MEMS_ERROR )
cparata 2:21a191bd1998 1599 {
cparata 2:21a191bd1998 1600 return 1;
cparata 2:21a191bd1998 1601 }
cparata 2:21a191bd1998 1602
cparata 2:21a191bd1998 1603 /* Enable basic Interrupts */
cparata 2:21a191bd1998 1604 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1605 {
cparata 2:21a191bd1998 1606 return 1;
cparata 2:21a191bd1998 1607 }
cparata 2:21a191bd1998 1608
cparata 7:4f512b172555 1609 /* Enable double tap on either INT1 or INT2 pin */
cparata 7:4f512b172555 1610 switch (pin)
cparata 2:21a191bd1998 1611 {
cparata 7:4f512b172555 1612 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 1613 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TAP_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1614 {
cparata 7:4f512b172555 1615 return 1;
cparata 7:4f512b172555 1616 }
cparata 7:4f512b172555 1617 break;
cparata 7:4f512b172555 1618
cparata 7:4f512b172555 1619 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 1620 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TAP_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1621 {
cparata 7:4f512b172555 1622 return 1;
cparata 7:4f512b172555 1623 }
cparata 7:4f512b172555 1624 break;
cparata 7:4f512b172555 1625
cparata 7:4f512b172555 1626 default:
cparata 2:21a191bd1998 1627 return 1;
cparata 2:21a191bd1998 1628 }
cparata 2:21a191bd1998 1629
cparata 2:21a191bd1998 1630 return 0;
cparata 2:21a191bd1998 1631 }
cparata 2:21a191bd1998 1632
cparata 2:21a191bd1998 1633 /**
cparata 2:21a191bd1998 1634 * @brief Disable the double tap detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1635 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1636 */
cparata 2:21a191bd1998 1637 int LSM6DSLSensor::Disable_Double_Tap_Detection(void)
cparata 2:21a191bd1998 1638 {
cparata 2:21a191bd1998 1639 /* Disable double tap interrupt on INT1 pin. */
cparata 2:21a191bd1998 1640 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_TAP_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1641 {
cparata 2:21a191bd1998 1642 return 1;
cparata 2:21a191bd1998 1643 }
cparata 2:21a191bd1998 1644
cparata 7:4f512b172555 1645 /* Disable double tap interrupt on INT2 pin. */
cparata 7:4f512b172555 1646 if ( LSM6DSL_ACC_GYRO_W_TapEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_TAP_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1647 {
cparata 7:4f512b172555 1648 return 1;
cparata 7:4f512b172555 1649 }
cparata 7:4f512b172555 1650
cparata 2:21a191bd1998 1651 /* Disable basic Interrupts */
cparata 2:21a191bd1998 1652 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1653 {
cparata 2:21a191bd1998 1654 return 1;
cparata 2:21a191bd1998 1655 }
cparata 2:21a191bd1998 1656
cparata 2:21a191bd1998 1657 /* Reset tap threshold. */
cparata 2:21a191bd1998 1658 if ( Set_Tap_Threshold( 0x0 ) == 1 )
cparata 2:21a191bd1998 1659 {
cparata 2:21a191bd1998 1660 return 1;
cparata 2:21a191bd1998 1661 }
cparata 2:21a191bd1998 1662
cparata 2:21a191bd1998 1663 /* Reset tap shock time window. */
cparata 2:21a191bd1998 1664 if ( Set_Tap_Shock_Time( 0x0 ) == 1 )
cparata 2:21a191bd1998 1665 {
cparata 2:21a191bd1998 1666 return 1;
cparata 2:21a191bd1998 1667 }
cparata 2:21a191bd1998 1668
cparata 2:21a191bd1998 1669 /* Reset tap quiet time window. */
cparata 2:21a191bd1998 1670 if ( Set_Tap_Quiet_Time( 0x0 ) == 1 )
cparata 2:21a191bd1998 1671 {
cparata 2:21a191bd1998 1672 return 1;
cparata 2:21a191bd1998 1673 }
cparata 2:21a191bd1998 1674
cparata 2:21a191bd1998 1675 /* Reset tap duration time window. */
cparata 2:21a191bd1998 1676 if ( Set_Tap_Duration_Time( 0x0 ) == 1 )
cparata 2:21a191bd1998 1677 {
cparata 2:21a191bd1998 1678 return 1;
cparata 2:21a191bd1998 1679 }
cparata 2:21a191bd1998 1680
cparata 2:21a191bd1998 1681 /* Only single tap enabled. */
cparata 2:21a191bd1998 1682 if ( LSM6DSL_ACC_GYRO_W_SINGLE_DOUBLE_TAP_EV( (void *)this, LSM6DSL_ACC_GYRO_SINGLE_DOUBLE_TAP_SINGLE_TAP ) == MEMS_ERROR )
cparata 2:21a191bd1998 1683 {
cparata 2:21a191bd1998 1684 return 1;
cparata 2:21a191bd1998 1685 }
cparata 2:21a191bd1998 1686
cparata 2:21a191bd1998 1687 /* Disable Z direction in tap recognition. */
cparata 2:21a191bd1998 1688 if ( LSM6DSL_ACC_GYRO_W_TAP_Z_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Z_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1689 {
cparata 2:21a191bd1998 1690 return 1;
cparata 2:21a191bd1998 1691 }
cparata 2:21a191bd1998 1692
cparata 2:21a191bd1998 1693 /* Disable Y direction in tap recognition. */
cparata 2:21a191bd1998 1694 if ( LSM6DSL_ACC_GYRO_W_TAP_Y_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_Y_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1695 {
cparata 2:21a191bd1998 1696 return 1;
cparata 2:21a191bd1998 1697 }
cparata 2:21a191bd1998 1698
cparata 2:21a191bd1998 1699 /* Disable X direction in tap recognition. */
cparata 2:21a191bd1998 1700 if ( LSM6DSL_ACC_GYRO_W_TAP_X_EN( (void *)this, LSM6DSL_ACC_GYRO_TAP_X_EN_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1701 {
cparata 2:21a191bd1998 1702 return 1;
cparata 2:21a191bd1998 1703 }
cparata 2:21a191bd1998 1704
cparata 2:21a191bd1998 1705 return 0;
cparata 2:21a191bd1998 1706 }
cparata 2:21a191bd1998 1707
cparata 2:21a191bd1998 1708 /**
cparata 2:21a191bd1998 1709 * @brief Set the tap threshold for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1710 * @param thr the threshold to be set
cparata 2:21a191bd1998 1711 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1712 */
cparata 2:21a191bd1998 1713 int LSM6DSLSensor::Set_Tap_Threshold(uint8_t thr)
cparata 2:21a191bd1998 1714 {
cparata 2:21a191bd1998 1715 if ( LSM6DSL_ACC_GYRO_W_TAP_THS( (void *)this, thr ) == MEMS_ERROR )
cparata 2:21a191bd1998 1716 {
cparata 2:21a191bd1998 1717 return 1;
cparata 2:21a191bd1998 1718 }
cparata 2:21a191bd1998 1719
cparata 2:21a191bd1998 1720 return 0;
cparata 2:21a191bd1998 1721 }
cparata 2:21a191bd1998 1722
cparata 2:21a191bd1998 1723 /**
cparata 2:21a191bd1998 1724 * @brief Set the tap shock time window for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1725 * @param time the shock time window to be set
cparata 2:21a191bd1998 1726 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1727 */
cparata 2:21a191bd1998 1728 int LSM6DSLSensor::Set_Tap_Shock_Time(uint8_t time)
cparata 2:21a191bd1998 1729 {
cparata 2:21a191bd1998 1730 if ( LSM6DSL_ACC_GYRO_W_SHOCK_Duration( (void *)this, time ) == MEMS_ERROR )
cparata 2:21a191bd1998 1731 {
cparata 2:21a191bd1998 1732 return 1;
cparata 2:21a191bd1998 1733 }
cparata 2:21a191bd1998 1734
cparata 2:21a191bd1998 1735 return 0;
cparata 2:21a191bd1998 1736 }
cparata 2:21a191bd1998 1737
cparata 2:21a191bd1998 1738 /**
cparata 2:21a191bd1998 1739 * @brief Set the tap quiet time window for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1740 * @param time the quiet time window to be set
cparata 2:21a191bd1998 1741 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1742 */
cparata 2:21a191bd1998 1743 int LSM6DSLSensor::Set_Tap_Quiet_Time(uint8_t time)
cparata 2:21a191bd1998 1744 {
cparata 2:21a191bd1998 1745 if ( LSM6DSL_ACC_GYRO_W_QUIET_Duration( (void *)this, time ) == MEMS_ERROR )
cparata 2:21a191bd1998 1746 {
cparata 2:21a191bd1998 1747 return 1;
cparata 2:21a191bd1998 1748 }
cparata 2:21a191bd1998 1749
cparata 2:21a191bd1998 1750 return 0;
cparata 2:21a191bd1998 1751 }
cparata 2:21a191bd1998 1752
cparata 2:21a191bd1998 1753 /**
cparata 2:21a191bd1998 1754 * @brief Set the tap duration of the time window for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1755 * @param time the duration of the time window to be set
cparata 2:21a191bd1998 1756 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1757 */
cparata 2:21a191bd1998 1758 int LSM6DSLSensor::Set_Tap_Duration_Time(uint8_t time)
cparata 2:21a191bd1998 1759 {
cparata 2:21a191bd1998 1760 if ( LSM6DSL_ACC_GYRO_W_DUR( (void *)this, time ) == MEMS_ERROR )
cparata 2:21a191bd1998 1761 {
cparata 2:21a191bd1998 1762 return 1;
cparata 2:21a191bd1998 1763 }
cparata 2:21a191bd1998 1764
cparata 2:21a191bd1998 1765 return 0;
cparata 2:21a191bd1998 1766 }
cparata 2:21a191bd1998 1767
cparata 2:21a191bd1998 1768 /**
cparata 2:21a191bd1998 1769 * @brief Enable the 6D orientation detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1770 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 2:21a191bd1998 1771 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1772 */
cparata 2:21a191bd1998 1773 int LSM6DSLSensor::Enable_6D_Orientation(void)
cparata 2:21a191bd1998 1774 {
cparata 7:4f512b172555 1775 return Enable_6D_Orientation(LSM6DSL_INT1_PIN);
cparata 7:4f512b172555 1776 }
cparata 7:4f512b172555 1777
cparata 7:4f512b172555 1778 /**
cparata 7:4f512b172555 1779 * @brief Enable the 6D orientation detection for LSM6DSL accelerometer sensor
cparata 7:4f512b172555 1780 * @param pin the interrupt pin to be used
cparata 7:4f512b172555 1781 * @note This function sets the LSM6DSL accelerometer ODR to 416Hz and the LSM6DSL accelerometer full scale to 2g
cparata 7:4f512b172555 1782 * @retval 0 in case of success, an error code otherwise
cparata 7:4f512b172555 1783 */
cparata 7:4f512b172555 1784 int LSM6DSLSensor::Enable_6D_Orientation(LSM6DSL_Interrupt_Pin_t pin)
cparata 7:4f512b172555 1785 {
cparata 2:21a191bd1998 1786 /* Output Data Rate selection */
cparata 2:21a191bd1998 1787 if( Set_X_ODR(416.0f) == 1 )
cparata 2:21a191bd1998 1788 {
cparata 2:21a191bd1998 1789 return 1;
cparata 2:21a191bd1998 1790 }
cparata 2:21a191bd1998 1791
cparata 2:21a191bd1998 1792 /* Full scale selection. */
cparata 2:21a191bd1998 1793 if( Set_X_FS(2.0f) == 1 )
cparata 2:21a191bd1998 1794 {
cparata 2:21a191bd1998 1795 return 1;
cparata 2:21a191bd1998 1796 }
cparata 2:21a191bd1998 1797
cparata 2:21a191bd1998 1798 /* Set 6D threshold. */
cparata 2:21a191bd1998 1799 if ( LSM6DSL_ACC_GYRO_W_SIXD_THS( (void *)this, LSM6DSL_ACC_GYRO_SIXD_THS_60_degree ) == MEMS_ERROR )
cparata 2:21a191bd1998 1800 {
cparata 2:21a191bd1998 1801 return 1;
cparata 2:21a191bd1998 1802 }
cparata 2:21a191bd1998 1803
cparata 2:21a191bd1998 1804 /* Enable basic Interrupts */
cparata 2:21a191bd1998 1805 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1806 {
cparata 2:21a191bd1998 1807 return 1;
cparata 2:21a191bd1998 1808 }
cparata 2:21a191bd1998 1809
cparata 7:4f512b172555 1810 /* Enable 6D orientation on either INT1 or INT2 pin */
cparata 7:4f512b172555 1811 switch (pin)
cparata 2:21a191bd1998 1812 {
cparata 7:4f512b172555 1813 case LSM6DSL_INT1_PIN:
cparata 7:4f512b172555 1814 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_6D_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1815 {
cparata 7:4f512b172555 1816 return 1;
cparata 7:4f512b172555 1817 }
cparata 7:4f512b172555 1818 break;
cparata 7:4f512b172555 1819
cparata 7:4f512b172555 1820 case LSM6DSL_INT2_PIN:
cparata 7:4f512b172555 1821 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_6D_ENABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1822 {
cparata 7:4f512b172555 1823 return 1;
cparata 7:4f512b172555 1824 }
cparata 7:4f512b172555 1825 break;
cparata 7:4f512b172555 1826
cparata 7:4f512b172555 1827 default:
cparata 2:21a191bd1998 1828 return 1;
cparata 2:21a191bd1998 1829 }
cparata 2:21a191bd1998 1830
cparata 2:21a191bd1998 1831 return 0;
cparata 2:21a191bd1998 1832 }
cparata 2:21a191bd1998 1833
cparata 2:21a191bd1998 1834 /**
cparata 2:21a191bd1998 1835 * @brief Disable the 6D orientation detection for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1836 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1837 */
cparata 2:21a191bd1998 1838 int LSM6DSLSensor::Disable_6D_Orientation(void)
cparata 2:21a191bd1998 1839 {
cparata 7:4f512b172555 1840 /* Disable 6D orientation interrupt on INT1 pin. */
cparata 2:21a191bd1998 1841 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_6D_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1842 {
cparata 2:21a191bd1998 1843 return 1;
cparata 2:21a191bd1998 1844 }
cparata 2:21a191bd1998 1845
cparata 7:4f512b172555 1846 /* Disable 6D orientation interrupt on INT2 pin. */
cparata 7:4f512b172555 1847 if ( LSM6DSL_ACC_GYRO_W_6DEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_6D_DISABLED ) == MEMS_ERROR )
cparata 7:4f512b172555 1848 {
cparata 7:4f512b172555 1849 return 1;
cparata 7:4f512b172555 1850 }
cparata 7:4f512b172555 1851
cparata 2:21a191bd1998 1852 /* Disable basic Interrupts */
cparata 2:21a191bd1998 1853 if ( LSM6DSL_ACC_GYRO_W_BASIC_INT( (void *)this, LSM6DSL_ACC_GYRO_BASIC_INT_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 1854 {
cparata 2:21a191bd1998 1855 return 1;
cparata 2:21a191bd1998 1856 }
cparata 2:21a191bd1998 1857
cparata 2:21a191bd1998 1858 /* Reset 6D threshold. */
cparata 2:21a191bd1998 1859 if ( LSM6DSL_ACC_GYRO_W_SIXD_THS( (void *)this, LSM6DSL_ACC_GYRO_SIXD_THS_80_degree ) == MEMS_ERROR )
cparata 2:21a191bd1998 1860 {
cparata 2:21a191bd1998 1861 return 1;
cparata 2:21a191bd1998 1862 }
cparata 2:21a191bd1998 1863
cparata 2:21a191bd1998 1864 return 0;
cparata 2:21a191bd1998 1865 }
cparata 2:21a191bd1998 1866
cparata 2:21a191bd1998 1867 /**
cparata 2:21a191bd1998 1868 * @brief Get the 6D orientation XL axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1869 * @param xl the pointer to the 6D orientation XL axis
cparata 2:21a191bd1998 1870 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1871 */
cparata 2:21a191bd1998 1872 int LSM6DSLSensor::Get_6D_Orientation_XL(uint8_t *xl)
cparata 2:21a191bd1998 1873 {
cparata 2:21a191bd1998 1874 LSM6DSL_ACC_GYRO_DSD_XL_t xl_raw;
cparata 2:21a191bd1998 1875
cparata 2:21a191bd1998 1876 if ( LSM6DSL_ACC_GYRO_R_DSD_XL( (void *)this, &xl_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 1877 {
cparata 2:21a191bd1998 1878 return 1;
cparata 2:21a191bd1998 1879 }
cparata 2:21a191bd1998 1880
cparata 2:21a191bd1998 1881 switch( xl_raw )
cparata 2:21a191bd1998 1882 {
cparata 2:21a191bd1998 1883 case LSM6DSL_ACC_GYRO_DSD_XL_DETECTED:
cparata 2:21a191bd1998 1884 *xl = 1;
cparata 2:21a191bd1998 1885 break;
cparata 2:21a191bd1998 1886 case LSM6DSL_ACC_GYRO_DSD_XL_NOT_DETECTED:
cparata 2:21a191bd1998 1887 *xl = 0;
cparata 2:21a191bd1998 1888 break;
cparata 2:21a191bd1998 1889 default:
cparata 2:21a191bd1998 1890 return 1;
cparata 2:21a191bd1998 1891 }
cparata 2:21a191bd1998 1892
cparata 2:21a191bd1998 1893 return 0;
cparata 2:21a191bd1998 1894 }
cparata 2:21a191bd1998 1895
cparata 2:21a191bd1998 1896 /**
cparata 2:21a191bd1998 1897 * @brief Get the 6D orientation XH axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1898 * @param xh the pointer to the 6D orientation XH axis
cparata 2:21a191bd1998 1899 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1900 */
cparata 2:21a191bd1998 1901 int LSM6DSLSensor::Get_6D_Orientation_XH(uint8_t *xh)
cparata 2:21a191bd1998 1902 {
cparata 2:21a191bd1998 1903 LSM6DSL_ACC_GYRO_DSD_XH_t xh_raw;
cparata 2:21a191bd1998 1904
cparata 2:21a191bd1998 1905 if ( LSM6DSL_ACC_GYRO_R_DSD_XH( (void *)this, &xh_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 1906 {
cparata 2:21a191bd1998 1907 return 1;
cparata 2:21a191bd1998 1908 }
cparata 2:21a191bd1998 1909
cparata 2:21a191bd1998 1910 switch( xh_raw )
cparata 2:21a191bd1998 1911 {
cparata 2:21a191bd1998 1912 case LSM6DSL_ACC_GYRO_DSD_XH_DETECTED:
cparata 2:21a191bd1998 1913 *xh = 1;
cparata 2:21a191bd1998 1914 break;
cparata 2:21a191bd1998 1915 case LSM6DSL_ACC_GYRO_DSD_XH_NOT_DETECTED:
cparata 2:21a191bd1998 1916 *xh = 0;
cparata 2:21a191bd1998 1917 break;
cparata 2:21a191bd1998 1918 default:
cparata 2:21a191bd1998 1919 return 1;
cparata 2:21a191bd1998 1920 }
cparata 2:21a191bd1998 1921
cparata 2:21a191bd1998 1922 return 0;
cparata 2:21a191bd1998 1923 }
cparata 2:21a191bd1998 1924
cparata 2:21a191bd1998 1925 /**
cparata 2:21a191bd1998 1926 * @brief Get the 6D orientation YL axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1927 * @param yl the pointer to the 6D orientation YL axis
cparata 2:21a191bd1998 1928 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1929 */
cparata 2:21a191bd1998 1930 int LSM6DSLSensor::Get_6D_Orientation_YL(uint8_t *yl)
cparata 2:21a191bd1998 1931 {
cparata 2:21a191bd1998 1932 LSM6DSL_ACC_GYRO_DSD_YL_t yl_raw;
cparata 2:21a191bd1998 1933
cparata 2:21a191bd1998 1934 if ( LSM6DSL_ACC_GYRO_R_DSD_YL( (void *)this, &yl_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 1935 {
cparata 2:21a191bd1998 1936 return 1;
cparata 2:21a191bd1998 1937 }
cparata 2:21a191bd1998 1938
cparata 2:21a191bd1998 1939 switch( yl_raw )
cparata 2:21a191bd1998 1940 {
cparata 2:21a191bd1998 1941 case LSM6DSL_ACC_GYRO_DSD_YL_DETECTED:
cparata 2:21a191bd1998 1942 *yl = 1;
cparata 2:21a191bd1998 1943 break;
cparata 2:21a191bd1998 1944 case LSM6DSL_ACC_GYRO_DSD_YL_NOT_DETECTED:
cparata 2:21a191bd1998 1945 *yl = 0;
cparata 2:21a191bd1998 1946 break;
cparata 2:21a191bd1998 1947 default:
cparata 2:21a191bd1998 1948 return 1;
cparata 2:21a191bd1998 1949 }
cparata 2:21a191bd1998 1950
cparata 2:21a191bd1998 1951 return 0;
cparata 2:21a191bd1998 1952 }
cparata 2:21a191bd1998 1953
cparata 2:21a191bd1998 1954 /**
cparata 2:21a191bd1998 1955 * @brief Get the 6D orientation YH axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1956 * @param yh the pointer to the 6D orientation YH axis
cparata 2:21a191bd1998 1957 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1958 */
cparata 2:21a191bd1998 1959 int LSM6DSLSensor::Get_6D_Orientation_YH(uint8_t *yh)
cparata 2:21a191bd1998 1960 {
cparata 2:21a191bd1998 1961 LSM6DSL_ACC_GYRO_DSD_YH_t yh_raw;
cparata 2:21a191bd1998 1962
cparata 2:21a191bd1998 1963 if ( LSM6DSL_ACC_GYRO_R_DSD_YH( (void *)this, &yh_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 1964 {
cparata 2:21a191bd1998 1965 return 1;
cparata 2:21a191bd1998 1966 }
cparata 2:21a191bd1998 1967
cparata 2:21a191bd1998 1968 switch( yh_raw )
cparata 2:21a191bd1998 1969 {
cparata 2:21a191bd1998 1970 case LSM6DSL_ACC_GYRO_DSD_YH_DETECTED:
cparata 2:21a191bd1998 1971 *yh = 1;
cparata 2:21a191bd1998 1972 break;
cparata 2:21a191bd1998 1973 case LSM6DSL_ACC_GYRO_DSD_YH_NOT_DETECTED:
cparata 2:21a191bd1998 1974 *yh = 0;
cparata 2:21a191bd1998 1975 break;
cparata 2:21a191bd1998 1976 default:
cparata 2:21a191bd1998 1977 return 1;
cparata 2:21a191bd1998 1978 }
cparata 2:21a191bd1998 1979
cparata 2:21a191bd1998 1980 return 0;
cparata 2:21a191bd1998 1981 }
cparata 2:21a191bd1998 1982
cparata 2:21a191bd1998 1983 /**
cparata 2:21a191bd1998 1984 * @brief Get the 6D orientation ZL axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 1985 * @param zl the pointer to the 6D orientation ZL axis
cparata 2:21a191bd1998 1986 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 1987 */
cparata 2:21a191bd1998 1988 int LSM6DSLSensor::Get_6D_Orientation_ZL(uint8_t *zl)
cparata 2:21a191bd1998 1989 {
cparata 2:21a191bd1998 1990 LSM6DSL_ACC_GYRO_DSD_ZL_t zl_raw;
cparata 2:21a191bd1998 1991
cparata 2:21a191bd1998 1992 if ( LSM6DSL_ACC_GYRO_R_DSD_ZL( (void *)this, &zl_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 1993 {
cparata 2:21a191bd1998 1994 return 1;
cparata 2:21a191bd1998 1995 }
cparata 2:21a191bd1998 1996
cparata 2:21a191bd1998 1997 switch( zl_raw )
cparata 2:21a191bd1998 1998 {
cparata 2:21a191bd1998 1999 case LSM6DSL_ACC_GYRO_DSD_ZL_DETECTED:
cparata 2:21a191bd1998 2000 *zl = 1;
cparata 2:21a191bd1998 2001 break;
cparata 2:21a191bd1998 2002 case LSM6DSL_ACC_GYRO_DSD_ZL_NOT_DETECTED:
cparata 2:21a191bd1998 2003 *zl = 0;
cparata 2:21a191bd1998 2004 break;
cparata 2:21a191bd1998 2005 default:
cparata 2:21a191bd1998 2006 return 1;
cparata 2:21a191bd1998 2007 }
cparata 2:21a191bd1998 2008
cparata 2:21a191bd1998 2009 return 0;
cparata 2:21a191bd1998 2010 }
cparata 2:21a191bd1998 2011
cparata 2:21a191bd1998 2012 /**
cparata 2:21a191bd1998 2013 * @brief Get the 6D orientation ZH axis for LSM6DSL accelerometer sensor
cparata 2:21a191bd1998 2014 * @param zh the pointer to the 6D orientation ZH axis
cparata 2:21a191bd1998 2015 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 2016 */
cparata 2:21a191bd1998 2017 int LSM6DSLSensor::Get_6D_Orientation_ZH(uint8_t *zh)
cparata 2:21a191bd1998 2018 {
cparata 2:21a191bd1998 2019 LSM6DSL_ACC_GYRO_DSD_ZH_t zh_raw;
cparata 2:21a191bd1998 2020
cparata 2:21a191bd1998 2021 if ( LSM6DSL_ACC_GYRO_R_DSD_ZH( (void *)this, &zh_raw ) == MEMS_ERROR )
cparata 2:21a191bd1998 2022 {
cparata 2:21a191bd1998 2023 return 1;
cparata 2:21a191bd1998 2024 }
cparata 2:21a191bd1998 2025
cparata 2:21a191bd1998 2026 switch( zh_raw )
cparata 2:21a191bd1998 2027 {
cparata 2:21a191bd1998 2028 case LSM6DSL_ACC_GYRO_DSD_ZH_DETECTED:
cparata 2:21a191bd1998 2029 *zh = 1;
cparata 2:21a191bd1998 2030 break;
cparata 2:21a191bd1998 2031 case LSM6DSL_ACC_GYRO_DSD_ZH_NOT_DETECTED:
cparata 2:21a191bd1998 2032 *zh = 0;
cparata 2:21a191bd1998 2033 break;
cparata 2:21a191bd1998 2034 default:
cparata 2:21a191bd1998 2035 return 1;
cparata 2:21a191bd1998 2036 }
cparata 2:21a191bd1998 2037
cparata 2:21a191bd1998 2038 return 0;
cparata 2:21a191bd1998 2039 }
cparata 2:21a191bd1998 2040
cparata 2:21a191bd1998 2041 /**
cparata 4:05f28412d61b 2042 * @brief Get the status of all hardware events for LSM6DSL accelerometer sensor
cparata 4:05f28412d61b 2043 * @param status the pointer to the status of all hardware events
cparata 4:05f28412d61b 2044 * @retval 0 in case of success, an error code otherwise
cparata 4:05f28412d61b 2045 */
cparata 4:05f28412d61b 2046 int LSM6DSLSensor::Get_Event_Status(LSM6DSL_Event_Status_t *status)
cparata 4:05f28412d61b 2047 {
cparata 5:7da0dc121ec6 2048 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 2049
cparata 4:05f28412d61b 2050 memset((void *)status, 0x0, sizeof(LSM6DSL_Event_Status_t));
cparata 4:05f28412d61b 2051
cparata 4:05f28412d61b 2052 if(ReadReg(LSM6DSL_ACC_GYRO_WAKE_UP_SRC, &Wake_Up_Src) != 0)
cparata 4:05f28412d61b 2053 {
cparata 4:05f28412d61b 2054 return 1;
cparata 4:05f28412d61b 2055 }
cparata 4:05f28412d61b 2056
cparata 4:05f28412d61b 2057 if(ReadReg(LSM6DSL_ACC_GYRO_TAP_SRC, &Tap_Src) != 0)
cparata 4:05f28412d61b 2058 {
cparata 4:05f28412d61b 2059 return 1;
cparata 4:05f28412d61b 2060 }
cparata 4:05f28412d61b 2061
cparata 4:05f28412d61b 2062 if(ReadReg(LSM6DSL_ACC_GYRO_D6D_SRC, &D6D_Src) != 0)
cparata 4:05f28412d61b 2063 {
cparata 4:05f28412d61b 2064 return 1;
cparata 4:05f28412d61b 2065 }
cparata 4:05f28412d61b 2066
cparata 4:05f28412d61b 2067 if(ReadReg(LSM6DSL_ACC_GYRO_FUNC_SRC, &Func_Src) != 0)
cparata 4:05f28412d61b 2068 {
cparata 4:05f28412d61b 2069 return 1;
cparata 4:05f28412d61b 2070 }
cparata 4:05f28412d61b 2071
cparata 5:7da0dc121ec6 2072 if(ReadReg(LSM6DSL_ACC_GYRO_MD1_CFG, &Md1_Cfg ) != 0 )
cparata 5:7da0dc121ec6 2073 {
cparata 5:7da0dc121ec6 2074 return 1;
cparata 5:7da0dc121ec6 2075 }
cparata 5:7da0dc121ec6 2076
cparata 5:7da0dc121ec6 2077 if(ReadReg(LSM6DSL_ACC_GYRO_MD2_CFG, &Md2_Cfg ) != 0)
cparata 4:05f28412d61b 2078 {
cparata 5:7da0dc121ec6 2079 return 1;
cparata 5:7da0dc121ec6 2080 }
cparata 5:7da0dc121ec6 2081
cparata 5:7da0dc121ec6 2082 if(ReadReg(LSM6DSL_ACC_GYRO_INT1_CTRL, &Int1_Ctrl ) != 0)
cparata 5:7da0dc121ec6 2083 {
cparata 5:7da0dc121ec6 2084 return 1;
cparata 4:05f28412d61b 2085 }
cparata 4:05f28412d61b 2086
cparata 7:4f512b172555 2087 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_FF_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_FF_MASK))
cparata 4:05f28412d61b 2088 {
cparata 5:7da0dc121ec6 2089 if((Wake_Up_Src & LSM6DSL_ACC_GYRO_FF_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2090 {
cparata 5:7da0dc121ec6 2091 status->FreeFallStatus = 1;
cparata 5:7da0dc121ec6 2092 }
cparata 4:05f28412d61b 2093 }
cparata 4:05f28412d61b 2094
cparata 7:4f512b172555 2095 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_WU_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_WU_MASK))
cparata 4:05f28412d61b 2096 {
cparata 5:7da0dc121ec6 2097 if((Wake_Up_Src & LSM6DSL_ACC_GYRO_WU_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2098 {
cparata 5:7da0dc121ec6 2099 status->WakeUpStatus = 1;
cparata 5:7da0dc121ec6 2100 }
cparata 4:05f28412d61b 2101 }
cparata 4:05f28412d61b 2102
cparata 7:4f512b172555 2103 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_SINGLE_TAP_MASK))
cparata 4:05f28412d61b 2104 {
cparata 5:7da0dc121ec6 2105 if((Tap_Src & LSM6DSL_ACC_GYRO_SINGLE_TAP_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2106 {
cparata 5:7da0dc121ec6 2107 status->TapStatus = 1;
cparata 5:7da0dc121ec6 2108 }
cparata 5:7da0dc121ec6 2109 }
cparata 5:7da0dc121ec6 2110
cparata 7:4f512b172555 2111 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TAP_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_TAP_MASK))
cparata 5:7da0dc121ec6 2112 {
cparata 5:7da0dc121ec6 2113 if((Tap_Src & LSM6DSL_ACC_GYRO_DOUBLE_TAP_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2114 {
cparata 5:7da0dc121ec6 2115 status->DoubleTapStatus = 1;
cparata 5:7da0dc121ec6 2116 }
cparata 4:05f28412d61b 2117 }
cparata 4:05f28412d61b 2118
cparata 7:4f512b172555 2119 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_6D_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_6D_MASK))
cparata 4:05f28412d61b 2120 {
cparata 5:7da0dc121ec6 2121 if((D6D_Src & LSM6DSL_ACC_GYRO_D6D_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2122 {
cparata 5:7da0dc121ec6 2123 status->D6DOrientationStatus = 1;
cparata 5:7da0dc121ec6 2124 }
cparata 4:05f28412d61b 2125 }
cparata 4:05f28412d61b 2126
cparata 7:4f512b172555 2127 if((Int1_Ctrl & LSM6DSL_ACC_GYRO_INT1_PEDO_MASK))
cparata 4:05f28412d61b 2128 {
cparata 5:7da0dc121ec6 2129 if((Func_Src & LSM6DSL_ACC_GYRO_PEDO_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2130 {
cparata 5:7da0dc121ec6 2131 status->StepStatus = 1;
cparata 5:7da0dc121ec6 2132 }
cparata 4:05f28412d61b 2133 }
cparata 4:05f28412d61b 2134
cparata 7:4f512b172555 2135 if((Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TILT_MASK) || (Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_TILT_MASK))
cparata 4:05f28412d61b 2136 {
cparata 5:7da0dc121ec6 2137 if((Func_Src & LSM6DSL_ACC_GYRO_TILT_EV_STATUS_MASK))
cparata 5:7da0dc121ec6 2138 {
cparata 5:7da0dc121ec6 2139 status->TiltStatus = 1;
cparata 5:7da0dc121ec6 2140 }
cparata 4:05f28412d61b 2141 }
cparata 4:05f28412d61b 2142
cparata 4:05f28412d61b 2143 return 0;
cparata 4:05f28412d61b 2144 }
cparata 4:05f28412d61b 2145
cparata 4:05f28412d61b 2146 /**
cparata 2:21a191bd1998 2147 * @brief Read the data from register
cparata 2:21a191bd1998 2148 * @param reg register address
cparata 2:21a191bd1998 2149 * @param data register data
cparata 4:05f28412d61b 2150 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 2151 */
cparata 2:21a191bd1998 2152 int LSM6DSLSensor::ReadReg( uint8_t reg, uint8_t *data )
cparata 2:21a191bd1998 2153 {
cparata 2:21a191bd1998 2154
cparata 2:21a191bd1998 2155 if ( LSM6DSL_ACC_GYRO_ReadReg( (void *)this, reg, data, 1 ) == MEMS_ERROR )
cparata 2:21a191bd1998 2156 {
cparata 2:21a191bd1998 2157 return 1;
cparata 2:21a191bd1998 2158 }
cparata 2:21a191bd1998 2159
cparata 2:21a191bd1998 2160 return 0;
cparata 2:21a191bd1998 2161 }
cparata 2:21a191bd1998 2162
cparata 2:21a191bd1998 2163 /**
cparata 2:21a191bd1998 2164 * @brief Write the data to register
cparata 2:21a191bd1998 2165 * @param reg register address
cparata 2:21a191bd1998 2166 * @param data register data
cparata 4:05f28412d61b 2167 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 2168 */
cparata 2:21a191bd1998 2169 int LSM6DSLSensor::WriteReg( uint8_t reg, uint8_t data )
cparata 2:21a191bd1998 2170 {
cparata 2:21a191bd1998 2171
cparata 2:21a191bd1998 2172 if ( LSM6DSL_ACC_GYRO_WriteReg( (void *)this, reg, &data, 1 ) == MEMS_ERROR )
cparata 2:21a191bd1998 2173 {
cparata 2:21a191bd1998 2174 return 1;
cparata 2:21a191bd1998 2175 }
cparata 2:21a191bd1998 2176
cparata 2:21a191bd1998 2177 return 0;
cparata 2:21a191bd1998 2178 }
cparata 2:21a191bd1998 2179
cparata 2:21a191bd1998 2180
cparata 2:21a191bd1998 2181 uint8_t LSM6DSL_IO_Write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
cparata 2:21a191bd1998 2182 {
cparata 2:21a191bd1998 2183 return ((LSM6DSLSensor *)handle)->IO_Write(pBuffer, WriteAddr, nBytesToWrite);
cparata 2:21a191bd1998 2184 }
cparata 2:21a191bd1998 2185
cparata 2:21a191bd1998 2186 uint8_t LSM6DSL_IO_Read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
cparata 2:21a191bd1998 2187 {
cparata 2:21a191bd1998 2188 return ((LSM6DSLSensor *)handle)->IO_Read(pBuffer, ReadAddr, nBytesToRead);
cparata 2:21a191bd1998 2189 }