/*----------------------------------------------------------------------------*/ | |
/* Copyright (c) FIRST 2008. All Rights Reserved. */ | |
/* Open Source Software - may be modified and shared by FRC teams. The code */ | |
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */ | |
/*----------------------------------------------------------------------------*/ | |
#include "ADXL345_I2C.h" | |
#include "DigitalModule.h" | |
#include "NetworkCommunication/UsageReporting.h" | |
#include "I2C.h" | |
const UINT8 ADXL345_I2C::kAddress; | |
const UINT8 ADXL345_I2C::kPowerCtlRegister; | |
const UINT8 ADXL345_I2C::kDataFormatRegister; | |
const UINT8 ADXL345_I2C::kDataRegister; | |
const double ADXL345_I2C::kGsPerLSB; | |
/** | |
* Constructor. | |
* | |
* @param moduleNumber The digital module that the sensor is plugged into (1 or 2). | |
* @param range The range (+ or -) that the accelerometer will measure. | |
*/ | |
ADXL345_I2C::ADXL345_I2C(UINT8 moduleNumber, ADXL345_I2C::DataFormat_Range range) | |
: m_i2c (NULL) | |
{ | |
DigitalModule *module = DigitalModule::GetInstance(moduleNumber); | |
if (module) | |
{ | |
m_i2c = module->GetI2C(kAddress); | |
// Turn on the measurements | |
m_i2c->Write(kPowerCtlRegister, kPowerCtl_Measure); | |
// Specify the data format to read | |
m_i2c->Write(kDataFormatRegister, kDataFormat_FullRes | (UINT8)range); | |
nUsageReporting::report(nUsageReporting::kResourceType_ADXL345, nUsageReporting::kADXL345_I2C, moduleNumber - 1); | |
} | |
} | |
/** | |
* Destructor. | |
*/ | |
ADXL345_I2C::~ADXL345_I2C() | |
{ | |
delete m_i2c; | |
m_i2c = NULL; | |
} | |
/** | |
* Get the acceleration of one axis in Gs. | |
* | |
* @param axis The axis to read from. | |
* @return Acceleration of the ADXL345 in Gs. | |
*/ | |
double ADXL345_I2C::GetAcceleration(ADXL345_I2C::Axes axis) | |
{ | |
INT16 rawAccel = 0; | |
if(m_i2c) | |
{ | |
m_i2c->Read(kDataRegister + (UINT8)axis, sizeof(rawAccel), (UINT8 *)&rawAccel); | |
// Sensor is little endian... swap bytes | |
rawAccel = ((rawAccel >> 8) & 0xFF) | (rawAccel << 8); | |
} | |
return rawAccel * kGsPerLSB; | |
} | |
/** | |
* Get the acceleration of all axes in Gs. | |
* | |
* @return Acceleration measured on all axes of the ADXL345 in Gs. | |
*/ | |
ADXL345_I2C::AllAxes ADXL345_I2C::GetAccelerations() | |
{ | |
AllAxes data = {0.0}; | |
INT16 rawData[3]; | |
if (m_i2c) | |
{ | |
m_i2c->Read(kDataRegister, sizeof(rawData), (UINT8*)rawData); | |
// Sensor is little endian... swap bytes | |
for (INT32 i=0; i<3; i++) | |
{ | |
rawData[i] = ((rawData[i] >> 8) & 0xFF) | (rawData[i] << 8); | |
} | |
data.XAxis = rawData[0] * kGsPerLSB; | |
data.YAxis = rawData[1] * kGsPerLSB; | |
data.ZAxis = rawData[2] * kGsPerLSB; | |
} | |
return data; | |
} | |