diff options
| -rw-r--r-- | embassy/src/time/duration.rs | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/embassy/src/time/duration.rs b/embassy/src/time/duration.rs index d35c2b65f..dc4f16bd4 100644 --- a/embassy/src/time/duration.rs +++ b/embassy/src/time/duration.rs | |||
| @@ -41,24 +41,46 @@ impl Duration { | |||
| 41 | Duration { ticks } | 41 | Duration { ticks } |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | /// Creates a duration from the specified number of seconds | 44 | /// Creates a duration from the specified number of seconds, rounding up. |
| 45 | pub const fn from_secs(secs: u64) -> Duration { | 45 | pub const fn from_secs(secs: u64) -> Duration { |
| 46 | Duration { | 46 | Duration { |
| 47 | ticks: secs * TICKS_PER_SECOND, | 47 | ticks: secs * TICKS_PER_SECOND, |
| 48 | } | 48 | } |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /// Creates a duration from the specified number of milliseconds | 51 | /// Creates a duration from the specified number of milliseconds, rounding up. |
| 52 | pub const fn from_millis(millis: u64) -> Duration { | 52 | pub const fn from_millis(millis: u64) -> Duration { |
| 53 | Duration { | 53 | Duration { |
| 54 | ticks: millis * (TICKS_PER_SECOND / GCD_1K) / (1000 / GCD_1K), | 54 | ticks: div_ceil(millis * (TICKS_PER_SECOND / GCD_1K), 1000 / GCD_1K), |
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /// Creates a duration from the specified number of microseconds | 58 | /// Creates a duration from the specified number of microseconds, rounding up. |
| 59 | /// NOTE: Delays this small may be inaccurate. | 59 | /// NOTE: Delays this small may be inaccurate. |
| 60 | pub const fn from_micros(micros: u64) -> Duration { | 60 | pub const fn from_micros(micros: u64) -> Duration { |
| 61 | Duration { | 61 | Duration { |
| 62 | ticks: div_ceil(micros * (TICKS_PER_SECOND / GCD_1M), 1_000_000 / GCD_1M), | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | /// Creates a duration from the specified number of seconds, rounding down. | ||
| 67 | pub const fn from_secs_floor(secs: u64) -> Duration { | ||
| 68 | Duration { | ||
| 69 | ticks: secs * TICKS_PER_SECOND, | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | /// Creates a duration from the specified number of milliseconds, rounding down. | ||
| 74 | pub const fn from_millis_floor(millis: u64) -> Duration { | ||
| 75 | Duration { | ||
| 76 | ticks: millis * (TICKS_PER_SECOND / GCD_1K) / (1000 / GCD_1K), | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 | /// Creates a duration from the specified number of microseconds, rounding down. | ||
| 81 | /// NOTE: Delays this small may be inaccurate. | ||
| 82 | pub const fn from_micros_floor(micros: u64) -> Duration { | ||
| 83 | Duration { | ||
| 62 | ticks: micros * (TICKS_PER_SECOND / GCD_1M) / (1_000_000 / GCD_1M), | 84 | ticks: micros * (TICKS_PER_SECOND / GCD_1M) / (1_000_000 / GCD_1M), |
| 63 | } | 85 | } |
| 64 | } | 86 | } |
| @@ -155,3 +177,8 @@ impl<'a> fmt::Display for Duration { | |||
| 155 | write!(f, "{} ticks", self.ticks) | 177 | write!(f, "{} ticks", self.ticks) |
| 156 | } | 178 | } |
| 157 | } | 179 | } |
| 180 | |||
| 181 | #[inline] | ||
| 182 | const fn div_ceil(num: u64, den: u64) -> u64 { | ||
| 183 | (num + den - 1) / den | ||
| 184 | } | ||
