From a8169788c559ab6489d66e70e900ba98a139bb5d Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 11 Jul 2018 12:02:10 +0200 Subject: [PATCH] Finished read_pedals() function and made listkeys an Option --- src/main.rs | 86 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3f55eb3..4b1f94c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ extern crate users; use std::path::PathBuf; +use std::process; use structopt::StructOpt; #[derive(StructOpt, Debug)] @@ -22,7 +23,7 @@ struct Opt { /// Prints a table of all keys with rows #[structopt(short = "l", long = "listkeys")] - listkeys: usize, + listkeys: Option, /// Select pedal (left: 1, middle: 2, right: 3) #[structopt(short = "p", long = "pedal", parse(from_os_str))] @@ -35,40 +36,40 @@ fn main() { let opt = Opt::from_args(); + // All options that don't need the device to be open + // Print all keys and exit application + if let Some(x) = opt.listkeys { + key_operations::print_key_map(x); + process::exit(0); + } + + // Open device let vld_dev = [ (0x0c45u16, 0x7403u16), (0x0c45 , 0x7404), (0x413d , 0x2107) ]; + let api = hidapi::HidApi::new().expect("Hidapi init failed!"); + let mut dev_path = String::new(); + for device in &api.devices() { + //println!("{}:{}, {}, {}", device.vendor_id, device.product_id, device.interface_number, device.path); + for val in vld_dev.iter() { + if *val == (device.vendor_id, device.product_id) && device.interface_number == 1 { + println!("Found device {:x}:{:x} ({})", device.vendor_id, device.product_id, device.path); + dev_path = device.path.clone(); + } + } + } + -// let api = hidapi::HidApi::new().expect("Hidapi init failed!"); -// let mut dev_path = String::new(); -// -// for device in &api.devices() { -// //println!("{}:{}, {}, {}", device.vendor_id, device.product_id, device.interface_number, device.path); -// for val in vld_dev.iter() { -// if *val == (device.vendor_id, device.product_id) && device.interface_number == 1 { -// println!("Found device {:x}:{:x} ({})", device.vendor_id, device.product_id, device.path); -// dev_path = device.path.clone(); -// } -// } -// } -// -// -// let dev = api.open_path(dev_path.as_str()).unwrap(); -// println!("Succesfully opened device."); -// -// //ToDo: Replace by match -// if opt.read == true { -// // Read data from device -// read_pedals(& dev); -// } + let dev = api.open_path(dev_path.as_str()).unwrap(); + println!("Succesfully opened device."); - if opt.listkeys > 0 { - println!("{:?}", opt.listkeys); - key_operations::print_key_map(opt.listkeys); + // All options that need the device to be open + if opt.read { + read_pedals(& dev); } } @@ -81,15 +82,34 @@ fn check_sudo() { /// Read the current values of the pedals fn read_pedals(dev: & hidapi::HidDevice) { - let query = [0x01u8, 0x82, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00]; - println!("{:?}", query); - - let res = dev.write(&query).expect("test"); - println!("Wrote: {:?} byte(s)", res); + let column_width = 15; + let total_width = (column_width+3)*3; let mut buf = [0u8; 8]; + let mut query = [0x01u8, 0x82, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00]; - let res = dev.read(&mut buf[..]).unwrap(); - println!("Read: {:?}", &buf[..res]); + // Print header + println!(" {}", "-".repeat(total_width)); + println!(" ‖{name:^width$}‖", name = "Programmed Keys", width = total_width - 2); + println!(" {}", "-".repeat(total_width)); + + // Read and print keys + for i in 0..3 { + query[3] = i + 1; + + dev.write(&query).unwrap(); + + let res = dev.read(&mut buf[..]).unwrap(); + + + let key_name = match key_operations::print_key(&buf[..res]) { + Some(key) => key, + None => "< None >".to_string(), + }; + print!(" ‖ {name:^-width$}", name = key_name, width = column_width); + } + + // Print simple footer + println!("‖\n {}", "-".repeat(total_width)); }