pub struct DeviceConfig { /* private fields */ }Expand description
Configuration for KM003C device communication
Specifies which USB interface to use. The interface determines the connection mode:
- Vendor (Interface 0): Full mode - all features including AdcQueue
- HID (Interface 3): Basic mode - ADC/PD polling only
§Examples
use km003c_lib::{KM003C, DeviceConfig};
// Full mode with vendor interface (fastest, all features)
let device = KM003C::new(DeviceConfig::vendor()).await?;
// Basic mode with HID interface (most compatible, ADC/PD only)
let device = KM003C::new(DeviceConfig::hid()).await?;
// With options
let device = KM003C::new(DeviceConfig::vendor().skip_reset()).await?;Implementations§
Source§impl DeviceConfig
impl DeviceConfig
Sourcepub fn vendor() -> Self
pub fn vendor() -> Self
Vendor interface (Interface 0) - Full mode with all features
This is the fastest option with ~0.6ms latency (6x faster than HID). Enables all features including AdcQueue streaming.
Performance:
- Latency: ~600 µs per request
- Throughput: ~200 KB/s
Features: Full mode - ADC, PD, AdcQueue, device info, authentication
Note: On Linux, requires detaching the powerz kernel driver,
which this library handles automatically.
Examples found in repository?
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut device = KM003C::new(DeviceConfig::vendor().skip_reset()).await?;
8 let settings = device.request_settings().await?;
9
10 println!("Device name: {}", settings.device_name().unwrap_or("<invalid UTF-8>"));
11 println!("Language selection: {}", settings.language_selection());
12 println!("Uncalibrated: {}", settings.is_uncalibrated());
13 println!("Brightness: {}%", settings.brightness().get::<percent>());
14 println!(
15 "Sample interval: {} us",
16 settings.sample_interval().get::<microsecond>()
17 );
18 println!("Screen orientation: {}", settings.screen_orientation());
19 println!("Mtools device mode: {}", settings.mtools_device_mode());
20 println!("Selected main page: {}", settings.selected_main_page());
21
22 Ok(())
23}More examples
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut device = KM003C::new(DeviceConfig::vendor().skip_reset()).await?;
8 let initial_level = device.state().map(|state| state.auth_level).unwrap_or(0);
9 println!("Initial authentication level: {initial_level}");
10
11 let result = device.authenticate_calibration().await?;
12 println!(
13 "Calibration authentication level: {} (attribute 0x{:04x})",
14 result.auth_level, result.attribute
15 );
16
17 device.start_graph_mode(GraphSampleRate::Sps50).await?;
18 tokio::time::sleep(Duration::from_millis(200)).await;
19 let response = device.request_data(AttributeSet::single(Attribute::AdcQueue)).await;
20 device.stop_graph_mode().await?;
21
22 let response = response?;
23 let samples = response.get_adc_queue().map(|queue| queue.samples.len()).unwrap_or(0);
24 println!("AdcQueue samples received after level-2 auth: {samples}");
25
26 Ok(())
27}Sourcepub fn hid() -> Self
pub fn hid() -> Self
HID interface (Interface 3) - Basic mode for ADC/PD polling
This is the most compatible option that works on all platforms without custom drivers. Only supports basic ADC and PD polling.
Performance:
- Latency: ~3.8 ms per request
- Throughput: ~60 KB/s
Features: Basic mode - ADC and PD polling only (no AdcQueue, no device info)
Advantages:
- Works without driver installation on Windows/Mac/Linux
- Uses standard HID protocol
- No permission issues
Sourcepub fn skip_reset(self) -> Self
pub fn skip_reset(self) -> Self
Skip USB reset during connection
Some systems (particularly MacOS) may have issues with USB reset. Use this if device connection fails with reset errors.
Examples found in repository?
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut device = KM003C::new(DeviceConfig::vendor().skip_reset()).await?;
8 let settings = device.request_settings().await?;
9
10 println!("Device name: {}", settings.device_name().unwrap_or("<invalid UTF-8>"));
11 println!("Language selection: {}", settings.language_selection());
12 println!("Uncalibrated: {}", settings.is_uncalibrated());
13 println!("Brightness: {}%", settings.brightness().get::<percent>());
14 println!(
15 "Sample interval: {} us",
16 settings.sample_interval().get::<microsecond>()
17 );
18 println!("Screen orientation: {}", settings.screen_orientation());
19 println!("Mtools device mode: {}", settings.mtools_device_mode());
20 println!("Selected main page: {}", settings.selected_main_page());
21
22 Ok(())
23}More examples
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut device = KM003C::new(DeviceConfig::vendor().skip_reset()).await?;
8 let initial_level = device.state().map(|state| state.auth_level).unwrap_or(0);
9 println!("Initial authentication level: {initial_level}");
10
11 let result = device.authenticate_calibration().await?;
12 println!(
13 "Calibration authentication level: {} (attribute 0x{:04x})",
14 result.auth_level, result.attribute
15 );
16
17 device.start_graph_mode(GraphSampleRate::Sps50).await?;
18 tokio::time::sleep(Duration::from_millis(200)).await;
19 let response = device.request_data(AttributeSet::single(Attribute::AdcQueue)).await;
20 device.stop_graph_mode().await?;
21
22 let response = response?;
23 let samples = response.get_adc_queue().map(|queue| queue.samples.len()).unwrap_or(0);
24 println!("AdcQueue samples received after level-2 auth: {samples}");
25
26 Ok(())
27}Sourcepub fn select(self, selector: DeviceSelector) -> Self
pub fn select(self, selector: DeviceSelector) -> Self
Open a specific KM003C instead of the first one found.
§Examples
use km003c_lib::{DeviceConfig, DeviceSelector, KM003C};
let config = DeviceConfig::vendor()
.select(DeviceSelector::SerialNumber("007965".to_string()))
.skip_reset();
let device = KM003C::new(config).await?;Sourcepub fn selector(&self) -> &DeviceSelector
pub fn selector(&self) -> &DeviceSelector
Which KM003C this config opens.