|
| 1 | +use crate::legacy::serial::interface; |
| 2 | +use crate::legacy::serial::terminal; |
| 3 | + |
| 4 | +use clap::ArgMatches; |
| 5 | +use tokio_serial::SerialStream; |
| 6 | + |
| 7 | +use crate::legacy::errors::TockloaderError; |
| 8 | + |
| 9 | +pub struct SerialInterface { |
| 10 | + pub port: String, |
| 11 | + pub baud_rate: u32, |
| 12 | + pub stream: Option<SerialStream>, |
| 13 | +} |
| 14 | + |
| 15 | +impl SerialInterface { |
| 16 | + pub fn new(args: &ArgMatches) -> Result<Self, TockloaderError> { |
| 17 | + // If the user has specified a port, we want to try to use it. |
| 18 | + // Otherwise, we let tokio-serial enumarate all ports and |
| 19 | + // if multiple ports are present, we let the user decide which. |
| 20 | + let port = if let Some(user_port) = args.get_one::<String>("port") { |
| 21 | + user_port.clone() |
| 22 | + } else { |
| 23 | + let available_ports = tokio_serial::available_ports()?; |
| 24 | + |
| 25 | + if available_ports.is_empty() { |
| 26 | + return Err(TockloaderError::NoPortAvailable); |
| 27 | + } else if available_ports.len() == 1 { |
| 28 | + clean_port_path(available_ports[0].port_name.clone()) |
| 29 | + } else { |
| 30 | + // available_ports.len() > 1 |
| 31 | + todo!("Make user choose out of multiple available ports") |
| 32 | + } |
| 33 | + }; |
| 34 | + |
| 35 | + // change this back!! |
| 36 | + let baud_rate: u32 = 115200; |
| 37 | + // let baud_rate = if let Some(baud_rate) = args.get_one::<u32>("baud-rate") { |
| 38 | + // *baud_rate |
| 39 | + // } else { |
| 40 | + // unreachable!("'--baud-rate' should have a default value.") |
| 41 | + // }; |
| 42 | + |
| 43 | + Ok(Self { |
| 44 | + port, |
| 45 | + baud_rate, |
| 46 | + stream: None, |
| 47 | + }) |
| 48 | + } |
| 49 | +} |
| 50 | + |
| 51 | +// When listing available ports, tokio_serial list unix ports like so: |
| 52 | +// /sys/class/tty/ttyACM0 |
| 53 | +// /sys/class/tty/<port> |
| 54 | +// For some users, tokio_serial fails to open ports using this path scheme. |
| 55 | +// This function replaces it with the normal '/dev/<port>' scheme. |
| 56 | +// Windows COM ports should not be affected. |
| 57 | +fn clean_port_path(port: String) -> String { |
| 58 | + if port.contains("/sys/class/tty/") { |
| 59 | + port.replace("/sys/class/tty/", "/dev/") |
| 60 | + } else { |
| 61 | + port |
| 62 | + } |
| 63 | +} |
0 commit comments