ST Expansion SW Team / X_NUCLEO_IKS01A2_SPI3W

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON_SPI3W

Dependents:   sensor-node-ble

Fork of X_NUCLEO_IKS01A2 by Licio Mapelli

Committer:
mapellil
Date:
Mon Jun 05 10:03:30 2017 +0000
Revision:
19:bfb25ac47fb5
Parent:
12:fe9481a79119
Removed CS pin from I2C sensors constructor

Who changed what in which revision?

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