Skip to content

Commit 62966e9

Browse files
bors[bot]ryankurte
andauthored
Merge #75
75: Add linux-i2cdev to e-h::i2c::ErrorKind mapping r=eldruin a=ryankurte Co-authored-by: ryan kurte <ryankurte@gmail.com>
2 parents e7fd628 + de52b52 commit 62966e9

File tree

4 files changed

+46
-89
lines changed

4 files changed

+46
-89
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ nb = "1"
2828
serial-core = "0.4.0"
2929
serial-unix = "0.4.0"
3030
spidev = "0.5.1"
31+
nix = "0.23.1"
3132

3233
[dev-dependencies]
3334
openpty = "0.2.0"

src/i2c.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use std::ops;
66
use std::path::{Path, PathBuf};
77

8+
use embedded_hal::i2c::NoAcknowledgeSource;
9+
810
/// Newtype around [`i2cdev::linux::LinuxI2CDevice`] that implements the `embedded-hal` traits
911
///
1012
/// [`i2cdev::linux::LinuxI2CDevice`]: https://docs.rs/i2cdev/0.5.0/i2cdev/linux/struct.LinuxI2CDevice.html
@@ -130,6 +132,13 @@ pub struct I2CError {
130132
err: i2cdev::linux::LinuxI2CError,
131133
}
132134

