diff options
author | Henrik Alsér <henrik@mindbite.se> | 2022-07-10 00:05:57 +0200 |
---|---|---|
committer | Henrik Alsér <henrik@mindbite.se> | 2022-07-10 00:05:57 +0200 |
commit | ef24faf2df594d0eca1542ac02834af6aafa3853 (patch) | |
tree | 6092b31b84be58e3c54b5bddef12bded57d69e2a /embassy-embedded-hal/src/shared_bus/i2c.rs | |
parent | 20f56b856feb3cefde300b76ceab85b6bd29c5a7 (diff) | |
download | embassy-ef24faf2df594d0eca1542ac02834af6aafa3853.zip |
Add asynch mod to shared_bus
Diffstat (limited to 'embassy-embedded-hal/src/shared_bus/i2c.rs')
-rw-r--r-- | embassy-embedded-hal/src/shared_bus/i2c.rs | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/embassy-embedded-hal/src/shared_bus/i2c.rs b/embassy-embedded-hal/src/shared_bus/i2c.rs deleted file mode 100644 index f63190e6..00000000 --- a/embassy-embedded-hal/src/shared_bus/i2c.rs +++ /dev/null @@ -1,201 +0,0 @@ -//! Asynchronous shared I2C bus -//! -//! # Example (nrf52) -//! -//! ```rust -//! use embassy_embedded_hal::shared_bus::i2c::I2cBusDevice; -//! use embassy::mutex::Mutex; -//! use embassy::blocking_mutex::raw::ThreadModeRawMutex; -//! -//! static I2C_BUS: Forever<Mutex::<ThreadModeRawMutex, Twim<TWISPI0>>> = Forever::new(); -//! let config = twim::Config::default(); -//! let irq = interrupt::take!(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0); -//! let i2c = Twim::new(p.TWISPI0, irq, p.P0_03, p.P0_04, config); -//! let i2c_bus = Mutex::<ThreadModeRawMutex, _>::new(i2c); -//! let i2c_bus = I2C_BUS.put(i2c_bus); -//! -//! // Device 1, using embedded-hal-async compatible driver for QMC5883L compass -//! let i2c_dev1 = I2cBusDevice::new(i2c_bus); -//! let compass = QMC5883L::new(i2c_dev1).await.unwrap(); -//! -//! // Device 2, using embedded-hal-async compatible driver for Mpu6050 accelerometer -//! let i2c_dev2 = I2cBusDevice::new(i2c_bus); -//! let mpu = Mpu6050::new(i2c_dev2); -//! ``` -use core::fmt::Debug; -use core::future::Future; - -use embassy::blocking_mutex::raw::RawMutex; -use embassy::mutex::Mutex; -#[cfg(feature = "nightly")] -use embedded_hal_async::i2c; - -use crate::SetConfig; - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -pub enum I2cBusDeviceError<BUS> { - I2c(BUS), -} - -impl<BUS> i2c::Error for I2cBusDeviceError<BUS> -where - BUS: i2c::Error + Debug, -{ - fn kind(&self) -> i2c::ErrorKind { - match self { - Self::I2c(e) => e.kind(), - } - } -} - -pub struct I2cBusDevice<'a, M: RawMutex, BUS> { - bus: &'a Mutex<M, BUS>, -} - -impl<'a, M: RawMutex, BUS> I2cBusDevice<'a, M, BUS> { - pub fn new(bus: &'a Mutex<M, BUS>) -> Self { - Self { bus } - } -} - -impl<'a, M: RawMutex, BUS> i2c::ErrorType for I2cBusDevice<'a, M, BUS> -where - BUS: i2c::ErrorType, -{ - type Error = I2cBusDeviceError<BUS::Error>; -} - -#[cfg(feature = "nightly")] -impl<M, BUS> i2c::I2c for I2cBusDevice<'_, M, BUS> -where - M: RawMutex + 'static, - BUS: i2c::I2c + 'static, -{ - type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.read(address, buffer).await.map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.write(address, bytes).await.map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn write_read<'a>( - &'a mut self, - address: u8, - wr_buffer: &'a [u8], - rd_buffer: &'a mut [u8], - ) -> Self::WriteReadFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.write_read(address, wr_buffer, rd_buffer) - .await - .map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a; - - fn transaction<'a, 'b>( - &'a mut self, - address: u8, - operations: &'a mut [embedded_hal_async::i2c::Operation<'b>], - ) -> Self::TransactionFuture<'a, 'b> { - let _ = address; - let _ = operations; - async move { todo!() } - } -} - -pub struct I2cBusDeviceWithConfig<'a, M: RawMutex, BUS: SetConfig> { - bus: &'a Mutex<M, BUS>, - config: BUS::Config, -} - -impl<'a, M: RawMutex, BUS: SetConfig> I2cBusDeviceWithConfig<'a, M, BUS> { - pub fn new(bus: &'a Mutex<M, BUS>, config: BUS::Config) -> Self { - Self { bus, config } - } -} - -impl<'a, M, BUS> i2c::ErrorType for I2cBusDeviceWithConfig<'a, M, BUS> -where - BUS: i2c::ErrorType, - M: RawMutex, - BUS: SetConfig, -{ - type Error = I2cBusDeviceError<BUS::Error>; -} - -#[cfg(feature = "nightly")] -impl<M, BUS> i2c::I2c for I2cBusDeviceWithConfig<'_, M, BUS> -where - M: RawMutex + 'static, - BUS: i2c::I2c + SetConfig + 'static, -{ - type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.set_config(&self.config); - bus.read(address, buffer).await.map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.set_config(&self.config); - bus.write(address, bytes).await.map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; - - fn write_read<'a>( - &'a mut self, - address: u8, - wr_buffer: &'a [u8], - rd_buffer: &'a mut [u8], - ) -> Self::WriteReadFuture<'a> { - async move { - let mut bus = self.bus.lock().await; - bus.set_config(&self.config); - bus.write_read(address, wr_buffer, rd_buffer) - .await - .map_err(I2cBusDeviceError::I2c)?; - Ok(()) - } - } - - type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a; - - fn transaction<'a, 'b>( - &'a mut self, - address: u8, - operations: &'a mut [embedded_hal_async::i2c::Operation<'b>], - ) -> Self::TransactionFuture<'a, 'b> { - let _ = address; - let _ = operations; - async move { todo!() } - } -} |