use embedded_io::{ErrorKind, ErrorType, Read, Write};
use serialport::SerialPort;
use std::io;
pub struct LinuxUart(pub Box<dyn SerialPort>);
impl LinuxUart {
pub fn open(path: &str, baud_rate: u32) -> io::Result<Self> {
let port = serialport::new(path, baud_rate)
.timeout(std::time::Duration::from_secs(1))
.open()
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
Ok(LinuxUart(port))
}
}
fn io_to_embedded(e: io::Error) -> ErrorKind {
match e.kind() {
io::ErrorKind::TimedOut | io::ErrorKind::WouldBlock => ErrorKind::TimedOut,
io::ErrorKind::BrokenPipe | io::ErrorKind::ConnectionReset => ErrorKind::BrokenPipe,
io::ErrorKind::NotConnected | io::ErrorKind::ConnectionRefused => ErrorKind::NotConnected,
_ => ErrorKind::Other,
}
}
impl ErrorType for LinuxUart {
type Error = ErrorKind;
}
impl Read for LinuxUart {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
io::Read::read(&mut self.0, buf).map_err(io_to_embedded)
}
}
impl Write for LinuxUart {
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
io::Write::write(&mut self.0, buf).map_err(io_to_embedded)
}
fn flush(&mut self) -> Result<(), Self::Error> {
io::Write::flush(&mut self.0).map_err(io_to_embedded)
}
}