gmt_mount_ctrl_driver/
lib.rs1#![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}