rt_graph/
test_data_generator.rs1use crate::{DataSource, Point, Result, Time, Value};
2
3const GEN_POINTS: u32 = 200;
4const GEN_T_INTERVAL: Time = 20;
5
6#[derive(Debug)]
8pub struct TestDataGenerator {
9 curr_t: Time,
10 interval: Time,
11 interval_inc: bool,
12}
13
14impl TestDataGenerator {
15 pub fn new() -> TestDataGenerator {
17 TestDataGenerator {
18 curr_t: 1,
19 interval: GEN_T_INTERVAL,
20 interval_inc: false,
21 }
22 }
23}
24
25impl DataSource for TestDataGenerator {
26 fn get_data(&mut self) -> Result<Vec<Point>> {
27 let mut rv: Vec<Point> = Vec::with_capacity(GEN_POINTS as usize);
28 for _i in 0..GEN_POINTS {
29 let t = self.curr_t;
30 rv.push(Point {
31 t,
32 vs: vec![trig_sample(1.0, 1.0/10000.0, 0.0, t),
33 ((100000.0 / (t as f64)) * trig_sample(1.0, 1.0/10000.0, std::f32::consts::PI / 3.0, t) as f64) as Value,
34 trig_sample(0.5, 1.0/5000.0, 0.0, t)],
35 });
36
37 self.curr_t += self.interval;
38 }
39
40 let switch = if self.interval_inc {
41 self.interval += 1;
42 self.interval == GEN_T_INTERVAL
43 } else {
44 self.interval -= 1;
45 self.interval == 1
46 };
47 if switch {
48 self.interval_inc = !self.interval_inc;
49 }
50 Ok(rv)
51 }
52
53 fn get_num_values(&self) -> Result<usize> {
54 Ok(3)
55 }
56}
57
58fn trig_sample(scale: f32, scale_period: f32, offset: f32, t: Time) -> Value {
59 let float_val = (offset + t as f32 * scale_period).sin() * scale;
60 let int_val = (((float_val + 1.0) / 2.0) * std::u16::MAX as f32) as Value;
61 int_val
62}