gmt_mount_ctrl_controller/
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;
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 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 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}