CAN: Move some FDCAN definitions into a module to share with BXCAN.
This commit is contained in:
parent
8f6c07c775
commit
fcfcfce400
2 changed files with 61 additions and 52 deletions
51
embassy-stm32/src/can/common.rs
Normal file
51
embassy-stm32/src/can/common.rs
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
use embassy_sync::channel::{DynamicReceiver, DynamicSender};
|
||||||
|
|
||||||
|
use crate::can::_version::frame::*;
|
||||||
|
use crate::can::_version::Timestamp;
|
||||||
|
use crate::can::_version::enums::*;
|
||||||
|
|
||||||
|
pub(crate) struct ClassicBufferedRxInner {
|
||||||
|
pub rx_sender: DynamicSender<'static, Result<(ClassicFrame, Timestamp), BusError>>,
|
||||||
|
}
|
||||||
|
pub(crate) struct ClassicBufferedTxInner {
|
||||||
|
pub tx_receiver: DynamicReceiver<'static, ClassicFrame>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) struct FdBufferedRxInner {
|
||||||
|
pub rx_sender: DynamicSender<'static, Result<(FdFrame, Timestamp), BusError>>,
|
||||||
|
}
|
||||||
|
pub(crate) struct FdBufferedTxInner {
|
||||||
|
pub tx_receiver: DynamicReceiver<'static, FdFrame>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sender that can be used for sending CAN frames.
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct BufferedCanSender {
|
||||||
|
pub(crate) tx_buf: embassy_sync::channel::DynamicSender<'static, ClassicFrame>,
|
||||||
|
pub(crate) waker: fn(),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BufferedCanSender {
|
||||||
|
/// Async write frame to TX buffer.
|
||||||
|
pub fn try_write(&mut self, frame: ClassicFrame) -> Result<(), embassy_sync::channel::TrySendError<ClassicFrame>> {
|
||||||
|
self.tx_buf.try_send(frame)?;
|
||||||
|
(self.waker)();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Async write frame to TX buffer.
|
||||||
|
pub async fn write(&mut self, frame: ClassicFrame) {
|
||||||
|
self.tx_buf.send(frame).await;
|
||||||
|
(self.waker)();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allows a poll_fn to poll until the channel is ready to write
|
||||||
|
pub fn poll_ready_to_send(&self, cx: &mut core::task::Context<'_>) -> core::task::Poll<()> {
|
||||||
|
self.tx_buf.poll_ready_to_send(cx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Receiver that can be used for receiving CAN frames. Note, each CAN frame will only be received by one receiver.
|
||||||
|
pub type BufferedCanReceiver =
|
||||||
|
embassy_sync::channel::DynamicReceiver<'static, Result<(ClassicFrame, Timestamp), BusError>>;
|
||||||
|
|
|
@ -14,6 +14,7 @@ use crate::interrupt::typelevel::Interrupt;
|
||||||
use crate::rcc::RccPeripheral;
|
use crate::rcc::RccPeripheral;
|
||||||
use crate::{interrupt, peripherals, Peripheral};
|
use crate::{interrupt, peripherals, Peripheral};
|
||||||
|
|
||||||
|
mod common;
|
||||||
pub mod enums;
|
pub mod enums;
|
||||||
pub(crate) mod fd;
|
pub(crate) mod fd;
|
||||||
pub mod frame;
|
pub mod frame;
|
||||||
|
@ -24,6 +25,7 @@ use fd::config::*;
|
||||||
use fd::filter::*;
|
use fd::filter::*;
|
||||||
pub use fd::{config, filter};
|
pub use fd::{config, filter};
|
||||||
use frame::*;
|
use frame::*;
|
||||||
|
pub use self::common::{BufferedCanSender, BufferedCanReceiver};
|
||||||
|
|
||||||
/// Timestamp for incoming packets. Use Embassy time when enabled.
|
/// Timestamp for incoming packets. Use Embassy time when enabled.
|
||||||
#[cfg(feature = "time")]
|
#[cfg(feature = "time")]
|
||||||
|
@ -414,36 +416,6 @@ pub struct BufferedCan<'d, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_S
|
||||||
rx_buf: &'static RxBuf<RX_BUF_SIZE>,
|
rx_buf: &'static RxBuf<RX_BUF_SIZE>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sender that can be used for sending CAN frames.
|
|
||||||
#[derive(Copy, Clone)]
|
|
||||||
pub struct BufferedCanSender {
|
|
||||||
tx_buf: embassy_sync::channel::DynamicSender<'static, ClassicFrame>,
|
|
||||||
waker: fn(),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BufferedCanSender {
|
|
||||||
/// Async write frame to TX buffer.
|
|
||||||
pub fn try_write(&mut self, frame: ClassicFrame) -> Result<(), embassy_sync::channel::TrySendError<ClassicFrame>> {
|
|
||||||
self.tx_buf.try_send(frame)?;
|
|
||||||
(self.waker)();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Async write frame to TX buffer.
|
|
||||||
pub async fn write(&mut self, frame: ClassicFrame) {
|
|
||||||
self.tx_buf.send(frame).await;
|
|
||||||
(self.waker)();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Allows a poll_fn to poll until the channel is ready to write
|
|
||||||
pub fn poll_ready_to_send(&self, cx: &mut core::task::Context<'_>) -> core::task::Poll<()> {
|
|
||||||
self.tx_buf.poll_ready_to_send(cx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Receiver that can be used for receiving CAN frames. Note, each CAN frame will only be received by one receiver.
|
|
||||||
pub type BufferedCanReceiver =
|
|
||||||
embassy_sync::channel::DynamicReceiver<'static, Result<(ClassicFrame, Timestamp), BusError>>;
|
|
||||||
|
|
||||||
impl<'c, 'd, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>
|
impl<'c, 'd, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>
|
||||||
BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE>
|
BufferedCan<'d, T, TX_BUF_SIZE, RX_BUF_SIZE>
|
||||||
|
@ -468,10 +440,10 @@ impl<'c, 'd, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>
|
||||||
fn setup(self) -> Self {
|
fn setup(self) -> Self {
|
||||||
// We don't want interrupts being processed while we change modes.
|
// We don't want interrupts being processed while we change modes.
|
||||||
critical_section::with(|_| unsafe {
|
critical_section::with(|_| unsafe {
|
||||||
let rx_inner = ClassicBufferedRxInner {
|
let rx_inner = self::common::ClassicBufferedRxInner {
|
||||||
rx_sender: self.rx_buf.sender().into(),
|
rx_sender: self.rx_buf.sender().into(),
|
||||||
};
|
};
|
||||||
let tx_inner = ClassicBufferedTxInner {
|
let tx_inner = self::common::ClassicBufferedTxInner {
|
||||||
tx_receiver: self.tx_buf.receiver().into(),
|
tx_receiver: self.tx_buf.receiver().into(),
|
||||||
};
|
};
|
||||||
T::mut_state().rx_mode = RxMode::ClassicBuffered(rx_inner);
|
T::mut_state().rx_mode = RxMode::ClassicBuffered(rx_inner);
|
||||||
|
@ -586,10 +558,10 @@ impl<'c, 'd, T: Instance, const TX_BUF_SIZE: usize, const RX_BUF_SIZE: usize>
|
||||||
fn setup(self) -> Self {
|
fn setup(self) -> Self {
|
||||||
// We don't want interrupts being processed while we change modes.
|
// We don't want interrupts being processed while we change modes.
|
||||||
critical_section::with(|_| unsafe {
|
critical_section::with(|_| unsafe {
|
||||||
let rx_inner = FdBufferedRxInner {
|
let rx_inner = self::common::FdBufferedRxInner {
|
||||||
rx_sender: self.rx_buf.sender().into(),
|
rx_sender: self.rx_buf.sender().into(),
|
||||||
};
|
};
|
||||||
let tx_inner = FdBufferedTxInner {
|
let tx_inner = self::common::FdBufferedTxInner {
|
||||||
tx_receiver: self.tx_buf.receiver().into(),
|
tx_receiver: self.tx_buf.receiver().into(),
|
||||||
};
|
};
|
||||||
T::mut_state().rx_mode = RxMode::FdBuffered(rx_inner);
|
T::mut_state().rx_mode = RxMode::FdBuffered(rx_inner);
|
||||||
|
@ -678,24 +650,10 @@ impl<'c, 'd, T: Instance> FdcanRx<'d, T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ClassicBufferedRxInner {
|
|
||||||
rx_sender: DynamicSender<'static, Result<(ClassicFrame, Timestamp), BusError>>,
|
|
||||||
}
|
|
||||||
struct ClassicBufferedTxInner {
|
|
||||||
tx_receiver: DynamicReceiver<'static, ClassicFrame>,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FdBufferedRxInner {
|
|
||||||
rx_sender: DynamicSender<'static, Result<(FdFrame, Timestamp), BusError>>,
|
|
||||||
}
|
|
||||||
struct FdBufferedTxInner {
|
|
||||||
tx_receiver: DynamicReceiver<'static, FdFrame>,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum RxMode {
|
enum RxMode {
|
||||||
NonBuffered(AtomicWaker),
|
NonBuffered(AtomicWaker),
|
||||||
ClassicBuffered(ClassicBufferedRxInner),
|
ClassicBuffered(self::common::ClassicBufferedRxInner),
|
||||||
FdBuffered(FdBufferedRxInner),
|
FdBuffered(self::common::FdBufferedRxInner),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RxMode {
|
impl RxMode {
|
||||||
|
@ -765,8 +723,8 @@ impl RxMode {
|
||||||
|
|
||||||
enum TxMode {
|
enum TxMode {
|
||||||
NonBuffered(AtomicWaker),
|
NonBuffered(AtomicWaker),
|
||||||
ClassicBuffered(ClassicBufferedTxInner),
|
ClassicBuffered(self::common::ClassicBufferedTxInner),
|
||||||
FdBuffered(FdBufferedTxInner),
|
FdBuffered(self::common::FdBufferedTxInner),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TxMode {
|
impl TxMode {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue