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(
44 &mut self,
45 config: &BeamDeflConfig,
46 ) -> Result<(), NanonisError> {
47 self.quick_send(
48 "BeamDefl.HorConfigSet",
49 vec![
50 NanonisValue::String(config.name.clone()),
51 NanonisValue::String(config.units.clone()),
52 NanonisValue::F32(config.calibration),
53 NanonisValue::F32(config.offset),
54 ],
55 vec!["+*c", "+*c", "f", "f"],
56 vec![],
57 )?;
58 Ok(())
59 }
60
61 pub fn beam_defl_hor_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
69 let result = self.quick_send(
70 "BeamDefl.HorConfigGet",
71 vec![],
72 vec![],
73 vec!["i", "*-c", "i", "*-c", "f", "f"],
74 )?;
75
76 Ok(BeamDeflConfig {
77 name: result[1].as_string()?.to_string(),
78 units: result[3].as_string()?.to_string(),
79 calibration: result[4].as_f32()?,
80 offset: result[5].as_f32()?,
81 })
82 }
83
84 pub fn beam_defl_ver_config_set(
92 &mut self,
93 config: &BeamDeflConfig,
94 ) -> Result<(), NanonisError> {
95 self.quick_send(
96 "BeamDefl.VerConfigSet",
97 vec![
98 NanonisValue::String(config.name.clone()),
99 NanonisValue::String(config.units.clone()),
100 NanonisValue::F32(config.calibration),
101 NanonisValue::F32(config.offset),
102 ],
103 vec!["+*c", "+*c", "f", "f"],
104 vec![],
105 )?;
106 Ok(())
107 }
108
109 pub fn beam_defl_ver_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
117 let result = self.quick_send(
118 "BeamDefl.VerConfigGet",
119 vec![],
120 vec![],
121 vec!["i", "*-c", "i", "*-c", "f", "f"],
122 )?;
123
124 Ok(BeamDeflConfig {
125 name: result[1].as_string()?.to_string(),
126 units: result[3].as_string()?.to_string(),
127 calibration: result[4].as_f32()?,
128 offset: result[5].as_f32()?,
129 })
130 }
131
132 pub fn beam_defl_int_config_set(
140 &mut self,
141 config: &BeamDeflConfig,
142 ) -> Result<(), NanonisError> {
143 self.quick_send(
144 "BeamDefl.IntConfigSet",
145 vec![
146 NanonisValue::String(config.name.clone()),
147 NanonisValue::String(config.units.clone()),
148 NanonisValue::F32(config.calibration),
149 NanonisValue::F32(config.offset),
150 ],
151 vec!["+*c", "+*c", "f", "f"],
152 vec![],
153 )?;
154 Ok(())
155 }
156
157 pub fn beam_defl_int_config_get(&mut self) -> Result<BeamDeflConfig, NanonisError> {
165 let result = self.quick_send(
166 "BeamDefl.IntConfigGet",
167 vec![],
168 vec![],
169 vec!["i", "*-c", "i", "*-c", "f", "f"],
170 )?;
171
172 Ok(BeamDeflConfig {
173 name: result[1].as_string()?.to_string(),
174 units: result[3].as_string()?.to_string(),
175 calibration: result[4].as_f32()?,
176 offset: result[5].as_f32()?,
177 })
178 }
179
180 pub fn beam_defl_auto_offset(&mut self, signal: DeflectionSignal) -> Result<(), NanonisError> {
190 self.quick_send(
191 "BeamDefl.AutoOffset",
192 vec![NanonisValue::U16(signal.into())],
193 vec!["H"],
194 vec![],
195 )?;
196 Ok(())
197 }
198}