diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-07-28 23:08:06 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-28 23:08:06 +0000 |
| commit | fcbfd224a729c38d5ff94d94a25321a819254630 (patch) | |
| tree | 92a730930a6ca9529a5109b0d9c0507e6f671501 | |
| parent | eb097b9d03fe906c4ee4cbe0f3eb3dbbe621d56f (diff) | |
| parent | 5a8704b4d8820fe629e9c9d586eb78d165b5f476 (diff) | |
Merge pull request #1706 from mattico/timeouti2c-lifetime
TimeoutI2c: allow ref to live shorter than peripheral
| -rw-r--r-- | embassy-stm32/src/i2c/timeout.rs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/embassy-stm32/src/i2c/timeout.rs b/embassy-stm32/src/i2c/timeout.rs index 939e2750e..8dc228b34 100644 --- a/embassy-stm32/src/i2c/timeout.rs +++ b/embassy-stm32/src/i2c/timeout.rs | |||
| @@ -6,8 +6,8 @@ use super::{Error, I2c, Instance}; | |||
| 6 | /// | 6 | /// |
| 7 | /// This is useful for recovering from a shorted bus or a device stuck in a clock stretching state. | 7 | /// This is useful for recovering from a shorted bus or a device stuck in a clock stretching state. |
| 8 | /// A regular [I2c] would freeze until condition is removed. | 8 | /// A regular [I2c] would freeze until condition is removed. |
| 9 | pub struct TimeoutI2c<'d, T: Instance, TXDMA, RXDMA> { | 9 | pub struct TimeoutI2c<'a, 'd: 'a, T: Instance, TXDMA, RXDMA> { |
| 10 | i2c: &'d mut I2c<'d, T, TXDMA, RXDMA>, | 10 | i2c: &'a mut I2c<'d, T, TXDMA, RXDMA>, |
| 11 | timeout: Duration, | 11 | timeout: Duration, |
| 12 | } | 12 | } |
| 13 | 13 | ||
| @@ -22,8 +22,8 @@ fn timeout_fn(timeout: Duration) -> impl Fn() -> Result<(), Error> { | |||
| 22 | } | 22 | } |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | impl<'d, T: Instance, TXDMA, RXDMA> TimeoutI2c<'d, T, TXDMA, RXDMA> { | 25 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> { |
| 26 | pub fn new(i2c: &'d mut I2c<'d, T, TXDMA, RXDMA>, timeout: Duration) -> Self { | 26 | pub fn new(i2c: &'a mut I2c<'d, T, TXDMA, RXDMA>, timeout: Duration) -> Self { |
| 27 | Self { i2c, timeout } | 27 | Self { i2c, timeout } |
| 28 | } | 28 | } |
| 29 | 29 | ||
| @@ -65,7 +65,7 @@ impl<'d, T: Instance, TXDMA, RXDMA> TimeoutI2c<'d, T, TXDMA, RXDMA> { | |||
| 65 | } | 65 | } |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Read for TimeoutI2c<'d, T, TXDMA, RXDMA> { | 68 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Read for TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> { |
| 69 | type Error = Error; | 69 | type Error = Error; |
| 70 | 70 | ||
| 71 | fn read(&mut self, addr: u8, read: &mut [u8]) -> Result<(), Self::Error> { | 71 | fn read(&mut self, addr: u8, read: &mut [u8]) -> Result<(), Self::Error> { |
| @@ -73,7 +73,7 @@ impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Read for Tim | |||
| 73 | } | 73 | } |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Write for TimeoutI2c<'d, T, TXDMA, RXDMA> { | 76 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Write for TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> { |
| 77 | type Error = Error; | 77 | type Error = Error; |
| 78 | 78 | ||
| 79 | fn write(&mut self, addr: u8, write: &[u8]) -> Result<(), Self::Error> { | 79 | fn write(&mut self, addr: u8, write: &[u8]) -> Result<(), Self::Error> { |
| @@ -81,7 +81,9 @@ impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::Write for Ti | |||
| 81 | } | 81 | } |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::WriteRead for TimeoutI2c<'d, T, TXDMA, RXDMA> { | 84 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::WriteRead |
| 85 | for TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> | ||
| 86 | { | ||
| 85 | type Error = Error; | 87 | type Error = Error; |
| 86 | 88 | ||
| 87 | fn write_read(&mut self, addr: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | 89 | fn write_read(&mut self, addr: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { |
| @@ -93,11 +95,11 @@ impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_02::blocking::i2c::WriteRead fo | |||
| 93 | mod eh1 { | 95 | mod eh1 { |
| 94 | use super::*; | 96 | use super::*; |
| 95 | 97 | ||
| 96 | impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_1::i2c::ErrorType for TimeoutI2c<'d, T, TXDMA, RXDMA> { | 98 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> embedded_hal_1::i2c::ErrorType for TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> { |
| 97 | type Error = Error; | 99 | type Error = Error; |
| 98 | } | 100 | } |
| 99 | 101 | ||
| 100 | impl<'d, T: Instance, TXDMA, RXDMA> embedded_hal_1::i2c::I2c for TimeoutI2c<'d, T, TXDMA, RXDMA> { | 102 | impl<'a, 'd, T: Instance, TXDMA, RXDMA> embedded_hal_1::i2c::I2c for TimeoutI2c<'a, 'd, T, TXDMA, RXDMA> { |
| 101 | fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { | 103 | fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { |
| 102 | self.blocking_read(address, read) | 104 | self.blocking_read(address, read) |
| 103 | } | 105 | } |
