#[cfg(unix)]
use mio::{Events, Interest, Poll, Token};
use serial_io::{build, Serial};
use std::env;
use std::io;
use std::io::Read;
use std::str;
const SERIAL_TOKEN: Token = Token(0);
#[cfg(unix)]
const DEFAULT_TTY: &str = "/dev/ttyUSB0";
#[cfg(windows)]
const DEFAULT_TTY: &str = "COM1";
#[cfg(windows)]
fn is_closed(state: Ready) -> bool {
false
}
pub fn main() {
let mut args = env::args();
let tty_path = args.nth(1).unwrap_or_else(|| DEFAULT_TTY.into());
let mut poll = Poll::new().unwrap();
let mut events = Events::with_capacity(1024);
println!("Opening {} at 9600,8N1", &tty_path);
let builder = build(tty_path, 9600);
let mut rx = Serial::from_builder(&builder).unwrap();
poll.registry()
.register(&mut rx, SERIAL_TOKEN, Interest::READABLE)
.unwrap();
let mut rx_buf = [0u8; 1024];
'outer: loop {
if let Err(ref e) = poll.poll(&mut events, None) {
println!("poll failed: {}", e);
break;
}
if events.is_empty() {
println!("Read timed out!");
continue;
}
for event in events.iter() {
match event.token() {
SERIAL_TOKEN => {
if event.is_read_closed() {
println!("Quitting due to event: {:?}", event);
break 'outer;
}
if event.is_readable() {
loop {
match rx.read(&mut rx_buf) {
Ok(count) => {
println!("{:?}", String::from_utf8_lossy(&rx_buf[..count]))
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
break;
}
Err(ref e) => {
println!("Quitting due to read error: {}", e);
break 'outer;
}
}
}
}
}
t => unreachable!("Unexpected token: {:?}", t),
}
}
}
}