1pub use clap;
2use clap::Parser;
3use prettytable::format::consts::FORMAT_CLEAN;
4use prettytable::{row, Attr, Cell, Row, Table};
5
6mod parse_ip;
7mod parse_mcu;
8mod paths;
9
10#[derive(Debug, Parser)]
11pub struct Args {
12 pub chip: String,
13 pub filter: Option<String>,
14}
15
16struct PinRow {
17 pin: String,
18 r#use: String,
19 mode: String,
20}
21
22pub fn run(args: &Args) -> anyhow::Result<()> {
23 let filter = args.filter.clone().unwrap_or_default().to_ascii_lowercase();
24 let db = paths::obtain_db(&args.chip)?;
25 let db = std::fs::read_to_string(db)?;
26
27 let db = std::thread::spawn(move || parse_mcu::parse_xml(&db));
28
29 let gpios = std::thread::spawn(move || parse_ip::parse_ip());
30
31 let db = db.join().unwrap()?;
32 let gpios = gpios.join().unwrap()?;
33
34 let gpios = gpios
36 .gpio_pins
37 .into_iter()
38 .map(|pin| (pin.name.to_string(), pin.pin_signals))
39 .collect::<std::collections::HashMap<_, _>>();
40
41 let mut pin_row = Vec::with_capacity(db.pins.len());
42
43 for pin in db.pins {
44 for signal in pin.signals {
45 let signal_name = signal.name.to_ascii_lowercase();
46 if signal_name.contains(&filter) {
47 let gpio = gpios.get(&pin.name).unwrap();
48
49 let signal = gpio
50 .iter()
51 .find(|signal| signal.name.to_ascii_lowercase() == signal_name)
52 .unwrap();
53
54 let signal_value = signal
55 .specific_parameters
56 .iter()
57 .flat_map(|p| &p.possible_values)
58 .next()
59 .unwrap();
60
61 let (_, signal_value, _) = signal_name_components(signal_value).unwrap();
62
63 pin_row.push(PinRow {
64 pin: pin.name.to_string(),
65 r#use: signal.name.to_string(),
66 mode: signal_value.to_string(),
67 });
68 }
69 }
70 }
71
72 pin_row.sort_by_key(|row| row.r#use.to_ascii_lowercase());
73
74 let mut table = Table::new();
75 table.set_format(*FORMAT_CLEAN);
76 table.add_row(Row::new(vec![
77 Cell::new("Use").with_style(Attr::Bold),
78 Cell::new("Pin").with_style(Attr::Bold),
79 Cell::new("Mode").with_style(Attr::Bold),
80 ]));
81 for row in pin_row {
82 table.add_row(row![row.r#use, row.pin, row.mode]);
83 }
84
85 table.printstd();
86
87 Ok(())
88}
89
90fn signal_name_components(name: &str) -> Option<(&str, &str, &str)> {
92 let mut parts = name.split('_');
93 let gpio = parts.next()?;
94 let x = parts.next()?;
95 let y = parts.next()?;
96 Some((gpio, x, y))
97}