Merge pull request #15 from juliangaal/non-owning-delay
Non owning delay, see #7
This commit is contained in:
commit
cd726772d3
2 changed files with 21 additions and 23 deletions
|
@ -6,10 +6,10 @@ fn main() -> Result<(), Mpu6050Error<LinuxI2CError>> {
|
||||||
let i2c = I2cdev::new("/dev/i2c-1")
|
let i2c = I2cdev::new("/dev/i2c-1")
|
||||||
.map_err(Mpu6050Error::I2c)?;
|
.map_err(Mpu6050Error::I2c)?;
|
||||||
|
|
||||||
let delay = Delay;
|
let mut delay = Delay;
|
||||||
|
let mut mpu = Mpu6050::new(i2c);
|
||||||
let mut mpu = Mpu6050::new(i2c, delay);
|
|
||||||
mpu.init()?;
|
mpu.init(&mut delay)?;
|
||||||
mpu.soft_calib(Steps(100))?;
|
mpu.soft_calib(Steps(100))?;
|
||||||
mpu.calc_variance(Steps(50))?;
|
mpu.calc_variance(Steps(50))?;
|
||||||
|
|
||||||
|
|
36
src/lib.rs
36
src/lib.rs
|
@ -14,10 +14,10 @@
|
||||||
//! let i2c = I2cdev::new("/dev/i2c-1")
|
//! let i2c = I2cdev::new("/dev/i2c-1")
|
||||||
//! .map_err(Mpu6050Error::I2c)?;
|
//! .map_err(Mpu6050Error::I2c)?;
|
||||||
//!
|
//!
|
||||||
//! let delay = Delay;
|
//! let mut delay = Delay;
|
||||||
//!
|
//! let mut mpu = Mpu6050::new(i2c);
|
||||||
//! let mut mpu = Mpu6050::new(i2c, delay);
|
//!
|
||||||
//! mpu.init()?;
|
//! mpu.init(&mut delay)?;
|
||||||
//! mpu.soft_calib(Steps(100))?;
|
//! mpu.soft_calib(Steps(100))?;
|
||||||
//! mpu.calc_variance(Steps(50))?;
|
//! mpu.calc_variance(Steps(50))?;
|
||||||
//!
|
//!
|
||||||
|
@ -309,25 +309,22 @@ pub enum Mpu6050Error<E> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles all operations on/with Mpu6050
|
/// Handles all operations on/with Mpu6050
|
||||||
pub struct Mpu6050<I, D> {
|
pub struct Mpu6050<I> {
|
||||||
i2c: I,
|
i2c: I,
|
||||||
delay: D,
|
|
||||||
bias: Option<Bias>,
|
bias: Option<Bias>,
|
||||||
variance: Option<Variance>,
|
variance: Option<Variance>,
|
||||||
acc_sensitivity: f32,
|
acc_sensitivity: f32,
|
||||||
gyro_sensitivity: f32,
|
gyro_sensitivity: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, D, E> Mpu6050<I, D>
|
impl<I, E> Mpu6050<I>
|
||||||
where
|
where
|
||||||
I: Write<Error = E> + WriteRead<Error = E>,
|
I: Write<Error = E> + WriteRead<Error = E>,
|
||||||
D: DelayMs<u8>,
|
|
||||||
{
|
{
|
||||||
/// Side effect free constructor with default sensitivies, no calibration
|
/// Side effect free constructor with default sensitivies, no calibration
|
||||||
pub fn new(i2c: I, delay: D) -> Self {
|
pub fn new(i2c: I) -> Self {
|
||||||
Mpu6050 {
|
Mpu6050 {
|
||||||
i2c,
|
i2c,
|
||||||
delay,
|
|
||||||
bias: None,
|
bias: None,
|
||||||
variance: None,
|
variance: None,
|
||||||
acc_sensitivity: AFS_SEL.0,
|
acc_sensitivity: AFS_SEL.0,
|
||||||
|
@ -336,10 +333,9 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// custom sensitivity
|
/// custom sensitivity
|
||||||
pub fn new_with_sens(i2c: I, delay: D, arange: AccelRange, grange: GyroRange) -> Self {
|
pub fn new_with_sens(i2c: I, arange: AccelRange, grange: GyroRange) -> Self {
|
||||||
Mpu6050 {
|
Mpu6050 {
|
||||||
i2c,
|
i2c,
|
||||||
delay,
|
|
||||||
bias: None,
|
bias: None,
|
||||||
variance: None,
|
variance: None,
|
||||||
acc_sensitivity: Sensitivity::from(arange).0,
|
acc_sensitivity: Sensitivity::from(arange).0,
|
||||||
|
@ -348,21 +344,21 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wakes MPU6050 with all sensors enabled (default)
|
/// Wakes MPU6050 with all sensors enabled (default)
|
||||||
pub fn wake(&mut self) -> Result<(), Mpu6050Error<E>> {
|
fn wake<D: DelayMs<u8>>(&mut self, delay: &mut D) -> Result<(), Mpu6050Error<E>> {
|
||||||
self.write_u8(POWER_MGMT_1.addr(), 0)?;
|
self.write_u8(POWER_MGMT_1.addr(), 0)?;
|
||||||
self.delay.delay_ms(100u8);
|
delay.delay_ms(100u8);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Init wakes MPU6050 and verifies register addr, e.g. in i2c
|
/// Init wakes MPU6050 and verifies register addr, e.g. in i2c
|
||||||
pub fn init(&mut self) -> Result<(), Mpu6050Error<E>> {
|
pub fn init<D: DelayMs<u8>>(&mut self, delay: &mut D) -> Result<(), Mpu6050Error<E>> {
|
||||||
self.wake()?;
|
self.wake(delay)?;
|
||||||
self.verify()?;
|
self.verify()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verifies device to address 0x68 with WHOAMI.addr() Register
|
/// Verifies device to address 0x68 with WHOAMI.addr() Register
|
||||||
pub fn verify(&mut self) -> Result<(), Mpu6050Error<E>> {
|
fn verify(&mut self) -> Result<(), Mpu6050Error<E>> {
|
||||||
let address = self.read_u8(WHOAMI.addr())?;
|
let address = self.read_u8(WHOAMI.addr())?;
|
||||||
if address != SLAVE_ADDR.addr() {
|
if address != SLAVE_ADDR.addr() {
|
||||||
return Err(Mpu6050Error::InvalidChipId(address));
|
return Err(Mpu6050Error::InvalidChipId(address));
|
||||||
|
@ -550,7 +546,9 @@ where
|
||||||
pub fn write_u8(&mut self, reg: u8, byte: u8) -> Result<(), Mpu6050Error<E>> {
|
pub fn write_u8(&mut self, reg: u8, byte: u8) -> Result<(), Mpu6050Error<E>> {
|
||||||
self.i2c.write(SLAVE_ADDR.addr(), &[reg, byte])
|
self.i2c.write(SLAVE_ADDR.addr(), &[reg, byte])
|
||||||
.map_err(Mpu6050Error::I2c)?;
|
.map_err(Mpu6050Error::I2c)?;
|
||||||
self.delay.delay_ms(10u8);
|
// delat disabled for dev build
|
||||||
|
// TODO: check effects with physical unit
|
||||||
|
// self.delay.delay_ms(10u8);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue