embassy/time: refactor module structure
This commit is contained in:
parent
40bc67bee0
commit
94bd4eb7d5
4 changed files with 75 additions and 81 deletions
|
@ -4,7 +4,6 @@ use core::{mem, ptr};
|
|||
|
||||
pub mod raw;
|
||||
mod run_queue;
|
||||
pub(crate) mod timer;
|
||||
mod timer_queue;
|
||||
mod util;
|
||||
mod waker;
|
||||
|
|
70
embassy/src/time/delay.rs
Normal file
70
embassy/src/time/delay.rs
Normal file
|
@ -0,0 +1,70 @@
|
|||
use core::future::Future;
|
||||
|
||||
use super::{Duration, Instant, Timer};
|
||||
|
||||
/// Async or blocking delay.
|
||||
pub struct Delay;
|
||||
|
||||
impl crate::traits::delay::Delay for Delay {
|
||||
type DelayFuture<'a> = impl Future<Output = ()> + 'a;
|
||||
|
||||
fn delay_ms<'a>(&'a mut self, millis: u64) -> Self::DelayFuture<'a> {
|
||||
Timer::after(Duration::from_millis(millis))
|
||||
}
|
||||
fn delay_us<'a>(&'a mut self, micros: u64) -> Self::DelayFuture<'a> {
|
||||
Timer::after(Duration::from_micros(micros))
|
||||
}
|
||||
}
|
||||
|
||||
/// Type used for blocking delays through embedded-hal traits.
|
||||
///
|
||||
/// For this interface to work, the Executor's clock must be correctly initialized before using it.
|
||||
/// The delays are implemented in a "best-effort" way, meaning that the cpu will block for at least
|
||||
/// the amount provided, but accuracy can be affected by many factors, including interrupt usage.
|
||||
/// Make sure to use a suitable tick rate for your use case. The tick rate can be chosen through
|
||||
/// features flags of this crate.
|
||||
pub struct BlockingTimer;
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u8> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u8) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u16> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u16) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u32> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u32) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u8> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u8) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u16> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u16) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u32> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u32) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
/// Blocks the cpu for at least `duration`.
|
||||
///
|
||||
/// For this interface to work, the Executor's clock must be correctly initialized before using it.
|
||||
pub fn block_for(duration: Duration) {
|
||||
let expires_at = Instant::now() + duration;
|
||||
while Instant::now() < expires_at {}
|
||||
}
|
|
@ -1,13 +1,16 @@
|
|||
//! Time abstractions
|
||||
//! To use these abstractions, first call `set_clock` with an instance of an [Clock](trait.Clock.html).
|
||||
//!
|
||||
mod delay;
|
||||
mod duration;
|
||||
mod instant;
|
||||
mod timer;
|
||||
mod traits;
|
||||
|
||||
pub use crate::executor::timer::{with_timeout, Delay, Ticker, TimeoutError, Timer};
|
||||
pub use delay::{block_for, Delay};
|
||||
pub use duration::Duration;
|
||||
pub use instant::Instant;
|
||||
pub use timer::{with_timeout, Ticker, TimeoutError, Timer};
|
||||
pub use traits::*;
|
||||
|
||||
#[cfg(any(
|
||||
|
@ -42,56 +45,3 @@ pub unsafe fn set_clock(clock: &'static dyn Clock) {
|
|||
pub(crate) fn now() -> u64 {
|
||||
unsafe { unwrap!(CLOCK, "No clock set").now() }
|
||||
}
|
||||
|
||||
/// Type used for blocking delays through embedded-hal traits.
|
||||
///
|
||||
/// For this interface to work, the Executor's clock must be correctly initialized before using it.
|
||||
/// The delays are implemented in a "best-effort" way, meaning that the cpu will block for at least
|
||||
/// the amount provided, but accuracy can be affected by many factors, including interrupt usage.
|
||||
/// Make sure to use a suitable tick rate for your use case. The tick rate can be chosen through
|
||||
/// features flags of this crate.
|
||||
pub struct BlockingTimer;
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u8> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u8) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u16> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u16) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayMs<u32> for BlockingTimer {
|
||||
fn delay_ms(&mut self, ms: u32) {
|
||||
block_for(Duration::from_millis(ms as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u8> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u8) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u16> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u16) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
impl embedded_hal::blocking::delay::DelayUs<u32> for BlockingTimer {
|
||||
fn delay_us(&mut self, us: u32) {
|
||||
block_for(Duration::from_micros(us as u64))
|
||||
}
|
||||
}
|
||||
|
||||
/// Blocks the cpu for at least `duration`.
|
||||
///
|
||||
/// For this interface to work, the Executor's clock must be correctly initialized before using it.
|
||||
pub fn block_for(duration: Duration) {
|
||||
let expires_at = Instant::now() + duration;
|
||||
while Instant::now() < expires_at {}
|
||||
}
|
||||
|
|
|
@ -1,36 +1,11 @@
|
|||
use core::future::Future;
|
||||
use core::marker::PhantomData;
|
||||
use core::pin::Pin;
|
||||
use core::task::{Context, Poll};
|
||||
use futures::{future::select, future::Either, pin_mut, Stream};
|
||||
|
||||
use super::raw;
|
||||
use crate::executor::raw;
|
||||
use crate::time::{Duration, Instant};
|
||||
|
||||
/// Delay abstraction using embassy's clock.
|
||||
pub struct Delay {
|
||||
_data: PhantomData<bool>,
|
||||
}
|
||||
|
||||
impl Delay {
|
||||
pub fn new() -> Self {
|
||||
Delay {
|
||||
_data: PhantomData {},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::traits::delay::Delay for Delay {
|
||||
type DelayFuture<'a> = impl Future<Output = ()> + 'a;
|
||||
|
||||
fn delay_ms<'a>(&'a mut self, millis: u64) -> Self::DelayFuture<'a> {
|
||||
Timer::after(Duration::from_millis(millis))
|
||||
}
|
||||
fn delay_us<'a>(&'a mut self, micros: u64) -> Self::DelayFuture<'a> {
|
||||
Timer::after(Duration::from_micros(micros))
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TimeoutError;
|
||||
pub async fn with_timeout<F: Future>(timeout: Duration, fut: F) -> Result<F::Output, TimeoutError> {
|
||||
let timeout_fut = Timer::after(timeout);
|
Loading…
Reference in a new issue