mount_ctrl_sampling1000_damping002/controller/
mod.rs1pub 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 pub fn new() -> Self {
24 Controller::Default(controller::Controller::new())
25 }
26 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 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}