gmt_mount_ctrl_controller/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(improper_ctypes)]
5
6include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
7
8include!(concat!(env!("OUT_DIR"), "/controller.rs"));
9
10#[cfg(test)]
11mod tests {
12    use super::*;
13    use matio_rs::MatFile;
14    #[test]
15    fn step() {
16        let mat = MatFile::load("mnt_fbC_step_test.mat").unwrap();
17        let mnt_fbC_step_t: Vec<f64> = mat.var("mnt_fbC_step_t").unwrap();
18        let mnt_fbC_step_y: Vec<f64> = mat.var("mnt_fbC_step_y").unwrap();
19
20        let mut ctrl = MountController::new();
21        ctrl.inputs.Mount_SP.iter_mut().for_each(|x| *x = 1f64);
22        let mut y = vec![];
23        for _ in &mnt_fbC_step_t {
24            ctrl.step();
25            y.extend_from_slice(ctrl.outputs.Mount_cmd.as_slice());
26        }
27
28        // dbg!(&y);
29        let y0_channels = mnt_fbC_step_y.chunks(mnt_fbC_step_t.len());
30        let y0: Vec<_> = y0_channels
31            .clone()
32            .take(1)
33            .flat_map(|x| x.iter())
34            .zip(y0_channels.clone().skip(1).take(1).flat_map(|x| x.iter()))
35            .zip(y0_channels.skip(2).take(1).flat_map(|x| x.iter()))
36            .flat_map(|((a, b), c)| vec![a, b, c])
37            .collect();
38        // dbg!(&y0);
39
40        let y_err = (y
41            .iter()
42            .zip(y0.iter())
43            .map(|(y, y0)| *y - *y0)
44            .map(|x| x * x)
45            .sum::<f64>()
46            / y.len() as f64)
47            .sqrt();
48        assert!(dbg!(y_err) < 1e-4);
49    }
50}