From 1a386606c4810389879d39e42b6405cddab4746c Mon Sep 17 00:00:00 2001 From: Diego Barrios Romero Date: Sat, 9 Nov 2019 14:14:54 +0100 Subject: [PATCH 1/4] Use transactional read-write --- src/lib.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3347b61..74f871f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,8 @@ use std::time::Duration; use std::{ops, thread}; use cast::{u32, u64}; -use i2cdev::core::I2CDevice; +use i2cdev::core::{I2CDevice, I2CMessage, I2CTransfer}; +use i2cdev::linux::LinuxI2CMessage; use spidev::SpidevTransfer; mod serial; @@ -219,8 +220,11 @@ impl hal::blocking::i2c::WriteRead for I2cdev { buffer: &mut [u8], ) -> Result<(), Self::Error> { self.set_address(address)?; - self.inner.write(bytes)?; - self.inner.read(buffer) + let mut messages = [ + LinuxI2CMessage::write(bytes), + LinuxI2CMessage::read(buffer), + ]; + self.inner.transfer(&mut messages).map(drop) } } From 20fc71422523bbda0ca9f70da35632b28af6cb67 Mon Sep 17 00:00:00 2001 From: Diego Barrios Romero Date: Mon, 25 Nov 2019 08:10:38 +0100 Subject: [PATCH 2/4] Update i2cdev --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1066fd4..2dfb830 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ version = "0.2.2" [dependencies] embedded-hal = { version = "0.2.0", features = ["unproven"] } -i2cdev = "0.4" +i2cdev = "0.4.3" spidev = "0.4" sysfs_gpio = "0.5" serial-unix = "0.4.0" From ec10dcb208c95a7d0c2e8b7a70bdf3f1ce3e361d Mon Sep 17 00:00:00 2001 From: Diego Barrios Romero Date: Mon, 25 Nov 2019 08:11:27 +0100 Subject: [PATCH 3/4] Improve casting --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 74f871f..e999faf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -185,7 +185,7 @@ impl I2cdev { fn set_address(&mut self, address: u8) -> Result<(), i2cdev::linux::LinuxI2CError> { if self.address != Some(address) { - self.inner = i2cdev::linux::LinuxI2CDevice::new(&self.path, address as u16)?; + self.inner = i2cdev::linux::LinuxI2CDevice::new(&self.path, u16::from(address))?; self.address = Some(address); } Ok(()) From 7cd65d641f4a609b0ebc7f446b30db3d824b7a58 Mon Sep 17 00:00:00 2001 From: Diego Barrios Romero Date: Mon, 25 Nov 2019 08:28:43 +0100 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b13daf8..2ab1d5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed + +- Do write and read in one transaction in WriteRead implementation. + +### Changed + +- updated to i2cdev 0.4.3 (necessary for trasactional write-read). + ## [v0.2.2] - 2018-12-21 ### Changed