Switch to async-fn-in-trait
This commit is contained in:
		@@ -22,7 +22,6 @@
 | 
			
		||||
//! let i2c_dev2 = I2cDevice::new(i2c_bus);
 | 
			
		||||
//! let mpu = Mpu6050::new(i2c_dev2);
 | 
			
		||||
//! ```
 | 
			
		||||
use core::future::Future;
 | 
			
		||||
 | 
			
		||||
use embassy_sync::blocking_mutex::raw::RawMutex;
 | 
			
		||||
use embassy_sync::mutex::Mutex;
 | 
			
		||||
@@ -55,53 +54,39 @@ 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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    async fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.read(address, buffer).await.map_err(I2cDeviceError::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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    async fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.write(address, bytes).await.map_err(I2cDeviceError::I2c)?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
 | 
			
		||||
 | 
			
		||||
    fn write_read<'a>(
 | 
			
		||||
    async 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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    ) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.write_read(address, wr_buffer, rd_buffer)
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(I2cDeviceError::I2c)?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
 | 
			
		||||
 | 
			
		||||
    fn transaction<'a, 'b>(
 | 
			
		||||
    async fn transaction<'a, 'b>(
 | 
			
		||||
        &'a mut self,
 | 
			
		||||
        address: u8,
 | 
			
		||||
        operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
 | 
			
		||||
    ) -> Self::TransactionFuture<'a, 'b> {
 | 
			
		||||
    ) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let _ = address;
 | 
			
		||||
        let _ = operations;
 | 
			
		||||
        async move { todo!() }
 | 
			
		||||
        todo!()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -136,55 +121,41 @@ 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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    async fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.set_config(&self.config);
 | 
			
		||||
        bus.read(address, buffer).await.map_err(I2cDeviceError::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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    async fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.set_config(&self.config);
 | 
			
		||||
        bus.write(address, bytes).await.map_err(I2cDeviceError::I2c)?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
 | 
			
		||||
 | 
			
		||||
    fn write_read<'a>(
 | 
			
		||||
    async 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(I2cDeviceError::I2c)?;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        }
 | 
			
		||||
    ) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.set_config(&self.config);
 | 
			
		||||
        bus.write_read(address, wr_buffer, rd_buffer)
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(I2cDeviceError::I2c)?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
 | 
			
		||||
 | 
			
		||||
    fn transaction<'a, 'b>(
 | 
			
		||||
    async fn transaction<'a, 'b>(
 | 
			
		||||
        &'a mut self,
 | 
			
		||||
        address: u8,
 | 
			
		||||
        operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
 | 
			
		||||
    ) -> Self::TransactionFuture<'a, 'b> {
 | 
			
		||||
    ) -> Result<(), I2cDeviceError<BUS::Error>> {
 | 
			
		||||
        let _ = address;
 | 
			
		||||
        let _ = operations;
 | 
			
		||||
        async move { todo!() }
 | 
			
		||||
        todo!()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -65,33 +65,25 @@ where
 | 
			
		||||
{
 | 
			
		||||
    type Bus = BUS;
 | 
			
		||||
 | 
			
		||||
    type TransactionFuture<'a, R, F, Fut> = impl Future<Output = Result<R, Self::Error>> + 'a
 | 
			
		||||
    async fn transaction<R, F, Fut>(&mut self, f: F) -> Result<R, Self::Error>
 | 
			
		||||
    where
 | 
			
		||||
        Self: 'a, R: 'a, F: FnOnce(*mut Self::Bus) -> Fut + 'a,
 | 
			
		||||
        Fut: Future<Output =  Result<R, <Self::Bus as ErrorType>::Error>> + 'a;
 | 
			
		||||
 | 
			
		||||
    fn transaction<'a, R, F, Fut>(&'a mut self, f: F) -> Self::TransactionFuture<'a, R, F, Fut>
 | 
			
		||||
    where
 | 
			
		||||
        R: 'a,
 | 
			
		||||
        F: FnOnce(*mut Self::Bus) -> Fut + 'a,
 | 
			
		||||
        Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>> + 'a,
 | 
			
		||||
        F: FnOnce(*mut Self::Bus) -> Fut,
 | 
			
		||||
        Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>>,
 | 
			
		||||
    {
 | 
			
		||||
        async move {
 | 
			
		||||
            let mut bus = self.bus.lock().await;
 | 
			
		||||
            self.cs.set_low().map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        self.cs.set_low().map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
 | 
			
		||||
            let f_res = f(&mut *bus).await;
 | 
			
		||||
        let f_res = f(&mut *bus).await;
 | 
			
		||||
 | 
			
		||||
            // On failure, it's important to still flush and deassert CS.
 | 
			
		||||
            let flush_res = bus.flush().await;
 | 
			
		||||
            let cs_res = self.cs.set_high();
 | 
			
		||||
        // On failure, it's important to still flush and deassert CS.
 | 
			
		||||
        let flush_res = bus.flush().await;
 | 
			
		||||
        let cs_res = self.cs.set_high();
 | 
			
		||||
 | 
			
		||||
            let f_res = f_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
            flush_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
            cs_res.map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
        let f_res = f_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
        flush_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
        cs_res.map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
 | 
			
		||||
            Ok(f_res)
 | 
			
		||||
        }
 | 
			
		||||
        Ok(f_res)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -130,33 +122,25 @@ where
 | 
			
		||||
{
 | 
			
		||||
    type Bus = BUS;
 | 
			
		||||
 | 
			
		||||
    type TransactionFuture<'a, R, F, Fut> = impl Future<Output = Result<R, Self::Error>> + 'a
 | 
			
		||||
    async fn transaction<R, F, Fut>(&mut self, f: F) -> Result<R, Self::Error>
 | 
			
		||||
    where
 | 
			
		||||
        Self: 'a, R: 'a, F: FnOnce(*mut Self::Bus) -> Fut + 'a,
 | 
			
		||||
        Fut: Future<Output =  Result<R, <Self::Bus as ErrorType>::Error>> + 'a;
 | 
			
		||||
 | 
			
		||||
    fn transaction<'a, R, F, Fut>(&'a mut self, f: F) -> Self::TransactionFuture<'a, R, F, Fut>
 | 
			
		||||
    where
 | 
			
		||||
        R: 'a,
 | 
			
		||||
        F: FnOnce(*mut Self::Bus) -> Fut + 'a,
 | 
			
		||||
        Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>> + 'a,
 | 
			
		||||
        F: FnOnce(*mut Self::Bus) -> Fut,
 | 
			
		||||
        Fut: Future<Output = Result<R, <Self::Bus as ErrorType>::Error>>,
 | 
			
		||||
    {
 | 
			
		||||
        async move {
 | 
			
		||||
            let mut bus = self.bus.lock().await;
 | 
			
		||||
            bus.set_config(&self.config);
 | 
			
		||||
            self.cs.set_low().map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
        let mut bus = self.bus.lock().await;
 | 
			
		||||
        bus.set_config(&self.config);
 | 
			
		||||
        self.cs.set_low().map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
 | 
			
		||||
            let f_res = f(&mut *bus).await;
 | 
			
		||||
        let f_res = f(&mut *bus).await;
 | 
			
		||||
 | 
			
		||||
            // On failure, it's important to still flush and deassert CS.
 | 
			
		||||
            let flush_res = bus.flush().await;
 | 
			
		||||
            let cs_res = self.cs.set_high();
 | 
			
		||||
        // On failure, it's important to still flush and deassert CS.
 | 
			
		||||
        let flush_res = bus.flush().await;
 | 
			
		||||
        let cs_res = self.cs.set_high();
 | 
			
		||||
 | 
			
		||||
            let f_res = f_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
            flush_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
            cs_res.map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
        let f_res = f_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
        flush_res.map_err(SpiDeviceError::Spi)?;
 | 
			
		||||
        cs_res.map_err(SpiDeviceError::Cs)?;
 | 
			
		||||
 | 
			
		||||
            Ok(f_res)
 | 
			
		||||
        }
 | 
			
		||||
        Ok(f_res)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user