use std::io::{self, Write};
use clap::{ArgMatches, App, SubCommand};
use serial_unit_testing::utils;
use serial_unit_testing::serial::Serial;
use crate::commands;
pub fn run(matches: &ArgMatches) -> Result<(), String> {
let (settings, port_name) = commands::get_serial_settings(matches).unwrap();
match Serial::open_with_settings(port_name, &settings) {
Ok(mut serial) => {
let text_format = commands::get_text_output_format(matches);
read(&mut serial, &text_format)
},
Err(e) => return Err(format!("Error opening port {:?}", e))
}
}
pub fn command<'a>() -> App<'a, 'a> {
SubCommand::with_name("monitor")
.about("Continously display serial port data")
.args(commands::serial_arguments(false, true).as_slice())
}
fn read(serial: &mut Serial, text_format: &utils::TextFormat) -> Result<(), String> {
let mut row_entries = 0;
loop {
match serial.read() {
Ok(bytes) => {
match text_format {
utils::TextFormat::Text => io::stdout().write_all(bytes).unwrap(),
_ => utils::print_radix_string(bytes, &text_format, &mut row_entries)
};
io::stdout().flush().unwrap();
},
Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (),
Err(e) => return Err(format!("{:?}", e))
}
}
}