diff options
| -rw-r--r-- | embassy-stm32/src/can/bx/mod.rs | 13 | ||||
| -rw-r--r-- | embassy-stm32/src/can/frame.rs | 19 |
2 files changed, 20 insertions, 12 deletions
diff --git a/embassy-stm32/src/can/bx/mod.rs b/embassy-stm32/src/can/bx/mod.rs index 253bcee13..cb83799d3 100644 --- a/embassy-stm32/src/can/bx/mod.rs +++ b/embassy-stm32/src/can/bx/mod.rs | |||
| @@ -622,17 +622,18 @@ impl Registers { | |||
| 622 | let id = (stid << 18) | (exid); | 622 | let id = (stid << 18) | (exid); |
| 623 | embedded_can::ExtendedId::new(id).unwrap().into() | 623 | embedded_can::ExtendedId::new(id).unwrap().into() |
| 624 | }; | 624 | }; |
| 625 | let data_len = fifo.rdtr().read().dlc(); | 625 | let rdtr = fifo.rdtr().read(); |
| 626 | let data_len = rdtr.dlc(); | ||
| 627 | |||
| 628 | #[cfg(not(feature = "time"))] | ||
| 629 | let ts = rdtr.time(); | ||
| 630 | |||
| 626 | let mut data: [u8; 8] = [0; 8]; | 631 | let mut data: [u8; 8] = [0; 8]; |
| 627 | data[0..4].copy_from_slice(&fifo.rdlr().read().0.to_ne_bytes()); | 632 | data[0..4].copy_from_slice(&fifo.rdlr().read().0.to_ne_bytes()); |
| 628 | data[4..8].copy_from_slice(&fifo.rdhr().read().0.to_ne_bytes()); | 633 | data[4..8].copy_from_slice(&fifo.rdhr().read().0.to_ne_bytes()); |
| 629 | 634 | ||
| 630 | let frame = Frame::new(Header::new(id, data_len, false), &data).unwrap(); | 635 | let frame = Frame::new(Header::new(id, data_len, false), &data).unwrap(); |
| 631 | let envelope = Envelope { | 636 | let envelope = Envelope { ts, frame }; |
| 632 | #[cfg(feature = "time")] | ||
| 633 | ts, | ||
| 634 | frame, | ||
| 635 | }; | ||
| 636 | 637 | ||
| 637 | rfr.modify(|v| v.set_rfom(true)); | 638 | rfr.modify(|v| v.set_rfom(true)); |
| 638 | 639 | ||
diff --git a/embassy-stm32/src/can/frame.rs b/embassy-stm32/src/can/frame.rs index fb032aee2..d2d1f7aa6 100644 --- a/embassy-stm32/src/can/frame.rs +++ b/embassy-stm32/src/can/frame.rs | |||
| @@ -3,6 +3,14 @@ use bit_field::BitField; | |||
| 3 | 3 | ||
| 4 | use crate::can::enums::FrameCreateError; | 4 | use crate::can::enums::FrameCreateError; |
| 5 | 5 | ||
| 6 | /// Calculate proper timestamp when available. | ||
| 7 | #[cfg(feature = "time")] | ||
| 8 | pub type Timestamp = embassy_time::Instant; | ||
| 9 | |||
| 10 | /// Raw register timestamp | ||
| 11 | #[cfg(not(feature = "time"))] | ||
| 12 | pub type Timestamp = u16; | ||
| 13 | |||
| 6 | /// CAN Header, without meta data | 14 | /// CAN Header, without meta data |
| 7 | #[derive(Debug, Copy, Clone)] | 15 | #[derive(Debug, Copy, Clone)] |
| 8 | pub struct Header { | 16 | pub struct Header { |
| @@ -264,15 +272,14 @@ impl CanHeader for Frame { | |||
| 264 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 272 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 265 | pub struct Envelope { | 273 | pub struct Envelope { |
| 266 | /// Reception time. | 274 | /// Reception time. |
| 267 | #[cfg(feature = "time")] | 275 | pub ts: Timestamp, |
| 268 | pub ts: embassy_time::Instant, | ||
| 269 | /// The actual CAN frame. | 276 | /// The actual CAN frame. |
| 270 | pub frame: Frame, | 277 | pub frame: Frame, |
| 271 | } | 278 | } |
| 272 | 279 | ||
| 273 | impl Envelope { | 280 | impl Envelope { |
| 274 | /// Convert into a tuple | 281 | /// Convert into a tuple |
| 275 | pub fn parts(self) -> (Frame, embassy_time::Instant) { | 282 | pub fn parts(self) -> (Frame, Timestamp) { |
| 276 | (self.frame, self.ts) | 283 | (self.frame, self.ts) |
| 277 | } | 284 | } |
| 278 | } | 285 | } |
| @@ -442,15 +449,15 @@ impl CanHeader for FdFrame { | |||
| 442 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 449 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 443 | pub struct FdEnvelope { | 450 | pub struct FdEnvelope { |
| 444 | /// Reception time. | 451 | /// Reception time. |
| 445 | #[cfg(feature = "time")] | 452 | pub ts: Timestamp, |
| 446 | pub ts: embassy_time::Instant, | 453 | |
| 447 | /// The actual CAN frame. | 454 | /// The actual CAN frame. |
| 448 | pub frame: FdFrame, | 455 | pub frame: FdFrame, |
| 449 | } | 456 | } |
| 450 | 457 | ||
| 451 | impl FdEnvelope { | 458 | impl FdEnvelope { |
| 452 | /// Convert into a tuple | 459 | /// Convert into a tuple |
| 453 | pub fn parts(self) -> (FdFrame, embassy_time::Instant) { | 460 | pub fn parts(self) -> (FdFrame, Timestamp) { |
| 454 | (self.frame, self.ts) | 461 | (self.frame, self.ts) |
| 455 | } | 462 | } |
| 456 | } | 463 | } |
