Skip to main content

nanonis_rs/client/oscilloscope/
osci_1t.rs

1use super::super::NanonisClient;
2use crate::error::NanonisError;
3use crate::types::NanonisValue;
4
5impl NanonisClient {
6    /// Set the channel to display in the Oscilloscope 1-Channel
7    /// channel_index: 0-23, corresponds to signals assigned to the 24 slots in the Signals Manager
8    pub fn osci1t_ch_set(&mut self, channel_index: i32) -> Result<(), NanonisError> {
9        self.quick_send(
10            "Osci1T.ChSet",
11            vec![NanonisValue::I32(channel_index)],
12            vec!["i"],
13            vec![],
14        )?;
15        Ok(())
16    }
17
18    /// Get the channel displayed in the Oscilloscope 1-Channel
19    /// Returns: channel index (0-23)
20    pub fn osci1t_ch_get(&mut self) -> Result<i32, NanonisError> {
21        let result = self.quick_send("Osci1T.ChGet", vec![], vec![], vec!["i"])?;
22        match result.first() {
23            Some(value) => Ok(value.as_i32()?),
24            None => Err(NanonisError::Protocol(
25                "No channel index returned".to_string(),
26            )),
27        }
28    }
29
30    /// Set the timebase in the Oscilloscope 1-Channel
31    /// Use osci1t_timebase_get() first to obtain available timebases, then use the index
32    pub fn osci1t_timebase_set(
33        &mut self,
34        timebase_index: i32,
35    ) -> Result<(), NanonisError> {
36        self.quick_send(
37            "Osci1T.TimebaseSet",
38            vec![NanonisValue::I32(timebase_index)],
39            vec!["i"],
40            vec![],
41        )?;
42        Ok(())
43    }
44
45    /// Get the timebase in the Oscilloscope 1-Channel
46    /// Returns: (timebase_index, timebases_array)
47    pub fn osci1t_timebase_get(&mut self) -> Result<(i32, Vec<f32>), NanonisError> {
48        let result = self.quick_send(
49            "Osci1T.TimebaseGet",
50            vec![],
51            vec![],
52            vec!["i", "i", "*f"],
53        )?;
54        if result.len() >= 3 {
55            let timebase_index = result[0].as_i32()?;
56            let timebases = result[2].as_f32_array()?.to_vec();
57            Ok((timebase_index, timebases))
58        } else {
59            Err(NanonisError::Protocol(
60                "Invalid timebase response".to_string(),
61            ))
62        }
63    }
64
65    /// Set the trigger configuration in the Oscilloscope 1-Channel
66    /// trigger_mode: 0 = Immediate, 1 = Level, 2 = Auto
67    /// trigger_slope: 0 = Falling, 1 = Rising
68    pub fn osci1t_trig_set(
69        &mut self,
70        trigger_mode: u16,
71        trigger_slope: u16,
72        trigger_level: f64,
73        trigger_hysteresis: f64,
74    ) -> Result<(), NanonisError> {
75        self.quick_send(
76            "Osci1T.TrigSet",
77            vec![
78                NanonisValue::U16(trigger_mode),
79                NanonisValue::U16(trigger_slope),
80                NanonisValue::F64(trigger_level),
81                NanonisValue::F64(trigger_hysteresis),
82            ],
83            vec!["H", "H", "d", "d"],
84            vec![],
85        )?;
86        Ok(())
87    }
88
89    /// Get the trigger configuration in the Oscilloscope 1-Channel
90    /// Returns: (trigger_mode, trigger_slope, trigger_level, trigger_hysteresis)
91    pub fn osci1t_trig_get(&mut self) -> Result<(u16, u16, f64, f64), NanonisError> {
92        let result = self.quick_send(
93            "Osci1T.TrigGet",
94            vec![],
95            vec![],
96            vec!["H", "H", "d", "d"],
97        )?;
98        if result.len() >= 4 {
99            let trigger_mode = result[0].as_u16()?;
100            let trigger_slope = result[1].as_u16()?;
101            let trigger_level = result[2].as_f64()?;
102            let trigger_hysteresis = result[3].as_f64()?;
103            Ok((
104                trigger_mode,
105                trigger_slope,
106                trigger_level,
107                trigger_hysteresis,
108            ))
109        } else {
110            Err(NanonisError::Protocol(
111                "Invalid trigger configuration response".to_string(),
112            ))
113        }
114    }
115
116    /// Start the Oscilloscope 1-Channel
117    pub fn osci1t_run(&mut self) -> Result<(), NanonisError> {
118        self.quick_send("Osci1T.Run", vec![], vec![], vec![])?;
119        Ok(())
120    }
121
122    /// Get the graph data from the Oscilloscope 1-Channel
123    /// data_to_get: 0 = Current, 1 = Next trigger, 2 = Wait 2 triggers
124    /// Returns: (t0, dt, size, data_values)
125    pub fn osci1t_data_get(
126        &mut self,
127        data_to_get: u16,
128    ) -> Result<(f64, f64, i32, Vec<f64>), NanonisError> {
129        let result = self.quick_send(
130            "Osci1T.DataGet",
131            vec![NanonisValue::U16(data_to_get)],
132            vec!["H"],
133            vec!["d", "d", "i", "*d"],
134        )?;
135
136        if result.len() >= 4 {
137            let t0 = result[0].as_f64()?;
138            let dt = result[1].as_f64()?;
139            let size = result[2].as_i32()?;
140            let data = result[3].as_f64_array()?.to_vec();
141            Ok((t0, dt, size, data))
142        } else {
143            Err(NanonisError::Protocol(
144                "Invalid oscilloscope 1T data response".to_string(),
145            ))
146        }
147    }
148}