Skip to content

Commit 281ebd3

Browse files
committed
Add serial::Read implementation
1 parent 92a092d commit 281ebd3

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ embedded-hal = { version = "0.2.0", features = ["unproven"] }
1313
i2cdev = "0.4.1"
1414
spidev = "0.3.0"
1515
sysfs_gpio = "0.5.1"
16+
serial = "0.4.0"
17+
nb = "0.1.1"
1618

1719
[dependencies.cast]
1820
# we don't need the `Error` implementation

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ extern crate embedded_hal as hal;
1717
pub extern crate i2cdev;
1818
pub extern crate spidev;
1919
pub extern crate sysfs_gpio;
20+
pub extern crate serial;
21+
pub extern crate nb;
2022

2123
use std::io::{self, Write};
2224
use std::path::{Path, PathBuf};
@@ -27,6 +29,8 @@ use cast::{u32, u64};
2729
use i2cdev::core::I2CDevice;
2830
use spidev::SpidevTransfer;
2931

32+
pub mod serial_impl;
33+
3034
/// Empty struct that provides delay functionality on top of `thread::sleep`
3135
pub struct Delay;
3236

src/serial_impl.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//! Implementation of [`Serial`](https://docs.rs/embedded-hal/0.2.1/embedded_hal/serial/index.html)
2+
3+
use hal::serial::Read;
4+
use nb;
5+
use serial;
6+
7+
/// Newtype around [`serial::SystemPort`] that implements the `embedded-hal` traits
8+
pub struct Serial(pub serial::SystemPort);
9+
10+
impl Read<u8> for Serial {
11+
type Error = serial::Error;
12+
13+
fn read(&mut self) -> nb::Result<u8, Self::Error> {
14+
use std::io::Read;
15+
let mut buffer = [0; 1];
16+
let bytes_read = self
17+
.0
18+
.read(&mut buffer)
19+
.map_err(|err| nb::Error::Other(Self::Error::from(err)))?;
20+
if bytes_read == 1 {
21+
Ok(buffer[0])
22+
} else {
23+
Err(nb::Error::WouldBlock)
24+
}
25+
}
26+
}
27+
28+
#[cfg(test)]
29+
mod test {
30+
use super::*;
31+
32+
#[test]
33+
fn test_empty() {
34+
let mut port: Box<Read<u8, Error = serial::Error>> =
35+
Box::new(Serial(serial::open("/dev/tty1").unwrap()));
36+
37+
port.read().unwrap();
38+
}
39+
}

0 commit comments

Comments
 (0)