Now you can download a copy of these docs so you can use them offline! Download now
ADXL345_I2C.cpp
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2008. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
5 /*----------------------------------------------------------------------------*/
6 
7 #include "ADXL345_I2C.h"
8 #include "DigitalModule.h"
9 #include "NetworkCommunication/UsageReporting.h"
10 #include "I2C.h"
11 
12 const uint8_t ADXL345_I2C::kAddress;
13 const uint8_t ADXL345_I2C::kPowerCtlRegister;
14 const uint8_t ADXL345_I2C::kDataFormatRegister;
15 const uint8_t ADXL345_I2C::kDataRegister;
16 constexpr double ADXL345_I2C::kGsPerLSB;
17 
24 ADXL345_I2C::ADXL345_I2C(uint8_t moduleNumber, ADXL345_I2C::DataFormat_Range range)
25  : m_i2c (NULL)
26 {
27  DigitalModule *module = DigitalModule::GetInstance(moduleNumber);
28  if (module)
29  {
30  m_i2c = module->GetI2C(kAddress);
31 
32  // Turn on the measurements
33  m_i2c->Write(kPowerCtlRegister, kPowerCtl_Measure);
34  // Specify the data format to read
35  m_i2c->Write(kDataFormatRegister, kDataFormat_FullRes | (uint8_t)range);
36 
37  nUsageReporting::report(nUsageReporting::kResourceType_ADXL345, nUsageReporting::kADXL345_I2C, moduleNumber - 1);
38  }
39 }
40 
45 {
46  delete m_i2c;
47  m_i2c = NULL;
48 }
49 
56 double ADXL345_I2C::GetAcceleration(ADXL345_I2C::Axes axis)
57 {
58  int16_t rawAccel = 0;
59  if(m_i2c)
60  {
61  m_i2c->Read(kDataRegister + (uint8_t)axis, sizeof(rawAccel), (uint8_t *)&rawAccel);
62 
63  // Sensor is little endian... swap bytes
64  rawAccel = ((rawAccel >> 8) & 0xFF) | (rawAccel << 8);
65  }
66  return rawAccel * kGsPerLSB;
67 }
68 
75 {
76  AllAxes data = {0.0};
77  int16_t rawData[3];
78  if (m_i2c)
79  {
80  m_i2c->Read(kDataRegister, sizeof(rawData), (uint8_t*)rawData);
81 
82  // Sensor is little endian... swap bytes
83  for (int32_t i=0; i<3; i++)
84  {
85  rawData[i] = ((rawData[i] >> 8) & 0xFF) | (rawData[i] << 8);
86  }
87 
88  data.XAxis = rawData[0] * kGsPerLSB;
89  data.YAxis = rawData[1] * kGsPerLSB;
90  data.ZAxis = rawData[2] * kGsPerLSB;
91  }
92  return data;
93 }
94 
virtual double GetAcceleration(Axes axis)
Definition: ADXL345_I2C.cpp:56
virtual ~ADXL345_I2C()
Definition: ADXL345_I2C.cpp:44
bool Read(uint8_t registerAddress, uint8_t count, uint8_t *data)
Definition: I2C.cpp:161
virtual AllAxes GetAccelerations()
Definition: ADXL345_I2C.cpp:74
static DigitalModule * GetInstance(uint8_t moduleNumber)
I2C * GetI2C(uint32_t address)
ADXL345_I2C(uint8_t moduleNumber, DataFormat_Range range=kRange_2G)
Definition: ADXL345_I2C.cpp:24
bool Write(uint8_t registerAddress, uint8_t data)
Definition: I2C.cpp:140

Generated on Sat Apr 26 2014 12:26:45 for WPILibC++ by doxygen 1.8.6