aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy/src/time/duration.rs35
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]
182const fn div_ceil(num: u64, den: u64) -> u64 {
183 (num + den - 1) / den
184}