diff options
| -rw-r--r-- | embassy-stm32/src/can/bxcan.rs | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/embassy-stm32/src/can/bxcan.rs b/embassy-stm32/src/can/bxcan.rs index 45a3836c0..be2e34963 100644 --- a/embassy-stm32/src/can/bxcan.rs +++ b/embassy-stm32/src/can/bxcan.rs | |||
| @@ -236,6 +236,19 @@ impl<'d, T: Instance> Can<'d, T> { | |||
| 236 | let (tx, rx) = self.can.split_by_ref(); | 236 | let (tx, rx) = self.can.split_by_ref(); |
| 237 | (CanTx { tx }, CanRx { rx }) | 237 | (CanTx { tx }, CanRx { rx }) |
| 238 | } | 238 | } |
| 239 | |||
| 240 | /// Return a buffered instance of driver. User must supply Buffers | ||
| 241 | pub fn buffered<'c, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>( | ||
| 242 | &'c mut self, | ||
| 243 | txb: &'static mut TxBuf<TX_BUF_SIZE>, | ||
| 244 | rxb: &'static mut RxBuf<RX_BUF_SIZE>, | ||
| 245 | ) -> BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE> { | ||
| 246 | let (tx, rx) = self.split(); | ||
| 247 | BufferedCan { | ||
| 248 | tx: tx.buffered(txb), | ||
| 249 | rx: rx.buffered(rxb), | ||
| 250 | } | ||
| 251 | } | ||
| 239 | } | 252 | } |
| 240 | 253 | ||
| 241 | impl<'d, T: Instance> AsMut<crate::can::bx::Can<BxcanInstance<'d, T>>> for Can<'d, T> { | 254 | impl<'d, T: Instance> AsMut<crate::can::bx::Can<BxcanInstance<'d, T>>> for Can<'d, T> { |
| @@ -245,6 +258,46 @@ impl<'d, T: Instance> AsMut<crate::can::bx::Can<BxcanInstance<'d, T>>> for Can<' | |||
| 245 | } | 258 | } |
| 246 | } | 259 | } |
| 247 | 260 | ||
| 261 | /// Buffered CAN driver. | ||
| 262 | pub struct BufferedCan<'d, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize> { | ||
| 263 | tx: BufferedCanTx<'d, T, TX_BUF_SIZE>, | ||
| 264 | rx: BufferedCanRx<'d, T, RX_BUF_SIZE>, | ||
| 265 | } | ||
| 266 | |||
| 267 | impl<'d, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize> BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE> { | ||
| 268 | /// Async write frame to TX buffer. | ||
| 269 | pub async fn write(&mut self, frame: &Frame) { | ||
| 270 | self.tx.write(frame).await | ||
| 271 | } | ||
| 272 | |||
| 273 | /// Returns a sender that can be used for sending CAN frames. | ||
| 274 | pub fn writer(&self) -> BufferedCanSender { | ||
| 275 | self.tx.writer() | ||
| 276 | } | ||
| 277 | |||
| 278 | /// Async read frame from RX buffer. | ||
| 279 | pub async fn read(&mut self) -> Result<(Frame, Timestamp), BusError> { | ||
| 280 | self.rx.read().await | ||
| 281 | } | ||
| 282 | |||
| 283 | /// Attempts to read a CAN frame without blocking. | ||
| 284 | /// | ||
| 285 | /// Returns [Err(TryReadError::Empty)] if there are no frames in the rx queue. | ||
| 286 | pub fn try_read(&mut self) -> Result<Envelope, TryReadError> { | ||
| 287 | self.rx.try_read() | ||
| 288 | } | ||
| 289 | |||
| 290 | /// Waits while receive queue is empty. | ||
| 291 | pub async fn wait_not_empty(&mut self) { | ||
| 292 | self.rx.wait_not_empty().await | ||
| 293 | } | ||
| 294 | |||
| 295 | /// Returns a receiver that can be used for receiving CAN frames. Note, each CAN frame will only be received by one receiver. | ||
| 296 | pub fn reader(&self) -> BufferedCanReceiver { | ||
| 297 | self.rx.reader() | ||
| 298 | } | ||
| 299 | } | ||
| 300 | |||
| 248 | /// CAN driver, transmit half. | 301 | /// CAN driver, transmit half. |
| 249 | pub struct CanTx<'d, T: Instance> { | 302 | pub struct CanTx<'d, T: Instance> { |
| 250 | tx: crate::can::bx::Tx<BxcanInstance<'d, T>>, | 303 | tx: crate::can::bx::Tx<BxcanInstance<'d, T>>, |
| @@ -346,7 +399,7 @@ impl<'d, T: Instance> CanTx<'d, T> { | |||
| 346 | /// User supplied buffer for TX buffering | 399 | /// User supplied buffer for TX buffering |
| 347 | pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>; | 400 | pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>; |
| 348 | 401 | ||
| 349 | /// CAN driver, transmit half. | 402 | /// Buffered CAN driver, transmit half. |
| 350 | pub struct BufferedCanTx<'d, T: Instance, const TX_BUF_SIZE: usize> { | 403 | pub struct BufferedCanTx<'d, T: Instance, const TX_BUF_SIZE: usize> { |
| 351 | _tx: crate::can::bx::Tx<BxcanInstance<'d, T>>, | 404 | _tx: crate::can::bx::Tx<BxcanInstance<'d, T>>, |
| 352 | tx_buf: &'static TxBuf<TX_BUF_SIZE>, | 405 | tx_buf: &'static TxBuf<TX_BUF_SIZE>, |
