Ultra-compact high-performance eCompass module: ultra-low power 3D accelerometer and 3D magnetometer.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   HelloWorld_ST_Sensors MOTENV_Mbed mbed-os-mqtt-client LSM303AGR_JS ... more

Committer:
mapellil
Date:
Mon Oct 02 09:29:33 2017 +0200
Revision:
2:e37be5550633
Parent:
1:86d530a7f949
Added SPI3/3Wires sensor support, some API modifcations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:ec6e59cc6f40 1 /**
nikapov 0:ec6e59cc6f40 2 ******************************************************************************
nikapov 0:ec6e59cc6f40 3 * @file LSM303AGRMagSensor.cpp
nikapov 0:ec6e59cc6f40 4 * @author CLab
nikapov 0:ec6e59cc6f40 5 * @version V1.0.0
nikapov 0:ec6e59cc6f40 6 * @date 5 August 2016
nikapov 0:ec6e59cc6f40 7 * @brief Implementation an LSM303AGR magnetometer sensor.
nikapov 0:ec6e59cc6f40 8 ******************************************************************************
nikapov 0:ec6e59cc6f40 9 * @attention
nikapov 0:ec6e59cc6f40 10 *
nikapov 0:ec6e59cc6f40 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
nikapov 0:ec6e59cc6f40 12 *
nikapov 0:ec6e59cc6f40 13 * Redistribution and use in source and binary forms, with or without modification,
nikapov 0:ec6e59cc6f40 14 * are permitted provided that the following conditions are met:
nikapov 0:ec6e59cc6f40 15 * 1. Redistributions of source code must retain the above copyright notice,
nikapov 0:ec6e59cc6f40 16 * this list of conditions and the following disclaimer.
nikapov 0:ec6e59cc6f40 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
nikapov 0:ec6e59cc6f40 18 * this list of conditions and the following disclaimer in the documentation
nikapov 0:ec6e59cc6f40 19 * and/or other materials provided with the distribution.
nikapov 0:ec6e59cc6f40 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nikapov 0:ec6e59cc6f40 21 * may be used to endorse or promote products derived from this software
nikapov 0:ec6e59cc6f40 22 * without specific prior written permission.
nikapov 0:ec6e59cc6f40 23 *
nikapov 0:ec6e59cc6f40 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nikapov 0:ec6e59cc6f40 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nikapov 0:ec6e59cc6f40 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nikapov 0:ec6e59cc6f40 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nikapov 0:ec6e59cc6f40 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nikapov 0:ec6e59cc6f40 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nikapov 0:ec6e59cc6f40 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nikapov 0:ec6e59cc6f40 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nikapov 0:ec6e59cc6f40 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nikapov 0:ec6e59cc6f40 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nikapov 0:ec6e59cc6f40 34 *
nikapov 0:ec6e59cc6f40 35 ******************************************************************************
nikapov 0:ec6e59cc6f40 36 */
nikapov 0:ec6e59cc6f40 37
nikapov 0:ec6e59cc6f40 38
nikapov 0:ec6e59cc6f40 39 /* Includes ------------------------------------------------------------------*/
nikapov 0:ec6e59cc6f40 40
nikapov 0:ec6e59cc6f40 41 #include "LSM303AGRMagSensor.h"
nikapov 0:ec6e59cc6f40 42
nikapov 0:ec6e59cc6f40 43
nikapov 0:ec6e59cc6f40 44 /* Class Implementation ------------------------------------------------------*/
mapellil 2:e37be5550633 45 LSM303AGRMagSensor::LSM303AGRMagSensor(SPI *spi, PinName cs_pin, PinName intmag_pin) :
mapellil 2:e37be5550633 46 _dev_spi(spi), _cs_pin(cs_pin), _intmag_pin(intmag_pin) // SPI3W ONLY
mapellil 2:e37be5550633 47 {
mapellil 2:e37be5550633 48 assert (spi);
mapellil 2:e37be5550633 49 if (cs_pin == NC)
mapellil 2:e37be5550633 50 {
mapellil 2:e37be5550633 51 printf ("ERROR LSM303AGRMagSensor CS MUST NOT BE NC\n\r");
mapellil 2:e37be5550633 52 _dev_spi = NULL;
mapellil 2:e37be5550633 53 _dev_i2c=NULL;
mapellil 2:e37be5550633 54 return;
mapellil 2:e37be5550633 55 }
mapellil 2:e37be5550633 56 _cs_pin = 0; // enable SPI3W disable I2C
mapellil 2:e37be5550633 57 _dev_i2c=NULL;
nikapov 0:ec6e59cc6f40 58
mapellil 2:e37be5550633 59 LSM303AGR_ACC_W_SPI_mode((void *)this, LSM303AGR_ACC_SIM_3_WIRES);
mapellil 2:e37be5550633 60 }
nikapov 0:ec6e59cc6f40 61 /** Constructor
nikapov 0:ec6e59cc6f40 62 * @param i2c object of an helper class which handles the I2C peripheral
nikapov 0:ec6e59cc6f40 63 * @param address the address of the component's instance
nikapov 0:ec6e59cc6f40 64 */
mapellil 1:86d530a7f949 65 LSM303AGRMagSensor::LSM303AGRMagSensor(DevI2C *i2c, uint8_t address, PinName intmag_pin) :
mapellil 1:86d530a7f949 66 _dev_i2c(i2c), _address(address), _cs_pin(NC), _intmag_pin(intmag_pin)
nikapov 0:ec6e59cc6f40 67 {
mapellil 1:86d530a7f949 68 assert (i2c);
mapellil 2:e37be5550633 69 _dev_spi = NULL;
mapellil 2:e37be5550633 70 }
nikapov 0:ec6e59cc6f40 71
nikapov 0:ec6e59cc6f40 72 /**
nikapov 0:ec6e59cc6f40 73 * @brief Initializing the component.
nikapov 0:ec6e59cc6f40 74 * @param[in] init pointer to device specific initalization structure.
nikapov 0:ec6e59cc6f40 75 * @retval "0" in case of success, an error code otherwise.
nikapov 0:ec6e59cc6f40 76 */
nikapov 0:ec6e59cc6f40 77 int LSM303AGRMagSensor::init(void *init)
nikapov 0:ec6e59cc6f40 78 {
nikapov 0:ec6e59cc6f40 79 /* Operating mode selection - power down */
nikapov 0:ec6e59cc6f40 80 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_IDLE1_MODE ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 81 {
nikapov 0:ec6e59cc6f40 82 return 1;
nikapov 0:ec6e59cc6f40 83 }
nikapov 0:ec6e59cc6f40 84
nikapov 0:ec6e59cc6f40 85 /* Enable BDU */
nikapov 0:ec6e59cc6f40 86 if ( LSM303AGR_MAG_W_BDU( (void *)this, LSM303AGR_MAG_BDU_ENABLED ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 87 {
nikapov 0:ec6e59cc6f40 88 return 1;
nikapov 0:ec6e59cc6f40 89 }
nikapov 0:ec6e59cc6f40 90
nikapov 0:ec6e59cc6f40 91 if ( set_m_odr( 100.0f ) == 1 )
nikapov 0:ec6e59cc6f40 92 {
nikapov 0:ec6e59cc6f40 93 return 1;
nikapov 0:ec6e59cc6f40 94 }
nikapov 0:ec6e59cc6f40 95
nikapov 0:ec6e59cc6f40 96 if ( set_m_fs( 50.0f ) == 1 )
nikapov 0:ec6e59cc6f40 97 {
nikapov 0:ec6e59cc6f40 98 return 1;
nikapov 0:ec6e59cc6f40 99 }
nikapov 0:ec6e59cc6f40 100
nikapov 0:ec6e59cc6f40 101 if ( LSM303AGR_MAG_W_ST( (void *)this, LSM303AGR_MAG_ST_DISABLED ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 102 {
nikapov 0:ec6e59cc6f40 103 return 1;
nikapov 0:ec6e59cc6f40 104 }
nikapov 0:ec6e59cc6f40 105
nikapov 0:ec6e59cc6f40 106 return 0;
nikapov 0:ec6e59cc6f40 107 }
nikapov 0:ec6e59cc6f40 108
nikapov 0:ec6e59cc6f40 109 /**
nikapov 0:ec6e59cc6f40 110 * @brief Enable LSM303AGR magnetometer
nikapov 0:ec6e59cc6f40 111 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 112 */
nikapov 0:ec6e59cc6f40 113 int LSM303AGRMagSensor::enable(void)
nikapov 0:ec6e59cc6f40 114 {
nikapov 0:ec6e59cc6f40 115 /* Operating mode selection */
nikapov 0:ec6e59cc6f40 116 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_CONTINUOS_MODE ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 117 {
nikapov 0:ec6e59cc6f40 118 return 1;
nikapov 0:ec6e59cc6f40 119 }
nikapov 0:ec6e59cc6f40 120
nikapov 0:ec6e59cc6f40 121 return 0;
nikapov 0:ec6e59cc6f40 122 }
nikapov 0:ec6e59cc6f40 123
nikapov 0:ec6e59cc6f40 124 /**
nikapov 0:ec6e59cc6f40 125 * @brief Disable LSM303AGR magnetometer
nikapov 0:ec6e59cc6f40 126 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 127 */
nikapov 0:ec6e59cc6f40 128 int LSM303AGRMagSensor::disable(void)
nikapov 0:ec6e59cc6f40 129 {
nikapov 0:ec6e59cc6f40 130 /* Operating mode selection - power down */
nikapov 0:ec6e59cc6f40 131 if ( LSM303AGR_MAG_W_MD( (void *)this, LSM303AGR_MAG_MD_IDLE1_MODE ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 132 {
nikapov 0:ec6e59cc6f40 133 return 1;
nikapov 0:ec6e59cc6f40 134 }
nikapov 0:ec6e59cc6f40 135
nikapov 0:ec6e59cc6f40 136 return 0;
nikapov 0:ec6e59cc6f40 137 }
nikapov 0:ec6e59cc6f40 138
nikapov 0:ec6e59cc6f40 139 /**
nikapov 0:ec6e59cc6f40 140 * @brief Read ID of LSM303AGR Magnetometer
nikapov 0:ec6e59cc6f40 141 * @param p_id the pointer where the ID of the device is stored
nikapov 0:ec6e59cc6f40 142 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 143 */
nikapov 0:ec6e59cc6f40 144 int LSM303AGRMagSensor::read_id(uint8_t *id)
nikapov 0:ec6e59cc6f40 145 {
nikapov 0:ec6e59cc6f40 146 if(!id)
nikapov 0:ec6e59cc6f40 147 {
nikapov 0:ec6e59cc6f40 148 return 1;
nikapov 0:ec6e59cc6f40 149 }
nikapov 0:ec6e59cc6f40 150
nikapov 0:ec6e59cc6f40 151 /* Read WHO AM I register */
nikapov 0:ec6e59cc6f40 152 if ( LSM303AGR_MAG_R_WHO_AM_I( (void *)this, id ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 153 {
nikapov 0:ec6e59cc6f40 154 return 1;
nikapov 0:ec6e59cc6f40 155 }
nikapov 0:ec6e59cc6f40 156
nikapov 0:ec6e59cc6f40 157 return 0;
nikapov 0:ec6e59cc6f40 158 }
nikapov 0:ec6e59cc6f40 159
nikapov 0:ec6e59cc6f40 160 /**
nikapov 0:ec6e59cc6f40 161 * @brief Read data from LSM303AGR Magnetometer
nikapov 0:ec6e59cc6f40 162 * @param pData the pointer where the magnetometer data are stored
nikapov 0:ec6e59cc6f40 163 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 164 */
nikapov 0:ec6e59cc6f40 165 int LSM303AGRMagSensor::get_m_axes(int32_t *pData)
nikapov 0:ec6e59cc6f40 166 {
nikapov 0:ec6e59cc6f40 167 int16_t pDataRaw[3];
nikapov 0:ec6e59cc6f40 168 float sensitivity = 0;
nikapov 0:ec6e59cc6f40 169
nikapov 0:ec6e59cc6f40 170 /* Read raw data from LSM303AGR output register. */
nikapov 0:ec6e59cc6f40 171 if ( get_m_axes_raw( pDataRaw ) == 1 )
nikapov 0:ec6e59cc6f40 172 {
nikapov 0:ec6e59cc6f40 173 return 1;
nikapov 0:ec6e59cc6f40 174 }
nikapov 0:ec6e59cc6f40 175
nikapov 0:ec6e59cc6f40 176 /* Get LSM303AGR actual sensitivity. */
nikapov 0:ec6e59cc6f40 177 if ( get_m_sensitivity( &sensitivity ) == 1 )
nikapov 0:ec6e59cc6f40 178 {
nikapov 0:ec6e59cc6f40 179 return 1;
nikapov 0:ec6e59cc6f40 180 }
nikapov 0:ec6e59cc6f40 181
nikapov 0:ec6e59cc6f40 182 /* Calculate the data. */
nikapov 0:ec6e59cc6f40 183 pData[0] = ( int32_t )( pDataRaw[0] * sensitivity );
nikapov 0:ec6e59cc6f40 184 pData[1] = ( int32_t )( pDataRaw[1] * sensitivity );
nikapov 0:ec6e59cc6f40 185 pData[2] = ( int32_t )( pDataRaw[2] * sensitivity );
nikapov 0:ec6e59cc6f40 186
nikapov 0:ec6e59cc6f40 187 return 0;
nikapov 0:ec6e59cc6f40 188 }
nikapov 0:ec6e59cc6f40 189
nikapov 0:ec6e59cc6f40 190 /**
nikapov 0:ec6e59cc6f40 191 * @brief Read Magnetometer Sensitivity
nikapov 0:ec6e59cc6f40 192 * @param pfData the pointer where the magnetometer sensitivity is stored
nikapov 0:ec6e59cc6f40 193 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 194 */
nikapov 0:ec6e59cc6f40 195 int LSM303AGRMagSensor::get_m_sensitivity(float *pfData)
nikapov 0:ec6e59cc6f40 196 {
nikapov 0:ec6e59cc6f40 197 *pfData = 1.5f;
nikapov 0:ec6e59cc6f40 198
nikapov 0:ec6e59cc6f40 199 return 0;
nikapov 0:ec6e59cc6f40 200 }
nikapov 0:ec6e59cc6f40 201
nikapov 0:ec6e59cc6f40 202 /**
nikapov 0:ec6e59cc6f40 203 * @brief Read raw data from LSM303AGR Magnetometer
nikapov 0:ec6e59cc6f40 204 * @param pData the pointer where the magnetomer raw data are stored
nikapov 0:ec6e59cc6f40 205 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 206 */
nikapov 0:ec6e59cc6f40 207 int LSM303AGRMagSensor::get_m_axes_raw(int16_t *pData)
nikapov 0:ec6e59cc6f40 208 {
nikapov 0:ec6e59cc6f40 209 uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};
nikapov 0:ec6e59cc6f40 210 int16_t *regValueInt16;
nikapov 0:ec6e59cc6f40 211
nikapov 0:ec6e59cc6f40 212 /* Read output registers from LSM303AGR_MAG_OUTX_L to LSM303AGR_MAG_OUTZ_H. */
nikapov 0:ec6e59cc6f40 213 if ( LSM303AGR_MAG_Get_Raw_Magnetic( (void *)this, regValue ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 214 {
nikapov 0:ec6e59cc6f40 215 return 1;
nikapov 0:ec6e59cc6f40 216 }
nikapov 0:ec6e59cc6f40 217
nikapov 0:ec6e59cc6f40 218 regValueInt16 = (int16_t *)regValue;
nikapov 0:ec6e59cc6f40 219
nikapov 0:ec6e59cc6f40 220 /* Format the data. */
nikapov 0:ec6e59cc6f40 221 pData[0] = regValueInt16[0];
nikapov 0:ec6e59cc6f40 222 pData[1] = regValueInt16[1];
nikapov 0:ec6e59cc6f40 223 pData[2] = regValueInt16[2];
nikapov 0:ec6e59cc6f40 224
nikapov 0:ec6e59cc6f40 225 return 0;
nikapov 0:ec6e59cc6f40 226 }
nikapov 0:ec6e59cc6f40 227
nikapov 0:ec6e59cc6f40 228 /**
nikapov 0:ec6e59cc6f40 229 * @brief Read LSM303AGR Magnetometer output data rate
nikapov 0:ec6e59cc6f40 230 * @param odr the pointer to the output data rate
nikapov 0:ec6e59cc6f40 231 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 232 */
nikapov 0:ec6e59cc6f40 233 int LSM303AGRMagSensor::get_m_odr(float* odr)
nikapov 0:ec6e59cc6f40 234 {
nikapov 0:ec6e59cc6f40 235 LSM303AGR_MAG_ODR_t odr_low_level;
nikapov 0:ec6e59cc6f40 236
nikapov 0:ec6e59cc6f40 237 if ( LSM303AGR_MAG_R_ODR( (void *)this, &odr_low_level ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 238 {
nikapov 0:ec6e59cc6f40 239 return 1;
nikapov 0:ec6e59cc6f40 240 }
nikapov 0:ec6e59cc6f40 241
nikapov 0:ec6e59cc6f40 242 switch( odr_low_level )
nikapov 0:ec6e59cc6f40 243 {
nikapov 0:ec6e59cc6f40 244 case LSM303AGR_MAG_ODR_10Hz:
nikapov 0:ec6e59cc6f40 245 *odr = 10.000f;
nikapov 0:ec6e59cc6f40 246 break;
nikapov 0:ec6e59cc6f40 247 case LSM303AGR_MAG_ODR_20Hz:
nikapov 0:ec6e59cc6f40 248 *odr = 20.000f;
nikapov 0:ec6e59cc6f40 249 break;
nikapov 0:ec6e59cc6f40 250 case LSM303AGR_MAG_ODR_50Hz:
nikapov 0:ec6e59cc6f40 251 *odr = 50.000f;
nikapov 0:ec6e59cc6f40 252 break;
nikapov 0:ec6e59cc6f40 253 case LSM303AGR_MAG_ODR_100Hz:
nikapov 0:ec6e59cc6f40 254 *odr = 100.000f;
nikapov 0:ec6e59cc6f40 255 break;
nikapov 0:ec6e59cc6f40 256 default:
nikapov 0:ec6e59cc6f40 257 *odr = -1.000f;
nikapov 0:ec6e59cc6f40 258 return 1;
nikapov 0:ec6e59cc6f40 259 }
nikapov 0:ec6e59cc6f40 260 return 0;
nikapov 0:ec6e59cc6f40 261 }
nikapov 0:ec6e59cc6f40 262
nikapov 0:ec6e59cc6f40 263 /**
nikapov 0:ec6e59cc6f40 264 * @brief Set ODR
nikapov 0:ec6e59cc6f40 265 * @param odr the output data rate to be set
nikapov 0:ec6e59cc6f40 266 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 267 */
nikapov 0:ec6e59cc6f40 268 int LSM303AGRMagSensor::set_m_odr(float odr)
nikapov 0:ec6e59cc6f40 269 {
nikapov 0:ec6e59cc6f40 270 LSM303AGR_MAG_ODR_t new_odr;
nikapov 0:ec6e59cc6f40 271
nikapov 0:ec6e59cc6f40 272 new_odr = ( odr <= 10.000f ) ? LSM303AGR_MAG_ODR_10Hz
nikapov 0:ec6e59cc6f40 273 : ( odr <= 20.000f ) ? LSM303AGR_MAG_ODR_20Hz
nikapov 0:ec6e59cc6f40 274 : ( odr <= 50.000f ) ? LSM303AGR_MAG_ODR_50Hz
nikapov 0:ec6e59cc6f40 275 : LSM303AGR_MAG_ODR_100Hz;
nikapov 0:ec6e59cc6f40 276
nikapov 0:ec6e59cc6f40 277 if ( LSM303AGR_MAG_W_ODR( (void *)this, new_odr ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 278 {
nikapov 0:ec6e59cc6f40 279 return 1;
nikapov 0:ec6e59cc6f40 280 }
nikapov 0:ec6e59cc6f40 281
nikapov 0:ec6e59cc6f40 282 return 0;
nikapov 0:ec6e59cc6f40 283 }
nikapov 0:ec6e59cc6f40 284
nikapov 0:ec6e59cc6f40 285
nikapov 0:ec6e59cc6f40 286 /**
nikapov 0:ec6e59cc6f40 287 * @brief Read LSM303AGR Magnetometer full scale
nikapov 0:ec6e59cc6f40 288 * @param fullScale the pointer to the output data rate
nikapov 0:ec6e59cc6f40 289 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 290 */
nikapov 0:ec6e59cc6f40 291 int LSM303AGRMagSensor::get_m_fs(float* fullScale)
nikapov 0:ec6e59cc6f40 292 {
nikapov 0:ec6e59cc6f40 293 *fullScale = 50.0f;
nikapov 0:ec6e59cc6f40 294
nikapov 0:ec6e59cc6f40 295 return 0;
nikapov 0:ec6e59cc6f40 296 }
nikapov 0:ec6e59cc6f40 297
nikapov 0:ec6e59cc6f40 298 /**
nikapov 0:ec6e59cc6f40 299 * @brief Set full scale
nikapov 0:ec6e59cc6f40 300 * @param fullScale the full scale to be set
nikapov 0:ec6e59cc6f40 301 * @retval 0 in case of success, an error code otherwise
nikapov 0:ec6e59cc6f40 302 */
nikapov 0:ec6e59cc6f40 303 int LSM303AGRMagSensor::set_m_fs(float fullScale)
nikapov 0:ec6e59cc6f40 304 {
nikapov 0:ec6e59cc6f40 305 return 0;
nikapov 0:ec6e59cc6f40 306 }
nikapov 0:ec6e59cc6f40 307
nikapov 0:ec6e59cc6f40 308
nikapov 0:ec6e59cc6f40 309 /**
nikapov 0:ec6e59cc6f40 310 * @brief Read magnetometer data from register
nikapov 0:ec6e59cc6f40 311 * @param reg register address
nikapov 0:ec6e59cc6f40 312 * @param data register data
nikapov 0:ec6e59cc6f40 313 * @retval 0 in case of success
nikapov 0:ec6e59cc6f40 314 * @retval 1 in case of failure
nikapov 0:ec6e59cc6f40 315 */
nikapov 0:ec6e59cc6f40 316 int LSM303AGRMagSensor::read_reg( uint8_t reg, uint8_t *data )
nikapov 0:ec6e59cc6f40 317 {
nikapov 0:ec6e59cc6f40 318 if ( LSM303AGR_MAG_read_reg( (void *)this, reg, data ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 319 {
nikapov 0:ec6e59cc6f40 320 return 1;
nikapov 0:ec6e59cc6f40 321 }
nikapov 0:ec6e59cc6f40 322
nikapov 0:ec6e59cc6f40 323 return 0;
nikapov 0:ec6e59cc6f40 324 }
nikapov 0:ec6e59cc6f40 325
nikapov 0:ec6e59cc6f40 326
nikapov 0:ec6e59cc6f40 327 /**
nikapov 0:ec6e59cc6f40 328 * @brief Write magnetometer data to register
nikapov 0:ec6e59cc6f40 329 * @param reg register address
nikapov 0:ec6e59cc6f40 330 * @param data register data
nikapov 0:ec6e59cc6f40 331 * @retval 0 in case of success
nikapov 0:ec6e59cc6f40 332 * @retval 1 in case of failure
nikapov 0:ec6e59cc6f40 333 */
nikapov 0:ec6e59cc6f40 334 int LSM303AGRMagSensor::write_reg( uint8_t reg, uint8_t data )
nikapov 0:ec6e59cc6f40 335 {
nikapov 0:ec6e59cc6f40 336 if ( LSM303AGR_MAG_write_reg( (void *)this, reg, data ) == MEMS_ERROR )
nikapov 0:ec6e59cc6f40 337 {
nikapov 0:ec6e59cc6f40 338 return 1;
nikapov 0:ec6e59cc6f40 339 }
nikapov 0:ec6e59cc6f40 340
nikapov 0:ec6e59cc6f40 341 return 0;
nikapov 0:ec6e59cc6f40 342 }
nikapov 0:ec6e59cc6f40 343
nikapov 0:ec6e59cc6f40 344 uint8_t LSM303AGR_MAG_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
nikapov 0:ec6e59cc6f40 345 {
nikapov 0:ec6e59cc6f40 346 return ((LSM303AGRMagSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
nikapov 0:ec6e59cc6f40 347 }
nikapov 0:ec6e59cc6f40 348
nikapov 0:ec6e59cc6f40 349 uint8_t LSM303AGR_MAG_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
nikapov 0:ec6e59cc6f40 350 {
nikapov 0:ec6e59cc6f40 351 return ((LSM303AGRMagSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
nikapov 0:ec6e59cc6f40 352 }