nanonis_rs/lib.rs
1//! # nanonis-rs
2//!
3//! A Rust client library for communicating with Nanonis SPM systems via TCP.
4//!
5//! ## Quick Start
6//!
7//! ```no_run
8//! use nanonis_rs::{NanonisClient, NanonisError};
9//!
10//! fn main() -> Result<(), NanonisError> {
11//! let mut client = NanonisClient::new("192.168.1.100", 6501)?;
12//!
13//! // Get current bias voltage
14//! let bias = client.bias_get()?;
15//! println!("Current bias: {} V", bias);
16//!
17//! // Set new bias voltage
18//! client.bias_set(0.5)?;
19//!
20//! Ok(())
21//! }
22//! ```
23//!
24//! ## Usage Pattern
25//!
26//! All instrument control is done through [`NanonisClient`]. Import types
27//! from domain modules only when needed:
28//!
29//! ```no_run
30//! use nanonis_rs::{NanonisClient, NanonisError};
31//! use nanonis_rs::motor::{MotorDirection, MotorGroup};
32//! use nanonis_rs::scan::ScanFrame;
33//!
34//! fn main() -> Result<(), NanonisError> {
35//! let mut client = NanonisClient::new("192.168.1.100", 6501)?;
36//!
37//! // Motor control
38//! client.motor_start_move(MotorDirection::ZPlus, 100u16, MotorGroup::Group1, true)?;
39//!
40//! // Scan control
41//! let frame = client.scan_frame_get()?;
42//! println!("Scan center: ({}, {})", frame.center.x, frame.center.y);
43//!
44//! Ok(())
45//! }
46//! ```
47//!
48//! ## Streaming Data
49//!
50//! For continuous data acquisition, use [`TCPLoggerStream`]:
51//!
52//! ```no_run
53//! use nanonis_rs::TCPLoggerStream;
54//!
55//! let mut stream = TCPLoggerStream::new("192.168.1.100", 6502)?;
56//! let frame = stream.read_frame()?;
57//! println!("Got {} channels", frame.data.len());
58//! # Ok::<(), Box<dyn std::error::Error>>(())
59//! ```
60
61// Internal modules
62mod client;
63mod error;
64mod protocol;
65mod tcplogger_stream;
66mod types;
67
68// ==================== Public API ====================
69
70pub use client::{ConnectionConfig, NanonisClient, NanonisClientBuilder};
71pub use error::NanonisError;
72pub use tcplogger_stream::TCPLoggerStream;
73
74// ==================== Protocol Constants ====================
75
76/// Maximum valid Nanonis signal index (0-based, 128 signals total).
77pub const MAX_SIGNAL_INDEX: u8 = 127;
78
79/// Maximum valid TCP logger channel index (0-based, 24 channels total).
80pub const MAX_TCP_CHANNEL: u8 = 23;
81
82/// Nanonis internal data acquisition base rate in Hz.
83///
84/// This is the fundamental sampling rate of the Nanonis RT engine.
85/// The effective rate seen in the TCP data stream is
86/// `BASE_ACQUISITION_RATE_HZ / oversampling`.
87pub const BASE_ACQUISITION_RATE_HZ: f64 = 2000.0;
88
89// Re-export commonly used types from the internal types module
90pub use types::{NanonisValue, Position};
91
92// ==================== Domain Type Modules ====================
93//
94// Import types from these modules as needed.
95
96/// Motor control types.
97///
98/// ```
99/// use nanonis_rs::motor::{MotorDirection, MotorGroup, MotorAxis};
100/// ```
101pub mod motor {
102 pub use crate::client::motor::*;
103}
104
105/// Scan control types.
106///
107/// ```
108/// use nanonis_rs::scan::{ScanFrame, ScanAction, ScanDirection};
109/// ```
110pub mod scan {
111 pub use crate::client::scan::*;
112}
113
114/// Bias control types.
115///
116/// ```
117/// use nanonis_rs::bias::PulseMode;
118/// ```
119pub mod bias {
120 pub use crate::client::bias::*;
121}
122
123/// Bias spectroscopy types.
124///
125/// ```
126/// use nanonis_rs::bias_spectr::{BiasSpectrPropsBuilder, OptionalFlag};
127/// ```
128pub mod bias_spectr {
129 pub use crate::client::bias_spectr::*;
130}
131
132/// Z-controller types.
133///
134/// ```
135/// use nanonis_rs::z_ctrl::{ZControllerHold, ZControllerStatus};
136/// ```
137pub mod z_ctrl {
138 pub use crate::client::z_ctrl::*;
139}
140
141/// Oscilloscope types.
142///
143/// ```
144/// use nanonis_rs::oscilloscope::{TriggerMode, TriggerSlope, OsciData};
145/// ```
146pub mod oscilloscope {
147 pub use crate::client::oscilloscope::*;
148}
149
150/// Signal management types.
151///
152/// ```
153/// use nanonis_rs::signals::SignalIndex;
154/// ```
155pub mod signals {
156 pub use crate::client::signals::*;
157}
158
159/// Lock-in amplifier types.
160pub mod lockin {
161 pub use crate::client::lockin::*;
162}
163
164/// Piezo control types.
165pub mod piezo {
166 pub use crate::client::piezo::*;
167}
168
169/// User output types.
170pub mod user_out {
171 pub use crate::client::user_out::*;
172}
173
174/// TCP logger types.
175pub mod tcplog {
176 pub use crate::client::tcplog::*;
177}
178
179/// PLL (Phase-Locked Loop) types.
180pub mod pll {
181 pub use crate::client::pll::*;
182}
183
184/// Generic sweep types.
185pub mod gen_swp {
186 pub use crate::client::gen_swp::*;
187}
188
189/// High-speed sweep types.
190pub mod hs_swp {
191 pub use crate::client::hs_swp::*;
192}
193
194/// Pattern types.
195pub mod pattern {
196 pub use crate::client::pattern::*;
197}
198
199/// Follow-me types.
200pub mod folme {
201 pub use crate::client::folme::*;
202}
203
204/// Atom tracking types.
205pub mod atom_track {
206 pub use crate::client::atom_track::*;
207}
208
209/// Kelvin controller types.
210pub mod kelvin_ctrl {
211 pub use crate::client::kelvin_ctrl::*;
212}
213
214/// Spectrum analyzer types.
215pub mod spectrum_anlzr {
216 pub use crate::client::spectrum_anlzr::*;
217}
218
219/// PLL signal analyzer types.
220pub mod pll_signal_anlzr {
221 pub use crate::client::pll_signal_anlzr::*;
222}
223
224/// Generic PI controller types.
225pub mod gen_pi_ctrl {
226 pub use crate::client::gen_pi_ctrl::*;
227}
228
229/// Marks types.
230pub mod marks {
231 pub use crate::client::marks::*;
232}
233
234/// Data logging types.
235pub mod data_log {
236 pub use crate::client::data_log::*;
237}
238
239/// Script types.
240pub mod script {
241 pub use crate::client::script::*;
242}
243
244/// Interferometer types.
245pub mod interf {
246 pub use crate::client::interf::*;
247}
248
249/// Beam deflection types.
250pub mod beam_defl {
251 pub use crate::client::beam_defl::*;
252}
253
254/// OC sync types.
255pub mod oc_sync {
256 pub use crate::client::oc_sync::*;
257}
258
259/// Digital lines types.
260pub mod dig_lines {
261 pub use crate::client::dig_lines::*;
262}
263
264/// PI controller types.
265pub mod pi_ctrl {
266 pub use crate::client::pi_ctrl::*;
267}
268
269/// Lock-in frequency sweep types.
270pub mod lockin_freq_swp {
271 pub use crate::client::lockin_freq_swp::*;
272}
273
274/// Signal chart types.
275pub mod signal_chart {
276 pub use crate::client::signal_chart::*;
277}
278
279/// Tip recovery types.
280pub mod tip_recovery {
281 pub use crate::client::tip_recovery::*;
282}
283
284/// CPD compensation types.
285pub mod cpd_comp {
286 pub use crate::client::cpd_comp::*;
287}
288
289/// Z spectroscopy types.
290pub mod z_spectr {
291 pub use crate::client::z_spectr::*;
292}
293
294/// Utility types.
295pub mod util {
296 pub use crate::client::util::*;
297}
298
299/// PLL frequency sweep types.
300pub mod pll_freq_swp {
301 pub use crate::client::pll_freq_swp::*;
302}
303
304// Note: mpass, laser, and user_in modules exist in client/ but contain
305// only NanonisClient impl blocks with no standalone public types.
306// Their methods are available directly on NanonisClient without a module import.