1
1
use core:: { mem, ptr} ;
2
- use core:: cell:: RefCell ;
2
+ use core:: cell:: { Cell , RefCell } ;
3
3
use log:: { self , Log , LogLevel , LogMetadata , LogRecord , LogLevelFilter } ;
4
4
use log_buffer:: LogBuffer ;
5
5
use clock;
6
6
7
7
pub struct BufferLogger {
8
- buffer : RefCell < LogBuffer < & ' static mut [ u8 ] > >
8
+ buffer : RefCell < LogBuffer < & ' static mut [ u8 ] > > ,
9
+ trace_to_uart : Cell < bool >
9
10
}
10
11
11
12
unsafe impl Sync for BufferLogger { }
@@ -15,7 +16,8 @@ static mut LOGGER: *const BufferLogger = ptr::null();
15
16
impl BufferLogger {
16
17
pub fn new ( buffer : & ' static mut [ u8 ] ) -> BufferLogger {
17
18
BufferLogger {
18
- buffer : RefCell :: new ( LogBuffer :: new ( buffer) )
19
+ buffer : RefCell :: new ( LogBuffer :: new ( buffer) ) ,
20
+ trace_to_uart : Cell :: new ( true )
19
21
}
20
22
}
21
23
@@ -48,6 +50,14 @@ impl BufferLogger {
48
50
pub fn extract < R , F : FnOnce ( & str ) -> R > ( & self , f : F ) -> R {
49
51
f ( self . buffer . borrow_mut ( ) . extract ( ) )
50
52
}
53
+
54
+ pub fn disable_trace_to_uart ( & self ) {
55
+ if self . trace_to_uart . get ( ) {
56
+ trace ! ( "disabling tracing to UART; all further trace messages \
57
+ are sent to core log only") ;
58
+ self . trace_to_uart . set ( false )
59
+ }
60
+ }
51
61
}
52
62
53
63
impl Log for BufferLogger {
@@ -61,7 +71,10 @@ impl Log for BufferLogger {
61
71
writeln ! ( self . buffer. borrow_mut( ) ,
62
72
"[{:12}us] {:>5}({}): {}" ,
63
73
clock:: get_us( ) , record. level( ) , record. target( ) , record. args( ) ) . unwrap ( ) ;
64
- if record. level ( ) <= LogLevel :: Info {
74
+
75
+ // Printing to UART is really slow, so avoid doing that when we have an alternative
76
+ // route to retrieve the debug messages.
77
+ if self . trace_to_uart . get ( ) || record. level ( ) <= LogLevel :: Info {
65
78
println ! ( "[{:12}us] {:>5}({}): {}" ,
66
79
clock:: get_us( ) , record. level( ) , record. target( ) , record. args( ) ) ;
67
80
}
0 commit comments