1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
mod controller;
pub use controller::{Controller, ControllerValues, Button, Axis, Coordinate};
use hidapi::HidApi;
use log::{debug, info};
use std::{thread, time};
use stoppable_thread::{spawn, StoppableHandle};
pub trait ControllerHandler {
fn controller_update(&mut self, controller: &Controller);
}
#[allow(unused_must_use)]
pub fn read_controller(
mut controller_handler: Box<dyn ControllerHandler + Send + Sync>,
) -> StoppableHandle<()> {
spawn(move |stopped| {
let dur = time::Duration::from_millis(1000);
while !stopped.get() {
info!("Trying to connect to a controller ...");
let (vid, pid) = (1356, 616);
let mut api = HidApi::new().unwrap();
let mut found = false;
while !found {
api.refresh_devices();
debug!("Devices refreshed!");
for device in api.device_list() {
debug!("{:?}", device.path());
if device.vendor_id() == vid && device.product_id() == pid {
info!("Found the device!");
found = true;
}
}
if !found {
debug!("Device not found, retrying ...");
thread::sleep(dur);
}
}
info!("Opening...");
let device = api.open(vid, pid).unwrap();
let mut buf = [0u8; 20];
let mut controller = Controller::new(ControllerValues::new(buf));
while !stopped.get() {
match device.read_timeout(&mut buf[..], -1) {
Ok(_) => {
debug!("Read: {:?}", buf);
let vals = ControllerValues::new(buf);
controller.update(vals);
controller_handler.controller_update(&controller);
}
Err(_e) => {
info!("Error reading controller values.");
break;
}
}
}
}
})
}