70 uint8_t reg, uint8_t *rxbuf,
size_t n) {
72 uint8_t txbuf = reg | LSM303AGR_MS;
90 uint8_t *txbuf,
size_t n) {
92 *txbuf |= LSM303AGR_MS;
138 "acc_read_raw(), invalid state");
140 "acc_read_raw(), channel not ready");
142 #if LSM303AGR_SHARED_I2C 145 devp->config->i2ccfg);
149 LSM303AGR_AD_OUT_X_L_A, buff,
152 #if LSM303AGR_SHARED_I2C 158 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
159 axes[i] = (int32_t)tmp;
193 "acc_read_cooked(), invalid state");
197 axes[i] = (raw[i] * devp->accsensitivity[i]) - devp->accbias[i];
225 "acc_set_bias(), invalid state");
228 devp->accbias[i] = bp[i];
254 "acc_reset_bias(), invalid state");
257 devp->accbias[i] = LSM303AGR_ACC_BIAS;
284 "acc_set_sensivity(), invalid state");
287 devp->accsensitivity[i] = sp[i];
313 "acc_reset_sensivity(), invalid state");
317 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_2G;
322 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_4G;
327 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_8G;
332 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_16G;
364 "acc_set_full_scale(), invalid state");
366 "acc_set_full_scale(), channel not ready");
370 newfs = LSM303AGR_ACC_2G;
373 newfs = LSM303AGR_ACC_4G;
376 newfs = LSM303AGR_ACC_8G;
379 newfs = LSM303AGR_ACC_16G;
386 if(newfs != devp->accfullscale) {
388 scale = newfs / devp->accfullscale;
389 devp->accfullscale = newfs;
391 #if LSM303AGR_SHARED_I2C 394 devp->config->i2ccfg);
400 LSM303AGR_AD_CTRL_REG4_A,
403 #if LSM303AGR_SHARED_I2C 410 buff[1] &= ~(LSM303AGR_CTRL_REG4_A_FS_MASK);
412 buff[0] = LSM303AGR_AD_CTRL_REG4_A;
414 #if LSM303AGR_SHARED_I2C 416 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
422 #if LSM303AGR_SHARED_I2C 431 devp->accsensitivity[i] *= scale;
432 devp->accbias[i] *= scale;
479 "comp_read_raw(), invalid state");
481 "comp_read_raw(), channel not ready");
483 #if LSM303AGR_SHARED_I2C 486 devp->config->i2ccfg);
489 LSM303AGR_AD_OUTX_L_REG_M, buff,
492 #if LSM303AGR_SHARED_I2C 498 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
499 axes[i] = (int32_t)tmp;
534 "comp_read_cooked(), invalid state");
538 axes[i] = (raw[i] * devp->compsensitivity[i]) - devp->compbias[i];
566 "comp_set_bias(), invalid state");
569 devp->compbias[i] = bp[i];
595 "comp_reset_bias(), invalid state");
598 devp->compbias[i] = LSM303AGR_COMP_BIAS;
625 "comp_set_sensivity(), invalid state");
628 devp->compsensitivity[i] = sp[i];
654 "comp_reset_sensivity(), invalid state");
657 devp->compsensitivity[i] = LSM303AGR_COMP_SENS_50GA;
691 devp->
vmt = &vmt_device;
718 "lsm303agrStart(), invalid state");
720 devp->config = config;
725 cr[0] = LSM303AGR_AD_CTRL_REG1_A;
730 #if LSM303AGR_ACC_USE_ADVANCED || defined(__DOXYGEN__) 732 cr[1] |= LSM303AGR_CTRL_REG1_A_LPEN;
748 cr[4] = devp->config->accfullscale;
749 #if LSM303AGR_ACC_USE_ADVANCED || defined(__DOXYGEN__) 750 cr[4] |= devp->config->accendianess |
751 devp->config->accblockdataupdate;
753 cr[4] |= LSM303AGR_CTRL_REG4_A_HR;
759 devp->accfullscale = LSM303AGR_ACC_2G;
761 if(devp->config->accsensitivity == NULL)
762 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_2G;
764 devp->accsensitivity[i] = devp->config->accsensitivity[i];
768 devp->accfullscale = LSM303AGR_ACC_4G;
770 if(devp->config->accsensitivity == NULL)
771 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_4G;
773 devp->accsensitivity[i] = devp->config->accsensitivity[i];
777 devp->accfullscale = LSM303AGR_ACC_8G;
779 if(devp->config->accsensitivity == NULL)
780 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_8G;
782 devp->accsensitivity[i] = devp->config->accsensitivity[i];
786 devp->accfullscale = LSM303AGR_ACC_16G;
788 if(devp->config->accsensitivity == NULL)
789 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_16G;
791 devp->accsensitivity[i] = devp->config->accsensitivity[i];
798 if(devp->config->accbias != NULL)
800 devp->accbias[i] = devp->config->accbias[i];
802 for(i = 0; i < LSM303AGR_ACC_NUMBER_OF_AXES; i++)
803 devp->accbias[i] = LSM303AGR_ACC_BIAS;
805 #if LSM303AGR_SHARED_I2C 812 #if LSM303AGR_SHARED_I2C 818 cr[0] = LSM303AGR_AD_CFG_REG_A_M;
822 cr[1] = devp->config->compoutputdatarate;
823 #if LSM303AGR_COMP_USE_ADVANCED || defined(__DOXYGEN__) 824 cr[1] |= devp->config->compmode | devp->config->complp;
838 #if LSM303AGR_SHARED_I2C 846 #if LSM303AGR_SHARED_I2C 850 devp->compfullscale = LSM303AGR_COMP_50GA;
852 if(devp->config->compsensitivity == NULL) {
853 devp->compsensitivity[i] = LSM303AGR_COMP_SENS_50GA;
856 devp->compsensitivity[i] = devp->config->compsensitivity[i];
879 "lsm303agrStop(), invalid state");
882 #if LSM303AGR_SHARED_I2C 884 i2cStart((devp)->config->i2cp, (devp)->config->i2ccfg);
888 cr[0] = LSM303AGR_AD_CTRL_REG1_A;
894 cr[0] = LSM303AGR_AD_CFG_REG_A_M;
900 #if LSM303AGR_SHARED_I2C
static msg_t lsm303agrI2CReadRegister(I2CDriver *i2cp, lsm303agr_sad_t sad, uint8_t reg, uint8_t *rxbuf, size_t n)
Reads registers value using I2C.
void lsm303agrStop(LSM303AGRDriver *devp)
Deactivates the LSM303AGR Complex Driver peripheral.
static msg_t comp_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseCompass.
msg_t i2cMasterTransmitTimeout(I2CDriver *i2cp, i2caddr_t addr, const uint8_t *txbuf, size_t txbytes, uint8_t *rxbuf, size_t rxbytes, sysinterval_t timeout)
Sends data via the I2C bus.
const struct LSM303AGRVMT * vmt
Virtual Methods Table.
static msg_t comp_set_bias(void *ip, float *bp)
Set bias values for the BaseCompass.
void i2cStart(I2CDriver *i2cp, const I2CConfig *config)
Configures and activates the I2C peripheral.
void lsm303agrObjectInit(LSM303AGRDriver *devp)
Initializes an instance.
static msg_t acc_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseAccelerometer.
BaseCompass virtual methods table.
static msg_t acc_set_full_scale(LSM303AGRDriver *devp, lsm303agr_acc_fs_t fs)
Changes the LSM303AGRDriver accelerometer fullscale value.
void i2cAcquireBus(I2CDriver *i2cp)
Gains exclusive access to the I2C bus.
void i2cReleaseBus(I2CDriver *i2cp)
Releases exclusive access to the I2C bus.
static msg_t acc_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseAccelerometer.
static msg_t acc_reset_bias(void *ip)
Reset bias values for the BaseAccelerometer.
#define objGetInstance(type, ip)
Returns the instance pointer starting from an interface pointer.
const struct BaseCompassVMT * vmt
Virtual Methods Table.
static msg_t acc_reset_sensivity(void *ip)
Reset sensitivity values for the BaseAccelerometer.
LSM303AGR 6-axis accelerometer/compass class.
LSM303AGR MEMS interface module header.
#define osalThreadSleepMilliseconds(msecs)
Delays the invoking thread for the specified number of milliseconds.
static msg_t comp_reset_bias(void *ip)
Reset bias values for the BaseCompass.
void i2cStop(I2CDriver *i2cp)
Deactivates the I2C peripheral.
lsm303agr_sad_t
Accelerometer and Compass Slave Address.
BaseAccelerometer acc_if
Base accelerometer interface.
Structure representing an I2C driver.
static msg_t lsm303agrI2CWriteRegister(I2CDriver *i2cp, lsm303agr_sad_t sad, uint8_t *txbuf, size_t n)
Writes a value into a register using I2C.
static size_t acc_get_axes_number(void *ip)
Return the number of axes of the BaseAccelerometer.
LSM303AGR virtual methods table.
#define TIME_INFINITE
Infinite interval specification for all functions with a timeout specification.
#define osalDbgCheck(c)
Function parameters check.
static msg_t comp_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseCompass.
#define MSG_OK
Normal wakeup message.
static msg_t acc_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseAccelerometer.
lsm303agr_acc_fs_t
LSM303AGR accelerometer subsystem full scale.
static msg_t acc_set_bias(void *ip, float *bp)
Set bias values for the BaseAccelerometer.
#define LSM303AGR_COMP_NUMBER_OF_AXES
LSM303AGR compass subsystem characteristics.
static size_t comp_get_axes_number(void *ip)
Return the number of axes of the BaseCompass.
LSM303AGR configuration structure.
static msg_t comp_reset_sensivity(void *ip)
Reset sensitivity values for the BaseCompass.
void lsm303agrStart(LSM303AGRDriver *devp, const LSM303AGRConfig *config)
Configures and activates LSM303AGR Complex Driver peripheral.
static msg_t comp_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseCompass.
#define osalDbgAssert(c, remark)
Condition assertion.
const I2CConfig * config
Current configuration data.
#define LSM303AGR_ACC_NUMBER_OF_AXES
LSM303AGR accelerometer subsystem characteristics.
BaseCompass comp_if
Base compass interface.
BaseAccelerometer virtual methods table.
Base accelerometer class.
const struct BaseAccelerometerVMT * vmt
Virtual Methods Table.
#define FALSE
Generic 'false' preprocessor boolean constant.
I2CDriver * i2cp
I2C driver associated to this LSM303AGR.
#define MSG_RESET
Wakeup caused by a reset condition.