Skip to main content

stress_abort/
stress_abort.rs

1use std::{env, error::Error, process, thread, time::Duration};
2
3use vlfd_rs::{Board, IoConfig};
4
5fn main() {
6    if let Err(err) = real_main() {
7        eprintln!("error: {err}");
8        process::exit(1);
9    }
10}
11
12fn real_main() -> Result<(), Box<dyn Error>> {
13    let mut iterations = 10usize;
14    let mut words = 512usize;
15    let mut window = 4usize;
16    let mut clock_high = 4u16;
17    let mut clock_low = 4u16;
18    let mut settle_ms = 0u64;
19
20    let mut args = env::args().skip(1);
21    while let Some(flag) = args.next() {
22        match flag.as_str() {
23            "--iterations" => {
24                iterations = args
25                    .next()
26                    .ok_or("missing value for --iterations")?
27                    .parse()?
28            }
29            "--words" => words = args.next().ok_or("missing value for --words")?.parse()?,
30            "--window" => window = args.next().ok_or("missing value for --window")?.parse()?,
31            "--clock-high" => {
32                clock_high = args
33                    .next()
34                    .ok_or("missing value for --clock-high")?
35                    .parse()?
36            }
37            "--clock-low" => {
38                clock_low = args
39                    .next()
40                    .ok_or("missing value for --clock-low")?
41                    .parse()?
42            }
43            "--settle-ms" => {
44                settle_ms = args
45                    .next()
46                    .ok_or("missing value for --settle-ms")?
47                    .parse()?
48            }
49            other => return Err(format!("unknown flag `{other}`").into()),
50        }
51    }
52
53    let tx = vec![0x1234u16; words];
54
55    for iteration in 0..iterations {
56        println!("iter={iteration} phase=open");
57        let mut board = Board::open()?;
58        println!(
59            "iter={iteration} config programmed={} fifo_words={} version=0x{:04x}",
60            board.config().is_programmed(),
61            board.config().fifo_size_words(),
62            board.config().smims_version_raw()
63        );
64
65        let mut io = board.configure_io(&IoConfig {
66            clock_high_delay: clock_high,
67            clock_low_delay: clock_low,
68            ..IoConfig::default()
69        })?;
70
71        {
72            let mut rolling = io.transfer_window(words, window)?;
73            for submit_index in 0..window {
74                rolling.submit(&tx)?;
75                println!("iter={iteration} submit={submit_index}");
76            }
77            if settle_ms > 0 {
78                thread::sleep(Duration::from_millis(settle_ms));
79            }
80        }
81
82        io.finish()?;
83        board.close()?;
84
85        println!("iter={iteration} phase=reopen");
86        let reopened = Board::open()?;
87        println!(
88            "iter={iteration} reopened programmed={} fifo_words={} version=0x{:04x}",
89            reopened.config().is_programmed(),
90            reopened.config().fifo_size_words(),
91            reopened.config().smims_version_raw()
92        );
93        reopened.close()?;
94    }
95
96    Ok(())
97}