mirror of
https://github.com/ferrous-systems/embedded-trainings-2020.git
synced 2024-05-17 07:52:59 +00:00
34 lines
884 B
Rust
34 lines
884 B
Rust
|
use std::env;
|
||
|
|
||
|
use anyhow::{anyhow, bail, ensure};
|
||
|
use hidapi::HidApi;
|
||
|
|
||
|
fn main() -> Result<(), anyhow::Error> {
|
||
|
let args = env::args()
|
||
|
.skip(1) // skip program name
|
||
|
.collect::<Vec<_>>();
|
||
|
ensure!(!args.is_empty(), "expected exactly one argument");
|
||
|
|
||
|
let api = HidApi::new()?;
|
||
|
let dev = api
|
||
|
.device_list()
|
||
|
.filter(|dev| dev.vendor_id() == consts::VID && check_pid(dev.product_id()))
|
||
|
.next()
|
||
|
.ok_or_else(|| anyhow!("device not found"))?
|
||
|
.open_device(&api)?;
|
||
|
|
||
|
let chan = args[0].parse::<u8>()?;
|
||
|
if chan < 11 || chan > 26 {
|
||
|
bail!("channel is out of range (`11..=26`)")
|
||
|
}
|
||
|
const REPORT_ID: u8 = 0;
|
||
|
dev.write(&[REPORT_ID, chan])?;
|
||
|
println!("requested channel change to channel {}", chan);
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
fn check_pid(pid: u16) -> bool {
|
||
|
pid == pids::LOOPBACK || pid == pids::PUZZLE
|
||
|
}
|