first commit
This commit is contained in:
130
src/drivers/AccelerometerController.cpp
Normal file
130
src/drivers/AccelerometerController.cpp
Normal file
@@ -0,0 +1,130 @@
|
||||
#include "drivers/AccelerometerController.h"
|
||||
|
||||
ADXL345Controller::ADXL345Controller(uint8_t deviceAddress) :
|
||||
_deviceAddress(deviceAddress),
|
||||
_lastReadTime(0),
|
||||
_minReadInterval(DEFAULT_MIN_READ_INTERVAL),
|
||||
_lastX(0.0),
|
||||
_lastY(0.0),
|
||||
_lastZ(0.0),
|
||||
_lastReadSuccess(false) {
|
||||
}
|
||||
|
||||
void ADXL345Controller::begin() {
|
||||
Wire.begin();
|
||||
|
||||
uint8_t deviceID = readRegister(ADXL345_DEVID);
|
||||
if (deviceID != 0xE5) {
|
||||
_lastReadSuccess = false;
|
||||
return;
|
||||
}
|
||||
|
||||
setRegister(ADXL345_POWER_CTL, 0x08);
|
||||
|
||||
setRegister(ADXL345_DATA_FORMAT, 0x0B);
|
||||
|
||||
setRegister(ADXL345_BW_RATE, 0x0A);
|
||||
|
||||
setRegister(ADXL345_OFSX, 0x00);
|
||||
setRegister(ADXL345_OFSY, 0x00);
|
||||
setRegister(ADXL345_OFSZ, 0x00);
|
||||
|
||||
_lastReadSuccess = true;
|
||||
}
|
||||
|
||||
bool ADXL345Controller::read() {
|
||||
unsigned long currentTime = millis();
|
||||
|
||||
if (currentTime - _lastReadTime >= _minReadInterval) {
|
||||
_lastReadTime = currentTime;
|
||||
|
||||
uint8_t buffer[6];
|
||||
readRegisters(ADXL345_DATAX0, 6, buffer);
|
||||
|
||||
int16_t x = ((int16_t)buffer[1] << 8) | buffer[0];
|
||||
int16_t y = ((int16_t)buffer[3] << 8) | buffer[2];
|
||||
int16_t z = ((int16_t)buffer[5] << 8) | buffer[4];
|
||||
|
||||
_lastX = x / 256.0;
|
||||
_lastY = y / 256.0;
|
||||
_lastZ = z / 256.0;
|
||||
|
||||
_lastReadSuccess = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return _lastReadSuccess;
|
||||
}
|
||||
|
||||
double ADXL345Controller::getX() {
|
||||
if (millis() - _lastReadTime >= _minReadInterval) read();
|
||||
return _lastX;
|
||||
}
|
||||
|
||||
double ADXL345Controller::getY() {
|
||||
if (millis() - _lastReadTime >= _minReadInterval) read();
|
||||
return _lastY;
|
||||
}
|
||||
|
||||
double ADXL345Controller::getZ() {
|
||||
if (millis() - _lastReadTime >= _minReadInterval) read();
|
||||
return _lastZ;
|
||||
}
|
||||
|
||||
bool ADXL345Controller::isLastReadSuccessful() const {
|
||||
return _lastReadSuccess;
|
||||
}
|
||||
|
||||
void ADXL345Controller::setMinReadInterval(unsigned long interval) {
|
||||
_minReadInterval = interval;
|
||||
}
|
||||
|
||||
void ADXL345Controller::setRange(uint8_t range) {
|
||||
uint8_t format = readRegister(ADXL345_DATA_FORMAT);
|
||||
|
||||
format &= ~0x03;
|
||||
|
||||
if (range > 3) range = 3;
|
||||
format |= range;
|
||||
|
||||
setRegister(ADXL345_DATA_FORMAT, format);
|
||||
}
|
||||
|
||||
void ADXL345Controller::setDataRate(uint8_t rate) {
|
||||
if (rate > 15) rate = 15;
|
||||
|
||||
setRegister(ADXL345_BW_RATE, rate);
|
||||
}
|
||||
|
||||
void ADXL345Controller::setOffsets(int8_t xOffset, int8_t yOffset, int8_t zOffset) {
|
||||
setRegister(ADXL345_OFSX, xOffset);
|
||||
setRegister(ADXL345_OFSY, yOffset);
|
||||
setRegister(ADXL345_OFSZ, zOffset);
|
||||
}
|
||||
|
||||
void ADXL345Controller::setRegister(uint8_t reg, uint8_t value) {
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
Wire.write(reg);
|
||||
Wire.write(value);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
uint8_t ADXL345Controller::readRegister(uint8_t reg) {
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
Wire.write(reg);
|
||||
Wire.endTransmission();
|
||||
|
||||
Wire.requestFrom(_deviceAddress, (uint8_t)1);
|
||||
return Wire.read();
|
||||
}
|
||||
|
||||
void ADXL345Controller::readRegisters(uint8_t reg, uint8_t count, uint8_t *buffer) {
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
Wire.write(reg);
|
||||
Wire.endTransmission();
|
||||
|
||||
Wire.requestFrom(_deviceAddress, count);
|
||||
for (uint8_t i = 0; i < count && Wire.available(); i++) {
|
||||
buffer[i] = Wire.read();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user