135+
impl I2CError {
136+
/// Fetch inner (concrete) [`LinuxI2CError`]
137+
pub fn inner(&self) -> &i2cdev::linux::LinuxI2CError {
138+
&self.err
139+
}
140+
}
141+
133142
impl From<i2cdev::linux::LinuxI2CError> for I2CError {
134143
fn from(err: i2cdev::linux::LinuxI2CError) -> Self {
135144
Self { err }
@@ -138,11 +147,24 @@ impl From<i2cdev::linux::LinuxI2CError> for I2CError {
138147

139148
impl embedded_hal::i2c::Error for I2CError {
140149
fn kind(&self) -> embedded_hal::i2c::ErrorKind {
141-
use embedded_hal::i2c::ErrorKind::*;
142-
match &self.err {
143-
// i2cdev::linux::LinuxI2CError::Nix(_) => todo!(),
144-
// i2cdev::linux::LinuxI2CError::Io(_) => todo!(),
145-
_ => Other,
150+
use embedded_hal::i2c::ErrorKind;
151+
use nix::errno::Errno::*;
152+
153+
let errno = match &self.err {
154+
i2cdev::linux::LinuxI2CError::Nix(e) => *e,
155+
i2cdev::linux::LinuxI2CError::Io(e) => match e.raw_os_error() {
156+
Some(r) => nix::Error::from_i32(r),
157+
None => return ErrorKind::Other,
158+
},
159+
};
160+
161+
// https://www.kernel.org/doc/html/latest/i2c/fault-codes.html
162+
match errno {
163+
EBUSY | EINVAL | EIO => ErrorKind::Bus,
164+
EAGAIN => ErrorKind::ArbitrationLoss,
165+
ENODEV => ErrorKind::NoAcknowledge(NoAcknowledgeSource::Data),
166+
ENXIO => ErrorKind::NoAcknowledge(NoAcknowledgeSource::Address),
167+
_ => ErrorKind::Other,
146168
}
147169
}
148170
}

src/serial.rs

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -62,51 +62,18 @@ pub struct SerialError {
6262
err: IoErrorKind,
6363
}
6464

65+
impl SerialError {
66+
/// Fetch inner (concrete) [`IoErrorKind`]
67+
pub fn inner(&self) -> &IoErrorKind {
68+
&self.err
69+
}
70+
}
71+
6572
impl embedded_hal::serial::Error for SerialError {
6673
fn kind(&self) -> embedded_hal::serial::ErrorKind {
6774
use embedded_hal::serial::ErrorKind::*;
6875
match &self.err {
69-
// IoErrorKind::NotFound => todo!(),
70-
// IoErrorKind::PermissionDenied => todo!(),
71-
// IoErrorKind::ConnectionRefused => todo!(),
72-
// IoErrorKind::ConnectionReset => todo!(),
73-
// IoErrorKind::HostUnreachable => todo!(),
74-
// IoErrorKind::NetworkUnreachable => todo!(),
75-
// IoErrorKind::ConnectionAborted => todo!(),
76-
// IoErrorKind::NotConnected => todo!(),
77-
// IoErrorKind::AddrInUse => todo!(),
78-
// IoErrorKind::AddrNotAvailable => todo!(),
79-
// IoErrorKind::NetworkDown => todo!(),
80-
// IoErrorKind::BrokenPipe => todo!(),
81-
// IoErrorKind::AlreadyExists => todo!(),
82-
// IoErrorKind::WouldBlock => todo!(),
83-
// IoErrorKind::NotADirectory => todo!(),
84-
// IoErrorKind::IsADirectory => todo!(),
85-
// IoErrorKind::DirectoryNotEmpty => todo!(),
86-
// IoErrorKind::ReadOnlyFilesystem => todo!(),
87-
// IoErrorKind::FilesystemLoop => todo!(),
88-
// IoErrorKind::StaleNetworkFileHandle => todo!(),
89-
// IoErrorKind::InvalidInput => todo!(),
90-
// IoErrorKind::InvalidData => todo!(),
91-
// IoErrorKind::TimedOut => todo!(),
92-
// IoErrorKind::WriteZero => todo!(),
93-
// IoErrorKind::StorageFull => todo!(),
94-
// IoErrorKind::NotSeekable => todo!(),
95-
// IoErrorKind::FilesystemQuotaExceeded => todo!(),
96-
// IoErrorKind::FileTooLarge => todo!(),
97-
// IoErrorKind::ResourceBusy => todo!(),
98-
// IoErrorKind::ExecutableFileBusy => todo!(),
99-
// IoErrorKind::Deadlock => todo!(),
100-
// IoErrorKind::CrossesDevices => todo!(),
101-
// IoErrorKind::TooManyLinks => todo!(),
102-
// IoErrorKind::FilenameTooLong => todo!(),
103-
// IoErrorKind::ArgumentListTooLong => todo!(),
104-
// IoErrorKind::Interrupted => todo!(),
105-
// IoErrorKind::Unsupported => todo!(),
106-
// IoErrorKind::UnexpectedEof => todo!(),
107-
// IoErrorKind::OutOfMemory => todo!(),
108-
// IoErrorKind::Other => todo!(),
109-
// IoErrorKind::Uncategorized => todo!(),
76+
// TODO: match any errors here if we can find any that are relevant
11077
_ => Other,
11178
}
11279
}

src/spi.rs

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ pub struct SPIError {
116116
err: io::Error,
117117
}
118118

119+
impl SPIError {
120+
/// Fetch inner (concrete) [`LinuxI2CError`]
121+
pub fn inner(&self) -> &io::Error {
122+
&self.err
123+
}
124+
}
125+
119126
impl From<io::Error> for SPIError {
120127
fn from(err: io::Error) -> Self {
121128
Self { err }
@@ -124,50 +131,10 @@ impl From<io::Error> for SPIError {
124131

125132
impl embedded_hal::spi::Error for SPIError {
126133
fn kind(&self) -> embedded_hal::spi::ErrorKind {
127-
use embedded_hal::spi::ErrorKind::*;
134+
use embedded_hal::spi::ErrorKind;
128135
match self.err.kind() {
129-
// io::ErrorKind::NotFound => todo!(),
130-
// io::ErrorKind::PermissionDenied => todo!(),
131-
// io::ErrorKind::ConnectionRefused => todo!(),
132-
// io::ErrorKind::ConnectionReset => todo!(),
133-
// io::ErrorKind::HostUnreachable => todo!(),
134-
// io::ErrorKind::NetworkUnreachable => todo!(),
135-
// io::ErrorKind::ConnectionAborted => todo!(),
136-
// io::ErrorKind::NotConnected => todo!(),
137-
// io::ErrorKind::AddrInUse => todo!(),
138-
// io::ErrorKind::AddrNotAvailable => todo!(),
139-
// io::ErrorKind::NetworkDown => todo!(),
140-
// io::ErrorKind::BrokenPipe => todo!(),
141-
// io::ErrorKind::AlreadyExists => todo!(),
142-
// io::ErrorKind::WouldBlock => todo!(),
143-
// io::ErrorKind::NotADirectory => todo!(),
144-
// io::ErrorKind::IsADirectory => todo!(),
145-
// io::ErrorKind::DirectoryNotEmpty => todo!(),
146-
// io::ErrorKind::ReadOnlyFilesystem => todo!(),
147-
// io::ErrorKind::FilesystemLoop => todo!(),
148-
// io::ErrorKind::StaleNetworkFileHandle => todo!(),
149-
// io::ErrorKind::InvalidInput => todo!(),
150-
// io::ErrorKind::InvalidData => todo!(),
151-
// io::ErrorKind::TimedOut => todo!(),
152-
// io::ErrorKind::WriteZero => todo!(),
153-
// io::ErrorKind::StorageFull => todo!(),
154-
// io::ErrorKind::NotSeekable => todo!(),
155-
// io::ErrorKind::FilesystemQuotaExceeded => todo!(),
156-
// io::ErrorKind::FileTooLarge => todo!(),
157-
// io::ErrorKind::ResourceBusy => todo!(),
158-
// io::ErrorKind::ExecutableFileBusy => todo!(),
159-
// io::ErrorKind::Deadlock => todo!(),
160-
// io::ErrorKind::CrossesDevices => todo!(),
161-
// io::ErrorKind::TooManyLinks => todo!(),
162-
// io::ErrorKind::FilenameTooLong => todo!(),
163-
// io::ErrorKind::ArgumentListTooLong => todo!(),
164-
// io::ErrorKind::Interrupted => todo!(),
165-
// io::ErrorKind::Unsupported => todo!(),
166-
// io::ErrorKind::UnexpectedEof => todo!(),
167-
// io::ErrorKind::OutOfMemory => todo!(),
168-
// io::ErrorKind::Other => todo!(),
169-
// io::ErrorKind::Uncategorized => todo!(),
170-
_ => Other,
136+
// TODO: match any errors here if we can find any that are relevant
137+
_ => ErrorKind::Other,
171138
}
172139
}
173140
}

0 commit comments

Comments
 (0)