Skip to content

Commit 6447dfa

Browse files
committed
error: use EH1 NoAcknowledgeSource
1 parent 5c4f40d commit 6447dfa

File tree

2 files changed

+41
-44
lines changed

2 files changed

+41
-44
lines changed

src/error.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use std::fmt;
2-
use std::io;
1+
use eh1::i2c::NoAcknowledgeSource;
2+
use std::{fmt, io};
33

44
/// Error type.
55
#[derive(Debug)]
@@ -17,27 +17,28 @@ pub enum Error<E: std::error::Error> {
1717
#[non_exhaustive]
1818
pub enum ErrorKind {
1919
/// No ACK from the I2C slave
20-
I2cNoAck,
20+
I2cNoAck(NoAcknowledgeSource),
2121
}
2222

2323
impl ErrorKind {
2424
fn as_str(&self) -> &str {
2525
match *self {
26-
ErrorKind::I2cNoAck => "No ACK from slave",
26+
ErrorKind::I2cNoAck(NoAcknowledgeSource::Address) => {
27+
"No ACK from slave during addressing"
28+
}
29+
ErrorKind::I2cNoAck(NoAcknowledgeSource::Data) => {
30+
"No ACK from slave during data transfer"
31+
}
32+
ErrorKind::I2cNoAck(NoAcknowledgeSource::Unknown) => "No ACK from slave",
2733
}
2834
}
2935
}
3036

3137
impl<E: std::error::Error> eh1::i2c::Error for Error<E> {
3238
fn kind(&self) -> eh1::i2c::ErrorKind {
3339
match self {
34-
Error::Hal(kind) => match kind {
35-
ErrorKind::I2cNoAck => {
36-
eh1::i2c::ErrorKind::NoAcknowledge(eh1::i2c::NoAcknowledgeSource::Unknown)
37-
}
38-
},
39-
Error::Io(_io_err) => eh1::i2c::ErrorKind::Other,
40-
Error::Backend(_std_err) => eh1::i2c::ErrorKind::Other,
40+
Self::Hal(ErrorKind::I2cNoAck(src)) => eh1::i2c::ErrorKind::NoAcknowledge(*src),
41+
_ => eh1::i2c::ErrorKind::Other,
4142
}
4243
}
4344
}

src/i2c.rs

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::error::Error;
22
use crate::error::ErrorKind::I2cNoAck;
33
use crate::{FtInner, PinUse};
4-
use eh1::i2c::{Operation, SevenBitAddress};
4+
use eh1::i2c::{NoAcknowledgeSource, Operation, SevenBitAddress};
55
use ftdi_mpsse::{ClockBitsIn, ClockBitsOut, MpsseCmdBuilder, MpsseCmdExecutor};
66
use std::sync::{Arc, Mutex};
77

@@ -97,14 +97,22 @@ where
9797

9898
/// Enable faster I2C transactions by sending commands in a single write.
9999
///
100-
/// This is disabled by default.
100+
/// This is disabled by default, and currently has no effect when using
101+
/// version 1 of the `embedded-hal` traits.
101102
///
102103
/// Normally the I2C methods will send commands with a delay after each
103104
/// slave ACK to read from the USB device.
104105
/// Enabling this will send I2C commands without a delay, but slave ACKs
105106
/// will only be checked at the end of each call to `read`, `write`, or
106107
/// `write_read`.
107108
///
109+
/// Additionally this changes the type of errors that can occur:
110+
///
111+
/// * enabled: NAK errors will be reported as
112+
/// `NoAcknowledgeSource::Unknown`.
113+
/// * disabled: NAK errors will be reported as
114+
/// `NoAcknowledgeSource::Address` or `NoAcknowledgeSource::Data`.
115+
///
108116
/// # Example
109117
///
110118
/// ```no_run
@@ -188,7 +196,7 @@ where
188196
lock.ft.recv(buffer)?;
189197

190198
if (ack_buf[0] & 0b1) != 0x00 {
191-
return Err(Error::Hal(I2cNoAck));
199+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Unknown)));
192200
}
193201

194202
Ok(())
@@ -221,7 +229,7 @@ where
221229
let mut ack_buf: [u8; 1] = [0; 1];
222230
lock.ft.recv(&mut ack_buf)?;
223231
if (ack_buf[0] & 0b1) != 0x00 {
224-
return Err(Error::Hal(I2cNoAck));
232+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Address)));
225233
}
226234

227235
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
@@ -318,7 +326,7 @@ where
318326
let mut ack_buf: Vec<u8> = vec![0; 1 + bytes.len()];
319327
lock.ft.recv(ack_buf.as_mut_slice())?;
320328
if ack_buf.iter().any(|&ack| (ack & 0b1) != 0x00) {
321-
Err(Error::Hal(I2cNoAck))
329+
Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Unknown)))
322330
} else {
323331
Ok(())
324332
}
@@ -351,7 +359,7 @@ where
351359
let mut ack_buf: [u8; 1] = [0; 1];
352360
lock.ft.recv(&mut ack_buf)?;
353361
if (ack_buf[0] & 0b1) != 0x00 {
354-
return Err(Error::Hal(I2cNoAck));
362+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Address)));
355363
}
356364

