mirror of
https://github.com/ferrous-systems/embedded-trainings-2020.git
synced 2024-05-19 08:48:17 +00:00
53 lines
1.4 KiB
Rust
53 lines
1.4 KiB
Rust
use core::sync::atomic::{AtomicBool, Ordering};
|
|
use std::{
|
|
io::{self, Read as _, Write as _},
|
|
thread,
|
|
time::Duration,
|
|
};
|
|
|
|
use serialport::SerialPortType;
|
|
|
|
fn main() -> Result<(), anyhow::Error> {
|
|
let mut once = true;
|
|
let dongle = loop {
|
|
if let Some(dongle) = serialport::available_ports()?
|
|
.into_iter()
|
|
.filter(|info| match &info.port_type {
|
|
SerialPortType::UsbPort(usb) => usb.vid == consts::VID,
|
|
_ => false,
|
|
})
|
|
.next()
|
|
{
|
|
break dongle;
|
|
} else if once {
|
|
once = false;
|
|
|
|
eprintln!("(waiting for the Dongle to be connected)");
|
|
}
|
|
};
|
|
|
|
let mut port = serialport::open(&dongle.port_name)?;
|
|
|
|
static CONTINUE: AtomicBool = AtomicBool::new(true);
|
|
|
|
// properly close the serial device on Ctrl-C
|
|
ctrlc::set_handler(|| CONTINUE.store(false, Ordering::Relaxed))?;
|
|
|
|
let stdout = io::stdout();
|
|
let mut stdout = stdout.lock();
|
|
let mut read_buf = [0; 64];
|
|
while CONTINUE.load(Ordering::Relaxed) {
|
|
if port.bytes_to_read()? != 0 {
|
|
let n = port.read(&mut read_buf)?;
|
|
stdout.write_all(&read_buf[..n])?;
|
|
stdout.flush()?;
|
|
} else {
|
|
// time span between two consecutive FS USB packets
|
|
thread::sleep(Duration::from_millis(1));
|
|
}
|
|
}
|
|
|
|
eprintln!("(closing the serial port)");
|
|
Ok(())
|
|
}
|