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

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of SingleDoubleTap_IKS01A2 by ST Expansion SW Team

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

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

Committer:
cparata
Date:
Fri Aug 19 12:31:21 2016 +0000
Revision:
2:21a191bd1998
Add interfaces to all components

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 2:21a191bd1998 1 /**
cparata 2:21a191bd1998 2 ******************************************************************************
cparata 2:21a191bd1998 3 * @file LSM303AGR_ACC_Sensor.cpp
cparata 2:21a191bd1998 4 * @author AST
cparata 2:21a191bd1998 5 * @version V1.0.0
cparata 2:21a191bd1998 6 * @date 5 August 2016
cparata 2:21a191bd1998 7 * @brief Implementation an LSM303AGR accelerometer sensor.
cparata 2:21a191bd1998 8 ******************************************************************************
cparata 2:21a191bd1998 9 * @attention
cparata 2:21a191bd1998 10 *
cparata 2:21a191bd1998 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
cparata 2:21a191bd1998 12 *
cparata 2:21a191bd1998 13 * Redistribution and use in source and binary forms, with or without modification,
cparata 2:21a191bd1998 14 * are permitted provided that the following conditions are met:
cparata 2:21a191bd1998 15 * 1. Redistributions of source code must retain the above copyright notice,
cparata 2:21a191bd1998 16 * this list of conditions and the following disclaimer.
cparata 2:21a191bd1998 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 2:21a191bd1998 18 * this list of conditions and the following disclaimer in the documentation
cparata 2:21a191bd1998 19 * and/or other materials provided with the distribution.
cparata 2:21a191bd1998 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 2:21a191bd1998 21 * may be used to endorse or promote products derived from this software
cparata 2:21a191bd1998 22 * without specific prior written permission.
cparata 2:21a191bd1998 23 *
cparata 2:21a191bd1998 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 2:21a191bd1998 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 2:21a191bd1998 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 2:21a191bd1998 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 2:21a191bd1998 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 2:21a191bd1998 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 2:21a191bd1998 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 2:21a191bd1998 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 2:21a191bd1998 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 2:21a191bd1998 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 2:21a191bd1998 34 *
cparata 2:21a191bd1998 35 ******************************************************************************
cparata 2:21a191bd1998 36 */
cparata 2:21a191bd1998 37
cparata 2:21a191bd1998 38
cparata 2:21a191bd1998 39 /* Includes ------------------------------------------------------------------*/
cparata 2:21a191bd1998 40
cparata 2:21a191bd1998 41 #include "DevI2C.h"
cparata 2:21a191bd1998 42 #include "LSM303AGR_ACC_Sensor.h"
cparata 2:21a191bd1998 43 #include "LSM303AGR_ACC_driver.h"
cparata 2:21a191bd1998 44
cparata 2:21a191bd1998 45
cparata 2:21a191bd1998 46 /* Class Implementation ------------------------------------------------------*/
cparata 2:21a191bd1998 47
cparata 2:21a191bd1998 48 /** Constructor
cparata 2:21a191bd1998 49 * @param i2c object of an helper class which handles the I2C peripheral
cparata 2:21a191bd1998 50 * @param address the address of the component's instance
cparata 2:21a191bd1998 51 */
cparata 2:21a191bd1998 52 LSM303AGR_ACC_Sensor::LSM303AGR_ACC_Sensor(DevI2C &i2c) : dev_i2c(i2c)
cparata 2:21a191bd1998 53 {
cparata 2:21a191bd1998 54 address = LSM303AGR_ACC_I2C_ADDRESS;
cparata 2:21a191bd1998 55 };
cparata 2:21a191bd1998 56
cparata 2:21a191bd1998 57 /** Constructor
cparata 2:21a191bd1998 58 * @param i2c object of an helper class which handles the I2C peripheral
cparata 2:21a191bd1998 59 * @param address the address of the component's instance
cparata 2:21a191bd1998 60 */
cparata 2:21a191bd1998 61 LSM303AGR_ACC_Sensor::LSM303AGR_ACC_Sensor(DevI2C &i2c, uint8_t address) : dev_i2c(i2c), address(address)
cparata 2:21a191bd1998 62 {
cparata 2:21a191bd1998 63
cparata 2:21a191bd1998 64 };
cparata 2:21a191bd1998 65
cparata 2:21a191bd1998 66 /**
cparata 2:21a191bd1998 67 * @brief Initializing the component.
cparata 2:21a191bd1998 68 * @param[in] init pointer to device specific initalization structure.
cparata 2:21a191bd1998 69 * @retval "0" in case of success, an error code otherwise.
cparata 2:21a191bd1998 70 */
cparata 2:21a191bd1998 71 int LSM303AGR_ACC_Sensor::Init(void *init)
cparata 2:21a191bd1998 72 {
cparata 2:21a191bd1998 73 /* Enable BDU */
cparata 2:21a191bd1998 74 if ( LSM303AGR_ACC_W_BlockDataUpdate( (void *)this, LSM303AGR_ACC_BDU_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 75 {
cparata 2:21a191bd1998 76 return 1;
cparata 2:21a191bd1998 77 }
cparata 2:21a191bd1998 78
cparata 2:21a191bd1998 79 /* FIFO mode selection */
cparata 2:21a191bd1998 80 if ( LSM303AGR_ACC_W_FifoMode( (void *)this, LSM303AGR_ACC_FM_BYPASS ) == MEMS_ERROR )
cparata 2:21a191bd1998 81 {
cparata 2:21a191bd1998 82 return 1;
cparata 2:21a191bd1998 83 }
cparata 2:21a191bd1998 84
cparata 2:21a191bd1998 85 /* Output data rate selection - power down. */
cparata 2:21a191bd1998 86 if ( LSM303AGR_ACC_W_ODR( (void *)this, LSM303AGR_ACC_ODR_DO_PWR_DOWN ) == MEMS_ERROR )
cparata 2:21a191bd1998 87 {
cparata 2:21a191bd1998 88 return 1;
cparata 2:21a191bd1998 89 }
cparata 2:21a191bd1998 90
cparata 2:21a191bd1998 91 /* Full scale selection. */
cparata 2:21a191bd1998 92 if ( Set_X_FS( 2.0f ) == 1 )
cparata 2:21a191bd1998 93 {
cparata 2:21a191bd1998 94 return 1;
cparata 2:21a191bd1998 95 }
cparata 2:21a191bd1998 96
cparata 2:21a191bd1998 97 /* Enable axes. */
cparata 2:21a191bd1998 98 if ( LSM303AGR_ACC_W_XEN( (void *)this, LSM303AGR_ACC_XEN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 99 {
cparata 2:21a191bd1998 100 return 1;
cparata 2:21a191bd1998 101 }
cparata 2:21a191bd1998 102
cparata 2:21a191bd1998 103 if ( LSM303AGR_ACC_W_YEN ( (void *)this, LSM303AGR_ACC_YEN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 104 {
cparata 2:21a191bd1998 105 return 1;
cparata 2:21a191bd1998 106 }
cparata 2:21a191bd1998 107
cparata 2:21a191bd1998 108 if ( LSM303AGR_ACC_W_ZEN ( (void *)this, LSM303AGR_ACC_ZEN_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 109 {
cparata 2:21a191bd1998 110 return 1;
cparata 2:21a191bd1998 111 }
cparata 2:21a191bd1998 112
cparata 2:21a191bd1998 113 /* Select default output data rate. */
cparata 2:21a191bd1998 114 Last_ODR = 100.0f;
cparata 2:21a191bd1998 115
cparata 2:21a191bd1998 116 isEnabled = 0;
cparata 2:21a191bd1998 117
cparata 2:21a191bd1998 118 return 0;
cparata 2:21a191bd1998 119 }
cparata 2:21a191bd1998 120
cparata 2:21a191bd1998 121 /**
cparata 2:21a191bd1998 122 * @brief Enable LSM303AGR Accelerator
cparata 2:21a191bd1998 123 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 124 */
cparata 2:21a191bd1998 125 int LSM303AGR_ACC_Sensor::Enable(void)
cparata 2:21a191bd1998 126 {
cparata 2:21a191bd1998 127 /* Check if the component is already enabled */
cparata 2:21a191bd1998 128 if ( isEnabled == 1 )
cparata 2:21a191bd1998 129 {
cparata 2:21a191bd1998 130 return 0;
cparata 2:21a191bd1998 131 }
cparata 2:21a191bd1998 132
cparata 2:21a191bd1998 133 /* Output data rate selection. */
cparata 2:21a191bd1998 134 if ( Set_X_ODR_When_Enabled( Last_ODR ) == 1 )
cparata 2:21a191bd1998 135 {
cparata 2:21a191bd1998 136 return 1;
cparata 2:21a191bd1998 137 }
cparata 2:21a191bd1998 138
cparata 2:21a191bd1998 139 isEnabled = 1;
cparata 2:21a191bd1998 140
cparata 2:21a191bd1998 141 return 0;
cparata 2:21a191bd1998 142 }
cparata 2:21a191bd1998 143
cparata 2:21a191bd1998 144 /**
cparata 2:21a191bd1998 145 * @brief Disable LSM303AGR Accelerator
cparata 2:21a191bd1998 146 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 147 */
cparata 2:21a191bd1998 148 int LSM303AGR_ACC_Sensor::Disable(void)
cparata 2:21a191bd1998 149 {
cparata 2:21a191bd1998 150 /* Check if the component is already disabled */
cparata 2:21a191bd1998 151 if ( isEnabled == 0 )
cparata 2:21a191bd1998 152 {
cparata 2:21a191bd1998 153 return 0;
cparata 2:21a191bd1998 154 }
cparata 2:21a191bd1998 155
cparata 2:21a191bd1998 156 /* Store actual output data rate. */
cparata 2:21a191bd1998 157 if ( Get_X_ODR( &Last_ODR ) == 1 )
cparata 2:21a191bd1998 158 {
cparata 2:21a191bd1998 159 return 1;
cparata 2:21a191bd1998 160 }
cparata 2:21a191bd1998 161
cparata 2:21a191bd1998 162 /* Output data rate selection - power down. */
cparata 2:21a191bd1998 163 if ( LSM303AGR_ACC_W_ODR( (void *)this, LSM303AGR_ACC_ODR_DO_PWR_DOWN ) == MEMS_ERROR )
cparata 2:21a191bd1998 164 {
cparata 2:21a191bd1998 165 return 1;
cparata 2:21a191bd1998 166 }
cparata 2:21a191bd1998 167
cparata 2:21a191bd1998 168 isEnabled = 0;
cparata 2:21a191bd1998 169
cparata 2:21a191bd1998 170 return 0;
cparata 2:21a191bd1998 171 }
cparata 2:21a191bd1998 172
cparata 2:21a191bd1998 173 /**
cparata 2:21a191bd1998 174 * @brief Read ID of LSM303AGR Accelerometer
cparata 2:21a191bd1998 175 * @param p_id the pointer where the ID of the device is stored
cparata 2:21a191bd1998 176 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 177 */
cparata 2:21a191bd1998 178 int LSM303AGR_ACC_Sensor::ReadID(uint8_t *id)
cparata 2:21a191bd1998 179 {
cparata 2:21a191bd1998 180 if(!id)
cparata 2:21a191bd1998 181 {
cparata 2:21a191bd1998 182 return 1;
cparata 2:21a191bd1998 183 }
cparata 2:21a191bd1998 184
cparata 2:21a191bd1998 185 /* Read WHO AM I register */
cparata 2:21a191bd1998 186 if ( LSM303AGR_ACC_R_WHO_AM_I( (void *)this, id ) == MEMS_ERROR )
cparata 2:21a191bd1998 187 {
cparata 2:21a191bd1998 188 return 1;
cparata 2:21a191bd1998 189 }
cparata 2:21a191bd1998 190
cparata 2:21a191bd1998 191 return 0;
cparata 2:21a191bd1998 192 }
cparata 2:21a191bd1998 193
cparata 2:21a191bd1998 194 /**
cparata 2:21a191bd1998 195 * @brief Read data from LSM303AGR Accelerometer
cparata 2:21a191bd1998 196 * @param pData the pointer where the accelerometer data are stored
cparata 2:21a191bd1998 197 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 198 */
cparata 2:21a191bd1998 199 int LSM303AGR_ACC_Sensor::Get_X_Axes(int32_t *pData)
cparata 2:21a191bd1998 200 {
cparata 2:21a191bd1998 201 int data[3];
cparata 2:21a191bd1998 202
cparata 2:21a191bd1998 203 /* Read data from LSM303AGR. */
cparata 2:21a191bd1998 204 if ( !LSM303AGR_ACC_Get_Acceleration((void *)this, data) )
cparata 2:21a191bd1998 205 {
cparata 2:21a191bd1998 206 return 1;
cparata 2:21a191bd1998 207 }
cparata 2:21a191bd1998 208
cparata 2:21a191bd1998 209 /* Calculate the data. */
cparata 2:21a191bd1998 210 pData[0] = (int32_t)data[0];
cparata 2:21a191bd1998 211 pData[1] = (int32_t)data[1];
cparata 2:21a191bd1998 212 pData[2] = (int32_t)data[2];
cparata 2:21a191bd1998 213
cparata 2:21a191bd1998 214 return 0;
cparata 2:21a191bd1998 215 }
cparata 2:21a191bd1998 216
cparata 2:21a191bd1998 217 /**
cparata 2:21a191bd1998 218 * @brief Read Accelerometer Sensitivity
cparata 2:21a191bd1998 219 * @param pfData the pointer where the accelerometer sensitivity is stored
cparata 2:21a191bd1998 220 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 221 */
cparata 2:21a191bd1998 222 int LSM303AGR_ACC_Sensor::Get_X_Sensitivity(float *pfData)
cparata 2:21a191bd1998 223 {
cparata 2:21a191bd1998 224 LSM303AGR_ACC_LPEN_t lp_value;
cparata 2:21a191bd1998 225 LSM303AGR_ACC_HR_t hr_value;
cparata 2:21a191bd1998 226
cparata 2:21a191bd1998 227 /* Read low power flag */
cparata 2:21a191bd1998 228 if( LSM303AGR_ACC_R_LOWPWR_EN( (void *)this, &lp_value ) == MEMS_ERROR )
cparata 2:21a191bd1998 229 {
cparata 2:21a191bd1998 230 return 1;
cparata 2:21a191bd1998 231 }
cparata 2:21a191bd1998 232
cparata 2:21a191bd1998 233 /* Read high performance flag */
cparata 2:21a191bd1998 234 if( LSM303AGR_ACC_R_HiRes( (void *)this, &hr_value ) == MEMS_ERROR )
cparata 2:21a191bd1998 235 {
cparata 2:21a191bd1998 236 return 1;
cparata 2:21a191bd1998 237 }
cparata 2:21a191bd1998 238
cparata 2:21a191bd1998 239 if( lp_value == LSM303AGR_ACC_LPEN_DISABLED && hr_value == LSM303AGR_ACC_HR_DISABLED )
cparata 2:21a191bd1998 240 {
cparata 2:21a191bd1998 241 /* Normal Mode */
cparata 2:21a191bd1998 242 return Get_X_Sensitivity_Normal_Mode( pfData );
cparata 2:21a191bd1998 243 } else if ( lp_value == LSM303AGR_ACC_LPEN_ENABLED && hr_value == LSM303AGR_ACC_HR_DISABLED )
cparata 2:21a191bd1998 244 {
cparata 2:21a191bd1998 245 /* Low Power Mode */
cparata 2:21a191bd1998 246 return Get_X_Sensitivity_LP_Mode( pfData );
cparata 2:21a191bd1998 247 } else if ( lp_value == LSM303AGR_ACC_LPEN_DISABLED && hr_value == LSM303AGR_ACC_HR_ENABLED )
cparata 2:21a191bd1998 248 {
cparata 2:21a191bd1998 249 /* High Resolution Mode */
cparata 2:21a191bd1998 250 return Get_X_Sensitivity_HR_Mode( pfData );
cparata 2:21a191bd1998 251 } else
cparata 2:21a191bd1998 252 {
cparata 2:21a191bd1998 253 /* Not allowed */
cparata 2:21a191bd1998 254 return 1;
cparata 2:21a191bd1998 255 }
cparata 2:21a191bd1998 256 }
cparata 2:21a191bd1998 257
cparata 2:21a191bd1998 258 /**
cparata 2:21a191bd1998 259 * @brief Read Accelerometer Sensitivity in Normal Mode
cparata 2:21a191bd1998 260 * @param sensitivity the pointer where the accelerometer sensitivity is stored
cparata 2:21a191bd1998 261 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 262 */
cparata 2:21a191bd1998 263 int LSM303AGR_ACC_Sensor::Get_X_Sensitivity_Normal_Mode( float *sensitivity )
cparata 2:21a191bd1998 264 {
cparata 2:21a191bd1998 265 LSM303AGR_ACC_FS_t fullScale;
cparata 2:21a191bd1998 266
cparata 2:21a191bd1998 267 /* Read actual full scale selection from sensor. */
cparata 2:21a191bd1998 268 if ( LSM303AGR_ACC_R_FullScale( (void *)this, &fullScale ) == MEMS_ERROR )
cparata 2:21a191bd1998 269 {
cparata 2:21a191bd1998 270 return 1;
cparata 2:21a191bd1998 271 }
cparata 2:21a191bd1998 272
cparata 2:21a191bd1998 273 /* Store the sensitivity based on actual full scale. */
cparata 2:21a191bd1998 274 switch( fullScale )
cparata 2:21a191bd1998 275 {
cparata 2:21a191bd1998 276 case LSM303AGR_ACC_FS_2G:
cparata 2:21a191bd1998 277 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_NORMAL_MODE;
cparata 2:21a191bd1998 278 break;
cparata 2:21a191bd1998 279 case LSM303AGR_ACC_FS_4G:
cparata 2:21a191bd1998 280 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_NORMAL_MODE;
cparata 2:21a191bd1998 281 break;
cparata 2:21a191bd1998 282 case LSM303AGR_ACC_FS_8G:
cparata 2:21a191bd1998 283 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_NORMAL_MODE;
cparata 2:21a191bd1998 284 break;
cparata 2:21a191bd1998 285 case LSM303AGR_ACC_FS_16G:
cparata 2:21a191bd1998 286 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_NORMAL_MODE;
cparata 2:21a191bd1998 287 break;
cparata 2:21a191bd1998 288 default:
cparata 2:21a191bd1998 289 *sensitivity = -1.0f;
cparata 2:21a191bd1998 290 return 1;
cparata 2:21a191bd1998 291 }
cparata 2:21a191bd1998 292
cparata 2:21a191bd1998 293 return 0;
cparata 2:21a191bd1998 294 }
cparata 2:21a191bd1998 295
cparata 2:21a191bd1998 296 /**
cparata 2:21a191bd1998 297 * @brief Read Accelerometer Sensitivity in LP Mode
cparata 2:21a191bd1998 298 * @param sensitivity the pointer where the accelerometer sensitivity is stored
cparata 2:21a191bd1998 299 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 300 */
cparata 2:21a191bd1998 301 int LSM303AGR_ACC_Sensor::Get_X_Sensitivity_LP_Mode( float *sensitivity )
cparata 2:21a191bd1998 302 {
cparata 2:21a191bd1998 303 LSM303AGR_ACC_FS_t fullScale;
cparata 2:21a191bd1998 304
cparata 2:21a191bd1998 305 /* Read actual full scale selection from sensor. */
cparata 2:21a191bd1998 306 if ( LSM303AGR_ACC_R_FullScale( (void *)this, &fullScale ) == MEMS_ERROR )
cparata 2:21a191bd1998 307 {
cparata 2:21a191bd1998 308 return 1;
cparata 2:21a191bd1998 309 }
cparata 2:21a191bd1998 310
cparata 2:21a191bd1998 311 /* Store the sensitivity based on actual full scale. */
cparata 2:21a191bd1998 312 switch( fullScale )
cparata 2:21a191bd1998 313 {
cparata 2:21a191bd1998 314 case LSM303AGR_ACC_FS_2G:
cparata 2:21a191bd1998 315 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_LOW_POWER_MODE;
cparata 2:21a191bd1998 316 break;
cparata 2:21a191bd1998 317 case LSM303AGR_ACC_FS_4G:
cparata 2:21a191bd1998 318 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_LOW_POWER_MODE;
cparata 2:21a191bd1998 319 break;
cparata 2:21a191bd1998 320 case LSM303AGR_ACC_FS_8G:
cparata 2:21a191bd1998 321 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_LOW_POWER_MODE;
cparata 2:21a191bd1998 322 break;
cparata 2:21a191bd1998 323 case LSM303AGR_ACC_FS_16G:
cparata 2:21a191bd1998 324 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_LOW_POWER_MODE;
cparata 2:21a191bd1998 325 break;
cparata 2:21a191bd1998 326 default:
cparata 2:21a191bd1998 327 *sensitivity = -1.0f;
cparata 2:21a191bd1998 328 return 1;
cparata 2:21a191bd1998 329 }
cparata 2:21a191bd1998 330
cparata 2:21a191bd1998 331 return 0;
cparata 2:21a191bd1998 332 }
cparata 2:21a191bd1998 333
cparata 2:21a191bd1998 334 /**
cparata 2:21a191bd1998 335 * @brief Read Accelerometer Sensitivity in HR Mode
cparata 2:21a191bd1998 336 * @param sensitivity the pointer where the accelerometer sensitivity is stored
cparata 2:21a191bd1998 337 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 338 */
cparata 2:21a191bd1998 339 int LSM303AGR_ACC_Sensor::Get_X_Sensitivity_HR_Mode( float *sensitivity )
cparata 2:21a191bd1998 340 {
cparata 2:21a191bd1998 341 LSM303AGR_ACC_FS_t fullScale;
cparata 2:21a191bd1998 342
cparata 2:21a191bd1998 343 /* Read actual full scale selection from sensor. */
cparata 2:21a191bd1998 344 if ( LSM303AGR_ACC_R_FullScale( (void *)this, &fullScale ) == MEMS_ERROR )
cparata 2:21a191bd1998 345 {
cparata 2:21a191bd1998 346 return 1;
cparata 2:21a191bd1998 347 }
cparata 2:21a191bd1998 348
cparata 2:21a191bd1998 349 /* Store the sensitivity based on actual full scale. */
cparata 2:21a191bd1998 350 switch( fullScale )
cparata 2:21a191bd1998 351 {
cparata 2:21a191bd1998 352 case LSM303AGR_ACC_FS_2G:
cparata 2:21a191bd1998 353 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_HIGH_RESOLUTION_MODE;
cparata 2:21a191bd1998 354 break;
cparata 2:21a191bd1998 355 case LSM303AGR_ACC_FS_4G:
cparata 2:21a191bd1998 356 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_HIGH_RESOLUTION_MODE;
cparata 2:21a191bd1998 357 break;
cparata 2:21a191bd1998 358 case LSM303AGR_ACC_FS_8G:
cparata 2:21a191bd1998 359 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_HIGH_RESOLUTION_MODE;
cparata 2:21a191bd1998 360 break;
cparata 2:21a191bd1998 361 case LSM303AGR_ACC_FS_16G:
cparata 2:21a191bd1998 362 *sensitivity = ( float )LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_HIGH_RESOLUTION_MODE;
cparata 2:21a191bd1998 363 break;
cparata 2:21a191bd1998 364 default:
cparata 2:21a191bd1998 365 *sensitivity = -1.0f;
cparata 2:21a191bd1998 366 return 1;
cparata 2:21a191bd1998 367 }
cparata 2:21a191bd1998 368
cparata 2:21a191bd1998 369 return 0;
cparata 2:21a191bd1998 370 }
cparata 2:21a191bd1998 371
cparata 2:21a191bd1998 372 /**
cparata 2:21a191bd1998 373 * @brief Read raw data from LSM303AGR Accelerometer
cparata 2:21a191bd1998 374 * @param pData the pointer where the accelerometer raw data are stored
cparata 2:21a191bd1998 375 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 376 */
cparata 2:21a191bd1998 377 int LSM303AGR_ACC_Sensor::Get_X_AxesRaw(int16_t *pData)
cparata 2:21a191bd1998 378 {
cparata 2:21a191bd1998 379 uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};
cparata 2:21a191bd1998 380 u8_t shift = 0;
cparata 2:21a191bd1998 381 LSM303AGR_ACC_LPEN_t lp;
cparata 2:21a191bd1998 382 LSM303AGR_ACC_HR_t hr;
cparata 2:21a191bd1998 383
cparata 2:21a191bd1998 384 /* Determine which operational mode the acc is set */
cparata 2:21a191bd1998 385 if(!LSM303AGR_ACC_R_HiRes( (void *)this, &hr )) {
cparata 2:21a191bd1998 386 return 1;
cparata 2:21a191bd1998 387 }
cparata 2:21a191bd1998 388
cparata 2:21a191bd1998 389 if(!LSM303AGR_ACC_R_LOWPWR_EN( (void *)this, &lp )) {
cparata 2:21a191bd1998 390 return 1;
cparata 2:21a191bd1998 391 }
cparata 2:21a191bd1998 392
cparata 2:21a191bd1998 393 if (lp == LSM303AGR_ACC_LPEN_ENABLED && hr == LSM303AGR_ACC_HR_DISABLED) {
cparata 2:21a191bd1998 394 /* op mode is LP 8-bit */
cparata 2:21a191bd1998 395 shift = 8;
cparata 2:21a191bd1998 396 } else if (lp == LSM303AGR_ACC_LPEN_DISABLED && hr == LSM303AGR_ACC_HR_DISABLED) {
cparata 2:21a191bd1998 397 /* op mode is Normal 10-bit */
cparata 2:21a191bd1998 398 shift = 6;
cparata 2:21a191bd1998 399 } else if (lp == LSM303AGR_ACC_LPEN_DISABLED && hr == LSM303AGR_ACC_HR_ENABLED) {
cparata 2:21a191bd1998 400 /* op mode is HR 12-bit */
cparata 2:21a191bd1998 401 shift = 4;
cparata 2:21a191bd1998 402 } else {
cparata 2:21a191bd1998 403 return 1;
cparata 2:21a191bd1998 404 }
cparata 2:21a191bd1998 405
cparata 2:21a191bd1998 406 /* Read output registers from LSM303AGR_ACC_GYRO_OUTX_L_XL to LSM303AGR_ACC_GYRO_OUTZ_H_XL. */
cparata 2:21a191bd1998 407 if (!LSM303AGR_ACC_Get_Raw_Acceleration( (void *)this, ( uint8_t* )regValue ))
cparata 2:21a191bd1998 408 {
cparata 2:21a191bd1998 409 return 1;
cparata 2:21a191bd1998 410 }
cparata 2:21a191bd1998 411
cparata 2:21a191bd1998 412 /* Format the data. */
cparata 2:21a191bd1998 413 pData[0] = ( ( ( ( ( int16_t )regValue[1] ) << 8 ) + ( int16_t )regValue[0] ) >> shift );
cparata 2:21a191bd1998 414 pData[1] = ( ( ( ( ( int16_t )regValue[3] ) << 8 ) + ( int16_t )regValue[2] ) >> shift );
cparata 2:21a191bd1998 415 pData[2] = ( ( ( ( ( int16_t )regValue[5] ) << 8 ) + ( int16_t )regValue[4] ) >> shift );
cparata 2:21a191bd1998 416
cparata 2:21a191bd1998 417 return 0;
cparata 2:21a191bd1998 418 }
cparata 2:21a191bd1998 419
cparata 2:21a191bd1998 420 /**
cparata 2:21a191bd1998 421 * @brief Read LSM303AGR Accelerometer output data rate
cparata 2:21a191bd1998 422 * @param odr the pointer to the output data rate
cparata 2:21a191bd1998 423 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 424 */
cparata 2:21a191bd1998 425 int LSM303AGR_ACC_Sensor::Get_X_ODR(float* odr)
cparata 2:21a191bd1998 426 {
cparata 2:21a191bd1998 427 LSM303AGR_ACC_ODR_t odr_low_level;
cparata 2:21a191bd1998 428
cparata 2:21a191bd1998 429 if ( LSM303AGR_ACC_R_ODR( (void *)this, &odr_low_level ) == MEMS_ERROR )
cparata 2:21a191bd1998 430 {
cparata 2:21a191bd1998 431 return 1;
cparata 2:21a191bd1998 432 }
cparata 2:21a191bd1998 433
cparata 2:21a191bd1998 434 switch( odr_low_level )
cparata 2:21a191bd1998 435 {
cparata 2:21a191bd1998 436 case LSM303AGR_ACC_ODR_DO_PWR_DOWN:
cparata 2:21a191bd1998 437 *odr = 0.0f;
cparata 2:21a191bd1998 438 break;
cparata 2:21a191bd1998 439 case LSM303AGR_ACC_ODR_DO_1Hz:
cparata 2:21a191bd1998 440 *odr = 1.0f;
cparata 2:21a191bd1998 441 break;
cparata 2:21a191bd1998 442 case LSM303AGR_ACC_ODR_DO_10Hz:
cparata 2:21a191bd1998 443 *odr = 10.0f;
cparata 2:21a191bd1998 444 break;
cparata 2:21a191bd1998 445 case LSM303AGR_ACC_ODR_DO_25Hz:
cparata 2:21a191bd1998 446 *odr = 25.0f;
cparata 2:21a191bd1998 447 break;
cparata 2:21a191bd1998 448 case LSM303AGR_ACC_ODR_DO_50Hz:
cparata 2:21a191bd1998 449 *odr = 50.0f;
cparata 2:21a191bd1998 450 break;
cparata 2:21a191bd1998 451 case LSM303AGR_ACC_ODR_DO_100Hz:
cparata 2:21a191bd1998 452 *odr = 100.0f;
cparata 2:21a191bd1998 453 break;
cparata 2:21a191bd1998 454 case LSM303AGR_ACC_ODR_DO_200Hz:
cparata 2:21a191bd1998 455 *odr = 200.0f;
cparata 2:21a191bd1998 456 break;
cparata 2:21a191bd1998 457 case LSM303AGR_ACC_ODR_DO_400Hz:
cparata 2:21a191bd1998 458 *odr = 400.0f;
cparata 2:21a191bd1998 459 break;
cparata 2:21a191bd1998 460 default:
cparata 2:21a191bd1998 461 *odr = -1.0f;
cparata 2:21a191bd1998 462 return 1;
cparata 2:21a191bd1998 463 }
cparata 2:21a191bd1998 464
cparata 2:21a191bd1998 465 return 0;
cparata 2:21a191bd1998 466 }
cparata 2:21a191bd1998 467
cparata 2:21a191bd1998 468 /**
cparata 2:21a191bd1998 469 * @brief Set ODR
cparata 2:21a191bd1998 470 * @param odr the output data rate to be set
cparata 2:21a191bd1998 471 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 472 */
cparata 2:21a191bd1998 473 int LSM303AGR_ACC_Sensor::Set_X_ODR(float odr)
cparata 2:21a191bd1998 474 {
cparata 2:21a191bd1998 475 if(isEnabled == 1)
cparata 2:21a191bd1998 476 {
cparata 2:21a191bd1998 477 if(Set_X_ODR_When_Enabled(odr) == 1)
cparata 2:21a191bd1998 478 {
cparata 2:21a191bd1998 479 return 1;
cparata 2:21a191bd1998 480 }
cparata 2:21a191bd1998 481 }
cparata 2:21a191bd1998 482 else
cparata 2:21a191bd1998 483 {
cparata 2:21a191bd1998 484 if(Set_X_ODR_When_Disabled(odr) == 1)
cparata 2:21a191bd1998 485 {
cparata 2:21a191bd1998 486 return 1;
cparata 2:21a191bd1998 487 }
cparata 2:21a191bd1998 488 }
cparata 2:21a191bd1998 489
cparata 2:21a191bd1998 490 return 0;
cparata 2:21a191bd1998 491 }
cparata 2:21a191bd1998 492
cparata 2:21a191bd1998 493 /**
cparata 2:21a191bd1998 494 * @brief Set ODR when enabled
cparata 2:21a191bd1998 495 * @param odr the output data rate to be set
cparata 2:21a191bd1998 496 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 497 */
cparata 2:21a191bd1998 498 int LSM303AGR_ACC_Sensor::Set_X_ODR_When_Enabled(float odr)
cparata 2:21a191bd1998 499 {
cparata 2:21a191bd1998 500 LSM303AGR_ACC_ODR_t new_odr;
cparata 2:21a191bd1998 501
cparata 2:21a191bd1998 502 new_odr = ( odr <= 1.0f ) ? LSM303AGR_ACC_ODR_DO_1Hz
cparata 2:21a191bd1998 503 : ( odr <= 10.0f ) ? LSM303AGR_ACC_ODR_DO_10Hz
cparata 2:21a191bd1998 504 : ( odr <= 25.0f ) ? LSM303AGR_ACC_ODR_DO_25Hz
cparata 2:21a191bd1998 505 : ( odr <= 50.0f ) ? LSM303AGR_ACC_ODR_DO_50Hz
cparata 2:21a191bd1998 506 : ( odr <= 100.0f ) ? LSM303AGR_ACC_ODR_DO_100Hz
cparata 2:21a191bd1998 507 : ( odr <= 200.0f ) ? LSM303AGR_ACC_ODR_DO_200Hz
cparata 2:21a191bd1998 508 : LSM303AGR_ACC_ODR_DO_400Hz;
cparata 2:21a191bd1998 509
cparata 2:21a191bd1998 510 if ( LSM303AGR_ACC_W_ODR( (void *)this, new_odr ) == MEMS_ERROR )
cparata 2:21a191bd1998 511 {
cparata 2:21a191bd1998 512 return 1;
cparata 2:21a191bd1998 513 }
cparata 2:21a191bd1998 514
cparata 2:21a191bd1998 515 return 0;
cparata 2:21a191bd1998 516 }
cparata 2:21a191bd1998 517
cparata 2:21a191bd1998 518 /**
cparata 2:21a191bd1998 519 * @brief Set ODR when disabled
cparata 2:21a191bd1998 520 * @param odr the output data rate to be set
cparata 2:21a191bd1998 521 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 522 */
cparata 2:21a191bd1998 523 int LSM303AGR_ACC_Sensor::Set_X_ODR_When_Disabled(float odr)
cparata 2:21a191bd1998 524 {
cparata 2:21a191bd1998 525 Last_ODR = ( odr <= 1.0f ) ? 1.0f
cparata 2:21a191bd1998 526 : ( odr <= 10.0f ) ? 10.0f
cparata 2:21a191bd1998 527 : ( odr <= 25.0f ) ? 25.0f
cparata 2:21a191bd1998 528 : ( odr <= 50.0f ) ? 50.0f
cparata 2:21a191bd1998 529 : ( odr <= 100.0f ) ? 100.0f
cparata 2:21a191bd1998 530 : ( odr <= 200.0f ) ? 200.0f
cparata 2:21a191bd1998 531 : 400.0f;
cparata 2:21a191bd1998 532
cparata 2:21a191bd1998 533 return 0;
cparata 2:21a191bd1998 534 }
cparata 2:21a191bd1998 535
cparata 2:21a191bd1998 536
cparata 2:21a191bd1998 537 /**
cparata 2:21a191bd1998 538 * @brief Read LSM303AGR Accelerometer full scale
cparata 2:21a191bd1998 539 * @param fullScale the pointer to the full scale
cparata 2:21a191bd1998 540 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 541 */
cparata 2:21a191bd1998 542 int LSM303AGR_ACC_Sensor::Get_X_FS(float* fullScale)
cparata 2:21a191bd1998 543 {
cparata 2:21a191bd1998 544 LSM303AGR_ACC_FS_t fs_low_level;
cparata 2:21a191bd1998 545
cparata 2:21a191bd1998 546 if ( LSM303AGR_ACC_R_FullScale( (void *)this, &fs_low_level ) == MEMS_ERROR )
cparata 2:21a191bd1998 547 {
cparata 2:21a191bd1998 548 return 1;
cparata 2:21a191bd1998 549 }
cparata 2:21a191bd1998 550
cparata 2:21a191bd1998 551 switch( fs_low_level )
cparata 2:21a191bd1998 552 {
cparata 2:21a191bd1998 553 case LSM303AGR_ACC_FS_2G:
cparata 2:21a191bd1998 554 *fullScale = 2.0f;
cparata 2:21a191bd1998 555 break;
cparata 2:21a191bd1998 556 case LSM303AGR_ACC_FS_4G:
cparata 2:21a191bd1998 557 *fullScale = 4.0f;
cparata 2:21a191bd1998 558 break;
cparata 2:21a191bd1998 559 case LSM303AGR_ACC_FS_8G:
cparata 2:21a191bd1998 560 *fullScale = 8.0f;
cparata 2:21a191bd1998 561 break;
cparata 2:21a191bd1998 562 case LSM303AGR_ACC_FS_16G:
cparata 2:21a191bd1998 563 *fullScale = 16.0f;
cparata 2:21a191bd1998 564 break;
cparata 2:21a191bd1998 565 default:
cparata 2:21a191bd1998 566 *fullScale = -1.0f;
cparata 2:21a191bd1998 567 return 1;
cparata 2:21a191bd1998 568 }
cparata 2:21a191bd1998 569
cparata 2:21a191bd1998 570 return 0;
cparata 2:21a191bd1998 571 }
cparata 2:21a191bd1998 572
cparata 2:21a191bd1998 573 /**
cparata 2:21a191bd1998 574 * @brief Set full scale
cparata 2:21a191bd1998 575 * @param fullScale the full scale to be set
cparata 2:21a191bd1998 576 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 577 */
cparata 2:21a191bd1998 578 int LSM303AGR_ACC_Sensor::Set_X_FS(float fullScale)
cparata 2:21a191bd1998 579 {
cparata 2:21a191bd1998 580 LSM303AGR_ACC_FS_t new_fs;
cparata 2:21a191bd1998 581
cparata 2:21a191bd1998 582 new_fs = ( fullScale <= 2.0f ) ? LSM303AGR_ACC_FS_2G
cparata 2:21a191bd1998 583 : ( fullScale <= 4.0f ) ? LSM303AGR_ACC_FS_4G
cparata 2:21a191bd1998 584 : ( fullScale <= 8.0f ) ? LSM303AGR_ACC_FS_8G
cparata 2:21a191bd1998 585 : LSM303AGR_ACC_FS_16G;
cparata 2:21a191bd1998 586
cparata 2:21a191bd1998 587 if ( LSM303AGR_ACC_W_FullScale( (void *)this, new_fs ) == MEMS_ERROR )
cparata 2:21a191bd1998 588 {
cparata 2:21a191bd1998 589 return 1;
cparata 2:21a191bd1998 590 }
cparata 2:21a191bd1998 591
cparata 2:21a191bd1998 592 return 0;
cparata 2:21a191bd1998 593 }
cparata 2:21a191bd1998 594
cparata 2:21a191bd1998 595 /**
cparata 2:21a191bd1998 596 * @brief Read accelerometer data from register
cparata 2:21a191bd1998 597 * @param reg register address
cparata 2:21a191bd1998 598 * @param data register data
cparata 2:21a191bd1998 599 * @retval 0 in case of success
cparata 2:21a191bd1998 600 * @retval 1 in case of failure
cparata 2:21a191bd1998 601 */
cparata 2:21a191bd1998 602 int LSM303AGR_ACC_Sensor::ReadReg( uint8_t reg, uint8_t *data )
cparata 2:21a191bd1998 603 {
cparata 2:21a191bd1998 604
cparata 2:21a191bd1998 605 if ( LSM303AGR_ACC_ReadReg( (void *)this, reg, data ) == MEMS_ERROR )
cparata 2:21a191bd1998 606 {
cparata 2:21a191bd1998 607 return 1;
cparata 2:21a191bd1998 608 }
cparata 2:21a191bd1998 609
cparata 2:21a191bd1998 610 return 0;
cparata 2:21a191bd1998 611 }
cparata 2:21a191bd1998 612
cparata 2:21a191bd1998 613 /**
cparata 2:21a191bd1998 614 * @brief Write accelerometer data to register
cparata 2:21a191bd1998 615 * @param reg register address
cparata 2:21a191bd1998 616 * @param data register data
cparata 2:21a191bd1998 617 * @retval 0 in case of success
cparata 2:21a191bd1998 618 * @retval 1 in case of failure
cparata 2:21a191bd1998 619 */
cparata 2:21a191bd1998 620 int LSM303AGR_ACC_Sensor::WriteReg( uint8_t reg, uint8_t data )
cparata 2:21a191bd1998 621 {
cparata 2:21a191bd1998 622
cparata 2:21a191bd1998 623 if ( LSM303AGR_ACC_WriteReg( (void *)this, reg, data ) == MEMS_ERROR )
cparata 2:21a191bd1998 624 {
cparata 2:21a191bd1998 625 return 1;
cparata 2:21a191bd1998 626 }
cparata 2:21a191bd1998 627
cparata 2:21a191bd1998 628 return 0;
cparata 2:21a191bd1998 629 }
cparata 2:21a191bd1998 630
cparata 2:21a191bd1998 631 uint8_t LSM303AGR_ACC_IO_Write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
cparata 2:21a191bd1998 632 {
cparata 2:21a191bd1998 633 return ((LSM303AGR_ACC_Sensor *)handle)->IO_Write(pBuffer, WriteAddr, nBytesToWrite);
cparata 2:21a191bd1998 634 }
cparata 2:21a191bd1998 635
cparata 2:21a191bd1998 636 uint8_t LSM303AGR_ACC_IO_Read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
cparata 2:21a191bd1998 637 {
cparata 2:21a191bd1998 638 return ((LSM303AGR_ACC_Sensor *)handle)->IO_Read(pBuffer, ReadAddr, nBytesToRead);
cparata 2:21a191bd1998 639 }