@@ -2,13 +2,13 @@ use crate::aliases::{Delay, I2c};
2
2
use crate :: imu:: { Imu , Quat } ;
3
3
use crate :: utils;
4
4
5
- use :: bno080:: interface:: I2cInterface ;
5
+ use bno080:: interface:: I2cInterface ;
6
6
use bno080:: interface:: SensorInterface ;
7
7
use defmt:: { debug, trace, warn} ;
8
8
use firmware_protocol:: ImuType ;
9
9
10
10
pub 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 ;
12
12
13
13
pub type DriverError < I2c > = :: bno080:: wrapper:: WrapperError <
14
14
<I2cInterface < I2c > as SensorInterface >:: SensorError ,
@@ -24,28 +24,85 @@ impl<I: crate::aliases::I2c> Bno080<I> {
24
24
) -> Result < Self , DriverError < I > > {
25
25
let interface = :: bno080:: interface:: I2cInterface :: new ( i2c, I2C_ADDR ) ;
26
26
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" ) ;
36
27
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))?;
49
106
Ok ( Self { driver } )
50
107
}
51
108
}
0 commit comments