use libusbk::{Device, DeviceHandle, DeviceList};
use super::{RCM_PID, RCM_VID};
use crate::Result;
#[derive(Debug, Clone)]
pub struct SwitchDevice {
pub(crate) device: Device,
}
#[derive(Debug)]
pub struct SwitchHandle {
pub(crate) handle: DeviceHandle,
}
impl super::Device for SwitchDevice {
fn find_device() -> Result<Self> {
let devices = DeviceList::new()?;
let device = devices.find_with_vid_and_pid(RCM_PID as i32, RCM_VID as i32)?;
Ok(Self { device })
}
fn init(&mut self) -> Result<SwitchHandle> {
Ok(SwitchHandle {
handle: self.device.open()?,
})
}
}
impl super::DeviceHandle for SwitchHandle {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
let amount = self.handle.read_pipe(0x81, buf)?;
Ok(amount as usize)
}
fn write(&mut self, buf: &[u8]) -> Result<usize> {
let amount = self.handle.write_pipe(0x01, buf)?;
Ok(amount as usize)
}
}