diff --git a/rog-client/src/aura_modes.rs b/rog-client/src/aura_modes.rs index 40ce7d42..845c276b 100644 --- a/rog-client/src/aura_modes.rs +++ b/rog-client/src/aura_modes.rs @@ -15,6 +15,7 @@ pub const PULSE: u8 = 0x0a; pub const COMET: u8 = 0x0b; pub const FLASH: u8 = 0x0c; pub const MULTISTATIC: u8 = 0x0d; +pub const RGB: u8 = 0xf0; #[derive(Clone, Deserialize, Serialize)] pub struct Colour(pub u8, pub u8, pub u8); @@ -238,7 +239,30 @@ impl From<&AuraModes> for u8 { } } -/// Exists to convert back from correct bytes +impl From<&AuraModes> for &str { + fn from(mode: &AuraModes) -> Self { + match mode { + AuraModes::Stable(_) => "Static", + AuraModes::Breathe(_) => "Breathing", + AuraModes::Strobe(_) => "Strobing", + AuraModes::Rainbow(_) => "Rainbow", + AuraModes::Star(_) => "Stars", + AuraModes::Rain(_) => "Rain", + AuraModes::Highlight(_) => "Keypress Highlight", + AuraModes::Laser(_) => "Keypress Laser", + AuraModes::Ripple(_) => "Keypress Ripple", + AuraModes::Pulse(_) => "Pulse", + AuraModes::Comet(_) => "Comet", + AuraModes::Flash(_) => "Flash", + AuraModes::MultiStatic(_) => "4-Zone Static Colours", + AuraModes::RGB(_) => "RGB per-key", + _ => panic!("Invalid mode"), + } + } +} + +/// Exists to convert back from correct bytes. RGB byte intentionally left off as it +/// does not correspond to an actual pre-set mode, nor does brightness. impl From for AuraModes { fn from(byte: u8) -> Self { match byte { diff --git a/rog-core/src/laptops.rs b/rog-core/src/laptops.rs index 3cf7b544..a2f9bdd0 100644 --- a/rog-core/src/laptops.rs +++ b/rog-core/src/laptops.rs @@ -2,7 +2,7 @@ use crate::{config::Config, rogcore::RogCore}; use rog_client::{ aura_modes::{ AuraModes, BREATHING, COMET, FLASH, HIGHLIGHT, LASER, MULTISTATIC, PULSE, RAIN, RAINBOW, - RIPPLE, SINGLE, STAR, STROBE, + RGB, RIPPLE, SINGLE, STAR, STROBE, }, error::AuraError, }; @@ -10,6 +10,8 @@ use rog_client::{ use crate::virt_device::ConsumerKeys; use log::{info, warn}; +static HELP_ADDRESS: &str = "https://github.com/flukejones/rog-core"; + pub(crate) fn match_laptop() -> LaptopBase { for device in rusb::devices().unwrap().iter() { let device_desc = device.device_descriptor().unwrap(); @@ -74,20 +76,36 @@ fn choose_1866_device(prod: u16) -> LaptopBase { } else if board_name.starts_with("GX502") { laptop.supported_modes = vec![ SINGLE, BREATHING, STROBE, RAINBOW, STAR, RAIN, HIGHLIGHT, LASER, RIPPLE, PULSE, COMET, - FLASH, + FLASH, RGB, ]; - // GM501 - } else if board_name.starts_with("GM501") { - laptop.supported_modes = vec![SINGLE, BREATHING, STROBE, RAINBOW]; - // GX531, G531 - } else if board_name.starts_with("GX531") || board_name.starts_with("G531") { + // G512LI & G712LI has 1 RGB zone which means per-key effect might work + // TODO: add specific supported mode for per-key effect + } else if board_name.starts_with("G512LI") || board_name.starts_with("G712LI") { laptop.supported_modes = vec![SINGLE, BREATHING, STROBE, RAINBOW, PULSE]; - // G712 - } else if board_name.starts_with("G712") { + // GM501, GX531, G531, G512, G712 have 4-zone RGB + } else if board_name.starts_with("GM501") + || board_name.starts_with("G512") + || board_name.starts_with("G712") + || board_name.starts_with("GX531") + || board_name.starts_with("G531") + { laptop.supported_modes = vec![SINGLE, BREATHING, STROBE, RAINBOW, PULSE, MULTISTATIC]; } else { panic!( - "Unsupported laptop, please request support at\nhttps://github.com/flukejones/rog-core" + "Unsupported laptop, please request support at {}", + HELP_ADDRESS + ); + } + + if !laptop.supported_modes.is_empty() { + info!("Supported Keyboard LED modes are:"); + for mode in &laptop.supported_modes { + let mode = <&str>::from(&::from(*mode)); + info!("- {}", mode); + } + info!( + "If these modes are incorrect or missing please request support at {}", + HELP_ADDRESS ); }