summaryrefslogtreecommitdiff
path: root/src/sensor/sensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sensor/sensor.cpp')
-rw-r--r--src/sensor/sensor.cpp174
1 files changed, 80 insertions, 94 deletions
diff --git a/src/sensor/sensor.cpp b/src/sensor/sensor.cpp
index e11a74b..a3b9a5c 100644
--- a/src/sensor/sensor.cpp
+++ b/src/sensor/sensor.cpp
@@ -1,50 +1,34 @@
#include "sensor.hpp"
-#include "../utils/serial.hpp"
-#include "../utils/time.hpp"
+
#include "registers.hpp"
+#include "utils/serial.hpp"
+#include "utils/time.hpp"
-Sensor::Sensor(uint8_t address, TwoWire *wire, SerialStream sout,
+Sensor::Sensor(uint8_t address, TwoWire wire, SerialStream sout,
unsigned int throttle_time)
- : _last_time(0), _sout(sout)
+ : _wire(wire),
+ _address(address),
+ _throttle_enabled(true),
+ _throttle_time(throttle_time),
+ _last_time(0),
+ _status(SensorStatus::OK),
+ _accel_to_g_force(RAW_TO_G_FACTOR),
+ _ang_rate_to_dps(RAW_TO_DPS_FACTOR),
+ _sout(sout)
{
- _address = address;
- _wire = wire;
-
- // Set default values
- accel_cal_x = 0;
- accel_cal_y = 0;
- accel_cal_z = 0;
-
- gyro_cal_x = 0;
- gyro_cal_y = 0;
- gyro_cal_z = 0;
-
- _throttle_enabled = true;
- _throttle_time = throttle_time;
-
- _status = SensorStatus::OK;
-
- _accel_sensitivity = 0;
- _accel_to_g_force = 1.0 / 16384.0;
-
- _gyro_sensitivity = 0;
- _ang_rate_to_dps = 1.0 / 131.0;
-
- // Reset the sensor
- reset();
}
bool Sensor::begin()
{
- _wire->begin();
+ _wire.begin();
if (isConnected())
{
- _wire->beginTransmission(_address);
- _wire->write(SensorRegisters::PWR_MGMT_1);
- _wire->write(SENSOR_WAKEUP);
+ _wire.beginTransmission(_address);
+ _wire.write(SensorRegisters::PWR_MGMT_1);
+ _wire.write(SENSOR_WAKEUP);
- return (_wire->endTransmission() == 0);
+ return (_wire.endTransmission() == 0);
}
return false;
@@ -52,31 +36,13 @@ bool Sensor::begin()
bool Sensor::isConnected()
{
- _wire->beginTransmission(_address);
- return (_wire->endTransmission() == 0);
-}
-
-void Sensor::reset()
-{
- _accel_raw_x = 0;
- _accel_raw_y = 0;
- _accel_raw_z = 0;
-
- _gyro_raw_x = 0;
- _gyro_raw_y = 0;
- _gyro_raw_z = 0;
-
- _accel_x = 0;
- _accel_y = 0;
-
- _pitch = 0;
- _roll = 0;
- _yaw = 0;
+ _wire.beginTransmission(_address);
+ return (_wire.endTransmission() == 0);
}
bool Sensor::read()
{
- Time now = time_now();
+ auto now = time_now();
if (_throttle_enabled && now.diff(_last_time).millisecs() < _throttle_time)
{
@@ -84,18 +50,20 @@ bool Sensor::read()
return false;
}
- _wire->beginTransmission(_address);
- _wire->write(SensorRegisters::ACCEL_XOUT_H);
+ _wire.beginTransmission(_address);
+ _wire.write(SensorRegisters::ACCEL_XOUT_H);
- if (_wire->endTransmission() != 0)
+ if (_wire.endTransmission() != 0U)
{
_status = SensorStatus::ERR_WRITE;
return false;
}
- int8_t response_length = _wire->requestFrom(_address, (uint8_t)14);
+ uint8_t response_length = _wire.requestFrom(_address, SensorRegisters::SELF_TEST_Y);
+
+ const uint8_t self_test_success = 14U;
- if (response_length != 14)
+ if (response_length != self_test_success)
{
_status = SensorStatus::ERR_READ;
return false;
@@ -123,7 +91,7 @@ bool Sensor::read()
// Duration interval
now.update();
- float duration = now.diff(_last_time).secs();
+ auto duration = now.diff(_last_time).secs();
_last_time = now;
// Convert raw acceleration to g:s (g-force)
@@ -147,12 +115,13 @@ bool Sensor::read()
<< endl;
// Prepare for Pitch Roll Yaw
- float accel_y_pow_two = pow(_accel_raw_y, 2);
- float accel_z_pow_two = pow(_accel_raw_z, 2);
+ auto accel_y_pow_two = pow(_accel_raw_y, 2);
+ auto accel_z_pow_two = pow(_accel_raw_z, 2);
- _accel_x = atan2(_accel_raw_y, _accel_raw_z) * 180 / PI;
+ _accel_x = atan2(_accel_raw_y, _accel_raw_z) * ONE_EIGHTY / PI;
- _accel_y = atan2(-_accel_raw_x, sqrt(accel_y_pow_two + accel_z_pow_two)) * 180 / PI;
+ _accel_y =
+ atan2(-_accel_raw_x, sqrt(accel_y_pow_two + accel_z_pow_two)) * ONE_EIGHTY / PI;
/*
_accel_x =
@@ -191,8 +160,11 @@ bool Sensor::read()
<< "Gyro raw z w/o time: " << _gyro_raw_z << "\n"
<< endl;
- _pitch = 0.96 * _gyro_y + 0.04 * _accel_y;
- _roll = 0.96 * _gyro_x + 0.04 * _accel_x;
+ const float gyro_balance = 0.96F;
+ const float accel_balance = 0.04F;
+
+ _pitch = gyro_balance * _gyro_y + accel_balance * _accel_y;
+ _roll = gyro_balance * _gyro_x + accel_balance * _accel_x;
_yaw = _gyro_z;
return true;
@@ -201,23 +173,31 @@ bool Sensor::read()
bool Sensor::setAccelSensitivity(uint8_t sensitivity)
{
if (sensitivity > 3)
+ {
sensitivity = 3;
+ }
_accel_sensitivity = sensitivity;
uint8_t accel_config = getRegister(SensorRegisters::ACCEL_CONFIG);
if (_status != SensorStatus::OK)
+ {
return false;
+ }
// No need to write same value
if (((accel_config >> 3) & 3) != _accel_sensitivity)
{
- accel_config &= 0xE7;
+ const uint8_t magic = 0xE7U;
+
+ accel_config &= magic;
accel_config |= (_accel_sensitivity << 3);
if (!setRegister(SensorRegisters::ACCEL_CONFIG, accel_config))
+ {
return false;
+ }
}
// Calculate conversion factor.
@@ -229,7 +209,9 @@ bool Sensor::setAccelSensitivity(uint8_t sensitivity)
bool Sensor::setGyroSensitivity(uint8_t sensitivity)
{
if (sensitivity > 3)
+ {
sensitivity = 3;
+ }
_gyro_sensitivity = sensitivity;
@@ -243,7 +225,9 @@ bool Sensor::setGyroSensitivity(uint8_t sensitivity)
// No need to write same value
if (((gyro_config >> 3) & 3) != _gyro_sensitivity)
{
- gyro_config &= 0xE7;
+ const uint8_t magic = 0xE7U;
+
+ gyro_config &= magic;
gyro_config |= (_gyro_sensitivity << 3);
if (!setRegister(SensorRegisters::GYRO_CONFIG, gyro_config))
@@ -257,63 +241,63 @@ bool Sensor::setGyroSensitivity(uint8_t sensitivity)
return true;
}
-float Sensor::getAccelX()
+double Sensor::getAccelX()
{
return _accel_raw_x;
}
-float Sensor::getAccelY()
+double Sensor::getAccelY()
{
return _accel_raw_y;
}
-float Sensor::getAccelZ()
+double Sensor::getAccelZ()
{
return _accel_raw_z;
}
-float Sensor::getAngleX()
+double Sensor::getAngleX()
{
return _accel_x;
}
-float Sensor::getAngleY()
+double Sensor::getAngleY()
{
return _accel_y;
}
-float Sensor::getGyroX()
+double Sensor::getGyroX()
{
return _gyro_raw_x;
}
-float Sensor::getGyroY()
+double Sensor::getGyroY()
{
return _gyro_raw_y;
}
-float Sensor::getGyroZ()
+double Sensor::getGyroZ()
{
return _gyro_raw_z;
}
-float Sensor::getPitch()
+double Sensor::getPitch()
{
return _pitch;
}
-float Sensor::getRoll()
+double Sensor::getRoll()
{
return _roll;
}
bool Sensor::setRegister(uint8_t reg, uint8_t value)
{
- _wire->beginTransmission(_address);
- _wire->write(reg);
- _wire->write(value);
+ _wire.beginTransmission(_address);
+ _wire.write(reg);
+ _wire.write(value);
- if (_wire->endTransmission() != 0)
+ if (_wire.endTransmission() != 0)
{
_status = SensorStatus::ERR_WRITE;
return false;
@@ -324,23 +308,23 @@ bool Sensor::setRegister(uint8_t reg, uint8_t value)
uint8_t Sensor::getRegister(uint8_t reg)
{
- _wire->beginTransmission(_address);
- _wire->write(reg);
+ _wire.beginTransmission(_address);
+ _wire.write(reg);
- if (_wire->endTransmission() != 0)
+ if (_wire.endTransmission() != 0U)
{
_status = SensorStatus::ERR_WRITE;
- return 0;
+ return 0U;
}
- uint8_t response_length = _wire->requestFrom(_address, (uint8_t)1);
- if (response_length != 1)
+ uint8_t response_length = _wire.requestFrom(_address, 1U);
+ if (response_length != 1U)
{
_status = SensorStatus::ERR_READ;
- return 0;
+ return 0U;
}
- return _wire->read();
+ return _wire.read();
}
SensorStatus Sensor::getStatus()
@@ -353,8 +337,10 @@ SensorStatus Sensor::getStatus()
int16_t Sensor::_readHighLow()
{
- int16_t high = _wire->read();
- int16_t low = _wire->read();
+ const int16_t high = _wire.read();
+ const int16_t low = _wire.read();
+
+ const int8_t bits_in_byte = 8;
- return high << 8 | low;
+ return high << bits_in_byte | low;
}