use libusb;
use std::time::Duration;
const VID: u16 = 0xb49;
const PID: u16 = 0x64f;
pub struct TranceVibeDeviceInfo {
context: libusb::Context,
pub bus_number: u8,
pub address: u8,
}
pub struct TranceVibeDevice<'a> {
device: libusb::DeviceHandle<'a>,
}
impl<'a> TranceVibeDevice<'a> {
fn new(device: libusb::DeviceHandle<'a>) -> TranceVibeDevice<'a> {
TranceVibeDevice { device: device }
}
pub fn set(&mut self, speed: u8) -> libusb::Result<usize> {
let timeout = Duration::from_secs(1);
let bytes: [u8; 0] = [];
return self.device.write_control(libusb::request_type(libusb::Direction::Out,
libusb::RequestType::Vendor,
libusb::Recipient::Interface),
1,
speed as u16,
0,
&bytes,
timeout);
}
}
impl TranceVibeDeviceInfo {
fn new(bus_number: u8, address: u8) -> TranceVibeDeviceInfo {
TranceVibeDeviceInfo {
context: match libusb::Context::new() {
Ok(c) => c,
Err(_) => panic!("Can't create context!"),
},
bus_number: bus_number,
address: address,
}
}
pub fn open(&mut self) -> libusb::Result<TranceVibeDevice> {
let devices = match self.context.devices() {
Ok(d) => d,
Err(e) => return Err(e),
};
for mut dev in devices.iter() {
let device_desc = match dev.device_descriptor() {
Ok(d) => d,
Err(e) => return Err(e),
};
if device_desc.vendor_id() != VID || device_desc.product_id() != PID ||
dev.bus_number() != self.bus_number || dev.address() != self.address {
continue;
}
match dev.open() {
Ok(h) => return Ok(TranceVibeDevice::new(h)),
Err(e) => return Err(e),
};
}
return Err(libusb::Error::NoDevice);
}
}
pub fn get_devices() -> libusb::Result<Vec<TranceVibeDeviceInfo>> {
let mut context = match libusb::Context::new() {
Ok(c) => c,
Err(e) => return Err(e),
};
let mut devices = Vec::<TranceVibeDeviceInfo>::new();
let connected_devices = match context.devices() {
Ok(d) => d,
Err(e) => return Err(e),
};
for mut device in connected_devices.iter() {
let device_desc = match device.device_descriptor() {
Ok(d) => d,
Err(e) => return Err(e),
};
if device_desc.vendor_id() != VID || device_desc.product_id() != PID {
continue;
}
devices.push(TranceVibeDeviceInfo::new(device.bus_number(), device.address()));
}
Ok(devices)
}