ST / IIS2DLPC

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
cparata
Date:
Wed Nov 21 15:51:50 2018 +0000
Revision:
2:28ad92a16a36
Parent:
0:13631b50eae6
Update PID files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:13631b50eae6 1 /**
cparata 0:13631b50eae6 2 ******************************************************************************
cparata 0:13631b50eae6 3 * @file IIS2DLPCSensor.cpp
cparata 0:13631b50eae6 4 * @author CLab
cparata 0:13631b50eae6 5 * @version V1.0.0
cparata 0:13631b50eae6 6 * @date 15 November 2018
cparata 0:13631b50eae6 7 * @brief Implementation of an IIS2DLPC Inertial Measurement Unit (IMU) 3 axes
cparata 0:13631b50eae6 8 * sensor.
cparata 0:13631b50eae6 9 ******************************************************************************
cparata 0:13631b50eae6 10 * @attention
cparata 0:13631b50eae6 11 *
cparata 0:13631b50eae6 12 * <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
cparata 0:13631b50eae6 13 *
cparata 0:13631b50eae6 14 * Redistribution and use in source and binary forms, with or without modification,
cparata 0:13631b50eae6 15 * are permitted provided that the following conditions are met:
cparata 0:13631b50eae6 16 * 1. Redistributions of source code must retain the above copyright notice,
cparata 0:13631b50eae6 17 * this list of conditions and the following disclaimer.
cparata 0:13631b50eae6 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 0:13631b50eae6 19 * this list of conditions and the following disclaimer in the documentation
cparata 0:13631b50eae6 20 * and/or other materials provided with the distribution.
cparata 0:13631b50eae6 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 0:13631b50eae6 22 * may be used to endorse or promote products derived from this software
cparata 0:13631b50eae6 23 * without specific prior written permission.
cparata 0:13631b50eae6 24 *
cparata 0:13631b50eae6 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 0:13631b50eae6 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 0:13631b50eae6 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 0:13631b50eae6 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 0:13631b50eae6 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 0:13631b50eae6 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 0:13631b50eae6 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 0:13631b50eae6 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 0:13631b50eae6 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 0:13631b50eae6 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 0:13631b50eae6 35 *
cparata 0:13631b50eae6 36 ******************************************************************************
cparata 0:13631b50eae6 37 */
cparata 0:13631b50eae6 38
cparata 0:13631b50eae6 39
cparata 0:13631b50eae6 40 /* Includes ------------------------------------------------------------------*/
cparata 0:13631b50eae6 41
cparata 0:13631b50eae6 42 #include "IIS2DLPCSensor.h"
cparata 0:13631b50eae6 43
cparata 0:13631b50eae6 44
cparata 0:13631b50eae6 45 /* Class Implementation ------------------------------------------------------*/
cparata 0:13631b50eae6 46
cparata 0:13631b50eae6 47 /** Constructor
cparata 0:13631b50eae6 48 * @param i2c object of an helper class which handles the I2C peripheral
cparata 0:13631b50eae6 49 * @param address the address of the component's instance
cparata 0:13631b50eae6 50 * @param int1_pin the interrupt 1 pin
cparata 0:13631b50eae6 51 * @param int2_pin the interrupt 2 pin
cparata 0:13631b50eae6 52 */
cparata 0:13631b50eae6 53 IIS2DLPCSensor::IIS2DLPCSensor(DevI2C *i2c, uint8_t address, PinName int1_pin, PinName int2_pin) :
cparata 0:13631b50eae6 54 _dev_i2c(i2c), _address(address), _cs_pin(NC), _int1_irq(int1_pin), _int2_irq(int2_pin)
cparata 0:13631b50eae6 55 {
cparata 0:13631b50eae6 56 assert (i2c);
cparata 0:13631b50eae6 57 _dev_spi = NULL;
cparata 0:13631b50eae6 58 _reg_ctx.write_reg = IIS2DLPC_io_write;
cparata 0:13631b50eae6 59 _reg_ctx.read_reg = IIS2DLPC_io_read;
cparata 0:13631b50eae6 60 _reg_ctx.handle = (void *)this;
cparata 0:13631b50eae6 61 }
cparata 0:13631b50eae6 62
cparata 0:13631b50eae6 63 /** Constructor
cparata 0:13631b50eae6 64 * @param spi object of an helper class which handles the SPI peripheral
cparata 0:13631b50eae6 65 * @param cs_pin the chip select pin
cparata 0:13631b50eae6 66 * @param int1_pin the interrupt 1 pin
cparata 0:13631b50eae6 67 * @param int2_pin the interrupt 2 pin
cparata 0:13631b50eae6 68 * @param spi_type the SPI type (4-Wires or 3-Wires)
cparata 0:13631b50eae6 69 */
cparata 0:13631b50eae6 70 IIS2DLPCSensor::IIS2DLPCSensor(SPI *spi, PinName cs_pin, PinName int1_pin, PinName int2_pin, SPI_type_t spi_type ) :
cparata 0:13631b50eae6 71 _dev_spi(spi), _cs_pin(cs_pin), _int1_irq(int1_pin), _int2_irq(int2_pin), _spi_type(spi_type)
cparata 0:13631b50eae6 72 {
cparata 0:13631b50eae6 73 assert (spi);
cparata 0:13631b50eae6 74 if (cs_pin == NC)
cparata 0:13631b50eae6 75 {
cparata 0:13631b50eae6 76 printf ("ERROR LPS22HBSensor CS MUST NOT BE NC\n\r");
cparata 0:13631b50eae6 77 _dev_spi = NULL;
cparata 0:13631b50eae6 78 _dev_i2c = NULL;
cparata 0:13631b50eae6 79 return;
cparata 0:13631b50eae6 80 }
cparata 0:13631b50eae6 81 _reg_ctx.write_reg = IIS2DLPC_io_write;
cparata 0:13631b50eae6 82 _reg_ctx.read_reg = IIS2DLPC_io_read;
cparata 0:13631b50eae6 83 _reg_ctx.handle = (void *)this;
cparata 0:13631b50eae6 84 _cs_pin = 1;
cparata 0:13631b50eae6 85 _dev_i2c = NULL;
cparata 0:13631b50eae6 86 _address = 0;
cparata 0:13631b50eae6 87
cparata 0:13631b50eae6 88 if (_spi_type == SPI3W)
cparata 0:13631b50eae6 89 {
cparata 0:13631b50eae6 90 /* Enable SPI 3-Wires on the component */
cparata 0:13631b50eae6 91 uint8_t data = 0x05;
cparata 0:13631b50eae6 92 iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL2, &data, 1);
cparata 0:13631b50eae6 93 }
cparata 0:13631b50eae6 94
cparata 0:13631b50eae6 95 /* Disable I2C on the component */
cparata 0:13631b50eae6 96 iis2dlpc_i2c_interface_set(&_reg_ctx, IIS2DLPC_I2C_DISABLE);
cparata 0:13631b50eae6 97 }
cparata 0:13631b50eae6 98
cparata 0:13631b50eae6 99 /**
cparata 0:13631b50eae6 100 * @brief Initializing the component.
cparata 0:13631b50eae6 101 * @param[in] init pointer to device specific initalization structure.
cparata 0:13631b50eae6 102 * @retval "0" in case of success, an error code otherwise.
cparata 0:13631b50eae6 103 */
cparata 0:13631b50eae6 104 int IIS2DLPCSensor::init(void *init)
cparata 0:13631b50eae6 105 {
cparata 0:13631b50eae6 106 /* Enable register address automatically incremented during a multiple byte
cparata 0:13631b50eae6 107 access with a serial interface. */
cparata 0:13631b50eae6 108 if (iis2dlpc_auto_increment_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:13631b50eae6 109 {
cparata 0:13631b50eae6 110 return 1;
cparata 0:13631b50eae6 111 }
cparata 0:13631b50eae6 112
cparata 0:13631b50eae6 113 /* Enable BDU */
cparata 0:13631b50eae6 114 if (iis2dlpc_block_data_update_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:13631b50eae6 115 {
cparata 0:13631b50eae6 116 return 1;
cparata 0:13631b50eae6 117 }
cparata 0:13631b50eae6 118
cparata 0:13631b50eae6 119 /* FIFO mode selection */
cparata 0:13631b50eae6 120 if (iis2dlpc_fifo_mode_set(&_reg_ctx, IIS2DLPC_BYPASS_MODE) != 0)
cparata 0:13631b50eae6 121 {
cparata 0:13631b50eae6 122 return 1;
cparata 0:13631b50eae6 123 }
cparata 0:13631b50eae6 124
cparata 0:13631b50eae6 125 /* Power mode selection */
cparata 0:13631b50eae6 126 if (iis2dlpc_power_mode_set(&_reg_ctx, IIS2DLPC_HIGH_PERFORMANCE) != 0)
cparata 0:13631b50eae6 127 {
cparata 0:13631b50eae6 128 return 1;
cparata 0:13631b50eae6 129 }
cparata 0:13631b50eae6 130
cparata 0:13631b50eae6 131 /* Output data rate selection - power down. */
cparata 0:13631b50eae6 132 if (iis2dlpc_data_rate_set(&_reg_ctx, IIS2DLPC_XL_ODR_OFF) != 0)
cparata 0:13631b50eae6 133 {
cparata 0:13631b50eae6 134 return 1;
cparata 0:13631b50eae6 135 }
cparata 0:13631b50eae6 136
cparata 0:13631b50eae6 137 /* Full scale selection. */
cparata 0:13631b50eae6 138 if (iis2dlpc_full_scale_set(&_reg_ctx, IIS2DLPC_2g) != 0)
cparata 0:13631b50eae6 139 {
cparata 0:13631b50eae6 140 return 1;
cparata 0:13631b50eae6 141 }
cparata 0:13631b50eae6 142
cparata 0:13631b50eae6 143 /* Select default output data rate. */
cparata 0:13631b50eae6 144 _x_last_odr = 100.0f;
cparata 0:13631b50eae6 145
cparata 0:13631b50eae6 146 _x_last_operating_mode = IIS2DLPC_HIGH_PERFORMANCE_MODE;
cparata 0:13631b50eae6 147
cparata 0:13631b50eae6 148 _x_last_noise = IIS2DLPC_LOW_NOISE_DISABLE;
cparata 0:13631b50eae6 149
cparata 0:13631b50eae6 150 _x_is_enabled = 0;
cparata 0:13631b50eae6 151
cparata 0:13631b50eae6 152 return 0;
cparata 0:13631b50eae6 153 }
cparata 0:13631b50eae6 154
cparata 0:13631b50eae6 155 /**
cparata 0:13631b50eae6 156 * @brief Enable IIS2DLPC Accelerator
cparata 0:13631b50eae6 157 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 158 */
cparata 0:13631b50eae6 159 int IIS2DLPCSensor::enable_x(void)
cparata 0:13631b50eae6 160 {
cparata 0:13631b50eae6 161 /* Check if the component is already enabled */
cparata 0:13631b50eae6 162 if ( _x_is_enabled == 1 )
cparata 0:13631b50eae6 163 {
cparata 0:13631b50eae6 164 return 0;
cparata 0:13631b50eae6 165 }
cparata 0:13631b50eae6 166
cparata 0:13631b50eae6 167 /* Output data rate selection. */
cparata 0:13631b50eae6 168 if ( set_x_odr_when_enabled( _x_last_odr, _x_last_operating_mode, _x_last_noise ) == 1 )
cparata 0:13631b50eae6 169 {
cparata 0:13631b50eae6 170 return 1;
cparata 0:13631b50eae6 171 }
cparata 0:13631b50eae6 172
cparata 0:13631b50eae6 173 _x_is_enabled = 1;
cparata 0:13631b50eae6 174
cparata 0:13631b50eae6 175 return 0;
cparata 0:13631b50eae6 176 }
cparata 0:13631b50eae6 177
cparata 0:13631b50eae6 178 /**
cparata 0:13631b50eae6 179 * @brief Disable IIS2DLPC Accelerator
cparata 0:13631b50eae6 180 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 181 */
cparata 0:13631b50eae6 182 int IIS2DLPCSensor::disable_x(void)
cparata 0:13631b50eae6 183 {
cparata 0:13631b50eae6 184 /* Check if the component is already disabled */
cparata 0:13631b50eae6 185 if ( _x_is_enabled == 0 )
cparata 0:13631b50eae6 186 {
cparata 0:13631b50eae6 187 return 0;
cparata 0:13631b50eae6 188 }
cparata 0:13631b50eae6 189
cparata 0:13631b50eae6 190 /* Output data rate selection - power down. */
cparata 0:13631b50eae6 191 if (iis2dlpc_data_rate_set(&_reg_ctx, IIS2DLPC_XL_ODR_OFF) != 0)
cparata 0:13631b50eae6 192 {
cparata 0:13631b50eae6 193 return 1;
cparata 0:13631b50eae6 194 }
cparata 0:13631b50eae6 195
cparata 0:13631b50eae6 196 _x_is_enabled = 0;
cparata 0:13631b50eae6 197
cparata 0:13631b50eae6 198 return 0;
cparata 0:13631b50eae6 199 }
cparata 0:13631b50eae6 200
cparata 0:13631b50eae6 201 /**
cparata 0:13631b50eae6 202 * @brief Read ID of IIS2DLPC Accelerometer and Gyroscope
cparata 0:13631b50eae6 203 * @param p_id the pointer where the ID of the device is stored
cparata 0:13631b50eae6 204 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 205 */
cparata 0:13631b50eae6 206 int IIS2DLPCSensor::read_id(uint8_t *id)
cparata 0:13631b50eae6 207 {
cparata 0:13631b50eae6 208 if(!id)
cparata 0:13631b50eae6 209 {
cparata 0:13631b50eae6 210 return 1;
cparata 0:13631b50eae6 211 }
cparata 0:13631b50eae6 212
cparata 0:13631b50eae6 213 /* Read WHO AM I register */
cparata 0:13631b50eae6 214 if (iis2dlpc_device_id_get(&_reg_ctx, id) != 0)
cparata 0:13631b50eae6 215 {
cparata 0:13631b50eae6 216 return 1;
cparata 0:13631b50eae6 217 }
cparata 0:13631b50eae6 218
cparata 0:13631b50eae6 219 return 0;
cparata 0:13631b50eae6 220 }
cparata 0:13631b50eae6 221
cparata 0:13631b50eae6 222 /**
cparata 0:13631b50eae6 223 * @brief Read data from IIS2DLPC Accelerometer
cparata 0:13631b50eae6 224 * @param acceleration the pointer where the accelerometer data are stored
cparata 0:13631b50eae6 225 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 226 */
cparata 0:13631b50eae6 227 int IIS2DLPCSensor::get_x_axes(int32_t *acceleration)
cparata 0:13631b50eae6 228 {
cparata 0:13631b50eae6 229 int16_t data_raw[3];
cparata 0:13631b50eae6 230 float sensitivity = 0;
cparata 0:13631b50eae6 231
cparata 0:13631b50eae6 232 /* Read raw data from IIS2DLPC output register. */
cparata 0:13631b50eae6 233 if ( get_x_axes_raw( data_raw ) == 1 )
cparata 0:13631b50eae6 234 {
cparata 0:13631b50eae6 235 return 1;
cparata 0:13631b50eae6 236 }
cparata 0:13631b50eae6 237
cparata 0:13631b50eae6 238 /* Get IIS2DLPC actual sensitivity. */
cparata 0:13631b50eae6 239 if ( get_x_sensitivity( &sensitivity ) == 1 )
cparata 0:13631b50eae6 240 {
cparata 0:13631b50eae6 241 return 1;
cparata 0:13631b50eae6 242 }
cparata 0:13631b50eae6 243
cparata 0:13631b50eae6 244 /* Calculate the data. */
cparata 0:13631b50eae6 245 acceleration[0] = ( int32_t )( data_raw[0] * sensitivity );
cparata 0:13631b50eae6 246 acceleration[1] = ( int32_t )( data_raw[1] * sensitivity );
cparata 0:13631b50eae6 247 acceleration[2] = ( int32_t )( data_raw[2] * sensitivity );
cparata 0:13631b50eae6 248
cparata 0:13631b50eae6 249 return 0;
cparata 0:13631b50eae6 250 }
cparata 0:13631b50eae6 251
cparata 0:13631b50eae6 252 /**
cparata 0:13631b50eae6 253 * @brief Read Accelerometer Sensitivity
cparata 0:13631b50eae6 254 * @param sensitivity the pointer where the accelerometer sensitivity is stored
cparata 0:13631b50eae6 255 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 256 */
cparata 0:13631b50eae6 257 int IIS2DLPCSensor::get_x_sensitivity(float *sensitivity)
cparata 0:13631b50eae6 258 {
cparata 0:13631b50eae6 259 int32_t ret = 0;
cparata 0:13631b50eae6 260 iis2dlpc_fs_t full_scale;
cparata 0:13631b50eae6 261 iis2dlpc_mode_t mode;
cparata 0:13631b50eae6 262
cparata 0:13631b50eae6 263 /* Read actual full scale selection from sensor. */
cparata 0:13631b50eae6 264 if (iis2dlpc_full_scale_get(&_reg_ctx, &full_scale) != 0)
cparata 0:13631b50eae6 265 {
cparata 0:13631b50eae6 266 return 1;
cparata 0:13631b50eae6 267 }
cparata 0:13631b50eae6 268
cparata 0:13631b50eae6 269 /* Read actual power mode selection from sensor. */
cparata 0:13631b50eae6 270 if (iis2dlpc_power_mode_get(&_reg_ctx, &mode) != 0)
cparata 0:13631b50eae6 271 {
cparata 0:13631b50eae6 272 return 1;
cparata 0:13631b50eae6 273 }
cparata 0:13631b50eae6 274
cparata 0:13631b50eae6 275 switch(mode)
cparata 0:13631b50eae6 276 {
cparata 0:13631b50eae6 277 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 278 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 279 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 280 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 281 switch (full_scale)
cparata 0:13631b50eae6 282 {
cparata 0:13631b50eae6 283 case IIS2DLPC_2g:
cparata 0:13631b50eae6 284 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_2G_LOPOW1_MODE;
cparata 0:13631b50eae6 285 break;
cparata 0:13631b50eae6 286
cparata 0:13631b50eae6 287 case IIS2DLPC_4g:
cparata 0:13631b50eae6 288 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_4G_LOPOW1_MODE;
cparata 0:13631b50eae6 289 break;
cparata 0:13631b50eae6 290
cparata 0:13631b50eae6 291 case IIS2DLPC_8g:
cparata 0:13631b50eae6 292 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_8G_LOPOW1_MODE;
cparata 0:13631b50eae6 293 break;
cparata 0:13631b50eae6 294
cparata 0:13631b50eae6 295 case IIS2DLPC_16g:
cparata 0:13631b50eae6 296 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_16G_LOPOW1_MODE;
cparata 0:13631b50eae6 297 break;
cparata 0:13631b50eae6 298
cparata 0:13631b50eae6 299 default:
cparata 0:13631b50eae6 300 *sensitivity = -1.0f;
cparata 0:13631b50eae6 301 ret = 1;
cparata 0:13631b50eae6 302 break;
cparata 0:13631b50eae6 303 }
cparata 0:13631b50eae6 304 break;
cparata 0:13631b50eae6 305
cparata 0:13631b50eae6 306 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 307 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 308 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 309 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 310 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 311 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 312 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 313 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 314 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 315 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 316 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 317 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 318 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 319 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 320 switch (full_scale)
cparata 0:13631b50eae6 321 {
cparata 0:13631b50eae6 322 case IIS2DLPC_2g:
cparata 0:13631b50eae6 323 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_2G_OTHER_MODES;
cparata 0:13631b50eae6 324 break;
cparata 0:13631b50eae6 325
cparata 0:13631b50eae6 326 case IIS2DLPC_4g:
cparata 0:13631b50eae6 327 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_4G_OTHER_MODES;
cparata 0:13631b50eae6 328 break;
cparata 0:13631b50eae6 329
cparata 0:13631b50eae6 330 case IIS2DLPC_8g:
cparata 0:13631b50eae6 331 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_8G_OTHER_MODES;
cparata 0:13631b50eae6 332 break;
cparata 0:13631b50eae6 333
cparata 0:13631b50eae6 334 case IIS2DLPC_16g:
cparata 0:13631b50eae6 335 *sensitivity = IIS2DLPC_ACC_SENSITIVITY_FOR_FS_16G_OTHER_MODES;
cparata 0:13631b50eae6 336 break;
cparata 0:13631b50eae6 337
cparata 0:13631b50eae6 338 default:
cparata 0:13631b50eae6 339 *sensitivity = -1.0f;
cparata 0:13631b50eae6 340 ret = 1;
cparata 0:13631b50eae6 341 break;
cparata 0:13631b50eae6 342 }
cparata 0:13631b50eae6 343 break;
cparata 0:13631b50eae6 344
cparata 0:13631b50eae6 345 default:
cparata 0:13631b50eae6 346 *sensitivity = -1.0f;
cparata 0:13631b50eae6 347 ret = 1;
cparata 0:13631b50eae6 348 break;
cparata 0:13631b50eae6 349 }
cparata 0:13631b50eae6 350
cparata 0:13631b50eae6 351 return ret;
cparata 0:13631b50eae6 352 }
cparata 0:13631b50eae6 353
cparata 0:13631b50eae6 354 /**
cparata 0:13631b50eae6 355 * @brief Read raw data from IIS2DLPC Accelerometer
cparata 0:13631b50eae6 356 * @param value the pointer where the accelerometer raw data are stored
cparata 0:13631b50eae6 357 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 358 */
cparata 0:13631b50eae6 359 int IIS2DLPCSensor::get_x_axes_raw(int16_t *value)
cparata 0:13631b50eae6 360 {
cparata 0:13631b50eae6 361 axis3bit16_t data_raw;
cparata 0:13631b50eae6 362 iis2dlpc_mode_t mode;
cparata 0:13631b50eae6 363 int32_t ret = 0;
cparata 0:13631b50eae6 364
cparata 0:13631b50eae6 365 /* Read actual power mode selection from sensor. */
cparata 0:13631b50eae6 366 if (iis2dlpc_power_mode_get(&_reg_ctx, &mode) != 0)
cparata 0:13631b50eae6 367 {
cparata 0:13631b50eae6 368 return 1;
cparata 0:13631b50eae6 369 }
cparata 0:13631b50eae6 370
cparata 0:13631b50eae6 371 /* Read raw data values. */
cparata 0:13631b50eae6 372 if (iis2dlpc_acceleration_raw_get(&_reg_ctx, data_raw.u8bit) != 0)
cparata 0:13631b50eae6 373 {
cparata 0:13631b50eae6 374 return 1;
cparata 0:13631b50eae6 375 }
cparata 0:13631b50eae6 376
cparata 0:13631b50eae6 377 switch(mode)
cparata 0:13631b50eae6 378 {
cparata 0:13631b50eae6 379 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 380 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 381 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 382 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 383 /* Data format 12 bits. */
cparata 0:13631b50eae6 384 value[0] = (data_raw.i16bit[0] / 16);
cparata 0:13631b50eae6 385 value[1] = (data_raw.i16bit[1] / 16);
cparata 0:13631b50eae6 386 value[2] = (data_raw.i16bit[2] / 16);
cparata 0:13631b50eae6 387 break;
cparata 0:13631b50eae6 388
cparata 0:13631b50eae6 389 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 390 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 391 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 392 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 393 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 394 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 395 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 396 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 397 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 398 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 399 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 400 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 401 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 402 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 403 /* Data format 14 bits. */
cparata 0:13631b50eae6 404 value[0] = (data_raw.i16bit[0] / 4);
cparata 0:13631b50eae6 405 value[1] = (data_raw.i16bit[1] / 4);
cparata 0:13631b50eae6 406 value[2] = (data_raw.i16bit[2] / 4);
cparata 0:13631b50eae6 407 break;
cparata 0:13631b50eae6 408
cparata 0:13631b50eae6 409 default:
cparata 0:13631b50eae6 410 ret = 1;
cparata 0:13631b50eae6 411 break;
cparata 0:13631b50eae6 412 }
cparata 0:13631b50eae6 413
cparata 0:13631b50eae6 414 return ret;
cparata 0:13631b50eae6 415 }
cparata 0:13631b50eae6 416
cparata 0:13631b50eae6 417 /**
cparata 0:13631b50eae6 418 * @brief Read IIS2DLPC Accelerometer output data rate
cparata 0:13631b50eae6 419 * @param odr the pointer to the output data rate
cparata 0:13631b50eae6 420 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 421 */
cparata 0:13631b50eae6 422 int IIS2DLPCSensor::get_x_odr(float* odr)
cparata 0:13631b50eae6 423 {
cparata 0:13631b50eae6 424 int32_t ret = 0;
cparata 0:13631b50eae6 425 iis2dlpc_odr_t odr_low_level;
cparata 0:13631b50eae6 426 iis2dlpc_mode_t mode;
cparata 0:13631b50eae6 427
cparata 0:13631b50eae6 428 /* Get current output data rate. */
cparata 0:13631b50eae6 429 if (iis2dlpc_data_rate_get(&_reg_ctx, &odr_low_level) != 0)
cparata 0:13631b50eae6 430 {
cparata 0:13631b50eae6 431 return 1;
cparata 0:13631b50eae6 432 }
cparata 0:13631b50eae6 433
cparata 0:13631b50eae6 434 /* Read actual power mode selection from sensor. */
cparata 0:13631b50eae6 435 if (iis2dlpc_power_mode_get(&_reg_ctx, &mode) != 0)
cparata 0:13631b50eae6 436 {
cparata 0:13631b50eae6 437 return 1;
cparata 0:13631b50eae6 438 }
cparata 0:13631b50eae6 439
cparata 0:13631b50eae6 440 switch (odr_low_level)
cparata 0:13631b50eae6 441 {
cparata 0:13631b50eae6 442 case IIS2DLPC_XL_ODR_OFF:
cparata 0:13631b50eae6 443 case IIS2DLPC_XL_SET_SW_TRIG:
cparata 0:13631b50eae6 444 case IIS2DLPC_XL_SET_PIN_TRIG:
cparata 0:13631b50eae6 445 *odr = 0.0f;
cparata 0:13631b50eae6 446 break;
cparata 0:13631b50eae6 447
cparata 0:13631b50eae6 448 case IIS2DLPC_XL_ODR_1Hz6_LP_ONLY:
cparata 0:13631b50eae6 449 switch (mode)
cparata 0:13631b50eae6 450 {
cparata 0:13631b50eae6 451 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 452 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 453 *odr = 12.5f;
cparata 0:13631b50eae6 454 break;
cparata 0:13631b50eae6 455
cparata 0:13631b50eae6 456 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 457 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 458 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 459 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 460 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 461 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 462 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 463 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 464 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 465 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 466 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 467 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 468 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 469 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 470 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 471 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 472 *odr = 1.6f;
cparata 0:13631b50eae6 473 break;
cparata 0:13631b50eae6 474
cparata 0:13631b50eae6 475 default:
cparata 0:13631b50eae6 476 *odr = -1.0f;
cparata 0:13631b50eae6 477 ret = 1;
cparata 0:13631b50eae6 478 break;
cparata 0:13631b50eae6 479 }
cparata 0:13631b50eae6 480 break;
cparata 0:13631b50eae6 481
cparata 0:13631b50eae6 482 case IIS2DLPC_XL_ODR_12Hz5:
cparata 0:13631b50eae6 483 *odr = 12.5f;
cparata 0:13631b50eae6 484 break;
cparata 0:13631b50eae6 485
cparata 0:13631b50eae6 486 case IIS2DLPC_XL_ODR_25Hz:
cparata 0:13631b50eae6 487 *odr = 25.0f;
cparata 0:13631b50eae6 488 break;
cparata 0:13631b50eae6 489
cparata 0:13631b50eae6 490 case IIS2DLPC_XL_ODR_50Hz:
cparata 0:13631b50eae6 491 *odr = 50.0f;
cparata 0:13631b50eae6 492 break;
cparata 0:13631b50eae6 493
cparata 0:13631b50eae6 494 case IIS2DLPC_XL_ODR_100Hz:
cparata 0:13631b50eae6 495 *odr = 100.0f;
cparata 0:13631b50eae6 496 break;
cparata 0:13631b50eae6 497
cparata 0:13631b50eae6 498 case IIS2DLPC_XL_ODR_200Hz:
cparata 0:13631b50eae6 499 *odr = 200.0f;
cparata 0:13631b50eae6 500 break;
cparata 0:13631b50eae6 501
cparata 0:13631b50eae6 502 case IIS2DLPC_XL_ODR_400Hz:
cparata 0:13631b50eae6 503 switch (mode)
cparata 0:13631b50eae6 504 {
cparata 0:13631b50eae6 505 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 506 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 507 *odr = 400.0f;
cparata 0:13631b50eae6 508 break;
cparata 0:13631b50eae6 509
cparata 0:13631b50eae6 510 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 511 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 512 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 513 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 514 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 515 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 516 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 517 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 518 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 519 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 520 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 521 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 522 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 523 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 524 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 525 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 526 *odr = 200.0f;
cparata 0:13631b50eae6 527 break;
cparata 0:13631b50eae6 528
cparata 0:13631b50eae6 529 default:
cparata 0:13631b50eae6 530 *odr = -1.0f;
cparata 0:13631b50eae6 531 ret = 1;
cparata 0:13631b50eae6 532 break;
cparata 0:13631b50eae6 533 }
cparata 0:13631b50eae6 534 break;
cparata 0:13631b50eae6 535
cparata 0:13631b50eae6 536 case IIS2DLPC_XL_ODR_800Hz:
cparata 0:13631b50eae6 537 switch (mode)
cparata 0:13631b50eae6 538 {
cparata 0:13631b50eae6 539 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 540 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 541 *odr = 800.0f;
cparata 0:13631b50eae6 542 break;
cparata 0:13631b50eae6 543
cparata 0:13631b50eae6 544 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 545 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 546 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 547 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 548 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 549 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 550 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 551 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 552 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 553 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 554 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 555 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 556 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 557 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 558 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 559 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 560 *odr = 200.0f;
cparata 0:13631b50eae6 561 break;
cparata 0:13631b50eae6 562
cparata 0:13631b50eae6 563 default:
cparata 0:13631b50eae6 564 *odr = -1.0f;
cparata 0:13631b50eae6 565 ret = 1;
cparata 0:13631b50eae6 566 break;
cparata 0:13631b50eae6 567 }
cparata 0:13631b50eae6 568 break;
cparata 0:13631b50eae6 569
cparata 0:13631b50eae6 570 case IIS2DLPC_XL_ODR_1k6Hz:
cparata 0:13631b50eae6 571 switch (mode)
cparata 0:13631b50eae6 572 {
cparata 0:13631b50eae6 573 case IIS2DLPC_HIGH_PERFORMANCE:
cparata 0:13631b50eae6 574 case IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE:
cparata 0:13631b50eae6 575 *odr = 1600.0f;
cparata 0:13631b50eae6 576 break;
cparata 0:13631b50eae6 577
cparata 0:13631b50eae6 578 case IIS2DLPC_CONT_LOW_PWR_4:
cparata 0:13631b50eae6 579 case IIS2DLPC_CONT_LOW_PWR_3:
cparata 0:13631b50eae6 580 case IIS2DLPC_CONT_LOW_PWR_2:
cparata 0:13631b50eae6 581 case IIS2DLPC_CONT_LOW_PWR_12bit:
cparata 0:13631b50eae6 582 case IIS2DLPC_SINGLE_LOW_PWR_4:
cparata 0:13631b50eae6 583 case IIS2DLPC_SINGLE_LOW_PWR_3:
cparata 0:13631b50eae6 584 case IIS2DLPC_SINGLE_LOW_PWR_2:
cparata 0:13631b50eae6 585 case IIS2DLPC_SINGLE_LOW_PWR_12bit:
cparata 0:13631b50eae6 586 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 587 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 588 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 589 case IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit:
cparata 0:13631b50eae6 590 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_4:
cparata 0:13631b50eae6 591 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_3:
cparata 0:13631b50eae6 592 case IIS2DLPC_SINGLE_LOW_PWR_LOW_NOISE_2:
cparata 0:13631b50eae6 593 case IIS2DLPC_SINGLE_LOW_LOW_NOISE_PWR_12bit:
cparata 0:13631b50eae6 594 *odr = 200.0f;
cparata 0:13631b50eae6 595 break;
cparata 0:13631b50eae6 596
cparata 0:13631b50eae6 597 default:
cparata 0:13631b50eae6 598 *odr = -1.0f;
cparata 0:13631b50eae6 599 ret = 1;
cparata 0:13631b50eae6 600 break;
cparata 0:13631b50eae6 601 }
cparata 0:13631b50eae6 602 break;
cparata 0:13631b50eae6 603
cparata 0:13631b50eae6 604 default:
cparata 0:13631b50eae6 605 *odr = -1.0f;
cparata 0:13631b50eae6 606 ret = 1;
cparata 0:13631b50eae6 607 break;
cparata 0:13631b50eae6 608 }
cparata 0:13631b50eae6 609
cparata 0:13631b50eae6 610 return ret;
cparata 0:13631b50eae6 611 }
cparata 0:13631b50eae6 612
cparata 0:13631b50eae6 613 /**
cparata 0:13631b50eae6 614 * @brief Set IIS2DLPC Accelerometer output data rate
cparata 0:13631b50eae6 615 * @param odr the output data rate to be set
cparata 0:13631b50eae6 616 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 617 */
cparata 0:13631b50eae6 618 int IIS2DLPCSensor::set_x_odr(float odr)
cparata 0:13631b50eae6 619 {
cparata 0:13631b50eae6 620 return set_x_odr_with_mode(odr, IIS2DLPC_HIGH_PERFORMANCE_MODE, IIS2DLPC_LOW_NOISE_DISABLE);
cparata 0:13631b50eae6 621 }
cparata 0:13631b50eae6 622
cparata 0:13631b50eae6 623 /**
cparata 0:13631b50eae6 624 * @brief Set IIS2DLPC Accelerometer output data rate
cparata 0:13631b50eae6 625 * @param odr the output data rate to be set
cparata 0:13631b50eae6 626 * @param mode the operating mode to be used
cparata 0:13631b50eae6 627 * @param noise the low noise option
cparata 0:13631b50eae6 628 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 629 */
cparata 0:13631b50eae6 630 int IIS2DLPCSensor::set_x_odr_with_mode(float odr, IIS2DLPC_Operating_Mode_t mode, IIS2DLPC_Low_Noise_t noise)
cparata 0:13631b50eae6 631 {
cparata 0:13631b50eae6 632 if(_x_is_enabled == 1)
cparata 0:13631b50eae6 633 {
cparata 0:13631b50eae6 634 if(set_x_odr_when_enabled(odr, mode, noise) != 0)
cparata 0:13631b50eae6 635 {
cparata 0:13631b50eae6 636 return 1;
cparata 0:13631b50eae6 637 }
cparata 0:13631b50eae6 638 }
cparata 0:13631b50eae6 639 else
cparata 0:13631b50eae6 640 {
cparata 0:13631b50eae6 641 if(set_x_odr_when_disabled(odr, mode, noise) != 0)
cparata 0:13631b50eae6 642 {
cparata 0:13631b50eae6 643 return 1;
cparata 0:13631b50eae6 644 }
cparata 0:13631b50eae6 645 }
cparata 0:13631b50eae6 646
cparata 0:13631b50eae6 647 return 0;
cparata 0:13631b50eae6 648 }
cparata 0:13631b50eae6 649
cparata 0:13631b50eae6 650 /**
cparata 0:13631b50eae6 651 * @brief Set IIS2DLPC Accelerometer output data rate when enabled
cparata 0:13631b50eae6 652 * @param odr the output data rate to be set
cparata 0:13631b50eae6 653 * @param mode the operating mode to be used
cparata 0:13631b50eae6 654 * @param noise the low noise option
cparata 0:13631b50eae6 655 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 656 */
cparata 0:13631b50eae6 657 int IIS2DLPCSensor::set_x_odr_when_enabled(float odr, IIS2DLPC_Operating_Mode_t mode, IIS2DLPC_Low_Noise_t noise)
cparata 0:13631b50eae6 658 {
cparata 0:13631b50eae6 659 iis2dlpc_odr_t new_odr;
cparata 0:13631b50eae6 660 iis2dlpc_mode_t new_power_mode;
cparata 0:13631b50eae6 661
cparata 0:13631b50eae6 662 switch (mode)
cparata 0:13631b50eae6 663 {
cparata 0:13631b50eae6 664 case IIS2DLPC_HIGH_PERFORMANCE_MODE:
cparata 0:13631b50eae6 665 default:
cparata 0:13631b50eae6 666 switch (noise)
cparata 0:13631b50eae6 667 {
cparata 0:13631b50eae6 668 case IIS2DLPC_LOW_NOISE_DISABLE:
cparata 0:13631b50eae6 669 default:
cparata 0:13631b50eae6 670 new_power_mode = IIS2DLPC_HIGH_PERFORMANCE;
cparata 0:13631b50eae6 671 break;
cparata 0:13631b50eae6 672 case IIS2DLPC_LOW_NOISE_ENABLE:
cparata 0:13631b50eae6 673 new_power_mode = IIS2DLPC_HIGH_PERFORMANCE_LOW_NOISE;
cparata 0:13631b50eae6 674 break;
cparata 0:13631b50eae6 675 }
cparata 0:13631b50eae6 676
cparata 0:13631b50eae6 677 /* If High Performance mode minimum ODR is 12.5Hz */
cparata 0:13631b50eae6 678 if(odr < 12.5f)
cparata 0:13631b50eae6 679 {
cparata 0:13631b50eae6 680 odr = 12.5f;
cparata 0:13631b50eae6 681 }
cparata 0:13631b50eae6 682 break;
cparata 0:13631b50eae6 683 case IIS2DLPC_LOW_POWER_MODE4:
cparata 0:13631b50eae6 684 switch (noise)
cparata 0:13631b50eae6 685 {
cparata 0:13631b50eae6 686 case IIS2DLPC_LOW_NOISE_DISABLE:
cparata 0:13631b50eae6 687 default:
cparata 0:13631b50eae6 688 new_power_mode = IIS2DLPC_CONT_LOW_PWR_4;
cparata 0:13631b50eae6 689 break;
cparata 0:13631b50eae6 690 case IIS2DLPC_LOW_NOISE_ENABLE:
cparata 0:13631b50eae6 691 new_power_mode = IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_4;
cparata 0:13631b50eae6 692 break;
cparata 0:13631b50eae6 693 }
cparata 0:13631b50eae6 694
cparata 0:13631b50eae6 695 /* If Low Power mode maximum ODR is 200Hz */
cparata 0:13631b50eae6 696 if(odr > 200.0f)
cparata 0:13631b50eae6 697 {
cparata 0:13631b50eae6 698 odr = 200.0f;
cparata 0:13631b50eae6 699 }
cparata 0:13631b50eae6 700 break;
cparata 0:13631b50eae6 701 case IIS2DLPC_LOW_POWER_MODE3:
cparata 0:13631b50eae6 702 switch (noise)
cparata 0:13631b50eae6 703 {
cparata 0:13631b50eae6 704 case IIS2DLPC_LOW_NOISE_DISABLE:
cparata 0:13631b50eae6 705 default:
cparata 0:13631b50eae6 706 new_power_mode = IIS2DLPC_CONT_LOW_PWR_3;
cparata 0:13631b50eae6 707 break;
cparata 0:13631b50eae6 708 case IIS2DLPC_LOW_NOISE_ENABLE:
cparata 0:13631b50eae6 709 new_power_mode = IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_3;
cparata 0:13631b50eae6 710 break;
cparata 0:13631b50eae6 711 }
cparata 0:13631b50eae6 712
cparata 0:13631b50eae6 713 /* If Low Power mode maximum ODR is 200Hz */
cparata 0:13631b50eae6 714 if(odr > 200.0f)
cparata 0:13631b50eae6 715 {
cparata 0:13631b50eae6 716 odr = 200.0f;
cparata 0:13631b50eae6 717 }
cparata 0:13631b50eae6 718 break;
cparata 0:13631b50eae6 719 case IIS2DLPC_LOW_POWER_MODE2:
cparata 0:13631b50eae6 720 switch (noise)
cparata 0:13631b50eae6 721 {
cparata 0:13631b50eae6 722 case IIS2DLPC_LOW_NOISE_DISABLE:
cparata 0:13631b50eae6 723 default:
cparata 0:13631b50eae6 724 new_power_mode = IIS2DLPC_CONT_LOW_PWR_2;
cparata 0:13631b50eae6 725 break;
cparata 0:13631b50eae6 726 case IIS2DLPC_LOW_NOISE_ENABLE:
cparata 0:13631b50eae6 727 new_power_mode = IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_2;
cparata 0:13631b50eae6 728 break;
cparata 0:13631b50eae6 729 }
cparata 0:13631b50eae6 730
cparata 0:13631b50eae6 731 /* If Low Power mode maximum ODR is 200Hz */
cparata 0:13631b50eae6 732 if(odr > 200.0f)
cparata 0:13631b50eae6 733 {
cparata 0:13631b50eae6 734 odr = 200.0f;
cparata 0:13631b50eae6 735 }
cparata 0:13631b50eae6 736 break;
cparata 0:13631b50eae6 737 case IIS2DLPC_LOW_POWER_MODE1:
cparata 0:13631b50eae6 738 switch (noise)
cparata 0:13631b50eae6 739 {
cparata 0:13631b50eae6 740 case IIS2DLPC_LOW_NOISE_DISABLE:
cparata 0:13631b50eae6 741 default:
cparata 0:13631b50eae6 742 new_power_mode = IIS2DLPC_CONT_LOW_PWR_12bit;
cparata 0:13631b50eae6 743 break;
cparata 0:13631b50eae6 744 case IIS2DLPC_LOW_NOISE_ENABLE:
cparata 0:13631b50eae6 745 new_power_mode = IIS2DLPC_CONT_LOW_PWR_LOW_NOISE_12bit;
cparata 0:13631b50eae6 746 break;
cparata 0:13631b50eae6 747 }
cparata 0:13631b50eae6 748
cparata 0:13631b50eae6 749 /* If Low Power mode maximum ODR is 200Hz */
cparata 0:13631b50eae6 750 if(odr > 200.0f)
cparata 0:13631b50eae6 751 {
cparata 0:13631b50eae6 752 odr = 200.0f;
cparata 0:13631b50eae6 753 }
cparata 0:13631b50eae6 754 break;
cparata 0:13631b50eae6 755 }
cparata 0:13631b50eae6 756
cparata 0:13631b50eae6 757
cparata 0:13631b50eae6 758 new_odr = (odr <= 1.6f) ? IIS2DLPC_XL_ODR_1Hz6_LP_ONLY
cparata 0:13631b50eae6 759 : (odr <= 12.5f) ? IIS2DLPC_XL_ODR_12Hz5
cparata 0:13631b50eae6 760 : (odr <= 25.0f) ? IIS2DLPC_XL_ODR_25Hz
cparata 0:13631b50eae6 761 : (odr <= 50.0f) ? IIS2DLPC_XL_ODR_50Hz
cparata 0:13631b50eae6 762 : (odr <= 100.0f) ? IIS2DLPC_XL_ODR_100Hz
cparata 0:13631b50eae6 763 : (odr <= 200.0f) ? IIS2DLPC_XL_ODR_200Hz
cparata 0:13631b50eae6 764 : (odr <= 400.0f) ? IIS2DLPC_XL_ODR_400Hz
cparata 0:13631b50eae6 765 : (odr <= 800.0f) ? IIS2DLPC_XL_ODR_800Hz
cparata 0:13631b50eae6 766 : IIS2DLPC_XL_ODR_1k6Hz;
cparata 0:13631b50eae6 767
cparata 0:13631b50eae6 768 /* Output data rate selection. */
cparata 0:13631b50eae6 769 if (iis2dlpc_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:13631b50eae6 770 {
cparata 0:13631b50eae6 771 return 1;
cparata 0:13631b50eae6 772 }
cparata 0:13631b50eae6 773
cparata 0:13631b50eae6 774 /* Power mode selection. */
cparata 0:13631b50eae6 775 if (iis2dlpc_power_mode_set(&_reg_ctx, new_power_mode) != 0)
cparata 0:13631b50eae6 776 {
cparata 0:13631b50eae6 777 return 1;
cparata 0:13631b50eae6 778 }
cparata 0:13631b50eae6 779
cparata 0:13631b50eae6 780 /* Store actual output data rate, operating mode and low noise. */
cparata 0:13631b50eae6 781 _x_last_odr = odr;
cparata 0:13631b50eae6 782 _x_last_operating_mode = mode;
cparata 0:13631b50eae6 783 _x_last_noise = noise;
cparata 0:13631b50eae6 784
cparata 0:13631b50eae6 785 return 0;
cparata 0:13631b50eae6 786 }
cparata 0:13631b50eae6 787
cparata 0:13631b50eae6 788 /**
cparata 0:13631b50eae6 789 * @brief Set IIS2DLPC Accelerometer output data rate when disabled
cparata 0:13631b50eae6 790 * @param odr the output data rate to be set
cparata 0:13631b50eae6 791 * @param mode the operating mode to be used
cparata 0:13631b50eae6 792 * @param noise the low noise option
cparata 0:13631b50eae6 793 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 794 */
cparata 0:13631b50eae6 795 int IIS2DLPCSensor::set_x_odr_when_disabled(float odr, IIS2DLPC_Operating_Mode_t mode, IIS2DLPC_Low_Noise_t noise)
cparata 0:13631b50eae6 796 {
cparata 0:13631b50eae6 797 _x_last_operating_mode = mode;
cparata 0:13631b50eae6 798 _x_last_noise = noise;
cparata 0:13631b50eae6 799
cparata 0:13631b50eae6 800 _x_last_odr = (odr <= 1.6f) ? 1.6f
cparata 0:13631b50eae6 801 : (odr <= 12.5f) ? 12.5f
cparata 0:13631b50eae6 802 : (odr <= 25.0f) ? 25.0f
cparata 0:13631b50eae6 803 : (odr <= 50.0f) ? 50.0f
cparata 0:13631b50eae6 804 : (odr <= 100.0f) ? 100.0f
cparata 0:13631b50eae6 805 : (odr <= 200.0f) ? 200.0f
cparata 0:13631b50eae6 806 : (odr <= 400.0f) ? 400.0f
cparata 0:13631b50eae6 807 : (odr <= 800.0f) ? 800.0f
cparata 0:13631b50eae6 808 : 1600.0f;
cparata 0:13631b50eae6 809
cparata 0:13631b50eae6 810 return 0;
cparata 0:13631b50eae6 811 }
cparata 0:13631b50eae6 812
cparata 0:13631b50eae6 813 /**
cparata 0:13631b50eae6 814 * @brief Read IIS2DLPC Accelerometer full scale
cparata 0:13631b50eae6 815 * @param full_scale the pointer to the full scale
cparata 0:13631b50eae6 816 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 817 */
cparata 0:13631b50eae6 818 int IIS2DLPCSensor::get_x_fs(float* full_scale)
cparata 0:13631b50eae6 819 {
cparata 0:13631b50eae6 820 int32_t ret = 0;
cparata 0:13631b50eae6 821 iis2dlpc_fs_t fs_low_level;
cparata 0:13631b50eae6 822
cparata 0:13631b50eae6 823 /* Read actual full scale selection from sensor. */
cparata 0:13631b50eae6 824 if (iis2dlpc_full_scale_get(&_reg_ctx, &fs_low_level) != 0)
cparata 0:13631b50eae6 825 {
cparata 0:13631b50eae6 826 return 1;
cparata 0:13631b50eae6 827 }
cparata 0:13631b50eae6 828
cparata 0:13631b50eae6 829 switch (fs_low_level)
cparata 0:13631b50eae6 830 {
cparata 0:13631b50eae6 831 case IIS2DLPC_2g:
cparata 0:13631b50eae6 832 *full_scale = 2;
cparata 0:13631b50eae6 833 break;
cparata 0:13631b50eae6 834
cparata 0:13631b50eae6 835 case IIS2DLPC_4g:
cparata 0:13631b50eae6 836 *full_scale = 4;
cparata 0:13631b50eae6 837 break;
cparata 0:13631b50eae6 838
cparata 0:13631b50eae6 839 case IIS2DLPC_8g:
cparata 0:13631b50eae6 840 *full_scale = 8;
cparata 0:13631b50eae6 841 break;
cparata 0:13631b50eae6 842
cparata 0:13631b50eae6 843 case IIS2DLPC_16g:
cparata 0:13631b50eae6 844 *full_scale = 16;
cparata 0:13631b50eae6 845 break;
cparata 0:13631b50eae6 846
cparata 0:13631b50eae6 847 default:
cparata 0:13631b50eae6 848 *full_scale = -1;
cparata 0:13631b50eae6 849 ret = 1;
cparata 0:13631b50eae6 850 break;
cparata 0:13631b50eae6 851 }
cparata 0:13631b50eae6 852
cparata 0:13631b50eae6 853 return ret;
cparata 0:13631b50eae6 854 }
cparata 0:13631b50eae6 855
cparata 0:13631b50eae6 856 /**
cparata 0:13631b50eae6 857 * @brief Set IIS2DLPC Accelerometer full scale
cparata 0:13631b50eae6 858 * @param full_scale the full scale to be set
cparata 0:13631b50eae6 859 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 860 */
cparata 0:13631b50eae6 861 int IIS2DLPCSensor::set_x_fs(float full_scale)
cparata 0:13631b50eae6 862 {
cparata 0:13631b50eae6 863 iis2dlpc_fs_t new_fs;
cparata 0:13631b50eae6 864
cparata 0:13631b50eae6 865 /* Seems like MISRA C-2012 rule 14.3a violation but only from single file statical analysis point of view because
cparata 0:13631b50eae6 866 the parameter passed to the function is not known at the moment of analysis */
cparata 0:13631b50eae6 867 new_fs = (full_scale <= 2) ? IIS2DLPC_2g
cparata 0:13631b50eae6 868 : (full_scale <= 4) ? IIS2DLPC_4g
cparata 0:13631b50eae6 869 : (full_scale <= 8) ? IIS2DLPC_8g
cparata 0:13631b50eae6 870 : IIS2DLPC_16g;
cparata 0:13631b50eae6 871
cparata 0:13631b50eae6 872 if (iis2dlpc_full_scale_set(&_reg_ctx, new_fs) != 0)
cparata 0:13631b50eae6 873 {
cparata 0:13631b50eae6 874 return 1;
cparata 0:13631b50eae6 875 }
cparata 0:13631b50eae6 876
cparata 0:13631b50eae6 877 return 0;
cparata 0:13631b50eae6 878 }
cparata 0:13631b50eae6 879
cparata 0:13631b50eae6 880 /**
cparata 0:13631b50eae6 881 * @brief Enable the wake up detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 882 * @note This function sets the IIS2DLPC accelerometer ODR to 200Hz and the IIS2DLPC accelerometer full scale to 2g
cparata 0:13631b50eae6 883 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 884 */
cparata 0:13631b50eae6 885 int IIS2DLPCSensor::enable_wake_up_detection(void)
cparata 0:13631b50eae6 886 {
cparata 0:13631b50eae6 887 int32_t ret = 0;
cparata 0:13631b50eae6 888 iis2dlpc_ctrl4_int1_pad_ctrl_t val;
cparata 0:13631b50eae6 889
cparata 0:13631b50eae6 890 /* Output Data Rate selection */
cparata 0:13631b50eae6 891 if (set_x_odr(200.0f) != 0)
cparata 0:13631b50eae6 892 {
cparata 0:13631b50eae6 893 return 1;
cparata 0:13631b50eae6 894 }
cparata 0:13631b50eae6 895
cparata 0:13631b50eae6 896 /* Full scale selection */
cparata 0:13631b50eae6 897 if (set_x_fs(2) != 0)
cparata 0:13631b50eae6 898 {
cparata 0:13631b50eae6 899 return 1;
cparata 0:13631b50eae6 900 }
cparata 0:13631b50eae6 901
cparata 0:13631b50eae6 902 /* WAKE_DUR setting */
cparata 0:13631b50eae6 903 if (iis2dlpc_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:13631b50eae6 904 {
cparata 0:13631b50eae6 905 return 1;
cparata 0:13631b50eae6 906 }
cparata 0:13631b50eae6 907
cparata 0:13631b50eae6 908 /* Set wake up threshold. */
cparata 0:13631b50eae6 909 if (iis2dlpc_wkup_threshold_set(&_reg_ctx, 0x02) != 0)
cparata 0:13631b50eae6 910 {
cparata 0:13631b50eae6 911 return 1;
cparata 0:13631b50eae6 912 }
cparata 0:13631b50eae6 913
cparata 0:13631b50eae6 914 if (iis2dlpc_pin_int1_route_get(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 915 {
cparata 0:13631b50eae6 916 return 1;
cparata 0:13631b50eae6 917 }
cparata 0:13631b50eae6 918
cparata 0:13631b50eae6 919 val.int1_wu = PROPERTY_ENABLE;
cparata 0:13631b50eae6 920
cparata 0:13631b50eae6 921 if (iis2dlpc_pin_int1_route_set(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 922 {
cparata 0:13631b50eae6 923 return 1;
cparata 0:13631b50eae6 924 }
cparata 0:13631b50eae6 925
cparata 0:13631b50eae6 926 return ret;
cparata 0:13631b50eae6 927 }
cparata 0:13631b50eae6 928
cparata 0:13631b50eae6 929 /**
cparata 0:13631b50eae6 930 * @brief Disable the wake up detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 931 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 932 */
cparata 0:13631b50eae6 933 int IIS2DLPCSensor::disable_wake_up_detection(void)
cparata 0:13631b50eae6 934 {
cparata 0:13631b50eae6 935 iis2dlpc_ctrl4_int1_pad_ctrl_t ctrl4_int1_reg;
cparata 0:13631b50eae6 936 iis2dlpc_ctrl5_int2_pad_ctrl_t ctrl5_int2_reg;
cparata 0:13631b50eae6 937 iis2dlpc_ctrl_reg7_t ctrl_reg7;
cparata 0:13631b50eae6 938
cparata 0:13631b50eae6 939 /* Disable wake up event on INT1 pin. */
cparata 0:13631b50eae6 940 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 941 {
cparata 0:13631b50eae6 942 return 1;
cparata 0:13631b50eae6 943 }
cparata 0:13631b50eae6 944
cparata 0:13631b50eae6 945 ctrl4_int1_reg.int1_wu = PROPERTY_DISABLE;
cparata 0:13631b50eae6 946
cparata 0:13631b50eae6 947 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 948 {
cparata 0:13631b50eae6 949 return 1;
cparata 0:13631b50eae6 950 }
cparata 0:13631b50eae6 951
cparata 0:13631b50eae6 952 /* Read INT2 Sleep Change */
cparata 0:13631b50eae6 953 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL5_INT2_PAD_CTRL, (uint8_t *)&ctrl5_int2_reg, 1) != 0)
cparata 0:13631b50eae6 954 {
cparata 0:13631b50eae6 955 return 1;
cparata 0:13631b50eae6 956 }
cparata 0:13631b50eae6 957
cparata 0:13631b50eae6 958 /*Disable Interrupts bit if none event is still enabled */
cparata 0:13631b50eae6 959 if(ctrl5_int2_reg.int2_sleep_chg == 0 && ctrl4_int1_reg.int1_wu == 0 && ctrl4_int1_reg.int1_6d == 0)
cparata 0:13631b50eae6 960 {
cparata 0:13631b50eae6 961 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 962 {
cparata 0:13631b50eae6 963 return 1;
cparata 0:13631b50eae6 964 }
cparata 0:13631b50eae6 965
cparata 0:13631b50eae6 966 ctrl_reg7.interrupts_enable = PROPERTY_DISABLE;
cparata 0:13631b50eae6 967
cparata 0:13631b50eae6 968 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 969 {
cparata 0:13631b50eae6 970 return 1;
cparata 0:13631b50eae6 971 }
cparata 0:13631b50eae6 972 }
cparata 0:13631b50eae6 973
cparata 0:13631b50eae6 974 /* Reset wake up threshold. */
cparata 0:13631b50eae6 975 if (iis2dlpc_wkup_threshold_set(&_reg_ctx, 0x00) != 0)
cparata 0:13631b50eae6 976 {
cparata 0:13631b50eae6 977 return 1;
cparata 0:13631b50eae6 978 }
cparata 0:13631b50eae6 979
cparata 0:13631b50eae6 980 /* WAKE_DUR setting */
cparata 0:13631b50eae6 981 if (iis2dlpc_wkup_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:13631b50eae6 982 {
cparata 0:13631b50eae6 983 return 1;
cparata 0:13631b50eae6 984 }
cparata 0:13631b50eae6 985
cparata 0:13631b50eae6 986 return 0;
cparata 0:13631b50eae6 987 }
cparata 0:13631b50eae6 988
cparata 0:13631b50eae6 989 /**
cparata 0:13631b50eae6 990 * @brief Set the wake up threshold for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 991 * @param thr the threshold to be set
cparata 0:13631b50eae6 992 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 993 */
cparata 0:13631b50eae6 994 int IIS2DLPCSensor::set_wake_up_threshold(uint8_t thr)
cparata 0:13631b50eae6 995 {
cparata 0:13631b50eae6 996 /* Set wake up threshold. */
cparata 0:13631b50eae6 997 if (iis2dlpc_wkup_threshold_set(&_reg_ctx, thr) != 0)
cparata 0:13631b50eae6 998 {
cparata 0:13631b50eae6 999 return 1;
cparata 0:13631b50eae6 1000 }
cparata 0:13631b50eae6 1001
cparata 0:13631b50eae6 1002 return 0;
cparata 0:13631b50eae6 1003 }
cparata 0:13631b50eae6 1004
cparata 0:13631b50eae6 1005 /**
cparata 0:13631b50eae6 1006 * @brief Set the wake up duration for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1007 * @param dur the duration to be set
cparata 0:13631b50eae6 1008 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1009 */
cparata 0:13631b50eae6 1010 int IIS2DLPCSensor::set_wake_up_duration(uint8_t dur)
cparata 0:13631b50eae6 1011 {
cparata 0:13631b50eae6 1012 /* Set wake up duration. */
cparata 0:13631b50eae6 1013 if (iis2dlpc_wkup_dur_set(&_reg_ctx, dur) != 0)
cparata 0:13631b50eae6 1014 {
cparata 0:13631b50eae6 1015 return 1;
cparata 0:13631b50eae6 1016 }
cparata 0:13631b50eae6 1017
cparata 0:13631b50eae6 1018 return 0;
cparata 0:13631b50eae6 1019 }
cparata 0:13631b50eae6 1020
cparata 0:13631b50eae6 1021 /**
cparata 0:13631b50eae6 1022 * @brief Enable the inactivity detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1023 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1024 */
cparata 0:13631b50eae6 1025 int IIS2DLPCSensor::enable_inactivity_detection(void)
cparata 0:13631b50eae6 1026 {
cparata 0:13631b50eae6 1027 int32_t ret = 0;
cparata 0:13631b50eae6 1028 iis2dlpc_ctrl5_int2_pad_ctrl_t val;
cparata 0:13631b50eae6 1029
cparata 0:13631b50eae6 1030 /* Output Data Rate and Full scale must be selected externally */
cparata 0:13631b50eae6 1031
cparata 0:13631b50eae6 1032 /* SLEEP_DUR setting */
cparata 0:13631b50eae6 1033 if (iis2dlpc_act_sleep_dur_set(&_reg_ctx, 0x01) != 0)
cparata 0:13631b50eae6 1034 {
cparata 0:13631b50eae6 1035 return 1;
cparata 0:13631b50eae6 1036 }
cparata 0:13631b50eae6 1037
cparata 0:13631b50eae6 1038 /* Set wake up threshold. */
cparata 0:13631b50eae6 1039 if (iis2dlpc_wkup_threshold_set(&_reg_ctx, 0x02) != 0)
cparata 0:13631b50eae6 1040 {
cparata 0:13631b50eae6 1041 return 1;
cparata 0:13631b50eae6 1042 }
cparata 0:13631b50eae6 1043
cparata 0:13631b50eae6 1044 /* Enable inactivity detection. */
cparata 0:13631b50eae6 1045 if (iis2dlpc_act_mode_set(&_reg_ctx, IIS2DLPC_DETECT_ACT_INACT) != 0)
cparata 0:13631b50eae6 1046 {
cparata 0:13631b50eae6 1047 return 1;
cparata 0:13631b50eae6 1048 }
cparata 0:13631b50eae6 1049
cparata 0:13631b50eae6 1050 if (iis2dlpc_pin_int2_route_get(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 1051 {
cparata 0:13631b50eae6 1052 return 1;
cparata 0:13631b50eae6 1053 }
cparata 0:13631b50eae6 1054
cparata 0:13631b50eae6 1055 val.int2_sleep_chg = PROPERTY_ENABLE;
cparata 0:13631b50eae6 1056
cparata 0:13631b50eae6 1057 if (iis2dlpc_pin_int2_route_set(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 1058 {
cparata 0:13631b50eae6 1059 return 1;
cparata 0:13631b50eae6 1060 }
cparata 0:13631b50eae6 1061
cparata 0:13631b50eae6 1062 return ret;
cparata 0:13631b50eae6 1063 }
cparata 0:13631b50eae6 1064
cparata 0:13631b50eae6 1065 /**
cparata 0:13631b50eae6 1066 * @brief Disable the inactivity detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1067 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1068 */
cparata 0:13631b50eae6 1069 int IIS2DLPCSensor::disable_inactivity_detection(void)
cparata 0:13631b50eae6 1070 {
cparata 0:13631b50eae6 1071 iis2dlpc_ctrl4_int1_pad_ctrl_t ctrl4_int1_reg;
cparata 0:13631b50eae6 1072 iis2dlpc_ctrl5_int2_pad_ctrl_t ctrl5_int2_reg;
cparata 0:13631b50eae6 1073 iis2dlpc_ctrl_reg7_t ctrl_reg7;
cparata 0:13631b50eae6 1074
cparata 0:13631b50eae6 1075 /* Disable inactivity event on INT2 pin */
cparata 0:13631b50eae6 1076 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL5_INT2_PAD_CTRL, (uint8_t *)&ctrl5_int2_reg, 1) != 0)
cparata 0:13631b50eae6 1077 {
cparata 0:13631b50eae6 1078 return 1;
cparata 0:13631b50eae6 1079 }
cparata 0:13631b50eae6 1080
cparata 0:13631b50eae6 1081 ctrl5_int2_reg.int2_sleep_chg = PROPERTY_DISABLE;
cparata 0:13631b50eae6 1082
cparata 0:13631b50eae6 1083 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL5_INT2_PAD_CTRL, (uint8_t *)&ctrl5_int2_reg, 1) != 0)
cparata 0:13631b50eae6 1084 {
cparata 0:13631b50eae6 1085 return 1;
cparata 0:13631b50eae6 1086 }
cparata 0:13631b50eae6 1087
cparata 0:13631b50eae6 1088 /* Read INT1 Wake Up event and INT1 6D Orientation event */
cparata 0:13631b50eae6 1089 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 1090 {
cparata 0:13631b50eae6 1091 return 1;
cparata 0:13631b50eae6 1092 }
cparata 0:13631b50eae6 1093
cparata 0:13631b50eae6 1094 /*Disable Interrupts bit if none event is still enabled */
cparata 0:13631b50eae6 1095 if(ctrl5_int2_reg.int2_sleep_chg == 0 && ctrl4_int1_reg.int1_wu == 0 && ctrl4_int1_reg.int1_6d == 0)
cparata 0:13631b50eae6 1096 {
cparata 0:13631b50eae6 1097 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 1098 {
cparata 0:13631b50eae6 1099 return 1;
cparata 0:13631b50eae6 1100 }
cparata 0:13631b50eae6 1101
cparata 0:13631b50eae6 1102 ctrl_reg7.interrupts_enable = PROPERTY_DISABLE;
cparata 0:13631b50eae6 1103
cparata 0:13631b50eae6 1104 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 1105 {
cparata 0:13631b50eae6 1106 return 1;
cparata 0:13631b50eae6 1107 }
cparata 0:13631b50eae6 1108 }
cparata 0:13631b50eae6 1109
cparata 0:13631b50eae6 1110 /* Disable inactivity detection. */
cparata 0:13631b50eae6 1111 if (iis2dlpc_act_mode_set(&_reg_ctx, IIS2DLPC_NO_DETECTION) != 0)
cparata 0:13631b50eae6 1112 {
cparata 0:13631b50eae6 1113 return 1;
cparata 0:13631b50eae6 1114 }
cparata 0:13631b50eae6 1115
cparata 0:13631b50eae6 1116 /* Reset wake up threshold. */
cparata 0:13631b50eae6 1117 if (iis2dlpc_wkup_threshold_set(&_reg_ctx, 0x00) != 0)
cparata 0:13631b50eae6 1118 {
cparata 0:13631b50eae6 1119 return 1;
cparata 0:13631b50eae6 1120 }
cparata 0:13631b50eae6 1121
cparata 0:13631b50eae6 1122 /* SLEEP_DUR setting */
cparata 0:13631b50eae6 1123 if (iis2dlpc_act_sleep_dur_set(&_reg_ctx, 0x00) != 0)
cparata 0:13631b50eae6 1124 {
cparata 0:13631b50eae6 1125 return 1;
cparata 0:13631b50eae6 1126 }
cparata 0:13631b50eae6 1127
cparata 0:13631b50eae6 1128 return 0;
cparata 0:13631b50eae6 1129 }
cparata 0:13631b50eae6 1130
cparata 0:13631b50eae6 1131 /**
cparata 0:13631b50eae6 1132 * @brief Set the sleep duration for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1133 * @param dur the duration to be set
cparata 0:13631b50eae6 1134 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1135 */
cparata 0:13631b50eae6 1136 int IIS2DLPCSensor::set_sleep_duration(uint8_t dur)
cparata 0:13631b50eae6 1137 {
cparata 0:13631b50eae6 1138 /* Set sleep duration. */
cparata 0:13631b50eae6 1139 if (iis2dlpc_act_sleep_dur_set(&_reg_ctx, dur) != 0)
cparata 0:13631b50eae6 1140 {
cparata 0:13631b50eae6 1141 return 1;
cparata 0:13631b50eae6 1142 }
cparata 0:13631b50eae6 1143
cparata 0:13631b50eae6 1144 return 0;
cparata 0:13631b50eae6 1145 }
cparata 0:13631b50eae6 1146
cparata 0:13631b50eae6 1147 /**
cparata 0:13631b50eae6 1148 * @brief Enable the 6D orientation detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1149 * @note This function sets the IIS2DLPC accelerometer ODR to 200Hz and the IIS2DLPC accelerometer full scale to 2g
cparata 0:13631b50eae6 1150 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1151 */
cparata 0:13631b50eae6 1152 int IIS2DLPCSensor::enable_6d_orientation(void)
cparata 0:13631b50eae6 1153 {
cparata 0:13631b50eae6 1154 int32_t ret = 0;
cparata 0:13631b50eae6 1155 iis2dlpc_ctrl4_int1_pad_ctrl_t val;
cparata 0:13631b50eae6 1156
cparata 0:13631b50eae6 1157 /* Output Data Rate selection */
cparata 0:13631b50eae6 1158 if(set_x_odr(200.0f) == 1)
cparata 0:13631b50eae6 1159 {
cparata 0:13631b50eae6 1160 return 1;
cparata 0:13631b50eae6 1161 }
cparata 0:13631b50eae6 1162
cparata 0:13631b50eae6 1163 /* Full scale selection. */
cparata 0:13631b50eae6 1164 if(set_x_fs(2.0f) == 1)
cparata 0:13631b50eae6 1165 {
cparata 0:13631b50eae6 1166 return 1;
cparata 0:13631b50eae6 1167 }
cparata 0:13631b50eae6 1168
cparata 0:13631b50eae6 1169 /* 6D orientation threshold. */
cparata 0:13631b50eae6 1170 if (iis2dlpc_6d_threshold_set(&_reg_ctx, 2) != 0) /* 60 degrees */
cparata 0:13631b50eae6 1171 {
cparata 0:13631b50eae6 1172 return 1;
cparata 0:13631b50eae6 1173 }
cparata 0:13631b50eae6 1174
cparata 0:13631b50eae6 1175 /* Enable 6D orientation event on INT1 pin */
cparata 0:13631b50eae6 1176 if (iis2dlpc_pin_int1_route_get(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 1177 {
cparata 0:13631b50eae6 1178 return 1;
cparata 0:13631b50eae6 1179 }
cparata 0:13631b50eae6 1180
cparata 0:13631b50eae6 1181 val.int1_6d = PROPERTY_ENABLE;
cparata 0:13631b50eae6 1182
cparata 0:13631b50eae6 1183 if (iis2dlpc_pin_int1_route_set(&_reg_ctx, &val) != 0)
cparata 0:13631b50eae6 1184 {
cparata 0:13631b50eae6 1185 return 1;
cparata 0:13631b50eae6 1186 }
cparata 0:13631b50eae6 1187
cparata 0:13631b50eae6 1188 return ret;
cparata 0:13631b50eae6 1189 }
cparata 0:13631b50eae6 1190
cparata 0:13631b50eae6 1191 /**
cparata 0:13631b50eae6 1192 * @brief Disable the 6D orientation detection for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1193 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1194 */
cparata 0:13631b50eae6 1195 int IIS2DLPCSensor::disable_6d_orientation(void)
cparata 0:13631b50eae6 1196 {
cparata 0:13631b50eae6 1197 iis2dlpc_ctrl4_int1_pad_ctrl_t ctrl4_int1_reg;
cparata 0:13631b50eae6 1198 iis2dlpc_ctrl5_int2_pad_ctrl_t ctrl5_int2_reg;
cparata 0:13631b50eae6 1199 iis2dlpc_ctrl_reg7_t ctrl_reg7;
cparata 0:13631b50eae6 1200
cparata 0:13631b50eae6 1201 /* Disable 6D orientation event on INT1 pin */
cparata 0:13631b50eae6 1202 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 1203 {
cparata 0:13631b50eae6 1204 return 1;
cparata 0:13631b50eae6 1205 }
cparata 0:13631b50eae6 1206
cparata 0:13631b50eae6 1207 ctrl4_int1_reg.int1_6d = PROPERTY_DISABLE;
cparata 0:13631b50eae6 1208
cparata 0:13631b50eae6 1209 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 1210 {
cparata 0:13631b50eae6 1211 return 1;
cparata 0:13631b50eae6 1212 }
cparata 0:13631b50eae6 1213
cparata 0:13631b50eae6 1214 /* Read INT2 Sleep Change */
cparata 0:13631b50eae6 1215 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL5_INT2_PAD_CTRL, (uint8_t *)&ctrl5_int2_reg, 1) != 0)
cparata 0:13631b50eae6 1216 {
cparata 0:13631b50eae6 1217 return 1;
cparata 0:13631b50eae6 1218 }
cparata 0:13631b50eae6 1219
cparata 0:13631b50eae6 1220 /*Disable Interrupts bit if none event is still enabled */
cparata 0:13631b50eae6 1221 if(ctrl5_int2_reg.int2_sleep_chg == 0 && ctrl4_int1_reg.int1_wu == 0 && ctrl4_int1_reg.int1_6d == 0)
cparata 0:13631b50eae6 1222 {
cparata 0:13631b50eae6 1223 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 1224 {
cparata 0:13631b50eae6 1225 return 1;
cparata 0:13631b50eae6 1226 }
cparata 0:13631b50eae6 1227
cparata 0:13631b50eae6 1228 ctrl_reg7.interrupts_enable = PROPERTY_DISABLE;
cparata 0:13631b50eae6 1229
cparata 0:13631b50eae6 1230 if (iis2dlpc_write_reg(&_reg_ctx, IIS2DLPC_CTRL_REG7, (uint8_t *)&ctrl_reg7, 1) != 0)
cparata 0:13631b50eae6 1231 {
cparata 0:13631b50eae6 1232 return 1;
cparata 0:13631b50eae6 1233 }
cparata 0:13631b50eae6 1234 }
cparata 0:13631b50eae6 1235
cparata 0:13631b50eae6 1236 /* Reset 6D orientation threshold. */
cparata 0:13631b50eae6 1237 if (iis2dlpc_6d_threshold_set(&_reg_ctx, 0) != 0)
cparata 0:13631b50eae6 1238 {
cparata 0:13631b50eae6 1239 return 1;
cparata 0:13631b50eae6 1240 }
cparata 0:13631b50eae6 1241
cparata 0:13631b50eae6 1242 return 0;
cparata 0:13631b50eae6 1243 }
cparata 0:13631b50eae6 1244
cparata 0:13631b50eae6 1245 /**
cparata 0:13631b50eae6 1246 * @brief Set the 6D orientation threshold for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1247 * @param thr the threshold to be set
cparata 0:13631b50eae6 1248 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1249 */
cparata 0:13631b50eae6 1250 int IIS2DLPCSensor::set_6d_orientation_threshold(uint8_t thr)
cparata 0:13631b50eae6 1251 {
cparata 0:13631b50eae6 1252 if(thr > 3)
cparata 0:13631b50eae6 1253 {
cparata 0:13631b50eae6 1254 return 1;
cparata 0:13631b50eae6 1255 }
cparata 0:13631b50eae6 1256
cparata 0:13631b50eae6 1257 if (iis2dlpc_6d_threshold_set(&_reg_ctx, thr) != 0)
cparata 0:13631b50eae6 1258 {
cparata 0:13631b50eae6 1259 return 1;
cparata 0:13631b50eae6 1260 }
cparata 0:13631b50eae6 1261
cparata 0:13631b50eae6 1262 return 0;
cparata 0:13631b50eae6 1263 }
cparata 0:13631b50eae6 1264
cparata 0:13631b50eae6 1265 /**
cparata 0:13631b50eae6 1266 * @brief Get the 6D orientation XL axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1267 * @param xl the pointer to the 6D orientation XL axis
cparata 0:13631b50eae6 1268 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1269 */
cparata 0:13631b50eae6 1270 int IIS2DLPCSensor::get_6d_orientation_xl(uint8_t *xl)
cparata 0:13631b50eae6 1271 {
cparata 0:13631b50eae6 1272 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1273
cparata 0:13631b50eae6 1274 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1275 {
cparata 0:13631b50eae6 1276 return 1;
cparata 0:13631b50eae6 1277 }
cparata 0:13631b50eae6 1278
cparata 0:13631b50eae6 1279 *xl = data.xl;
cparata 0:13631b50eae6 1280
cparata 0:13631b50eae6 1281 return 0;
cparata 0:13631b50eae6 1282 }
cparata 0:13631b50eae6 1283
cparata 0:13631b50eae6 1284 /**
cparata 0:13631b50eae6 1285 * @brief Get the 6D orientation XH axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1286 * @param xh the pointer to the 6D orientation XH axis
cparata 0:13631b50eae6 1287 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1288 */
cparata 0:13631b50eae6 1289 int IIS2DLPCSensor::get_6d_orientation_xh(uint8_t *xh)
cparata 0:13631b50eae6 1290 {
cparata 0:13631b50eae6 1291 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1292
cparata 0:13631b50eae6 1293 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1294 {
cparata 0:13631b50eae6 1295 return 1;
cparata 0:13631b50eae6 1296 }
cparata 0:13631b50eae6 1297
cparata 0:13631b50eae6 1298 *xh = data.xh;
cparata 0:13631b50eae6 1299
cparata 0:13631b50eae6 1300 return 0;
cparata 0:13631b50eae6 1301 }
cparata 0:13631b50eae6 1302
cparata 0:13631b50eae6 1303 /**
cparata 0:13631b50eae6 1304 * @brief Get the 6D orientation YL axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1305 * @param yl the pointer to the 6D orientation YL axis
cparata 0:13631b50eae6 1306 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1307 */
cparata 0:13631b50eae6 1308 int IIS2DLPCSensor::get_6d_orientation_yl(uint8_t *yl)
cparata 0:13631b50eae6 1309 {
cparata 0:13631b50eae6 1310 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1311
cparata 0:13631b50eae6 1312 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1313 {
cparata 0:13631b50eae6 1314 return 1;
cparata 0:13631b50eae6 1315 }
cparata 0:13631b50eae6 1316
cparata 0:13631b50eae6 1317 *yl = data.yl;
cparata 0:13631b50eae6 1318
cparata 0:13631b50eae6 1319 return 0;
cparata 0:13631b50eae6 1320 }
cparata 0:13631b50eae6 1321
cparata 0:13631b50eae6 1322 /**
cparata 0:13631b50eae6 1323 * @brief Get the 6D orientation YH axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1324 * @param yh the pointer to the 6D orientation YH axis
cparata 0:13631b50eae6 1325 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1326 */
cparata 0:13631b50eae6 1327 int IIS2DLPCSensor::get_6d_orientation_yh(uint8_t *yh)
cparata 0:13631b50eae6 1328 {
cparata 0:13631b50eae6 1329 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1330
cparata 0:13631b50eae6 1331 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1332 {
cparata 0:13631b50eae6 1333 return 1;
cparata 0:13631b50eae6 1334 }
cparata 0:13631b50eae6 1335
cparata 0:13631b50eae6 1336 *yh = data.yh;
cparata 0:13631b50eae6 1337
cparata 0:13631b50eae6 1338 return 0;
cparata 0:13631b50eae6 1339 }
cparata 0:13631b50eae6 1340
cparata 0:13631b50eae6 1341 /**
cparata 0:13631b50eae6 1342 * @brief Get the 6D orientation ZL axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1343 * @param zl the pointer to the 6D orientation ZL axis
cparata 0:13631b50eae6 1344 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1345 */
cparata 0:13631b50eae6 1346 int IIS2DLPCSensor::get_6d_orientation_zl(uint8_t *zl)
cparata 0:13631b50eae6 1347 {
cparata 0:13631b50eae6 1348 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1349
cparata 0:13631b50eae6 1350 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1351 {
cparata 0:13631b50eae6 1352 return 1;
cparata 0:13631b50eae6 1353 }
cparata 0:13631b50eae6 1354
cparata 0:13631b50eae6 1355 *zl = data.zl;
cparata 0:13631b50eae6 1356
cparata 0:13631b50eae6 1357 return 0;
cparata 0:13631b50eae6 1358 }
cparata 0:13631b50eae6 1359
cparata 0:13631b50eae6 1360 /**
cparata 0:13631b50eae6 1361 * @brief Get the 6D orientation ZH axis for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1362 * @param zh the pointer to the 6D orientation ZH axis
cparata 0:13631b50eae6 1363 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1364 */
cparata 0:13631b50eae6 1365 int IIS2DLPCSensor::get_6d_orientation_zh(uint8_t *zh)
cparata 0:13631b50eae6 1366 {
cparata 0:13631b50eae6 1367 iis2dlpc_sixd_src_t data;
cparata 0:13631b50eae6 1368
cparata 0:13631b50eae6 1369 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_SIXD_SRC, (uint8_t *)&data, 1) != 0)
cparata 0:13631b50eae6 1370 {
cparata 0:13631b50eae6 1371 return 1;
cparata 0:13631b50eae6 1372 }
cparata 0:13631b50eae6 1373
cparata 0:13631b50eae6 1374 *zh = data.zh;
cparata 0:13631b50eae6 1375
cparata 0:13631b50eae6 1376 return 0;
cparata 0:13631b50eae6 1377 }
cparata 0:13631b50eae6 1378
cparata 0:13631b50eae6 1379 /**
cparata 0:13631b50eae6 1380 * @brief Get the status of all hardware events for IIS2DLPC accelerometer sensor
cparata 0:13631b50eae6 1381 * @param status the pointer to the status of all hardware events
cparata 0:13631b50eae6 1382 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1383 */
cparata 0:13631b50eae6 1384 int IIS2DLPCSensor::get_event_status(IIS2DLPC_Event_Status_t *status)
cparata 0:13631b50eae6 1385 {
cparata 0:13631b50eae6 1386 iis2dlpc_status_t status_reg;
cparata 0:13631b50eae6 1387 iis2dlpc_ctrl4_int1_pad_ctrl_t ctrl4_int1_reg;
cparata 0:13631b50eae6 1388 iis2dlpc_ctrl5_int2_pad_ctrl_t ctrl5_int2_reg;
cparata 0:13631b50eae6 1389
cparata 0:13631b50eae6 1390 (void)memset((void *)status, 0x0, sizeof(IIS2DLPC_Event_Status_t));
cparata 0:13631b50eae6 1391
cparata 0:13631b50eae6 1392 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_STATUS, (uint8_t *)&status_reg, 1) != 0)
cparata 0:13631b50eae6 1393 {
cparata 0:13631b50eae6 1394 return 1;
cparata 0:13631b50eae6 1395 }
cparata 0:13631b50eae6 1396
cparata 0:13631b50eae6 1397 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL4_INT1_PAD_CTRL, (uint8_t *)&ctrl4_int1_reg, 1) != 0)
cparata 0:13631b50eae6 1398 {
cparata 0:13631b50eae6 1399 return 1;
cparata 0:13631b50eae6 1400 }
cparata 0:13631b50eae6 1401
cparata 0:13631b50eae6 1402 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_CTRL5_INT2_PAD_CTRL, (uint8_t *)&ctrl5_int2_reg, 1) != 0)
cparata 0:13631b50eae6 1403 {
cparata 0:13631b50eae6 1404 return 1;
cparata 0:13631b50eae6 1405 }
cparata 0:13631b50eae6 1406
cparata 0:13631b50eae6 1407 if (ctrl4_int1_reg.int1_wu == 1U)
cparata 0:13631b50eae6 1408 {
cparata 0:13631b50eae6 1409 if (status_reg.wu_ia == 1U)
cparata 0:13631b50eae6 1410 {
cparata 0:13631b50eae6 1411 status->WakeUpStatus = 1;
cparata 0:13631b50eae6 1412 }
cparata 0:13631b50eae6 1413 }
cparata 0:13631b50eae6 1414
cparata 0:13631b50eae6 1415 if (ctrl4_int1_reg.int1_6d == 1U)
cparata 0:13631b50eae6 1416 {
cparata 0:13631b50eae6 1417 if (status_reg._6d_ia == 1U)
cparata 0:13631b50eae6 1418 {
cparata 0:13631b50eae6 1419 status->D6DOrientationStatus = 1;
cparata 0:13631b50eae6 1420 }
cparata 0:13631b50eae6 1421 }
cparata 0:13631b50eae6 1422
cparata 0:13631b50eae6 1423 if (ctrl5_int2_reg.int2_sleep_chg == 1U)
cparata 0:13631b50eae6 1424 {
cparata 0:13631b50eae6 1425 if (status_reg.sleep_state == 1U)
cparata 0:13631b50eae6 1426 {
cparata 0:13631b50eae6 1427 status->SleepStatus = 1;
cparata 0:13631b50eae6 1428 }
cparata 0:13631b50eae6 1429 }
cparata 0:13631b50eae6 1430
cparata 0:13631b50eae6 1431 return 0;
cparata 0:13631b50eae6 1432 }
cparata 0:13631b50eae6 1433
cparata 0:13631b50eae6 1434 /**
cparata 0:13631b50eae6 1435 * @brief Get the number of samples contained into the FIFO
cparata 0:13631b50eae6 1436 * @param num_samples the number of samples contained into the FIFO
cparata 0:13631b50eae6 1437 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1438 */
cparata 0:13631b50eae6 1439 int IIS2DLPCSensor::get_fifo_num_samples(uint16_t *num_samples)
cparata 0:13631b50eae6 1440 {
cparata 0:13631b50eae6 1441 iis2dlpc_fifo_samples_t fifo_samples;
cparata 0:13631b50eae6 1442
cparata 0:13631b50eae6 1443 if (iis2dlpc_read_reg(&_reg_ctx, IIS2DLPC_FIFO_SAMPLES, (uint8_t *)&fifo_samples, 1) != 0)
cparata 0:13631b50eae6 1444 {
cparata 0:13631b50eae6 1445 return 1;
cparata 0:13631b50eae6 1446 }
cparata 0:13631b50eae6 1447
cparata 0:13631b50eae6 1448 if(fifo_samples.diff == 0x20)
cparata 0:13631b50eae6 1449 {
cparata 0:13631b50eae6 1450 *num_samples = 32;
cparata 0:13631b50eae6 1451 }
cparata 0:13631b50eae6 1452 else
cparata 0:13631b50eae6 1453 {
cparata 0:13631b50eae6 1454 *num_samples = fifo_samples.diff;
cparata 0:13631b50eae6 1455 }
cparata 0:13631b50eae6 1456
cparata 0:13631b50eae6 1457 return 0;
cparata 0:13631b50eae6 1458 }
cparata 0:13631b50eae6 1459
cparata 0:13631b50eae6 1460 /**
cparata 0:13631b50eae6 1461 * @brief Set the FIFO mode
cparata 0:13631b50eae6 1462 * @param mode FIFO mode
cparata 0:13631b50eae6 1463 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1464 */
cparata 0:13631b50eae6 1465 int IIS2DLPCSensor::set_fifo_mode(uint8_t mode)
cparata 0:13631b50eae6 1466 {
cparata 0:13631b50eae6 1467 int32_t ret = 0;
cparata 0:13631b50eae6 1468
cparata 0:13631b50eae6 1469 /* Verify that the passed parameter contains one of the valid values. */
cparata 0:13631b50eae6 1470 switch ((iis2dlpc_fmode_t)mode)
cparata 0:13631b50eae6 1471 {
cparata 0:13631b50eae6 1472 case IIS2DLPC_BYPASS_MODE:
cparata 0:13631b50eae6 1473 case IIS2DLPC_FIFO_MODE:
cparata 0:13631b50eae6 1474 case IIS2DLPC_STREAM_TO_FIFO_MODE:
cparata 0:13631b50eae6 1475 case IIS2DLPC_BYPASS_TO_STREAM_MODE:
cparata 0:13631b50eae6 1476 case IIS2DLPC_STREAM_MODE:
cparata 0:13631b50eae6 1477 break;
cparata 0:13631b50eae6 1478
cparata 0:13631b50eae6 1479 default:
cparata 0:13631b50eae6 1480 ret = 1;
cparata 0:13631b50eae6 1481 break;
cparata 0:13631b50eae6 1482 }
cparata 0:13631b50eae6 1483
cparata 0:13631b50eae6 1484 if (ret == 1)
cparata 0:13631b50eae6 1485 {
cparata 0:13631b50eae6 1486 return ret;
cparata 0:13631b50eae6 1487 }
cparata 0:13631b50eae6 1488
cparata 0:13631b50eae6 1489 if (iis2dlpc_fifo_mode_set(&_reg_ctx, (iis2dlpc_fmode_t)mode) != 0)
cparata 0:13631b50eae6 1490 {
cparata 0:13631b50eae6 1491 return 1;
cparata 0:13631b50eae6 1492 }
cparata 0:13631b50eae6 1493
cparata 0:13631b50eae6 1494 return ret;
cparata 0:13631b50eae6 1495 }
cparata 0:13631b50eae6 1496
cparata 0:13631b50eae6 1497 /**
cparata 0:13631b50eae6 1498 * @brief Read the data from register
cparata 0:13631b50eae6 1499 * @param reg register address
cparata 0:13631b50eae6 1500 * @param data register data
cparata 0:13631b50eae6 1501 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1502 */
cparata 0:13631b50eae6 1503 int IIS2DLPCSensor::read_reg(uint8_t reg, uint8_t *data)
cparata 0:13631b50eae6 1504 {
cparata 0:13631b50eae6 1505
cparata 0:13631b50eae6 1506 if (iis2dlpc_read_reg(&_reg_ctx, reg, data, 1) != 0)
cparata 0:13631b50eae6 1507 {
cparata 0:13631b50eae6 1508 return 1;
cparata 0:13631b50eae6 1509 }
cparata 0:13631b50eae6 1510
cparata 0:13631b50eae6 1511 return 0;
cparata 0:13631b50eae6 1512 }
cparata 0:13631b50eae6 1513
cparata 0:13631b50eae6 1514 /**
cparata 0:13631b50eae6 1515 * @brief Write the data to register
cparata 0:13631b50eae6 1516 * @param reg register address
cparata 0:13631b50eae6 1517 * @param data register data
cparata 0:13631b50eae6 1518 * @retval 0 in case of success, an error code otherwise
cparata 0:13631b50eae6 1519 */
cparata 0:13631b50eae6 1520 int IIS2DLPCSensor::write_reg(uint8_t reg, uint8_t data)
cparata 0:13631b50eae6 1521 {
cparata 0:13631b50eae6 1522
cparata 0:13631b50eae6 1523 if (iis2dlpc_write_reg(&_reg_ctx, reg, &data, 1) != 0)
cparata 0:13631b50eae6 1524 {
cparata 0:13631b50eae6 1525 return 1;
cparata 0:13631b50eae6 1526 }
cparata 0:13631b50eae6 1527
cparata 0:13631b50eae6 1528 return 0;
cparata 0:13631b50eae6 1529 }
cparata 0:13631b50eae6 1530
cparata 0:13631b50eae6 1531
cparata 0:13631b50eae6 1532 int32_t IIS2DLPC_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
cparata 0:13631b50eae6 1533 {
cparata 0:13631b50eae6 1534 return ((IIS2DLPCSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
cparata 0:13631b50eae6 1535 }
cparata 0:13631b50eae6 1536
cparata 0:13631b50eae6 1537 int32_t IIS2DLPC_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
cparata 0:13631b50eae6 1538 {
cparata 0:13631b50eae6 1539 return ((IIS2DLPCSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
cparata 0:13631b50eae6 1540 }