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