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_MAG_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 magnetometer 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 "mbed.h"
cparata 2:21a191bd1998 42 #include "DevI2C.h"
cparata 2:21a191bd1998 43 #include "LSM303AGR_MAG_Sensor.h"
cparata 2:21a191bd1998 44 #include "LSM303AGR_MAG_driver.h"
cparata 2:21a191bd1998 45
cparata 2:21a191bd1998 46
cparata 2:21a191bd1998 47 /* Class Implementation ------------------------------------------------------*/
cparata 2:21a191bd1998 48
cparata 2:21a191bd1998 49 /** Constructor
cparata 2:21a191bd1998 50 * @param i2c object of an helper class which handles the I2C peripheral
cparata 2:21a191bd1998 51 * @param address the address of the component's instance
cparata 2:21a191bd1998 52 */
cparata 2:21a191bd1998 53 LSM303AGR_MAG_Sensor::LSM303AGR_MAG_Sensor(DevI2C &i2c) : dev_i2c(i2c)
cparata 2:21a191bd1998 54 {
cparata 2:21a191bd1998 55 address = LSM303AGR_MAG_I2C_ADDRESS;
cparata 2:21a191bd1998 56 };
cparata 2:21a191bd1998 57
cparata 2:21a191bd1998 58 /** Constructor
cparata 2:21a191bd1998 59 * @param i2c object of an helper class which handles the I2C peripheral
cparata 2:21a191bd1998 60 * @param address the address of the component's instance
cparata 2:21a191bd1998 61 */
cparata 2:21a191bd1998 62 LSM303AGR_MAG_Sensor::LSM303AGR_MAG_Sensor(DevI2C &i2c, uint8_t address) : dev_i2c(i2c), address(address)
cparata 2:21a191bd1998 63 {
cparata 2:21a191bd1998 64
cparata 2:21a191bd1998 65 };
cparata 2:21a191bd1998 66
cparata 2:21a191bd1998 67 /**
cparata 2:21a191bd1998 68 * @brief Initializing the component.
cparata 2:21a191bd1998 69 * @param[in] init pointer to device specific initalization structure.
cparata 2:21a191bd1998 70 * @retval "0" in case of success, an error code otherwise.
cparata 2:21a191bd1998 71 */
cparata 2:21a191bd1998 72 int LSM303AGR_MAG_Sensor::Init(void *init)
cparata 2:21a191bd1998 73 {
cparata 2:21a191bd1998 74 /* Operating mode selection - power down */
cparata 2:21a191bd1998 75 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_IDLE1_MODE ) == MEMS_ERROR )
cparata 2:21a191bd1998 76 {
cparata 2:21a191bd1998 77 return 1;
cparata 2:21a191bd1998 78 }
cparata 2:21a191bd1998 79
cparata 2:21a191bd1998 80 /* Enable BDU */
cparata 2:21a191bd1998 81 if ( LSM303AGR_MAG_W_BDU( (void *)this, LSM303AGR_MAG_BDU_ENABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 82 {
cparata 2:21a191bd1998 83 return 1;
cparata 2:21a191bd1998 84 }
cparata 2:21a191bd1998 85
cparata 2:21a191bd1998 86 if ( Set_M_ODR( 100.0f ) == 1 )
cparata 2:21a191bd1998 87 {
cparata 2:21a191bd1998 88 return 1;
cparata 2:21a191bd1998 89 }
cparata 2:21a191bd1998 90
cparata 2:21a191bd1998 91 if ( Set_M_FS( 50.0f ) == 1 )
cparata 2:21a191bd1998 92 {
cparata 2:21a191bd1998 93 return 1;
cparata 2:21a191bd1998 94 }
cparata 2:21a191bd1998 95
cparata 2:21a191bd1998 96 if ( LSM303AGR_MAG_W_ST( (void *)this, LSM303AGR_MAG_ST_DISABLED ) == MEMS_ERROR )
cparata 2:21a191bd1998 97 {
cparata 2:21a191bd1998 98 return 1;
cparata 2:21a191bd1998 99 }
cparata 2:21a191bd1998 100
cparata 2:21a191bd1998 101 return 0;
cparata 2:21a191bd1998 102 }
cparata 2:21a191bd1998 103
cparata 2:21a191bd1998 104 /**
cparata 2:21a191bd1998 105 * @brief Enable LSM303AGR magnetometer
cparata 2:21a191bd1998 106 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 107 */
cparata 2:21a191bd1998 108 int LSM303AGR_MAG_Sensor::Enable(void)
cparata 2:21a191bd1998 109 {
cparata 2:21a191bd1998 110 /* Operating mode selection */
cparata 2:21a191bd1998 111 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_CONTINUOS_MODE ) == MEMS_ERROR )
cparata 2:21a191bd1998 112 {
cparata 2:21a191bd1998 113 return 1;
cparata 2:21a191bd1998 114 }
cparata 2:21a191bd1998 115
cparata 2:21a191bd1998 116 return 0;
cparata 2:21a191bd1998 117 }
cparata 2:21a191bd1998 118
cparata 2:21a191bd1998 119 /**
cparata 2:21a191bd1998 120 * @brief Disable LSM303AGR magnetometer
cparata 2:21a191bd1998 121 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 122 */
cparata 2:21a191bd1998 123 int LSM303AGR_MAG_Sensor::Disable(void)
cparata 2:21a191bd1998 124 {
cparata 2:21a191bd1998 125 /* Operating mode selection - power down */
cparata 2:21a191bd1998 126 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_IDLE1_MODE ) == MEMS_ERROR )
cparata 2:21a191bd1998 127 {
cparata 2:21a191bd1998 128 return 1;
cparata 2:21a191bd1998 129 }
cparata 2:21a191bd1998 130
cparata 2:21a191bd1998 131 return 0;
cparata 2:21a191bd1998 132 }
cparata 2:21a191bd1998 133
cparata 2:21a191bd1998 134 /**
cparata 2:21a191bd1998 135 * @brief Read ID of LSM303AGR Magnetometer
cparata 2:21a191bd1998 136 * @param p_id the pointer where the ID of the device is stored
cparata 2:21a191bd1998 137 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 138 */
cparata 2:21a191bd1998 139 int LSM303AGR_MAG_Sensor::ReadID(uint8_t *id)
cparata 2:21a191bd1998 140 {
cparata 2:21a191bd1998 141 if(!id)
cparata 2:21a191bd1998 142 {
cparata 2:21a191bd1998 143 return 1;
cparata 2:21a191bd1998 144 }
cparata 2:21a191bd1998 145
cparata 2:21a191bd1998 146 /* Read WHO AM I register */
cparata 2:21a191bd1998 147 if ( LSM303AGR_MAG_R_WHO_AM_I( (void *)this, id ) == MEMS_ERROR )
cparata 2:21a191bd1998 148 {
cparata 2:21a191bd1998 149 return 1;
cparata 2:21a191bd1998 150 }
cparata 2:21a191bd1998 151
cparata 2:21a191bd1998 152 return 0;
cparata 2:21a191bd1998 153 }
cparata 2:21a191bd1998 154
cparata 2:21a191bd1998 155 /**
cparata 2:21a191bd1998 156 * @brief Read data from LSM303AGR Magnetometer
cparata 2:21a191bd1998 157 * @param pData the pointer where the magnetometer data are stored
cparata 2:21a191bd1998 158 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 159 */
cparata 2:21a191bd1998 160 int LSM303AGR_MAG_Sensor::Get_M_Axes(int32_t *pData)
cparata 2:21a191bd1998 161 {
cparata 2:21a191bd1998 162 int16_t pDataRaw[3];
cparata 2:21a191bd1998 163 float sensitivity = 0;
cparata 2:21a191bd1998 164
cparata 2:21a191bd1998 165 /* Read raw data from LSM303AGR output register. */
cparata 2:21a191bd1998 166 if ( Get_M_AxesRaw( pDataRaw ) == 1 )
cparata 2:21a191bd1998 167 {
cparata 2:21a191bd1998 168 return 1;
cparata 2:21a191bd1998 169 }
cparata 2:21a191bd1998 170
cparata 2:21a191bd1998 171 /* Get LSM303AGR actual sensitivity. */
cparata 2:21a191bd1998 172 if ( Get_M_Sensitivity( &sensitivity ) == 1 )
cparata 2:21a191bd1998 173 {
cparata 2:21a191bd1998 174 return 1;
cparata 2:21a191bd1998 175 }
cparata 2:21a191bd1998 176
cparata 2:21a191bd1998 177 /* Calculate the data. */
cparata 2:21a191bd1998 178 pData[0] = ( int32_t )( pDataRaw[0] * sensitivity );
cparata 2:21a191bd1998 179 pData[1] = ( int32_t )( pDataRaw[1] * sensitivity );
cparata 2:21a191bd1998 180 pData[2] = ( int32_t )( pDataRaw[2] * sensitivity );
cparata 2:21a191bd1998 181
cparata 2:21a191bd1998 182 return 0;
cparata 2:21a191bd1998 183 }
cparata 2:21a191bd1998 184
cparata 2:21a191bd1998 185 /**
cparata 2:21a191bd1998 186 * @brief Read Magnetometer Sensitivity
cparata 2:21a191bd1998 187 * @param pfData the pointer where the magnetometer sensitivity is stored
cparata 2:21a191bd1998 188 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 189 */
cparata 2:21a191bd1998 190 int LSM303AGR_MAG_Sensor::Get_M_Sensitivity(float *pfData)
cparata 2:21a191bd1998 191 {
cparata 2:21a191bd1998 192 *pfData = 1.5f;
cparata 2:21a191bd1998 193
cparata 2:21a191bd1998 194 return 0;
cparata 2:21a191bd1998 195 }
cparata 2:21a191bd1998 196
cparata 2:21a191bd1998 197 /**
cparata 2:21a191bd1998 198 * @brief Read raw data from LSM303AGR Magnetometer
cparata 2:21a191bd1998 199 * @param pData the pointer where the magnetomer raw data are stored
cparata 2:21a191bd1998 200 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 201 */
cparata 2:21a191bd1998 202 int LSM303AGR_MAG_Sensor::Get_M_AxesRaw(int16_t *pData)
cparata 2:21a191bd1998 203 {
cparata 2:21a191bd1998 204 uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};
cparata 2:21a191bd1998 205 int16_t *regValueInt16;
cparata 2:21a191bd1998 206
cparata 2:21a191bd1998 207 /* Read output registers from LSM303AGR_MAG_OUTX_L to LSM303AGR_MAG_OUTZ_H. */
cparata 2:21a191bd1998 208 if ( LSM303AGR_MAG_Get_Raw_Magnetic( (void *)this, regValue ) == MEMS_ERROR )
cparata 2:21a191bd1998 209 {
cparata 2:21a191bd1998 210 return 1;
cparata 2:21a191bd1998 211 }
cparata 2:21a191bd1998 212
cparata 2:21a191bd1998 213 regValueInt16 = (int16_t *)regValue;
cparata 2:21a191bd1998 214
cparata 2:21a191bd1998 215 /* Format the data. */
cparata 2:21a191bd1998 216 pData[0] = regValueInt16[0];
cparata 2:21a191bd1998 217 pData[1] = regValueInt16[1];
cparata 2:21a191bd1998 218 pData[2] = regValueInt16[2];
cparata 2:21a191bd1998 219
cparata 2:21a191bd1998 220 return 0;
cparata 2:21a191bd1998 221 }
cparata 2:21a191bd1998 222
cparata 2:21a191bd1998 223 /**
cparata 2:21a191bd1998 224 * @brief Read LSM303AGR Magnetometer output data rate
cparata 2:21a191bd1998 225 * @param odr the pointer to the output data rate
cparata 2:21a191bd1998 226 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 227 */
cparata 2:21a191bd1998 228 int LSM303AGR_MAG_Sensor::Get_M_ODR(float* odr)
cparata 2:21a191bd1998 229 {
cparata 2:21a191bd1998 230 LSM303AGR_MAG_ODR_t odr_low_level;
cparata 2:21a191bd1998 231
cparata 2:21a191bd1998 232 if ( LSM303AGR_MAG_R_ODR( (void *)this, &odr_low_level ) == MEMS_ERROR )
cparata 2:21a191bd1998 233 {
cparata 2:21a191bd1998 234 return 1;
cparata 2:21a191bd1998 235 }
cparata 2:21a191bd1998 236
cparata 2:21a191bd1998 237 switch( odr_low_level )
cparata 2:21a191bd1998 238 {
cparata 2:21a191bd1998 239 case LSM303AGR_MAG_ODR_10Hz:
cparata 2:21a191bd1998 240 *odr = 10.000f;
cparata 2:21a191bd1998 241 break;
cparata 2:21a191bd1998 242 case LSM303AGR_MAG_ODR_20Hz:
cparata 2:21a191bd1998 243 *odr = 20.000f;
cparata 2:21a191bd1998 244 break;
cparata 2:21a191bd1998 245 case LSM303AGR_MAG_ODR_50Hz:
cparata 2:21a191bd1998 246 *odr = 50.000f;
cparata 2:21a191bd1998 247 break;
cparata 2:21a191bd1998 248 case LSM303AGR_MAG_ODR_100Hz:
cparata 2:21a191bd1998 249 *odr = 100.000f;
cparata 2:21a191bd1998 250 break;
cparata 2:21a191bd1998 251 default:
cparata 2:21a191bd1998 252 *odr = -1.000f;
cparata 2:21a191bd1998 253 return 1;
cparata 2:21a191bd1998 254 }
cparata 2:21a191bd1998 255 return 0;
cparata 2:21a191bd1998 256 }
cparata 2:21a191bd1998 257
cparata 2:21a191bd1998 258 /**
cparata 2:21a191bd1998 259 * @brief Set ODR
cparata 2:21a191bd1998 260 * @param odr the output data rate to be set
cparata 2:21a191bd1998 261 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 262 */
cparata 2:21a191bd1998 263 int LSM303AGR_MAG_Sensor::Set_M_ODR(float odr)
cparata 2:21a191bd1998 264 {
cparata 2:21a191bd1998 265 LSM303AGR_MAG_ODR_t new_odr;
cparata 2:21a191bd1998 266
cparata 2:21a191bd1998 267 new_odr = ( odr <= 10.000f ) ? LSM303AGR_MAG_ODR_10Hz
cparata 2:21a191bd1998 268 : ( odr <= 20.000f ) ? LSM303AGR_MAG_ODR_20Hz
cparata 2:21a191bd1998 269 : ( odr <= 50.000f ) ? LSM303AGR_MAG_ODR_50Hz
cparata 2:21a191bd1998 270 : LSM303AGR_MAG_ODR_100Hz;
cparata 2:21a191bd1998 271
cparata 2:21a191bd1998 272 if ( LSM303AGR_MAG_W_ODR( (void *)this, new_odr ) == MEMS_ERROR )
cparata 2:21a191bd1998 273 {
cparata 2:21a191bd1998 274 return 1;
cparata 2:21a191bd1998 275 }
cparata 2:21a191bd1998 276
cparata 2:21a191bd1998 277 return 0;
cparata 2:21a191bd1998 278 }
cparata 2:21a191bd1998 279
cparata 2:21a191bd1998 280
cparata 2:21a191bd1998 281 /**
cparata 2:21a191bd1998 282 * @brief Read LSM303AGR Magnetometer full scale
cparata 2:21a191bd1998 283 * @param fullScale the pointer to the output data rate
cparata 2:21a191bd1998 284 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 285 */
cparata 2:21a191bd1998 286 int LSM303AGR_MAG_Sensor::Get_M_FS(float* fullScale)
cparata 2:21a191bd1998 287 {
cparata 2:21a191bd1998 288 *fullScale = 50.0f;
cparata 2:21a191bd1998 289
cparata 2:21a191bd1998 290 return 0;
cparata 2:21a191bd1998 291 }
cparata 2:21a191bd1998 292
cparata 2:21a191bd1998 293 /**
cparata 2:21a191bd1998 294 * @brief Set full scale
cparata 2:21a191bd1998 295 * @param fullScale the full scale to be set
cparata 2:21a191bd1998 296 * @retval 0 in case of success, an error code otherwise
cparata 2:21a191bd1998 297 */
cparata 2:21a191bd1998 298 int LSM303AGR_MAG_Sensor::Set_M_FS(float fullScale)
cparata 2:21a191bd1998 299 {
cparata 2:21a191bd1998 300 return 0;
cparata 2:21a191bd1998 301 }
cparata 2:21a191bd1998 302
cparata 2:21a191bd1998 303
cparata 2:21a191bd1998 304 /**
cparata 2:21a191bd1998 305 * @brief Read magnetometer data from register
cparata 2:21a191bd1998 306 * @param reg register address
cparata 2:21a191bd1998 307 * @param data register data
cparata 2:21a191bd1998 308 * @retval 0 in case of success
cparata 2:21a191bd1998 309 * @retval 1 in case of failure
cparata 2:21a191bd1998 310 */
cparata 2:21a191bd1998 311 int LSM303AGR_MAG_Sensor::ReadReg( uint8_t reg, uint8_t *data )
cparata 2:21a191bd1998 312 {
cparata 2:21a191bd1998 313 if ( LSM303AGR_MAG_ReadReg( (void *)this, reg, data ) == MEMS_ERROR )
cparata 2:21a191bd1998 314 {
cparata 2:21a191bd1998 315 return 1;
cparata 2:21a191bd1998 316 }
cparata 2:21a191bd1998 317
cparata 2:21a191bd1998 318 return 0;
cparata 2:21a191bd1998 319 }
cparata 2:21a191bd1998 320
cparata 2:21a191bd1998 321
cparata 2:21a191bd1998 322 /**
cparata 2:21a191bd1998 323 * @brief Write magnetometer data to register
cparata 2:21a191bd1998 324 * @param reg register address
cparata 2:21a191bd1998 325 * @param data register data
cparata 2:21a191bd1998 326 * @retval 0 in case of success
cparata 2:21a191bd1998 327 * @retval 1 in case of failure
cparata 2:21a191bd1998 328 */
cparata 2:21a191bd1998 329 int LSM303AGR_MAG_Sensor::WriteReg( uint8_t reg, uint8_t data )
cparata 2:21a191bd1998 330 {
cparata 2:21a191bd1998 331 if ( LSM303AGR_MAG_WriteReg( (void *)this, reg, data ) == MEMS_ERROR )
cparata 2:21a191bd1998 332 {
cparata 2:21a191bd1998 333 return 1;
cparata 2:21a191bd1998 334 }
cparata 2:21a191bd1998 335
cparata 2:21a191bd1998 336 return 0;
cparata 2:21a191bd1998 337 }
cparata 2:21a191bd1998 338
cparata 2:21a191bd1998 339 uint8_t LSM303AGR_MAG_IO_Write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
cparata 2:21a191bd1998 340 {
cparata 2:21a191bd1998 341 return ((LSM303AGR_MAG_Sensor *)handle)->IO_Write(pBuffer, WriteAddr, nBytesToWrite);
cparata 2:21a191bd1998 342 }
cparata 2:21a191bd1998 343
cparata 2:21a191bd1998 344 uint8_t LSM303AGR_MAG_IO_Read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
cparata 2:21a191bd1998 345 {
cparata 2:21a191bd1998 346 return ((LSM303AGR_MAG_Sensor *)handle)->IO_Read(pBuffer, ReadAddr, nBytesToRead);
cparata 2:21a191bd1998 347 }