BXCAN: Add struct that combines Buffered RX and Buffered TX.
This commit is contained in:
parent
41b7e4a434
commit
f5daa50a7b
@ -236,6 +236,19 @@ impl<'d, T: Instance> Can<'d, T> {
|
|||||||
let (tx, rx) = self.can.split_by_ref();
|
let (tx, rx) = self.can.split_by_ref();
|
||||||
(CanTx { tx }, CanRx { rx })
|
(CanTx { tx }, CanRx { rx })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return a buffered instance of driver. User must supply Buffers
|
||||||
|
pub fn buffered<'c, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>(
|
||||||
|
&'c mut self,
|
||||||
|
txb: &'static mut TxBuf<TX_BUF_SIZE>,
|
||||||
|
rxb: &'static mut RxBuf<RX_BUF_SIZE>,
|
||||||
|
) -> BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE> {
|
||||||
|
let (tx, rx) = self.split();
|
||||||
|
BufferedCan {
|
||||||
|
tx: tx.buffered(txb),
|
||||||
|
rx: rx.buffered(rxb),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> AsMut<crate::can::bx::Can<BxcanInstance<'d, T>>> for Can<'d, T> {
|
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<'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Buffered CAN driver.
|
||||||
|
pub struct BufferedCan<'d, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize> {
|
||||||
|
tx: BufferedCanTx<'d, T, TX_BUF_SIZE>,
|
||||||
|
rx: BufferedCanRx<'d, T, RX_BUF_SIZE>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize> BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE> {
|
||||||
|
/// Async write frame to TX buffer.
|
||||||
|
pub async fn write(&mut self, frame: &Frame) {
|
||||||
|
self.tx.write(frame).await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a sender that can be used for sending CAN frames.
|
||||||
|
pub fn writer(&self) -> BufferedCanSender {
|
||||||
|
self.tx.writer()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Async read frame from RX buffer.
|
||||||
|
pub async fn read(&mut self) -> Result<(Frame, Timestamp), BusError> {
|
||||||
|
self.rx.read().await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Attempts to read a CAN frame without blocking.
|
||||||
|
///
|
||||||
|
/// Returns [Err(TryReadError::Empty)] if there are no frames in the rx queue.
|
||||||
|
pub fn try_read(&mut self) -> Result<Envelope, TryReadError> {
|
||||||
|
self.rx.try_read()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Waits while receive queue is empty.
|
||||||
|
pub async fn wait_not_empty(&mut self) {
|
||||||
|
self.rx.wait_not_empty().await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a receiver that can be used for receiving CAN frames. Note, each CAN frame will only be received by one receiver.
|
||||||
|
pub fn reader(&self) -> BufferedCanReceiver {
|
||||||
|
self.rx.reader()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// CAN driver, transmit half.
|
/// CAN driver, transmit half.
|
||||||
pub struct CanTx<'d, T: Instance> {
|
pub struct CanTx<'d, T: Instance> {
|
||||||
tx: crate::can::bx::Tx<BxcanInstance<'d, T>>,
|
tx: crate::can::bx::Tx<BxcanInstance<'d, T>>,
|
||||||
@ -346,7 +399,7 @@ impl<'d, T: Instance> CanTx<'d, T> {
|
|||||||
/// User supplied buffer for TX buffering
|
/// User supplied buffer for TX buffering
|
||||||
pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>;
|
pub type TxBuf<const BUF_SIZE: usize> = Channel<CriticalSectionRawMutex, Frame, BUF_SIZE>;
|
||||||
|
|
||||||
/// CAN driver, transmit half.
|
/// Buffered CAN driver, transmit half.
|
||||||
pub struct BufferedCanTx<'d, T: Instance, const TX_BUF_SIZE: usize> {
|
pub struct BufferedCanTx<'d, T: Instance, const TX_BUF_SIZE: usize> {
|
||||||
_tx: crate::can::bx::Tx<BxcanInstance<'d, T>>,
|
_tx: crate::can::bx::Tx<BxcanInstance<'d, T>>,
|
||||||
tx_buf: &'static TxBuf<TX_BUF_SIZE>,
|
tx_buf: &'static TxBuf<TX_BUF_SIZE>,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user