rt_graph/
test_data_generator.rs

1use crate::{DataSource, Point, Result, Time, Value};
2
3const GEN_POINTS: u32 = 200;
4const GEN_T_INTERVAL: Time = 20;
5
6/// A struct that implements `DataSource` by showing dummy test data.
7#[derive(Debug)]
8pub struct TestDataGenerator {
9    curr_t: Time,
10    interval: Time,
11    interval_inc: bool,
12}
13
14impl TestDataGenerator {
15    /// Construct a new instance.
16    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}