demo/
demo.rs

1use dynpick_force_torque_sensor::serialport;
2use dynpick_force_torque_sensor::{DynpickSensorBuilder, Sensitivity, Triplet};
3
4fn search_usb_sensor_path() -> Result<Option<String>, serialport::Error> {
5    // Wacoh-tech vendor ID.
6    let vendor_id = 0x10c4;
7    // NOTE: The following product-ID may be specific for WDF-6M200-3.
8    let product_id = 0xea60;
9
10    let ports = serialport::available_ports()?;
11    let path = ports
12        .into_iter()
13        .filter(move |port| match &port.port_type {
14            // Takes only USB-connected device
15            serialport::SerialPortType::UsbPort(usb) => {
16                usb.vid == vendor_id && usb.pid == product_id
17            }
18            _ => false,
19        })
20        .map(|sensor_port| sensor_port.port_name)
21        .next();
22
23    Ok(path)
24}
25
26fn main() {
27    println!("dynpick-force-torque-sensor demo started.");
28    println!("Make sure that the sensor is connected to the computer.");
29    println!("Make sure setting udev rule. See examples/setup_udev_rule.sh in detail.");
30
31    // Search USB-connected dynpick sensor.
32    let path = match search_usb_sensor_path() {
33        Ok(Some(path)) => path,
34        Ok(None) => {
35            println!("No dynpick sensor is connected.");
36            return;
37        }
38        Err(e) => {
39            println!("{}", e);
40            return;
41        }
42    };
43    println!("Found a sensor. Path: {}", path);
44
45    // Specify the sensitivity manually.
46    let sensitivity = {
47        let force = Triplet::new(24.9, 24.6, 24.5);
48        let torque = Triplet::new(1664.7, 1639.7, 1638.0);
49        Sensitivity::new(force, torque)
50    };
51
52    // Connect the found sensor.
53    let sensor = DynpickSensorBuilder::open(path)
54        .map(|b| b.set_sensitivity_manually(sensitivity))
55        .and_then(|b| b.build());
56    let mut sensor = match sensor {
57        Ok(s) => s,
58        Err(e) => {
59            println!("{}", e);
60            return;
61        }
62    };
63    println!("Successfully opened the sensor.");
64
65    // Correct zero-point
66    match sensor.zeroed_next() {
67        Ok(_) => println!("Offset the sensor."),
68        Err(e) => {
69            println!("An error occurred during offset: {}", e);
70            return;
71        }
72    }
73
74    // Repeatedly receive wrenches from the sensor.
75    let measurement_count = 1000;
76    for i in 0..measurement_count {
77        std::thread::sleep(sensor.inner_port().timeout());
78
79        match sensor.update() {
80            Ok(w) => println!("[{}/{}] {:?}", i + 1, measurement_count, w),
81            Err(e) => println!("[{}/{}] {}", i + 1, measurement_count, e),
82        }
83    }
84
85    // Info
86    println!("Product info: {:?}", sensor.receive_product_info());
87
88    println!("dynpick-force-torque-sensor demo finished.");
89}