1pub type Milliseconds = u32;
9
10pub type Microseconds = u64;
12
13pub trait TimeProvider {
18 fn current_time_ms(&self) -> Milliseconds;
23
24 fn current_time_us(&self) -> Microseconds;
29
30 fn elapsed_ms(&mut self) -> Milliseconds {
35 let current = self.current_time_ms();
36 let last = self.last_time_ms();
37 self.update_last_time_ms(current);
38 current.saturating_sub(last)
39 }
40
41 fn elapsed_us(&mut self) -> Microseconds {
46 let current = self.current_time_us();
47 let last = self.last_time_us();
48 self.update_last_time_us(current);
49 current.saturating_sub(last)
50 }
51
52 fn last_time_ms(&self) -> Milliseconds;
56
57 fn last_time_us(&self) -> Microseconds;
61
62 fn update_last_time_ms(&mut self, time: Milliseconds);
66
67 fn update_last_time_us(&mut self, time: Microseconds);
71
72 fn reset(&mut self) {
76 let current_ms = self.current_time_ms();
77 let current_us = self.current_time_us();
78 self.update_last_time_ms(current_ms);
79 self.update_last_time_us(current_us);
80 }
81}
82
83#[derive(Debug)]
88pub struct MonotonicTimeProvider<F>
89where
90 F: Fn() -> Microseconds,
91{
92 timer_fn: F,
94 last_ms: Milliseconds,
96 last_us: Microseconds,
98}
99
100impl<F> MonotonicTimeProvider<F>
101where
102 F: Fn() -> Microseconds,
103{
104 pub fn new(timer_fn: F) -> Self {
126 let current_us = timer_fn();
127 Self {
128 timer_fn,
129 last_ms: (current_us / 1000) as Milliseconds,
130 last_us: current_us,
131 }
132 }
133
134 pub fn from_ticks<G>(
162 get_ticks: G,
163 ticks_per_second: u32,
164 ) -> MonotonicTimeProvider<impl Fn() -> Microseconds>
165 where
166 G: Fn() -> u64,
167 {
168 let timer_fn = move || {
169 let ticks = get_ticks();
170 (ticks * 1_000_000) / ticks_per_second as u64
172 };
173
174 let current_us = timer_fn();
175 MonotonicTimeProvider {
176 timer_fn,
177 last_ms: (current_us / 1000) as Milliseconds,
178 last_us: current_us,
179 }
180 }
181}
182
183impl<F> TimeProvider for MonotonicTimeProvider<F>
184where
185 F: Fn() -> Microseconds,
186{
187 fn current_time_ms(&self) -> Milliseconds {
188 ((self.timer_fn)() / 1000) as Milliseconds
189 }
190
191 fn current_time_us(&self) -> Microseconds {
192 (self.timer_fn)()
193 }
194
195 fn last_time_ms(&self) -> Milliseconds {
196 self.last_ms
197 }
198
199 fn last_time_us(&self) -> Microseconds {
200 self.last_us
201 }
202
203 fn update_last_time_ms(&mut self, time: Milliseconds) {
204 self.last_ms = time;
205 }
206
207 fn update_last_time_us(&mut self, time: Microseconds) {
208 self.last_us = time;
209 }
210}
211
212#[derive(Debug, Clone)]
217pub struct ManualTimeProvider {
218 current_us: Microseconds,
220 last_ms: Milliseconds,
222 last_us: Microseconds,
224}
225
226impl ManualTimeProvider {
227 pub fn new() -> Self {
229 Self {
230 current_us: 0,
231 last_ms: 0,
232 last_us: 0,
233 }
234 }
235
236 pub fn with_start_time(start_us: Microseconds) -> Self {
238 Self {
239 current_us: start_us,
240 last_ms: (start_us / 1000) as Milliseconds,
241 last_us: start_us,
242 }
243 }
244
245 pub fn advance_ms(&mut self, delta_ms: Milliseconds) {
247 self.current_us += (delta_ms as Microseconds) * 1000;
248 }
249
250 pub fn advance_us(&mut self, delta_us: Microseconds) {
252 self.current_us += delta_us;
253 }
254
255 pub fn set_time_us(&mut self, time_us: Microseconds) {
257 self.current_us = time_us;
258 }
259
260 pub fn set_time_ms(&mut self, time_ms: Milliseconds) {
262 self.current_us = (time_ms as Microseconds) * 1000;
263 }
264}
265
266impl Default for ManualTimeProvider {
267 fn default() -> Self {
268 Self::new()
269 }
270}
271
272impl TimeProvider for ManualTimeProvider {
273 fn current_time_ms(&self) -> Milliseconds {
274 (self.current_us / 1000) as Milliseconds
275 }
276
277 fn current_time_us(&self) -> Microseconds {
278 self.current_us
279 }
280
281 fn last_time_ms(&self) -> Milliseconds {
282 self.last_ms
283 }
284
285 fn last_time_us(&self) -> Microseconds {
286 self.last_us
287 }
288
289 fn update_last_time_ms(&mut self, time: Milliseconds) {
290 self.last_ms = time;
291 }
292
293 fn update_last_time_us(&mut self, time: Microseconds) {
294 self.last_us = time;
295 }
296}
297
298#[cfg(feature = "std")]
303#[derive(Debug)]
304pub struct StdTimeProvider {
305 start_time: std::time::Instant,
307 last_ms: Milliseconds,
309 last_us: Microseconds,
311}
312
313#[cfg(feature = "std")]
314impl StdTimeProvider {
315 pub fn new() -> Self {
317 let now = std::time::Instant::now();
318 Self {
319 start_time: now,
320 last_ms: 0,
321 last_us: 0,
322 }
323 }
324}
325
326#[cfg(feature = "std")]
327impl Default for StdTimeProvider {
328 fn default() -> Self {
329 Self::new()
330 }
331}
332
333#[cfg(feature = "std")]
334impl TimeProvider for StdTimeProvider {
335 fn current_time_ms(&self) -> Milliseconds {
336 self.start_time.elapsed().as_millis() as Milliseconds
337 }
338
339 fn current_time_us(&self) -> Microseconds {
340 self.start_time.elapsed().as_micros() as Microseconds
341 }
342
343 fn last_time_ms(&self) -> Milliseconds {
344 self.last_ms
345 }
346
347 fn last_time_us(&self) -> Microseconds {
348 self.last_us
349 }
350
351 fn update_last_time_ms(&mut self, time: Milliseconds) {
352 self.last_ms = time;
353 }
354
355 fn update_last_time_us(&mut self, time: Microseconds) {
356 self.last_us = time;
357 }
358}
359
360#[cfg(test)]
361mod tests {
362 use super::*;
363
364 #[test]
365 fn test_manual_time_provider() {
366 let mut provider = ManualTimeProvider::new();
367
368 assert_eq!(provider.current_time_ms(), 0);
369 assert_eq!(provider.current_time_us(), 0);
370
371 provider.advance_ms(100);
372 assert_eq!(provider.current_time_ms(), 100);
373 assert_eq!(provider.current_time_us(), 100_000);
374
375 provider.advance_us(500);
376 assert_eq!(provider.current_time_ms(), 100);
377 assert_eq!(provider.current_time_us(), 100_500);
378 }
379
380 #[test]
381 fn test_manual_time_provider_elapsed() {
382 let mut provider = ManualTimeProvider::new();
383
384 assert_eq!(provider.elapsed_ms(), 0);
386
387 provider.advance_ms(50);
388 assert_eq!(provider.elapsed_ms(), 50);
389
390 provider.advance_ms(25);
391 assert_eq!(provider.elapsed_ms(), 25);
392 }
393
394 #[test]
395 fn test_monotonic_time_provider() {
396 use core::cell::RefCell;
397
398 let counter = RefCell::new(0u64);
399 let timer_fn = || {
400 let mut c = counter.borrow_mut();
401 *c += 1000; *c
403 };
404
405 let provider = MonotonicTimeProvider::new(timer_fn);
406
407 let first_time = provider.current_time_us();
408 let second_time = provider.current_time_us();
409
410 assert!(second_time > first_time);
411 assert_eq!(second_time - first_time, 1000); }
413
414 #[cfg(feature = "std")]
421 #[test]
422 fn test_std_time_provider() {
423 let provider = StdTimeProvider::new();
424
425 let first_time = provider.current_time_ms();
426 std::thread::sleep(std::time::Duration::from_millis(10));
427 let second_time = provider.current_time_ms();
428
429 assert!(second_time >= first_time + 10);
430 }
431
432 #[test]
433 fn test_time_provider_reset() {
434 let mut provider = ManualTimeProvider::new();
435
436 provider.advance_ms(100);
437 let _ = provider.elapsed_ms(); provider.advance_ms(50);
440 provider.reset();
441
442 provider.advance_ms(25);
443 let elapsed = provider.elapsed_ms();
444
445 assert_eq!(elapsed, 25); }
447}