@@ -2,13 +2,13 @@ use crate::aliases::{Delay, I2c};
22use crate :: imu:: { Imu , Quat } ;
33use crate :: utils;
44
5- use :: bno080:: interface:: I2cInterface ;
5+ use bno080:: interface:: I2cInterface ;
66use bno080:: interface:: SensorInterface ;
77use defmt:: { debug, trace, warn} ;
88use firmware_protocol:: ImuType ;
99
1010pub const IMU_REPORT_INTERVAL_MS : u16 = 10 ;
11- pub const I2C_ADDR : u8 = :: bno080:: interface:: i2c:: DEFAULT_ADDRESS ;
11+ pub const I2C_ADDR : u8 = :: bno080:: interface:: i2c:: ALTERNATE_ADDRESS ;
1212
1313pub type DriverError < I2c > = :: bno080:: wrapper:: WrapperError <
1414 <I2cInterface < I2c > as SensorInterface >:: SensorError ,
@@ -24,28 +24,85 @@ impl<I: crate::aliases::I2c> Bno080<I> {
2424 ) -> Result < Self , DriverError < I > > {
2525 let interface = :: bno080:: interface:: I2cInterface :: new ( i2c, I2C_ADDR ) ;
2626 let mut driver = :: bno080:: wrapper:: BNO080 :: new_with_interface ( interface) ;
27- utils:: retry (
28- 4 ,
29- ( ) ,
30- |_| -> Result < ( ) , ( ( ) , DriverError < I > ) > {
31- delay. delay_ms ( 100u32 ) ;
32- trace ! ( "Flushing comms" ) ;
33- let _ = driver. eat_all_messages ( delay) ;
34- delay. delay_ms ( 100u32 ) ;
35- trace ! ( "Constructing IMU" ) ;
3627
37- driver. init ( delay) . map_err ( |e| ( ( ) , e) ) ?;
38- debug ! ( "Initialized bno080 driver" ) ;
39- delay. delay_ms ( 100u32 ) ;
40- driver
41- . enable_rotation_vector ( IMU_REPORT_INTERVAL_MS )
42- . map_err ( |e| ( ( ) , e) ) ?;
43- debug ! ( "Enabled rotation vector" ) ;
44- Ok ( ( ) )
45- } ,
46- |i| warn ! ( "Retrying IMU connection (attempts so far: {})" , i + 1 ) ,
47- )
48- . map_err ( |( _, e) | panic ! ( "{:?}" , e) ) ?;
28+ let mut last_err = Ok ( ( ) ) ;
29+ for i in 0 ..4 {
30+ delay. delay_ms ( 100u32 ) ;
31+ if let Err ( e) = driver. soft_reset ( ) {
32+ warn ! (
33+ "Error resetting bno080 (atmpt {}): {:?}" ,
34+ i + 1 ,
35+ defmt:: Debug2Format ( & e)
36+ ) ;
37+ last_err = Err ( e) ;
38+ } else {
39+ last_err = Ok ( ( ) ) ;
40+ break ;
41+ }
42+ }
43+ last_err?;
44+
45+ let mut last_err = Ok ( ( ) ) ;
46+ for i in 0 ..4 {
47+ delay. delay_ms ( 500u32 ) ;
48+ if let Err ( e) = driver. init ( delay) {
49+ warn ! (
50+ "Error initializing bno080 (atmpt {}): {:?}" ,
51+ i + 1 ,
52+ defmt:: Debug2Format ( & e)
53+ ) ;
54+ last_err = Err ( e) ;
55+ } else {
56+ last_err = Ok ( ( ) ) ;
57+ break ;
58+ }
59+ }
60+ last_err?;
61+
62+ let mut last_err = Ok ( ( ) ) ;
63+ for i in 0 ..4 {
64+ if let Err ( e) = driver. enable_rotation_vector ( IMU_REPORT_INTERVAL_MS ) {
65+ warn ! (
66+ "Error enabling rotation (atmpt {}): {:?}" ,
67+ i + 1 ,
68+ defmt:: Debug2Format ( & e)
69+ ) ;
70+ last_err = Err ( e) ;
71+ } else {
72+ last_err = Ok ( ( ) ) ;
73+ break ;
74+ }
75+ }
76+ last_err?;
77+
78+ // utils::retry(
79+ // 4,
80+ // (),
81+ // |_| -> Result<(), ((), DriverError<I>)> {
82+ // // delay.delay_ms(400u32);
83+ // // trace!("Flushing comms");
84+ // // let _ = i2c.write(I2C_ADDR, &[0]);
85+ //
86+ // // delay.delay_ms(400u32);
87+ // trace!("Constructing IMU");
88+ //
89+ // // if let Err(e) = driver.init(delay) {
90+ // // return Err((driver.free().free(), e));
91+ // // }
92+ // debug!("Initialized bno080 driver");
93+ // // delay.delay_ms(100u32);
94+ // // if let Err(e) = driver.enable_rotation_vector(IMU_REPORT_INTERVAL_MS) {
95+ // // return Err((driver.free().free(), e));
96+ // // }
97+ // driver
98+ // .enable_rotation_vector(IMU_REPORT_INTERVAL_MS)
99+ // .map_err(|e| ((), e))?;
100+ // debug!("Enabled rotation vector");
101+ // Ok(())
102+ // },
103+ // |i| warn!("Retrying IMU connection (attempts so far: {})", i + 1),
104+ // )
105+ // .map_err(|(_, e)| panic!("{:?}", e))?;
49106 Ok ( Self { driver } )
50107 }
51108}
0 commit comments