mount_ctrl_sampling1000_damping002/controller/
mod.rs

1pub mod controller;
2pub mod ze00;
3pub mod ze30;
4pub mod ze60;
5
6pub enum Controller<'a> {
7    Ze00(ze00::Controller<'a>),
8    Ze30(ze30::Controller<'a>),
9    Ze60(ze60::Controller<'a>),
10    Default(controller::Controller<'a>),
11}
12
13#[derive(Debug, thiserror::Error)]
14pub enum ControlError {
15    #[error("Expected zenith angle 0, 30 or 60 found {0}")]
16    ZenithAngle(i32),
17}
18
19type Result<T> = std::result::Result<T, ControlError>;
20
21impl<'a> Controller<'a> {
22    /// Returns a default mount controller
23    pub fn new() -> Self {
24        Controller::Default(controller::Controller::new())
25    }
26    /// Returns a mount controller for the given zenith angle
27    ///
28    /// The zenith angle is either 0, 30 or 60 degrees
29    pub fn at_zenith_angle(ze: i32) -> Result<Self> {
30        println!("Mount controller zenith angle: {ze}");
31        match ze {
32            ze if ze == 0 => Ok(Self::Ze00(ze00::Controller::new())),
33            ze if ze == 30 => Ok(Self::Ze30(ze30::Controller::new())),
34            ze if ze == 60 => Ok(Self::Ze60(ze60::Controller::new())),
35            _ => Err(ControlError::ZenithAngle(ze)),
36        }
37    }
38    /// Returns a mount controller for the given elevation
39    ///
40    /// The elevation is either 90, 60 or 30 degrees
41    pub fn at_elevation(el: i32) -> Result<Self> {
42        Self::at_zenith_angle(90 - el)
43    }
44    pub fn mount_fb(&mut self) -> Option<&mut [f64; 14]> {
45        match self {
46            Controller::Ze00(controller) => {
47                if let ze00::U::MountFB(val) = &mut controller.mount_fb {
48                    Some(val)
49                } else {
50                    None
51                }
52            }
53            Controller::Ze30(controller) => {
54                if let ze30::U::MountFB(val) = &mut controller.mount_fb {
55                    Some(val)
56                } else {
57                    None
58                }
59            }
60            Controller::Ze60(controller) => {
61                if let ze60::U::MountFB(val) = &mut controller.mount_fb {
62                    Some(val)
63                } else {
64                    None
65                }
66            }
67            Controller::Default(controller) => {
68                if let controller::U::MountFB(val) = &mut controller.mount_fb {
69                    Some(val)
70                } else {
71                    None
72                }
73            }
74        }
75    }
76    pub fn mount_sp(&mut self) -> Option<&mut [f64; 3]> {
77        match self {
78            Controller::Ze00(controller) => {
79                if let ze00::U::MountSP(val) = &mut controller.mount_sp {
80                    Some(val)
81                } else {
82                    None
83                }
84            }
85            Controller::Ze30(controller) => {
86                if let ze30::U::MountSP(val) = &mut controller.mount_sp {
87                    Some(val)
88                } else {
89                    None
90                }
91            }
92            Controller::Ze60(controller) => {
93                if let ze60::U::MountSP(val) = &mut controller.mount_sp {
94                    Some(val)
95                } else {
96                    None
97                }
98            }
99            Controller::Default(controller) => {
100                if let controller::U::MountSP(val) = &mut controller.mount_sp {
101                    Some(val)
102                } else {
103                    None
104                }
105            }
106        }
107    }
108    pub fn mount_cmd(&mut self) -> Option<&[f64; 3]> {
109        match self {
110            Controller::Ze00(controller) => {
111                let ze00::Y::Mountcmd(val) = &controller.mount_cmd;
112                Some(val)
113            }
114            Controller::Ze30(controller) => {
115                let ze30::Y::Mountcmd(val) = &controller.mount_cmd;
116                Some(val)
117            }
118            Controller::Ze60(controller) => {
119                let ze60::Y::Mountcmd(val) = &controller.mount_cmd;
120                Some(val)
121            }
122            Controller::Default(controller) => {
123                let controller::Y::Mountcmd(val) = &controller.mount_cmd;
124                Some(val)
125            }
126        }
127    }
128}
129
130impl<'a> Iterator for Controller<'a> {
131    type Item = ();
132
133    fn next(&mut self) -> Option<Self::Item> {
134        match self {
135            Controller::Ze00(control) => control.next(),
136            Controller::Ze30(control) => control.next(),
137            Controller::Ze60(control) => control.next(),
138            Controller::Default(control) => control.next(),
139        }
140    }
141}