aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-06-24 21:29:29 +0000
committerGitHub <[email protected]>2022-06-24 21:29:29 +0000
commita51df0dec619ee783579578d395d99f97857094b (patch)
tree4002e20bbc0cbafdf9ae292e00541395ad2b818d
parent0ec32d53edcdda9fe4338b783fa0d88aaabfc805 (diff)
parent571e4f2b01b0d2d8a9e566e49df306d84cd4c9ef (diff)
Merge #824
824: embassy/time: round up by default in duration conversions. Fixes #823 r=Dirbaio a=Dirbaio Co-authored-by: Dario Nieuwenhuis <[email protected]>
-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}