1use crate::prelude::*;
7
8pub mod prelude {
9 pub use super::{
10 RTUtils,
11 };
12}
13
14pub struct RTUtils;
16
17impl RTUtils {
18 pub fn is_taskset_sorted_by_period(taskset: &[RTTask]) -> bool {
19 taskset.windows(2).all(|w| w[0].period <= w[1].period)
20 }
21
22 pub fn is_taskset_sorted_by_deadline(taskset: &[RTTask]) -> bool {
23 taskset.windows(2).all(|w| w[0].deadline <= w[1].deadline)
24 }
25
26 pub fn implicit_deadlines(taskset: &[RTTask]) -> bool {
27 taskset.iter().all(RTTask::has_implicit_deadline)
28 }
29
30 pub fn constrained_deadlines(taskset: &[RTTask]) -> bool {
31 taskset.iter().all(RTTask::has_constrained_deadline)
32 }
33
34 pub fn total_utilization(taskset: &[RTTask]) -> f64 {
35 taskset.iter()
36 .map(RTTask::utilization)
37 .sum()
38 }
39
40 pub fn largest_utilization(taskset: &[RTTask]) -> f64 {
41 let max = taskset.iter()
42 .map(|t| ordered_float::OrderedFloat(RTTask::utilization(t)))
43 .max();
44
45 match max {
46 Some(max) => *max,
47 None => 0f64,
48 }
49 }
50
51 pub fn total_density(taskset: &[RTTask]) -> f64 {
52 taskset.iter()
53 .map(RTTask::density)
54 .sum()
55 }
56
57 pub fn largest_density(taskset: &[RTTask]) -> f64 {
58 let max = taskset.iter()
59 .map(|t| ordered_float::OrderedFloat(RTTask::density(t)))
60 .max();
61
62 match max {
63 Some(max) => *max,
64 None => 0f64,
65 }
66 }
67
68 pub fn hyperperiod(taskset: &[RTTask]) -> Time {
69 let hyperperiod =
70 taskset.iter()
71 .map(|task| task.period.as_nanos().floor() as i64)
72 .fold(1, |lcm, period| num::integer::lcm(lcm, period));
73
74 Time { value_ns: hyperperiod as f64 }
75 }
76}