1
- use super :: line_endings:: normalized;
2
- use crossterm:: event:: { poll, read, Event , KeyCode , KeyEvent , KeyModifiers } ;
3
- use crossterm:: terminal:: { disable_raw_mode, enable_raw_mode} ;
1
+ use std:: {
2
+ io:: { stdout, ErrorKind , Read , Write } ,
3
+ thread:: sleep,
4
+ time:: Duration ,
5
+ } ;
6
+
7
+ use crossterm:: {
8
+ event:: { poll, read, Event , KeyCode , KeyEvent , KeyModifiers } ,
9
+ terminal:: { disable_raw_mode, enable_raw_mode} ,
10
+ } ;
4
11
use miette:: { IntoDiagnostic , Result } ;
5
12
use serialport:: SerialPort ;
6
- use std:: io:: { stdout, ErrorKind , Read , Write } ;
7
- use std:: thread:: sleep;
8
- use std:: time:: Duration ;
9
13
10
- /// Converts key events from crossterm into appropriate character/escape sequences which are then
11
- /// sent over the serial connection.
14
+ use super :: line_endings:: normalized;
15
+
16
+ /// Converts key events from crossterm into appropriate character/escape
17
+ /// sequences which are then sent over the serial connection.
12
18
///
13
19
/// Adapted from https://github.com/dhylands/serial-monitor
14
20
fn handle_key_event ( key_event : KeyEvent ) -> Option < Vec < u8 > > {
@@ -83,25 +89,33 @@ pub fn monitor(mut serial: Box<dyn SerialPort>) -> serialport::Result<()> {
83
89
println ! ( " CTRL+C Exit" ) ;
84
90
println ! ( ) ;
85
91
86
- let mut buff = [ 0 ; 128 ] ;
92
+ // Explicitly set the baud rate when starting the serial monitor, to allow using
93
+ // different rates for flashing.
87
94
serial. set_baud_rate ( 115_200 ) ?;
88
95
serial. set_timeout ( Duration :: from_millis ( 5 ) ) ?;
89
96
90
97
let _raw_mode = RawModeGuard :: new ( ) ;
98
+
91
99
let stdout = stdout ( ) ;
92
100
let mut stdout = stdout. lock ( ) ;
101
+
102
+ let mut buff = [ 0 ; 128 ] ;
93
103
loop {
94
104
let read_count = match serial. read ( & mut buff) {
95
105
Ok ( count) => Ok ( count) ,
96
106
Err ( e) if e. kind ( ) == ErrorKind :: TimedOut => Ok ( 0 ) ,
107
+ Err ( e) if e. kind ( ) == ErrorKind :: Interrupted => continue ,
97
108
err => err,
98
109
} ?;
110
+
99
111
if read_count > 0 {
100
112
let data: Vec < u8 > = normalized ( buff[ 0 ..read_count] . iter ( ) . copied ( ) ) . collect ( ) ;
101
113
let data = String :: from_utf8_lossy ( & data) ;
114
+
102
115
stdout. write_all ( data. as_bytes ( ) ) . ok ( ) ;
103
116
stdout. flush ( ) ?;
104
117
}
118
+
105
119
if poll ( Duration :: from_secs ( 0 ) ) ? {
106
120
if let Event :: Key ( key) = read ( ) ? {
107
121
if key. modifiers . contains ( KeyModifiers :: CONTROL ) {
@@ -119,12 +133,14 @@ pub fn monitor(mut serial: Box<dyn SerialPort>) -> serialport::Result<()> {
119
133
_ => { }
120
134
}
121
135
}
136
+
122
137
if let Some ( bytes) = handle_key_event ( key) {
123
138
serial. write_all ( & bytes) ?;
124
139
serial. flush ( ) ?;
125
140
}
126
141
}
127
142
}
128
143
}
144
+
129
145
Ok ( ( ) )
130
146
}
0 commit comments