gmt_m2_ctrl_fsm_piezo_7/
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 std::f64::EPSILON;
13
14    use super::*;
15    use matio_rs::MatFile;
16
17    #[test]
18    fn impulse() {
19        let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
20            .join("..")
21            .join("simulink-models")
22            .join("m2fsm_tests.mat");
23        let mat = MatFile::load(path.to_str().unwrap()).unwrap();
24        let pzt_7_Cfb_imp_t: Vec<f64> = mat.var("pzt_7_Cfb_imp_t").unwrap();
25        let pzt_7_Cfb_imp_y: Vec<f64> = mat.var("pzt_7_Cfb_imp_y").unwrap();
26
27        let n = pzt_7_Cfb_imp_t.len();
28        let fs = pzt_7_Cfb_imp_t[1].recip();
29
30        for k in 0..3 {
31            let sim_y: Vec<_> = pzt_7_Cfb_imp_y
32                .chunks(n)
33                .skip(k * 4)
34                .take(1)
35                .flatten()
36                .collect();
37            // dbg!(&sim_y[..10]);
38
39            let mut ctrl = FsmPiezo7::new();
40            let mut y = vec![];
41            for i in 0..n {
42                ctrl.inputs.pzt_error[k] = if i == 0 { fs } else { 0f64 };
43                ctrl.step();
44                y.push(ctrl.outputs.pzt_control[k]);
45            }
46            // dbg!(&y[..10]);
47
48            let n = sim_y.len();
49            let y_err = (sim_y
50                .into_iter()
51                .zip(&y)
52                .map(|(sim_y, y)| 1. - y / sim_y)
53                .map(|x| x * x)
54                .sum::<f64>()
55                / (n as f64))
56                .sqrt();
57            assert!(dbg!(y_err) < EPSILON * 1e1);
58        }
59    }
60}