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(&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    /// Get the horizontal deflection configuration.
59    ///
60    /// # Returns
61    /// Beam deflection configuration.
62    ///
63    /// # Errors
64    /// Returns `NanonisError` if communication fails.
65    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    /// Set the vertical deflection configuration.
82    ///
83    /// # Arguments
84    /// * `config` - Beam deflection configuration
85    ///
86    /// # Errors
87    /// Returns `NanonisError` if communication fails.
88    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    /// Get the vertical deflection configuration.
104    ///
105    /// # Returns
106    /// Beam deflection configuration.
107    ///
108    /// # Errors
109    /// Returns `NanonisError` if communication fails.
110    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    /// Set the intensity signal configuration.
127    ///
128    /// # Arguments
129    /// * `config` - Beam deflection configuration
130    ///
131    /// # Errors
132    /// Returns `NanonisError` if communication fails.
133    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    /// Get the intensity signal configuration.
149    ///
150    /// # Returns
151    /// Beam deflection configuration.
152    ///
153    /// # Errors
154    /// Returns `NanonisError` if communication fails.
155    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    /// Auto-offset the beam deflection signal.
172    ///
173    /// Adds the current deflection value to the offset so the signal is close to 0.
174    ///
175    /// # Arguments
176    /// * `signal` - Which deflection signal to offset
177    ///
178    /// # Errors
179    /// Returns `NanonisError` if communication fails.
180    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}