1
Fork 0

Merge pull request #15 from juliangaal/non-owning-delay

Non owning delay, see #7
This commit is contained in:
Julian Gaal 2020-09-24 14:17:48 +02:00 committed by GitHub
commit cd726772d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 23 deletions

View file

@ -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))?;

View file

@ -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(())
} }