gmt_mount_ctrl_driver/
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, MatIO, MayBeInto};
14
15    #[derive(Debug, Default, MatIO)]
16    struct MountDriverTest {
17        time: Vec<f64>,
18        mount_drv_po: Vec<f64>,
19        mount_cmd: Vec<f64>,
20        mount_t: Vec<f64>,
21    }
22
23    #[test]
24    fn data_based() {
25        let mat_file = MatFile::load("mount_driver_test.mat").unwrap();
26        let mat = mat_file.read("mount_driver").unwrap();
27        let time = mat.field("time").unwrap();
28        let mount_drv_po = mat.field("mount_drv_po").unwrap();
29        let mount_cmd = mat.field("mount_cmd").unwrap();
30        let mount_t = mat.field("mount_t").unwrap();
31        let n = time.len();
32        dbg!(n);
33
34        let mut ctrl = MountDriver::new();
35        ctrl.inputs.Mount_cmd.iter_mut().for_each(|x| *x = 1f64);
36        let mut y = vec![];
37        let mut e: f64 = 0.0;
38        for ((&mount_drv_po, &mount_cmd), &mount_t) in mount_drv_po
39            .iter()
40            .zip(mount_cmd.iter())
41            .zip(mount_t.iter())
42        {
43            let data: Vec<f64> = MayBeInto::maybe_into(mount_cmd).unwrap();
44            ctrl.inputs
45                .Mount_cmd
46                .iter_mut()
47                .zip(&data)
48                .for_each(|(x, &data)| *x = data);
49            let data: Vec<f64> = MayBeInto::maybe_into(mount_drv_po).unwrap();
50            ctrl.inputs
51                .Mount_drv_Po
52                .iter_mut()
53                .zip(&data)
54                .for_each(|(x, &data)| *x = data);
55            ctrl.step();
56            let data: Vec<f64> = MayBeInto::maybe_into(mount_t).unwrap();
57            e += data
58                .iter()
59                .zip(ctrl.outputs.Mount_T.as_slice())
60                .map(|(x, y)| x - y)
61                .map(|x| x * x)
62                .sum::<f64>();
63            y.extend_from_slice(ctrl.outputs.Mount_T.as_slice());
64        }
65        e = (e / n as f64).sqrt();
66        assert!(dbg!(e) < 1e-13);
67
68        MatFile::save("mount_drive_y.mat")
69            .unwrap()
70            .array("y", &y, vec![(y.len() / n) as u64, n as u64])
71            .unwrap();
72    }
73}