357365
for (idx, byte) in bytes.iter().enumerate() {
@@ -388,7 +396,7 @@ where
388396
let mut ack_buf: [u8; 1] = [0; 1];
389397
lock.ft.recv(&mut ack_buf)?;
390398
if (ack_buf[0] & 0b1) != 0x00 {
391-
return Err(Error::Hal(I2cNoAck));
399+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Data)));
392400
}
393401
}
394402

@@ -493,7 +501,7 @@ where
493501
lock.ft.recv(buffer)?;
494502

495503
if ack_buf.iter().any(|&ack| (ack & 0b1) != 0x00) {
496-
Err(Error::Hal(I2cNoAck))
504+
Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Unknown)))
497505
} else {
498506
Ok(())
499507
}
@@ -534,7 +542,7 @@ where
534542
let mut ack_buf: [u8; 1] = [0; 1];
535543
lock.ft.recv(&mut ack_buf)?;
536544
if (ack_buf[0] & 0b1) != 0x00 {
537-
return Err(Error::Hal(I2cNoAck));
545+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Address)));
538546
}
539547

540548
for byte in bytes {
@@ -551,7 +559,7 @@ where
551559
let mut ack_buf: [u8; 1] = [0; 1];
552560
lock.ft.recv(&mut ack_buf)?;
553561
if (ack_buf[0] & 0b1) != 0x00 {
554-
return Err(Error::Hal(I2cNoAck));
562+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Data)));
555563
}
556564
}
557565

@@ -579,7 +587,7 @@ where
579587
let mut ack_buf: [u8; 1] = [0; 1];
580588
lock.ft.recv(&mut ack_buf)?;
581589
if (ack_buf[0] & 0b1) != 0x00 {
582-
return Err(Error::Hal(I2cNoAck));
590+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Data)));
583591
}
584592

585593
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
@@ -622,7 +630,7 @@ where
622630
Ok(())
623631
}
624632

625-
fn transaction_slow(
633+
fn transaction(
626634
&mut self,
627635
address: u8,
628636
operations: &mut [Operation<'_>],
@@ -641,13 +649,13 @@ where
641649
}
642650
lock.ft.send(mpsse_cmd.as_slice())?;
643651

644-
let mut last_op_was_a_read = false;
652+
let mut prev_op_was_a_read: bool = false;
645653
for (idx, operation) in operations.iter_mut().enumerate() {
646654
match operation {
647655
Operation::Read(buffer) => {
648656
assert!(!buffer.is_empty(), "buffer must be a non-empty slice");
649657

650-
if idx == 0 || !last_op_was_a_read {
658+
if idx == 0 || !prev_op_was_a_read {
651659
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
652660
if idx != 0 {
653661
// SR
@@ -680,7 +688,7 @@ where
680688
let mut ack_buf: [u8; 1] = [0; 1];
681689
lock.ft.recv(&mut ack_buf)?;
682690
if (ack_buf[0] & 0b1) != 0x00 {
683-
return Err(Error::Hal(I2cNoAck));
691+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Address)));
684692
}
685693
}
686694

@@ -704,12 +712,12 @@ where
704712
lock.ft.send(mpsse_cmd.as_slice())?;
705713
lock.ft.recv(buffer)?;
706714

707-
last_op_was_a_read = true;
715+
prev_op_was_a_read = true;
708716
}
709717
Operation::Write(bytes) => {
710718
assert!(!bytes.is_empty(), "bytes must be a non-empty slice");
711719

712-
if idx == 0 || last_op_was_a_read {
720+
if idx == 0 || prev_op_was_a_read {
713721
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
714722
if idx != 0 {
715723
// SR
@@ -742,7 +750,7 @@ where
742750
let mut ack_buf: [u8; 1] = [0; 1];
743751
lock.ft.recv(&mut ack_buf)?;
744752
if (ack_buf[0] & 0b1) != 0x00 {
745-
return Err(Error::Hal(I2cNoAck));
753+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Address)));
746754
}
747755
}
748756

@@ -761,11 +769,11 @@ where
761769
let mut ack_buf: [u8; 1] = [0; 1];
762770
lock.ft.recv(&mut ack_buf)?;
763771
if (ack_buf[0] & 0b1) != 0x00 {
764-
return Err(Error::Hal(I2cNoAck));
772+
return Err(Error::Hal(I2cNoAck(NoAcknowledgeSource::Data)));
765773
}
766774
}
767775

768-
last_op_was_a_read = false;
776+
prev_op_was_a_read = false;
769777
}
770778
}
771779
}
@@ -790,14 +798,6 @@ where
790798

791799
Ok(())
792800
}
793-
794-
fn transaction_fast(
795-
&mut self,
796-
_address: u8,
797-
_operations: &mut [Operation<'_>],
798-
) -> Result<(), Error<E>> {
799-
unimplemented!()
800-
}
801801
}
802802

803803
impl<Device, E> eh0::blocking::i2c::Read for I2c<Device>
@@ -871,10 +871,6 @@ where
871871
address: SevenBitAddress,
872872
operations: &mut [Operation<'_>],
873873
) -> Result<(), Self::Error> {
874-
if self.fast {
875-
self.transaction_fast(address, operations)
876-
} else {
877-
self.transaction_slow(address, operations)
878-
}
874+
self.transaction(address, operations)
879875
}
880876
}

0 commit comments

Comments
 (0)