response_time_analysis/arrival/
sporadic.rs1use std::iter;
2
3use super::{divide_with_ceil, ArrivalBound, Periodic};
4use crate::time::Duration;
5
6#[derive(Copy, Clone, Debug)]
13pub struct Sporadic {
14 pub min_inter_arrival: Duration,
17 pub jitter: Duration,
20}
21
22impl Sporadic {
23 pub fn new(min_inter_arrival: Duration, jitter: Duration) -> Sporadic {
26 Sporadic {
27 min_inter_arrival,
28 jitter,
29 }
30 }
31
32 pub fn new_zero_jitter(min_inter_arrival: Duration) -> Sporadic {
35 Sporadic {
36 min_inter_arrival,
37 jitter: Duration::zero(),
38 }
39 }
40}
41
42impl ArrivalBound for Sporadic {
43 fn number_arrivals(&self, delta: Duration) -> usize {
44 if delta.is_non_zero() {
45 divide_with_ceil(delta + self.jitter, self.min_inter_arrival) as usize
46 } else {
47 0
48 }
49 }
50
51 fn steps_iter<'a>(&'a self) -> Box<dyn Iterator<Item = Duration> + 'a> {
52 Box::new(
53 iter::once(Duration::from(1)).chain(
54 (1..)
55 .filter(move |j| self.min_inter_arrival * *j > self.jitter)
56 .map(move |j| self.min_inter_arrival * j + Duration::epsilon() - self.jitter),
57 ),
58 )
59 }
60
61 fn clone_with_jitter(&self, added_jitter: Duration) -> Box<dyn ArrivalBound> {
62 let mut ab = Box::new(*self);
63 ab.jitter += added_jitter;
64 ab
65 }
66}
67
68impl From<Periodic> for Sporadic {
69 fn from(p: Periodic) -> Self {
70 Sporadic::new_zero_jitter(p.period)
71 }
72}