aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Schuhen <[email protected]>2024-03-24 14:15:46 +1000
committerCorey Schuhen <[email protected]>2024-03-28 09:32:13 +1000
commitf5daa50a7baceb44f2aad44bf6ce055bccb08433 (patch)
tree32dedc5154d2876a80071b461290a8b253483f8d
parent41b7e4a434c0d1fe1fc5d93afe76f8058aa411db (diff)
BXCAN: Add struct that combines Buffered RX and Buffered TX.
-rw-r--r--embassy-stm32/src/can/bxcan.rs55
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
241impl<'d, T: Instance> AsMut<crate::can::bx::Can<BxcanInstance<'d, T>>> for Can<'d, T> { 254impl<'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.
262pub 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
267impl<'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.
249pub struct CanTx<'d, T: Instance> { 302pub 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
347pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>; 400pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>;
348 401
349/// CAN driver, transmit half. 402/// Buffered CAN driver, transmit half.
350pub struct BufferedCanTx<'d, T: Instance, const TX_BUF_SIZE: usize> { 403pub 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>,