use crate::{timer_queue::TimerQueueBackend, TimeoutError}; use crate::Monotonic; /// A [`Monotonic`] that is backed by the [`TimerQueue`](crate::timer_queue::TimerQueue). pub trait TimerQueueBasedMonotonic { /// The backend for the timer queue type Backend: TimerQueueBackend; /// The type for instant, defining an instant in time. /// /// **Note:** In all APIs in RTIC that use instants from this monotonic, this type will be used. type Instant: TimerQueueBasedInstant::Ticks> + core::ops::Add + core::ops::Sub + core::ops::Sub; /// The type for duration, defining a duration of time. /// /// **Note:** In all APIs in RTIC that use duration from this monotonic, this type will be used. type Duration: TimerQueueBasedDuration::Ticks>; } impl Monotonic for T { type Instant = T::Instant; type Duration = T::Duration; fn now() -> Self::Instant { Self::Instant::from_ticks(T::Backend::timer_queue().now()) } async fn delay(duration: Self::Duration) { T::Backend::timer_queue().delay(duration.ticks()).await } async fn delay_until(instant: Self::Instant) { T::Backend::timer_queue().delay_until(instant.ticks()).await } async fn timeout_at( instant: Self::Instant, future: F, ) -> Result { T::Backend::timer_queue() .timeout_at(instant.ticks(), future) .await } async fn timeout_after( duration: Self::Duration, future: F, ) -> Result { T::Backend::timer_queue() .timeout_after(duration.ticks(), future) .await } } /// An instant that can be used in [`TimerQueueBasedMonotonic`]. pub trait TimerQueueBasedInstant: Ord + Copy { /// The internal type of the instant type Ticks; /// Convert from ticks to the instant fn from_ticks(ticks: Self::Ticks) -> Self; /// Convert the instant to ticks fn ticks(self) -> Self::Ticks; } /// A duration that can be used in [`TimerQueueBasedMonotonic`]. pub trait TimerQueueBasedDuration: Copy { /// The internal type of the duration type Ticks; /// Convert the duration to ticks fn ticks(self) -> Self::Ticks; } impl TimerQueueBasedInstant for fugit::Instant { type Ticks = u64; fn from_ticks(ticks: Self::Ticks) -> Self { Self::from_ticks(ticks) } fn ticks(self) -> Self::Ticks { Self::ticks(&self) } } impl TimerQueueBasedInstant for fugit::Instant { type Ticks = u32; fn from_ticks(ticks: Self::Ticks) -> Self { Self::from_ticks(ticks) } fn ticks(self) -> Self::Ticks { Self::ticks(&self) } } impl TimerQueueBasedDuration for fugit::Duration { type Ticks = u64; fn ticks(self) -> Self::Ticks { Self::ticks(&self) } } impl TimerQueueBasedDuration for fugit::Duration { type Ticks = u32; fn ticks(self) -> Self::Ticks { Self::ticks(&self) } }