1use super::NanonisClient;
2use crate::error::NanonisError;
3use crate::types::NanonisValue;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
7pub enum DeflectionSignal {
8 #[default]
9 Horizontal = 0,
10 Vertical = 1,
11 Intensity = 2,
12}
13
14impl From<DeflectionSignal> for u16 {
15 fn from(sig: DeflectionSignal) -> Self {
16 sig as u16
17 }
18}
19
20#[derive(Debug, Clone, Default)]
22pub struct BeamDeflConfig {
23 pub name: String,
25 pub units: String,
27 pub calibration: f32,
29 pub offset: f32,
31}
32
33impl NanonisClient {
34 pub fn beam_defl_hor_config_set(&mut self, config: &BeamDeflConfig) -> Result<(), NanonisError> {
44 self.quick_send(
45 "BeamDefl.HorConfigSet",
46 vec![
47 NanonisValue::String(config.name.clone()),
48 NanonisValue::String(config.units.clone()),
49 NanonisValue::F32(config.calibration),
50 NanonisValue::F32(config.offset),
51 ],
52 vec!["+*c", "+*c", "f", "f"],
53 vec![],
54 )?;
55 Ok(())
56 }
57
58 pub fn beam_defl_hor_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
66 let result = self.quick_send(
67 "BeamDefl.HorConfigGet",
68 vec![],
69 vec![],
70 vec!["i", "*-c", "i", "*-c", "f", "f"],
71 )?;
72
73 Ok(BeamDeflConfig {
74 name: result[1].as_string()?.to_string(),
75 units: result[3].as_string()?.to_string(),
76 calibration: result[4].as_f32()?,
77 offset: result[5].as_f32()?,
78 })
79 }
80
81 pub fn beam_defl_ver_config_set(&mut self, config: &BeamDeflConfig) -> Result<(), NanonisError> {
89 self.quick_send(
90 "BeamDefl.VerConfigSet",
91 vec![
92 NanonisValue::String(config.name.clone()),
93 NanonisValue::String(config.units.clone()),
94 NanonisValue::F32(config.calibration),
95 NanonisValue::F32(config.offset),
96 ],
97 vec!["+*c", "+*c", "f", "f"],
98 vec![],
99 )?;
100 Ok(())
101 }
102
103 pub fn beam_defl_ver_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
111 let result = self.quick_send(
112 "BeamDefl.VerConfigGet",
113 vec![],
114 vec![],
115 vec!["i", "*-c", "i", "*-c", "f", "f"],
116 )?;
117
118 Ok(BeamDeflConfig {
119 name: result[1].as_string()?.to_string(),
120 units: result[3].as_string()?.to_string(),
121 calibration: result[4].as_f32()?,
122 offset: result[5].as_f32()?,
123 })
124 }
125
126 pub fn beam_defl_int_config_set(&mut self, config: &BeamDeflConfig) -> Result<(), NanonisError> {
134 self.quick_send(
135 "BeamDefl.IntConfigSet",
136 vec![
137 NanonisValue::String(config.name.clone()),
138 NanonisValue::String(config.units.clone()),
139 NanonisValue::F32(config.calibration),
140 NanonisValue::F32(config.offset),
141 ],
142 vec!["+*c", "+*c", "f", "f"],
143 vec![],
144 )?;
145 Ok(())
146 }
147
148 pub fn beam_defl_int_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
156 let result = self.quick_send(
157 "BeamDefl.IntConfigGet",
158 vec![],
159 vec![],
160 vec!["i", "*-c", "i", "*-c", "f", "f"],
161 )?;
162
163 Ok(BeamDeflConfig {
164 name: result[1].as_string()?.to_string(),
165 units: result[3].as_string()?.to_string(),
166 calibration: result[4].as_f32()?,
167 offset: result[5].as_f32()?,
168 })
169 }
170
171 pub fn beam_defl_auto_offset(&mut self, signal: DeflectionSignal) -> Result<(), NanonisError> {
181 self.quick_send(
182 "BeamDefl.AutoOffset",
183 vec![NanonisValue::U16(signal.into())],
184 vec!["H"],
185 vec![],
186 )?;
187 Ok(())
188 }
189}