Skip to content

Commit 21dbc04

Browse files
committed
Update embedded-hal to 1.0.0-alpha.8
This also bumps the MSRV to 1.54.0, as this is embedded-hal's current requirement.
1 parent 12847c4 commit 21dbc04

File tree

4 files changed

+37
-48
lines changed

4 files changed

+37
-48
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121

2222
include:
2323
# Test MSRV
24-
- rust: 1.46.0
24+
- rust: 1.54.0
2525
TARGET: x86_64-unknown-linux-gnu
2626

2727
# Test nightly but don't fail

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ spi = ["spidev"]
2222
default = [ "gpio_cdev", "gpio_sysfs", "i2c", "spi" ]
2323

2424
[dependencies]
25-
embedded-hal = "=1.0.0-alpha.7"
25+
embedded-hal = "=1.0.0-alpha.8"
2626
gpio-cdev = { version = "0.5.1", optional = true }
2727
sysfs_gpio = { version = "0.6.1", optional = true }
2828
i2cdev = { version = "0.5.1", optional = true }

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ With `default-features = false` you can enable the features `gpio_cdev`, `gpio_s
2929

3030
## Minimum Supported Rust Version (MSRV)
3131

32-
This crate is guaranteed to compile on stable Rust 1.46.0 and up. It *might*
32+
This crate is guaranteed to compile on stable Rust 1.54.0 and up. It *might*
3333
compile with older versions but that may change in any new patch release.
3434

3535
## License

src/spi.rs

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -40,71 +40,60 @@ impl ops::DerefMut for Spidev {
4040

4141
mod embedded_hal_impl {
4242
use super::*;
43-
use embedded_hal::spi::blocking::{
44-
Operation as SpiOperation, Transactional, Transfer, TransferInplace, Write,
45-
};
43+
use embedded_hal::spi::blocking::{SpiBus, SpiBusFlush, SpiBusRead, SpiBusWrite, SpiDevice};
4644
use embedded_hal::spi::ErrorType;
4745
use spidev::SpidevTransfer;
48-
use std::io::Write as _;
46+
use std::io::{Read, Write};
4947

5048
impl ErrorType for Spidev {
5149
type Error = SPIError;
5250
}
5351

54-
impl Transfer<u8> for Spidev {
55-
fn transfer<'b>(&mut self, read: &'b mut [u8], write: &[u8]) -> Result<(), Self::Error> {
56-
self.0
57-
.transfer(&mut SpidevTransfer::read_write(&write, read))
58-
.map_err(|err| SPIError { err })
52+
impl SpiBusFlush for Spidev {
53+
fn flush(&mut self) -> Result<(), Self::Error> {
54+
self.0.flush().map_err(|err| SPIError { err })
5955
}
6056
}
6157

62-
impl TransferInplace<u8> for Spidev {
63-
fn transfer_inplace<'b>(&mut self, buffer: &'b mut [u8]) -> Result<(), Self::Error> {
64-
let tx = buffer.to_owned();
65-
self.0
66-
.transfer(&mut SpidevTransfer::read_write(&tx, buffer))
67-
.map_err(|err| SPIError { err })
58+
impl SpiBusRead<u8> for Spidev {
59+
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
60+
self.0.read_exact(words).map_err(|err| SPIError { err })
6861
}
6962
}
7063

71-
impl Write<u8> for Spidev {
72-
fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
73-
self.0.write_all(buffer).map_err(|err| SPIError { err })
64+
impl SpiBusWrite<u8> for Spidev {
65+
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
66+
self.0.write_all(words).map_err(|err| SPIError { err })
7467
}
7568
}
7669

77-
/// Transactional implementation batches SPI operations into a single transaction
78-
impl Transactional<u8> for Spidev {
79-
fn exec<'a>(&mut self, operations: &mut [SpiOperation<'a, u8>]) -> Result<(), Self::Error> {
80-
// Map types from generic to linux objects
81-
let mut messages: Vec<_> = operations
82-
.iter_mut()
83-
.map(|a| {
84-
match a {
85-
SpiOperation::Read(w) => SpidevTransfer::read(w),
86-
SpiOperation::Write(w) => SpidevTransfer::write(w),
87-
SpiOperation::Transfer(r, w) => SpidevTransfer::read_write(w, r),
88-
SpiOperation::TransferInplace(r) => {
89-
// Clone read to write pointer
90-
// SPIdev is okay with having w == r but this is tricky to achieve in safe rust
91-
let w = unsafe {
92-
let p = r.as_ptr();
93-
std::slice::from_raw_parts(p, r.len())
94-
};
95-
96-
SpidevTransfer::read_write(w, r)
97-
}
98-
}
99-
})
100-
.collect();
101-
102-
// Execute transfer
70+
impl SpiBus<u8> for Spidev {
71+
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
72+
self.0
73+
.transfer(&mut SpidevTransfer::read_write(write, read))
74+
.map_err(|err| SPIError { err })
75+
}
76+
77+
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
78+
let tx = words.to_owned();
10379
self.0
104-
.transfer_multiple(&mut messages)
80+
.transfer(&mut SpidevTransfer::read_write(&tx, words))
10581
.map_err(|err| SPIError { err })
10682
}
10783
}
84+
85+
impl SpiDevice for Spidev {
86+
type Bus = Spidev;
87+
88+
fn transaction<R>(
89+
&mut self,
90+
f: impl FnOnce(&mut Self::Bus) -> Result<R, <Self::Bus as ErrorType>::Error>,
91+
) -> Result<R, Self::Error> {
92+
let result = f(self)?;
93+
self.flush()?;
94+
Ok(result)
95+
}
96+
}
10897
}
10998

11099
/// Error type wrapping [io::Error](io::Error) to implement [embedded_hal::spi::ErrorKind]

0 commit comments

Comments
 (0)