Skip to main content

nanonis_rs/client/
beam_defl.rs

1use super::NanonisClient;
2use crate::error::NanonisError;
3use crate::types::NanonisValue;
4
5/// Deflection signal type for beam deflection module.
6#[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/// Beam deflection configuration.
21#[derive(Debug, Clone, Default)]
22pub struct BeamDeflConfig {
23    /// Signal name
24    pub name: String,
25    /// Physical units
26    pub units: String,
27    /// Calibration value
28    pub calibration: f32,
29    /// Offset value
30    pub offset: f32,
31}
32
33impl NanonisClient {
34    // ==================== Beam Deflection ====================
35
36    /// Set the horizontal deflection configuration.
37    ///
38    /// # Arguments
39    /// * `config` - Beam deflection configuration
40    ///
41    /// # Errors
42    /// Returns `NanonisError` if communication fails.
43    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    /// Get the horizontal deflection configuration.
62    ///
63    /// # Returns
64    /// Beam deflection configuration.
65    ///
66    /// # Errors
67    /// Returns `NanonisError` if communication fails.
68    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    /// Set the vertical deflection configuration.
85    ///
86    /// # Arguments
87    /// * `config` - Beam deflection configuration
88    ///
89    /// # Errors
90    /// Returns `NanonisError` if communication fails.
91    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    /// Get the vertical deflection configuration.
110    ///
111    /// # Returns
112    /// Beam deflection configuration.
113    ///
114    /// # Errors
115    /// Returns `NanonisError` if communication fails.
116    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    /// Set the intensity signal configuration.
133    ///
134    /// # Arguments
135    /// * `config` - Beam deflection configuration
136    ///
137    /// # Errors
138    /// Returns `NanonisError` if communication fails.
139    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    /// Get the intensity signal configuration.
158    ///
159    /// # Returns
160    /// Beam deflection configuration.
161    ///
162    /// # Errors
163    /// Returns `NanonisError` if communication fails.
164    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    /// Auto-offset the beam deflection signal.
181    ///
182    /// Adds the current deflection value to the offset so the signal is close to 0.
183    ///
184    /// # Arguments
185    /// * `signal` - Which deflection signal to offset
186    ///
187    /// # Errors
188    /// Returns `NanonisError` if communication fails.
189    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}