aboutsummaryrefslogtreecommitdiff
path: root/tests/utils/src
diff options
context:
space:
mode:
authorRasmus Melchior Jacobsen <[email protected]>2023-04-26 10:51:23 +0200
committerDario Nieuwenhuis <[email protected]>2023-05-01 22:42:36 +0200
commit49455792cb5406f3e2df0f3850c0d650965e6b2b (patch)
tree6811a5ef17a7fa7809467e5aa6dc5552cabfe5c6 /tests/utils/src
parent855c0d1423cb1aacd4f4f45e255b02b442afde34 (diff)
Ring-buffered uart rx with one-period overrun detection
Diffstat (limited to 'tests/utils/src')
-rw-r--r--tests/utils/src/bin/saturate_serial.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/utils/src/bin/saturate_serial.rs b/tests/utils/src/bin/saturate_serial.rs
new file mode 100644
index 000000000..28480516d
--- /dev/null
+++ b/tests/utils/src/bin/saturate_serial.rs
@@ -0,0 +1,52 @@
1use std::path::Path;
2use std::time::Duration;
3use std::{env, io, thread};
4
5use rand::random;
6use serial::SerialPort;
7
8pub fn main() {
9 if let Some(port_name) = env::args().nth(1) {
10 let sleep = env::args().position(|x| x == "--sleep").is_some();
11
12 println!("Saturating port {:?} with 115200 8N1", port_name);
13 println!("Sleep: {}", sleep);
14 let mut port = serial::open(&port_name).unwrap();
15 if saturate(&mut port, sleep).is_err() {
16 eprintln!("Unable to saturate port");
17 }
18 } else {
19 let path = env::args().next().unwrap();
20 let basepath = Path::new(&path).with_extension("");
21 let basename = basepath.file_name().unwrap();
22 eprintln!("USAGE: {} <port-name>", basename.to_string_lossy());
23 }
24}
25
26fn saturate<T: SerialPort>(port: &mut T, sleep: bool) -> io::Result<()> {
27 port.reconfigure(&|settings| {
28 settings.set_baud_rate(serial::Baud115200)?;
29 settings.set_char_size(serial::Bits8);
30 settings.set_parity(serial::ParityNone);
31 settings.set_stop_bits(serial::Stop1);
32 Ok(())
33 })?;
34
35 let mut written = 0;
36 loop {
37 let len = random::<usize>() % 0x1000;
38 let buf: Vec<u8> = (written..written + len).map(|x| x as u8).collect();
39
40 port.write_all(&buf)?;
41
42 if sleep {
43 let micros = (random::<usize>() % 1000) as u64;
44 println!("Sleeping {}us", micros);
45 port.flush().unwrap();
46 thread::sleep(Duration::from_micros(micros));
47 }
48
49 written += len;
50 println!("Written: {}", written);
51 }
52} \ No newline at end of file