mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Better handling
This commit is contained in:
@@ -14,3 +14,4 @@ sysfs-class = "0.1.2"
|
||||
aho-corasick = "0.7"
|
||||
thiserror = "1.0.15"
|
||||
log = "0.4"
|
||||
uhid-virt = { path = "../../uhid-fs" }
|
||||
@@ -10,6 +10,7 @@ use std::process::Command;
|
||||
use std::str::FromStr;
|
||||
use std::time::Duration;
|
||||
use sysfs_class::{Brightness, SysClass};
|
||||
use uhid_virt::{Bus, CreateParams, UHIDDevice};
|
||||
|
||||
pub const LED_MSG_LEN: usize = 17;
|
||||
static LED_INIT1: [u8; 2] = [0x5d, 0xb9];
|
||||
@@ -39,6 +40,7 @@ pub struct RogCore {
|
||||
keys_endpoint: u8,
|
||||
config: Config,
|
||||
laptop: RefCell<Box<dyn Laptop>>,
|
||||
virt_keys: VirtKeys,
|
||||
}
|
||||
|
||||
impl RogCore {
|
||||
@@ -79,9 +81,14 @@ impl RogCore {
|
||||
keys_endpoint,
|
||||
config: Config::default().read(),
|
||||
laptop: RefCell::new(laptop),
|
||||
virt_keys: VirtKeys::new(),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn virt_keys(&mut self) -> &mut VirtKeys {
|
||||
&mut self.virt_keys
|
||||
}
|
||||
|
||||
pub fn laptop(&self) -> Ref<Box<dyn Laptop>> {
|
||||
self.laptop.borrow()
|
||||
}
|
||||
@@ -307,3 +314,73 @@ impl FromStr for LedBrightness {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct VirtKeys {
|
||||
pub device: UHIDDevice<std::fs::File>,
|
||||
}
|
||||
|
||||
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,
|
||||
rd_data: CONSUMER.to_vec(),
|
||||
})
|
||||
.unwrap(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn press(&mut self, key: u8) {
|
||||
let mut bytes = [0u8; 8];
|
||||
bytes[0] = 0x02;
|
||||
bytes[1] = key;
|
||||
// email button
|
||||
// bytes[1] = 0x8a;
|
||||
// bytes[2] = 0x01;
|
||||
self.device.write(&bytes).unwrap();
|
||||
bytes[1] = 0;
|
||||
self.device.write(&bytes).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
pub const CONSUMER: [u8; 25] = [
|
||||
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,No Null Position)
|
||||
0xC0,
|
||||
];
|
||||
|
||||
// Usage 04 for microphone
|
||||
// Needs another Usage (80) for system control
|
||||
// B5 for toggle int/ext display
|
||||
// b2 for external
|
||||
pub enum ConsumerKeys {
|
||||
VolUp = 0xe9, // USAGE (Volume up)
|
||||
VolDown = 0xea, // USAGE (Volume down)
|
||||
VolMute = 0xe2, // USAGE (Volume mute)
|
||||
TrackNext = 0xb6, // USAGE (Track next)
|
||||
PlayToggl = 0xcd, // USAGE (Play/Pause)
|
||||
TrackPrev = 0xb5, // USAGE (Track prev)
|
||||
TrackStop = 0xb7,
|
||||
Power = 0x30,
|
||||
Reset = 0x31,
|
||||
Sleep = 0x32, // USAGE (Sleep)
|
||||
BacklightInc = 0x6f, // USAGE (Backlight Inc)
|
||||
BacklightDec = 0x70, // USAGE (Backlight Dec)
|
||||
BacklightTog = 0x72, // USAGE (Backlight toggle? display toggle?)
|
||||
}
|
||||
|
||||
@@ -23,12 +23,7 @@ pub fn match_laptop() -> Result<Box<dyn Laptop>, AuraError> {
|
||||
/// has 3 explicit groups: main, vol+media, and the ones that the Linux kernel doesn't
|
||||
/// map.
|
||||
pub trait Laptop {
|
||||
fn do_hotkey_action(
|
||||
&self,
|
||||
core: &mut RogCore,
|
||||
key_byte: u8,
|
||||
virt: Box<dyn Fn(u8)>,
|
||||
) -> Result<(), AuraError>;
|
||||
fn do_hotkey_action(&self, core: &mut RogCore, key_byte: u8) -> Result<(), AuraError>;
|
||||
fn hotkey_group_bytes(&self) -> &[u8];
|
||||
fn led_iface_num(&self) -> u8;
|
||||
fn supported_modes(&self) -> &[BuiltInModeByte];
|
||||
@@ -82,12 +77,7 @@ impl LaptopGX502GW {
|
||||
}
|
||||
}
|
||||
impl Laptop for LaptopGX502GW {
|
||||
fn do_hotkey_action(
|
||||
&self,
|
||||
rogcore: &mut RogCore,
|
||||
key_byte: u8,
|
||||
virt: Box<dyn Fn(u8)>,
|
||||
) -> Result<(), AuraError> {
|
||||
fn do_hotkey_action(&self, rogcore: &mut RogCore, key_byte: u8) -> Result<(), AuraError> {
|
||||
match GX502GWKeys::from(key_byte) {
|
||||
GX502GWKeys::LedBrightUp => {
|
||||
let mut bright = rogcore.config().brightness;
|
||||
@@ -159,7 +149,7 @@ impl Laptop for LaptopGX502GW {
|
||||
"Unmapped key, attempt to pass to virtual device: {:?}, {:X?}",
|
||||
&key_byte, &key_byte
|
||||
);
|
||||
virt(key_byte);
|
||||
rogcore.virt_keys().press(key_byte);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user