Garage Door Monitor and Opener

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Introduction

This system implements a simple garage door opener and environmental monitor. The hardware connects to the internet using Wi-Fi then on to the Pelion Device Management Platform which provides device monitoring and secure firmware updates over the air (FOTA). Pelion Device Management provides a flexible set of REST APIs which we will use to communicate to a web application running on an EC-2 instance in AWS. The web application will serve a web page where we can monitor and control our garage..

This project is intended to work on the DISCO-L475VG-IOT01A from ST Microelectronics It implements a simple actuator to drive a relay to simulate pushing the "open" button on older style garage doors which do not use a rolling code interface.

The system is designed to be mounted over the door so that the on board time of flight sensor can be used to detect if the door is open or closed.

The system also monitors temperature, humidity and barometric pressure.

https://os.mbed.com/media/uploads/JimCarver/garageopener.jpg

Hardware Requirements:

DISCO-L475G-IOT01A https://os.mbed.com/platforms/ST-Discovery-L475E-IOT01A/

Seeed Studio Grove Relay module https://www.seeedstudio.com/Grove-Relay.html

Seeed Studio Grove cable, I used this one: https://www.seeedstudio.com/Grove-4-pin-Male-Jumper-to-Grove-4-pin-Conversion-Cable-5-PCs-per-Pack.html

Connect to the PMOD connector like this:

https://os.mbed.com/media/uploads/JimCarver/opener.jpg

This shows how I installed so that the time of flight sensor can detect when the door is open

https://os.mbed.com/media/uploads/JimCarver/opener1.jpg https://os.mbed.com/media/uploads/JimCarver/opener2.jpg

To use the project:

You will also need a Pelion developers account.

I suggest you first use the Pelion quick state to become familiar with Pelion Device Management. https://os.mbed.com/guides/connect-device-to-pelion/1/?board=ST-Discovery-L475E-IOT01A

Web Interface

For my web interface I am running node-red under Ubuntu in an EC2 instance on AWS. This can run for 12 month within the constraints of their free tier. Here is a tutorial: https://nodered.org/docs/getting-started/aws

You will also need to install several node-red add ons:

sudo npm install -g node-red-dashboard

sudo npm install -g node-red-contrib-mbed-cloud

sudo npm istall -g node-red-contrib-moment

After starting node-red import the contents of GarageFlow.txt from the project, pin the flow into the page.

To enable your web app to access your Pelion account you need an API key.

First you will neet to use your Pelion account to create an API key.

https://os.mbed.com/media/uploads/JimCarver/api_portal.jpg

Now we need to apply that API key to your Node-Red flow.

https://os.mbed.com/media/uploads/JimCarver/api_node-red.jpg

Committer:
JimCarver
Date:
Thu Dec 05 19:03:48 2019 +0000
Revision:
37:ec1124e5ec1f
Parent:
18:a15bfe7aaebd
Bug fix

Who changed what in which revision?

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