From a879907bc3ada3f27c0d33d80ac178627fc9ea4f Mon Sep 17 00:00:00 2001 From: Luke D Jones Date: Sat, 1 Aug 2020 23:06:36 +1200 Subject: [PATCH] Move fast, break things --- Cargo.lock | 110 ---------------------- rog-core/Cargo.toml | 5 +- rog-core/src/config.rs | 2 - rog-core/src/daemon.rs | 61 +----------- rog-core/src/laptops.rs | 149 ----------------------------- rog-core/src/lib.rs | 2 - rog-core/src/rog_dbus.rs | 6 +- rog-core/src/rogcore.rs | 80 +--------------- rog-core/src/virt_device.rs | 181 ------------------------------------ 9 files changed, 5 insertions(+), 591 deletions(-) delete mode 100644 rog-core/src/virt_device.rs diff --git a/Cargo.lock b/Cargo.lock index 3dbeeb3d..a81d5e05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,26 +26,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "bindgen" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" -dependencies = [ - "bitflags", - "cexpr", - "cfg-if", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", -] - [[package]] name = "bit-set" version = "0.5.2" @@ -82,31 +62,12 @@ version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c1f1d60091c1b73e2b1f4560ab419204b178e625fa945ded7b660becd2bd46" -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -[[package]] -name = "clang-sys" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" -dependencies = [ - "glob", - "libc", -] - [[package]] name = "crc32fast" version = "1.2.0" @@ -138,26 +99,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "env_logger" version = "0.7.1" @@ -327,12 +268,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - [[package]] name = "gumdrop" version = "0.8.0" @@ -412,12 +347,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" - [[package]] name = "libc" version = "0.2.71" @@ -559,12 +488,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pin-project" version = "0.4.22" @@ -725,7 +648,6 @@ dependencies = [ "serde_json", "sysfs-class", "tokio", - "uhid-virt", ] [[package]] @@ -739,12 +661,6 @@ dependencies = [ "libusb1-sys", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.2.3" @@ -820,12 +736,6 @@ dependencies = [ "serde", ] -[[package]] -name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - [[package]] name = "slab" version = "0.4.2" @@ -959,26 +869,6 @@ dependencies = [ "syn", ] -[[package]] -name = "uhid-virt" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e317bfbb0281bb799f4802d62261a798443a88df4352f302269ad32b4cfc822" -dependencies = [ - "enumflags2", - "libc", - "uhidrs-sys", -] - -[[package]] -name = "uhidrs-sys" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfcc3b1a199338bcfe0e64b3c427ffab84514e7b23f9402d7fef9b38c0a9916e" -dependencies = [ - "bindgen", -] - [[package]] name = "unicode-xid" version = "0.2.1" diff --git a/rog-core/Cargo.toml b/rog-core/Cargo.toml index 27c65086..2665b456 100644 --- a/rog-core/Cargo.toml +++ b/rog-core/Cargo.toml @@ -39,7 +39,4 @@ serde_json = "^1.0" # Device control sysfs-class = "^0.1.2" # used for backlight control and baord ID # cpu power management -intel-pstate = "^0.2.1" -# virtualisation of HID, mainly for outputting consumer key codes -uhid-virt = "^0.0.5" -#keycode = "^0.3" \ No newline at end of file +intel-pstate = "^0.2.1" \ No newline at end of file diff --git a/rog-core/src/config.rs b/rog-core/src/config.rs index 2b0a2640..d945829d 100644 --- a/rog-core/src/config.rs +++ b/rog-core/src/config.rs @@ -1,4 +1,3 @@ -use crate::virt_device::ConsumerKeys; use rog_client::aura_modes::AuraModes; use serde_derive::{Deserialize, Serialize}; use std::fs::{File, OpenOptions}; @@ -8,7 +7,6 @@ pub static CONFIG_PATH: &str = "/etc/rogcore.conf"; #[derive(Default, Deserialize, Serialize)] pub struct Config { - pub rog_key: ConsumerKeys, pub fan_mode: u8, pub bat_charge_limit: u8, pub brightness: u8, diff --git a/rog-core/src/daemon.rs b/rog-core/src/daemon.rs index 843c55f7..c051ab49 100644 --- a/rog-core/src/daemon.rs +++ b/rog-core/src/daemon.rs @@ -64,12 +64,6 @@ pub async fn start_daemon() -> Result<(), Box> { laptop.supported_modes().to_owned(), ); - let keyboard_reader = KeyboardReader::new( - rogcore.get_raw_device_handle(), - laptop.key_endpoint(), - laptop.key_filter().to_owned(), - ); - led_writer .reload_last_builtin(&mut config) .await @@ -89,7 +83,6 @@ pub async fn start_daemon() -> Result<(), Box> { let ( tree, - aura_command_sender, mut aura_command_recv, mut animatrix_recv, fan_mode, @@ -161,14 +154,7 @@ pub async fn start_daemon() -> Result<(), Box> { .unwrap_or_else(|err| warn!("{:?}", err)); } } - // Keyboard reads - let data = keyboard_reader.poll_keyboard().await; - if let Some(bytes) = data { - laptop - .do_keyboard_command(&mut rogcore, &config1, bytes, aura_command_sender.clone()) - .await - .unwrap_or_else(|err| warn!("{}", err)); - } + } }); @@ -277,48 +263,3 @@ async fn send_boot_signals( Ok(()) } -// fn start_keyboard_task( -// fan_mode: Arc>>, -// charge_limit: Arc>>, -// config: Arc>, -// aura_command_sender: mpsc::Sender, -// mut rogcore: RogCore, -// laptop: LaptopBase, -// ) -> tokio::task::JoinHandle<()> { -// let keyboard_reader = KeyboardReader::new( -// rogcore.get_raw_device_handle(), -// laptop.key_endpoint(), -// laptop.key_filter().to_owned(), -// ); -// -// tokio::spawn(async move { -// loop { -// // Fan mode -// if let Ok(mut lock) = fan_mode.try_lock() { -// if let Some(n) = lock.take() { -// let mut config = config.lock().await; -// rogcore -// .set_fan_mode(n, &mut config) -// .unwrap_or_else(|err| warn!("{:?}", err)); -// } -// } -// // Charge limit -// if let Ok(mut lock) = charge_limit.try_lock() { -// if let Some(n) = lock.take() { -// let mut config = config.lock().await; -// rogcore -// .set_charge_limit(n, &mut config) -// .unwrap_or_else(|err| warn!("{:?}", err)); -// } -// } -// // Keyboard reads -// let data = keyboard_reader.poll_keyboard().await; -// if let Some(bytes) = data { -// laptop -// .run(&mut rogcore, &config, bytes, aura_command_sender.clone()) -// .await -// .unwrap_or_else(|err| warn!("{}", err)); -// } -// } -// }) -// } diff --git a/rog-core/src/laptops.rs b/rog-core/src/laptops.rs index 4771fa56..67b0d554 100644 --- a/rog-core/src/laptops.rs +++ b/rog-core/src/laptops.rs @@ -1,58 +1,13 @@ -use crate::{config::Config, rogcore::RogCore}; use rog_client::{ aura_modes::{ AuraModes, BREATHING, COMET, FLASH, HIGHLIGHT, LASER, MULTISTATIC, PULSE, RAIN, RAINBOW, RGB, RIPPLE, SINGLE, STAR, STROBE, }, - error::AuraError, }; -//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState}; -use crate::virt_device::{ConsumerKeys, KeyboardKeys}; use log::{info, warn}; static HELP_ADDRESS: &str = "https://github.com/flukejones/rog-core"; -/// The map of bytes which each fn+key combo emits (0x1866 device only) -pub enum FnKeys { - Rog = 0x38, - MicToggle = 0x7C, - Fan = 0xAE, - ScreenToggle = 0x35, - ScreenBrightDn = 0x10, - ScreenBrightUp = 0x20, - TouchPadToggle = 0x6b, - Sleep = 0x6C, - AirplaneMode = 0x88, - LedBrightUp = 0xC4, - LedBrightDown = 0xC5, - AuraPrevious = 0xB2, - AuraNext = 0xB3, - Calc = 0x92, - None, -} - -impl From for FnKeys { - fn from(byte: u8) -> Self { - match byte { - 0x38 => FnKeys::Rog, - 0x7C => FnKeys::MicToggle, - 0xAE => FnKeys::Fan, - 0x35 => FnKeys::ScreenToggle, - 0x10 => FnKeys::ScreenBrightDn, - 0x20 => FnKeys::ScreenBrightUp, - 0x6b => FnKeys::TouchPadToggle, - 0x6C => FnKeys::Sleep, - 0x88 => FnKeys::AirplaneMode, - 0xC4 => FnKeys::LedBrightUp, - 0xC5 => FnKeys::LedBrightDown, - 0xB2 => FnKeys::AuraPrevious, - 0xB3 => FnKeys::AuraNext, - 0x90 => FnKeys::Calc, - _ => FnKeys::None, - } - } -} - pub(crate) fn match_laptop() -> LaptopBase { for device in rusb::devices().unwrap().iter() { let device_desc = device.device_descriptor().unwrap(); @@ -64,9 +19,6 @@ pub(crate) fn match_laptop() -> LaptopBase { return LaptopBase { usb_vendor: 0x0B05, usb_product: 0x1854, - report_filter_bytes: vec![0x5a, 0x02], - min_led_bright: 0x00, - max_led_bright: 0x03, //from `lsusb -vd 0b05:1866` led_endpoint: 0x04, //from `lsusb -vd 0b05:1866` @@ -93,9 +45,6 @@ fn select_1866_device(prod: u16) -> LaptopBase { let mut laptop = LaptopBase { usb_vendor: 0x0B05, usb_product: prod, - report_filter_bytes: vec![0x5a, 0x02], - min_led_bright: 0x00, - max_led_bright: 0x03, //from `lsusb -vd 0b05:1866` led_endpoint: 0x04, //from `lsusb -vd 0b05:1866` @@ -166,117 +115,19 @@ fn select_1866_device(prod: u16) -> LaptopBase { pub(super) struct LaptopBase { usb_vendor: u16, usb_product: u16, - report_filter_bytes: Vec, - min_led_bright: u8, - max_led_bright: u8, led_endpoint: u8, key_endpoint: u8, supported_modes: Vec, support_animatrix: bool, } -use tokio::sync::{mpsc, Mutex}; - impl LaptopBase { - // Pass in LedWriter as Mutex so it is only locked when required - /// Determines what action each fn+key combo should have - pub(super) async fn do_keyboard_command( - &self, - rogcore: &mut RogCore, - config: &Mutex, - key_buf: [u8; 32], - mut aura_command: mpsc::Sender, - ) -> Result<(), AuraError> { - let mut config = config.lock().await; - match FnKeys::from(key_buf[1]) { - FnKeys::LedBrightUp => { - let mut bright = config.brightness; - if bright < self.max_led_bright { - bright += 1; - info!("Increased LED brightness to {:#?}", bright); - } - aura_command - .send(AuraModes::LedBrightness(bright)) - .await - .unwrap_or_else(|err| warn!("LedBrightUp: {}", err)); - } - FnKeys::LedBrightDown => { - let mut bright = config.brightness; - if bright > self.min_led_bright { - bright -= 1; - } - aura_command - .send(AuraModes::LedBrightness(bright)) - .await - .unwrap_or_else(|err| warn!("LedBrightDown: {}", err)); - } - FnKeys::AuraNext => { - if let Ok(idx) = self.supported_modes.binary_search(&config.current_mode) { - let idx_next = if idx < self.supported_modes.len() - 1 { - idx + 1 - } else { - 0 - }; - config.read(); - if let Some(data) = config.get_led_mode_data(self.supported_modes[idx_next]) { - aura_command.send(data.clone()).await.unwrap_or_else(|_| {}); - } - } else { - warn!("Tried to step to next LED mode while in non-supported mode"); - } - } - FnKeys::AuraPrevious => { - if let Ok(idx) = self.supported_modes.binary_search(&config.current_mode) { - let idx_next = if idx > 0 { - idx - 1 - } else { - self.supported_modes.len() - 1 - }; - config.read(); - if let Some(data) = config.get_led_mode_data(self.supported_modes[idx_next]) { - aura_command.send(data.clone()).await.unwrap_or_else(|_| {}); - } - } else { - warn!("Tried to step to next LED mode while in non-supported mode"); - } - } - FnKeys::ScreenBrightUp => rogcore.virt_keys().press(ConsumerKeys::BacklightInc.into()), //self.backlight.step_up(), - FnKeys::ScreenBrightDn => rogcore.virt_keys().press(ConsumerKeys::BacklightDec.into()), - FnKeys::ScreenToggle => {} - FnKeys::Sleep => rogcore.suspend_with_systemd(), - FnKeys::AirplaneMode => rogcore.toggle_airplane_mode(), - FnKeys::MicToggle => rogcore.virt_keys().press(KeyboardKeys::MicToggle.into()), - FnKeys::Fan => { - rogcore.fan_mode_step(&mut config).unwrap_or_else(|err| { - warn!("Couldn't toggle fan mode: {:?}", err); - }); - } - FnKeys::TouchPadToggle => rogcore - .virt_keys() - .press(KeyboardKeys::TouchpadToggle.into()), - FnKeys::Rog => rogcore.virt_keys().press(config.rog_key.into()), - FnKeys::Calc => rogcore - .virt_keys() - .press(ConsumerKeys::LaunchCalculator.into()), - FnKeys::None => { - if key_buf[0] != 0x5A { - info!("Unmapped key, attempt passthrough: {:X?}", &key_buf[1]); - rogcore.virt_keys().press(key_buf); - } - } - } - Ok(()) - } - pub(super) fn led_endpoint(&self) -> u8 { self.led_endpoint } pub(super) fn key_endpoint(&self) -> u8 { self.key_endpoint } - pub(super) fn key_filter(&self) -> &[u8] { - &self.report_filter_bytes - } pub(super) fn usb_vendor(&self) -> u16 { self.usb_vendor } diff --git a/rog-core/src/lib.rs b/rog-core/src/lib.rs index 82a385d3..2de8528e 100644 --- a/rog-core/src/lib.rs +++ b/rog-core/src/lib.rs @@ -14,7 +14,5 @@ mod rog_dbus; /// The core module which allows writing to LEDs or polling the /// laptop keyboard attached devices pub mod rogcore; -/// A virtual "consumer device" to help emit the correct key codes -mod virt_device; mod error; diff --git a/rog-core/src/rog_dbus.rs b/rog-core/src/rog_dbus.rs index a2bf5be5..393c3b16 100644 --- a/rog-core/src/rog_dbus.rs +++ b/rog-core/src/rog_dbus.rs @@ -176,7 +176,6 @@ pub(super) fn dbus_create_tree( config: Arc>, ) -> ( Tree, - Sender, Receiver, Receiver>>, DbusU8Type, @@ -210,9 +209,7 @@ pub(super) fn dbus_create_tree( factory.object_path(DBUS_PATH, ()).introspectable().add( factory .interface(DBUS_IFACE, ()) - .add_m(set_keyboard_backlight(Mutex::new( - aura_command_send.clone(), - ))) + .add_m(set_keyboard_backlight(Mutex::new(aura_command_send))) .add_m(set_animatrix(Mutex::new(animatrix_send))) .add_m(set_fan_mode(fan_mode.clone())) .add_m(set_charge_limit(charge_limit.clone())) @@ -228,7 +225,6 @@ pub(super) fn dbus_create_tree( .add(factory.object_path("/", ()).introspectable()); ( tree, - aura_command_send, aura_command_recv, animatrix_recv, fan_mode, diff --git a/rog-core/src/rogcore.rs b/rog-core/src/rogcore.rs index 4c4d26be..9cede77b 100644 --- a/rog-core/src/rogcore.rs +++ b/rog-core/src/rogcore.rs @@ -1,17 +1,16 @@ // Return show-stopping errors, otherwise map error to a log level -use crate::{config::Config, error::RogError, virt_device::VirtKeys}; +use crate::{config::Config, error::RogError}; use log::{error, info, warn}; use rusb::{Device, DeviceHandle}; use std::error::Error; use std::fs::OpenOptions; use std::io::Write; -use std::marker::{PhantomData, PhantomPinned}; +use std::marker::{PhantomPinned}; use std::path::Path; use std::process::Command; use std::ptr::NonNull; use std::str::FromStr; -use std::time::Duration; static FAN_TYPE_1_PATH: &str = "/sys/devices/platform/asus-nb-wmi/throttle_thermal_policy"; static FAN_TYPE_2_PATH: &str = "/sys/devices/platform/asus-nb-wmi/fan_boost_mode"; @@ -29,7 +28,6 @@ static BAT_CHARGE_PATH: &str = "/sys/class/power_supply/BAT0/charge_control_end_ /// - `LED_INIT4` pub struct RogCore { handle: DeviceHandle, - virt_keys: VirtKeys, _pin: PhantomPinned, } @@ -79,25 +77,13 @@ impl RogCore { device.set_auto_detach_kernel_driver(true)?; } - if let Err(err) = device.claim_interface(interface) { - warn!("Could not claim keyboard device interface: {:?}", err); - warn!("Sleeping 5 seconds"); - std::thread::sleep(std::time::Duration::from_millis(5000)); - device.claim_interface(interface)?; - } - // std::thread::sleep(std::time::Duration::from_millis(500)); Ok(RogCore { handle: device, - virt_keys: VirtKeys::new(), _pin: PhantomPinned, }) } - pub fn virt_keys(&mut self) -> &mut VirtKeys { - &mut self.virt_keys - } - fn get_device(vendor: u16, product: u16) -> Result, rusb::Error> { for device in rusb::devices()?.iter() { let device_desc = device.device_descriptor()?; @@ -330,70 +316,8 @@ impl RogCore { } } } - - pub fn get_raw_device_handle(&mut self) -> NonNull> { - // Breaking every damn lifetime guarantee rust gives us - unsafe { - NonNull::new_unchecked(&mut self.handle as *mut DeviceHandle) - } - } } -/// Lifetime is tied to `DeviceHandle` from `RogCore` -pub struct KeyboardReader<'d, C: 'd> -where - C: rusb::UsbContext, -{ - handle: NonNull>, - endpoint: u8, - filter: Vec, - _phantom: PhantomData<&'d DeviceHandle>, -} - -/// UNSAFE -unsafe impl<'d, C> Send for KeyboardReader<'d, C> where C: rusb::UsbContext {} -unsafe impl<'d, C> Sync for KeyboardReader<'d, C> where C: rusb::UsbContext {} - -impl<'d, C> KeyboardReader<'d, C> -where - C: rusb::UsbContext, -{ - pub fn new(device_handle: NonNull>, key_endpoint: u8, filter: Vec) -> Self { - KeyboardReader { - handle: device_handle, - endpoint: key_endpoint, - filter, - _phantom: PhantomData, - } - } - - /// Write the bytes read from the device interrupt to the buffer arg, and returns the - /// count of bytes written - /// - /// `report_filter_bytes` is used to filter the data read from the interupt so - /// only the relevant byte array is returned. - pub async fn poll_keyboard(&self) -> Option<[u8; 32]> { - let mut buf = [0u8; 32]; - match unsafe { self.handle.as_ref() }.read_interrupt( - self.endpoint, - &mut buf, - Duration::from_millis(200), - ) { - Ok(_) => { - if self.filter.contains(&buf[0]) - && (buf[1] != 0 || buf[2] != 0 || buf[3] != 0 || buf[4] != 0) - { - return Some(buf); - } - } - Err(err) => match err { - rusb::Error::Timeout => {} - _ => error!("Failed to read keyboard interrupt: {:?}", err), - }, - } - None - } -} #[derive(Debug)] pub enum FanLevel { diff --git a/rog-core/src/virt_device.rs b/rog-core/src/virt_device.rs deleted file mode 100644 index 7cf81640..00000000 --- a/rog-core/src/virt_device.rs +++ /dev/null @@ -1,181 +0,0 @@ -use log::error; -use serde_derive::{Deserialize, Serialize}; -use uhid_virt::{Bus, CreateParams, UHIDDevice}; - -/// Create a virtual device to emit key-presses -/// -/// This is required in some instances because either the USB device that -/// an interface for a working set of buttons is also captured, or because -/// there is no equivalent "system" action to take for a key function and -/// a key-press is required to emit a particular key code. -/// -/// The two devices set up mirror that of the GX502GW and can accept the same -/// original byte arrays to emit. -/// - "Consumer Device" generally has all device type controls like media, backlight, power -/// - "Keyboard Device" is a full featured keyboard including special keys like F13-F24 -/// -/// # Some example uses: -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x68, 0, 0, 0, 0]); // F13, Config/Control Panel` -/// -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x70, 0, 0, 0, 0]); // F21, Touchpad toggle, XF86/Gnome` -/// -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x71, 0, 0, 0, 0]); // F22, Touchpad on, XF86/Gnome` -/// -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x72, 0, 0, 0, 0]); // F23, Touchpad off, XF86/Gnome` -/// -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x82, 0, 0, 0, 0]); // Sleep` -/// -/// `rogcore.virt_keys().press([0x01, 0, 0, 0x66, 0, 0, 0, 0]); // Power (menu)` -pub struct VirtKeys { - device: UHIDDevice, -} - -impl Default for VirtKeys { - fn default() -> Self { - Self::new() - } -} - -impl VirtKeys { - pub fn new() -> Self { - VirtKeys { - device: UHIDDevice::create(CreateParams { - name: String::from("Virtual ROG buttons"), - phys: String::from(""), - uniq: String::from(""), - bus: Bus::USB, - vendor: 0x0b05, - product: 0x1866, - version: 0, - country: 0, - // This is a device which emits the usage code as a whole, rather than as bits - rd_data: [ - // Consumer Device TLC - 0x05, 0x0C, // Usage Page (Consumer) - 0x09, 0x01, // Usage (Consumer Control) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x02, // Report ID (2) - 0x19, 0x00, // Usage Minimum (Unassigned) - 0x2A, 0x3C, 0x02, // Usage Maximum (AC Format) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0x3C, 0x02, // Logical Maximum (572) - 0x75, 0x10, // Report Size (16) - 0x95, 0x02, // Report Count (2) - 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State) - 0xC0, // - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x06, // Usage (Keyboard) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0xE0, // Usage Minimum (0xE0) - 0x29, 0xE7, // Usage Maximum (0xE7) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State) - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) - 0x05, 0x08, // Usage Page (LEDs) - 0x19, 0x01, // Usage Minimum (Num Lock) - 0x29, 0x05, // Usage Maximum (Kana) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State) - 0x95, 0x01, // Report Count (1) - 0x75, 0x03, // Report Size (3) - 0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State) - 0x95, 0x1E, // Report Count (30) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0x00, // Usage Minimum (0x00) - 0x2A, 0xFF, 0x00, // Usage Maximum (0xFF) - 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State) - 0xC0, // End Collection - ] - .to_vec(), - }) - .map_err(|err| error!("Could not create virtual device: {:?}", err)) - .expect("Could not create virtual device"), - } - } - - /// A single on/off key press - pub fn press(&mut self, input: [u8; 32]) { - self.device.write(&input).unwrap(); - let mut reset = [0u8; 32]; - reset[0] = input[0]; - self.device.write(&reset).unwrap(); - } -} - -#[allow(dead_code)] -#[derive(Copy, Clone, Deserialize, Serialize)] -pub enum ConsumerKeys { - Power = 0x30, - Sleep = 0x32, - // Menu = 0x40, - MediaRecord = 0xB2, - MediaFastFwd = 0xB3, - MediaRewind = 0xB4, - MediaNext = 0xB5, - MediaPrev = 0xB6, - MediaStop = 0xB7, - MediaPlayPause = 0xCD, - MediaVolMute = 0xE2, - MediaVolUp = 0xE9, - MediaVolDown = 0xEA, - BacklightInc = 0x6F, - BacklightDec = 0x70, - // BacklightTog = 0x72, // USAGE (Backlight toggle? display toggle?) - ControlConfig = 0x183, - LaunchTextEditor = 0x185, - LaunchEmailApp = 0x18A, - LaunchNewsReader = 0x18B, - LaunchCalendar = 0x018E, - LaunchCalculator = 0x192, - LaunchWebBrowser = 0x196, - // VideoOutStep = 0x82, - FileBrowser = 0x1B4, -} - -impl From for [u8; 32] { - fn from(key: ConsumerKeys) -> Self { - let mut bytes = [0u8; 32]; - bytes[0] = 0x02; // report ID for consumer - bytes[1] = key as u8; - bytes[2] = (key as u16 >> 8) as u8; - bytes - } -} - -impl Default for ConsumerKeys { - fn default() -> Self { - ConsumerKeys::ControlConfig - } -} - -/// Implements only a small subset of useful keys -#[allow(dead_code)] -#[derive(Copy, Clone)] -pub enum KeyboardKeys { - Config = 0x68, // Desktop configuration, F13 - MicToggle = 0x6f, // Microphone toggle, F20 - TouchpadToggle = 0x70, // Touchpad toggle, F21 - WWW = 0xf0, // Web browser - Sleep = 0xf8, // Sleep - Coffee = 0xf9, // lockscreen -} - -impl From for [u8; 32] { - fn from(key: KeyboardKeys) -> Self { - let mut bytes = [0u8; 32]; - bytes[0] = 0x01; // report ID for keyboard - bytes[3] = key as u8; - bytes - } -}