3-axis MEMS ultra low power accelerometer

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Committer:
cparata
Date:
Wed Jul 24 14:18:07 2019 +0000
Revision:
4:94c5d5546161
Parent:
0:dff8803aace7
Format with Astyle

Who changed what in which revision?

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