mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-01-22 17:33:19 +01:00
Adjust anime init sequence
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
- Minor updates in aura controller to ensure configs are updated if the support file changes
|
- Minor updates in aura controller to ensure configs are updated if the support file changes
|
||||||
- Don't panic if -ENODEV on fan_curve enable
|
- Don't panic if -ENODEV on fan_curve enable
|
||||||
- Adjust the G513Q support to match what is on the asus website.
|
- Adjust the G513Q support to match what is on the asus website.
|
||||||
|
- Adjust init sequence of anime to prevent accidental use of Slash as Anime
|
||||||
|
|
||||||
## [v6.0.9]
|
## [v6.0.9]
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::error::Error;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimeDiagonal, AnimeType};
|
use rog_anime::{AnimeDiagonal, AnimeType};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -26,7 +26,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
AnimeType::GA401,
|
AnimeType::GA401,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let anime_type = get_anime_type()?;
|
let anime_type = get_maybe_anime_type()?;
|
||||||
|
|
||||||
proxy.write(matrix.into_data_buffer(anime_type)?).unwrap();
|
proxy.write(matrix.into_data_buffer(anime_type)?).unwrap();
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimeDiagonal, AnimeType};
|
use rog_anime::{AnimeDiagonal, AnimeType};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -29,7 +29,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let anime_type = get_anime_type().unwrap();
|
let anime_type = get_maybe_anime_type().unwrap();
|
||||||
proxy
|
proxy
|
||||||
.write(matrix.into_data_buffer(anime_type).unwrap())
|
.write(matrix.into_data_buffer(anime_type).unwrap())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use std::env;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{ActionData, ActionLoader, Sequences};
|
use rog_anime::{ActionData, ActionLoader, Sequences};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -19,7 +19,7 @@ fn main() {
|
|||||||
|
|
||||||
let path = Path::new(&args[1]);
|
let path = Path::new(&args[1]);
|
||||||
let brightness = args[2].parse::<f32>().unwrap();
|
let brightness = args[2].parse::<f32>().unwrap();
|
||||||
let anime_type = get_anime_type().unwrap();
|
let anime_type = get_maybe_anime_type().unwrap();
|
||||||
let mut seq = Sequences::new(anime_type);
|
let mut seq = Sequences::new(anime_type);
|
||||||
seq.insert(
|
seq.insert(
|
||||||
0,
|
0,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimeDataBuffer, AnimeGrid};
|
use rog_anime::{AnimeDataBuffer, AnimeGrid};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -14,7 +14,7 @@ fn main() {
|
|||||||
let conn = Connection::system().unwrap();
|
let conn = Connection::system().unwrap();
|
||||||
let proxy = AnimeProxyBlocking::new(&conn).unwrap();
|
let proxy = AnimeProxyBlocking::new(&conn).unwrap();
|
||||||
|
|
||||||
let anime_type = get_anime_type().unwrap();
|
let anime_type = get_maybe_anime_type().unwrap();
|
||||||
let mut matrix = AnimeGrid::new(anime_type);
|
let mut matrix = AnimeGrid::new(anime_type);
|
||||||
let tmp = matrix.get_mut();
|
let tmp = matrix.get_mut();
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::AnimeDataBuffer;
|
use rog_anime::AnimeDataBuffer;
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -9,7 +9,7 @@ use zbus::blocking::Connection;
|
|||||||
fn main() {
|
fn main() {
|
||||||
let conn = Connection::system().unwrap();
|
let conn = Connection::system().unwrap();
|
||||||
let proxy = AnimeProxyBlocking::new(&conn).unwrap();
|
let proxy = AnimeProxyBlocking::new(&conn).unwrap();
|
||||||
let anime_type = get_anime_type().unwrap();
|
let anime_type = get_maybe_anime_type().unwrap();
|
||||||
let mut matrix = AnimeDataBuffer::new(anime_type);
|
let mut matrix = AnimeDataBuffer::new(anime_type);
|
||||||
matrix.data_mut()[1] = 100; // start = 1
|
matrix.data_mut()[1] = 100; // start = 1
|
||||||
for n in matrix.data_mut()[2..32].iter_mut() {
|
for n in matrix.data_mut()[2..32].iter_mut() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::error::Error;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimeDataBuffer, AnimeImage, Vec2};
|
use rog_anime::{AnimeDataBuffer, AnimeImage, Vec2};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -20,7 +20,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let anime_type = get_anime_type()?;
|
let anime_type = get_maybe_anime_type()?;
|
||||||
let matrix = AnimeImage::from_png(
|
let matrix = AnimeImage::from_png(
|
||||||
Path::new(&args[1]),
|
Path::new(&args[1]),
|
||||||
args[2].parse::<f32>().unwrap(),
|
args[2].parse::<f32>().unwrap(),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use std::process::exit;
|
|||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimeDataBuffer, AnimeImage, Vec2};
|
use rog_anime::{AnimeDataBuffer, AnimeImage, Vec2};
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
use zbus::blocking::Connection;
|
use zbus::blocking::Connection;
|
||||||
@@ -23,7 +23,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let anime_type = get_anime_type()?;
|
let anime_type = get_maybe_anime_type()?;
|
||||||
let mut matrix = AnimeImage::from_png(
|
let mut matrix = AnimeImage::from_png(
|
||||||
Path::new(&args[1]),
|
Path::new(&args[1]),
|
||||||
args[2].parse::<f32>().unwrap(),
|
args[2].parse::<f32>().unwrap(),
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use aura_cli::{LedPowerCommand1, LedPowerCommand2};
|
|||||||
use dmi_id::DMIID;
|
use dmi_id::DMIID;
|
||||||
use fan_curve_cli::FanCurveCommand;
|
use fan_curve_cli::FanCurveCommand;
|
||||||
use gumdrop::{Opt, Options};
|
use gumdrop::{Opt, Options};
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2};
|
use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2};
|
||||||
use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower};
|
use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower};
|
||||||
use rog_aura::{self, AuraDeviceType, AuraEffect, PowerZones};
|
use rog_aura::{self, AuraDeviceType, AuraEffect, PowerZones};
|
||||||
@@ -365,8 +365,8 @@ fn handle_anime(conn: &Connection, cmd: &AnimeCommand) -> Result<(), Box<dyn std
|
|||||||
println!("Did Alice _really_ make it back from Wonderland?");
|
println!("Did Alice _really_ make it back from Wonderland?");
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut anime_type = get_anime_type()?;
|
let mut anime_type = get_maybe_anime_type()?;
|
||||||
if let AnimeType::Unknown = anime_type {
|
if let AnimeType::Unsupported = anime_type {
|
||||||
if let Some(model) = cmd.override_type {
|
if let Some(model) = cmd.override_type {
|
||||||
anime_type = model;
|
anime_type = model;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use std::sync::{Arc, Mutex};
|
|||||||
use asusd_user::config::*;
|
use asusd_user::config::*;
|
||||||
use asusd_user::ctrl_anime::{CtrlAnime, CtrlAnimeInner};
|
use asusd_user::ctrl_anime::{CtrlAnime, CtrlAnimeInner};
|
||||||
use config_traits::{StdConfig, StdConfigLoad};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_maybe_anime_type;
|
||||||
use rog_aura::aura_detection::LedSupportData;
|
use rog_aura::aura_detection::LedSupportData;
|
||||||
use rog_aura::keyboard::KeyLayout;
|
use rog_aura::keyboard::KeyLayout;
|
||||||
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
use rog_dbus::zbus_anime::AnimeProxyBlocking;
|
||||||
@@ -44,7 +44,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
// Set up the anime data and run loop/thread
|
// Set up the anime data and run loop/thread
|
||||||
if supported.contains(&"org.asuslinux.Anime".to_string()) {
|
if supported.contains(&"org.asuslinux.Anime".to_string()) {
|
||||||
if let Some(cfg) = config.active_anime {
|
if let Some(cfg) = config.active_anime {
|
||||||
let anime_type = get_anime_type()?;
|
let anime_type = get_maybe_anime_type()?;
|
||||||
let anime_config = ConfigAnime::new().set_name(cfg).load();
|
let anime_config = ConfigAnime::new().set_name(cfg).load();
|
||||||
let anime = anime_config.create(anime_type)?;
|
let anime = anime_config.create(anime_type)?;
|
||||||
let anime_config = Arc::new(Mutex::new(anime_config));
|
let anime_config = Arc::new(Mutex::new(anime_config));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad2};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use rog_anime::error::AnimeError;
|
use rog_anime::error::AnimeError;
|
||||||
use rog_anime::usb::Brightness;
|
use rog_anime::usb::Brightness;
|
||||||
use rog_anime::{
|
use rog_anime::{
|
||||||
@@ -10,60 +10,6 @@ use serde_derive::{Deserialize, Serialize};
|
|||||||
|
|
||||||
const CONFIG_FILE: &str = "anime.ron";
|
const CONFIG_FILE: &str = "anime.ron";
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
pub struct AnimeConfigV460 {
|
|
||||||
pub system: Vec<ActionLoader>,
|
|
||||||
pub boot: Vec<ActionLoader>,
|
|
||||||
pub wake: Vec<ActionLoader>,
|
|
||||||
pub sleep: Vec<ActionLoader>,
|
|
||||||
pub shutdown: Vec<ActionLoader>,
|
|
||||||
pub brightness: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AnimeConfigV460> for AnimeConfig {
|
|
||||||
fn from(c: AnimeConfigV460) -> AnimeConfig {
|
|
||||||
AnimeConfig {
|
|
||||||
system: c.system,
|
|
||||||
boot: c.boot,
|
|
||||||
wake: c.wake,
|
|
||||||
shutdown: c.shutdown,
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
pub struct AnimeConfigV472 {
|
|
||||||
pub model_override: Option<AnimeType>,
|
|
||||||
pub system: Vec<ActionLoader>,
|
|
||||||
pub boot: Vec<ActionLoader>,
|
|
||||||
pub wake: Vec<ActionLoader>,
|
|
||||||
pub sleep: Vec<ActionLoader>,
|
|
||||||
pub shutdown: Vec<ActionLoader>,
|
|
||||||
pub brightness: f32,
|
|
||||||
pub display_enabled: bool,
|
|
||||||
pub display_brightness: Brightness,
|
|
||||||
pub builtin_anims_enabled: bool,
|
|
||||||
pub builtin_anims: Animations,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AnimeConfigV472> for AnimeConfig {
|
|
||||||
fn from(c: AnimeConfigV472) -> AnimeConfig {
|
|
||||||
AnimeConfig {
|
|
||||||
system: c.system,
|
|
||||||
boot: c.boot,
|
|
||||||
wake: c.wake,
|
|
||||||
shutdown: c.shutdown,
|
|
||||||
model_override: c.model_override,
|
|
||||||
display_enabled: c.display_enabled,
|
|
||||||
display_brightness: c.display_brightness,
|
|
||||||
builtin_anims_enabled: c.builtin_anims_enabled,
|
|
||||||
builtin_anims: c.builtin_anims,
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Default)]
|
#[derive(Deserialize, Serialize, Default)]
|
||||||
pub struct AnimeConfigCached {
|
pub struct AnimeConfigCached {
|
||||||
pub system: Vec<ActionData>,
|
pub system: Vec<ActionData>,
|
||||||
@@ -108,7 +54,6 @@ impl AnimeConfigCached {
|
|||||||
/// Config for base system actions for the anime display
|
/// Config for base system actions for the anime display
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
pub struct AnimeConfig {
|
pub struct AnimeConfig {
|
||||||
pub model_override: Option<AnimeType>,
|
|
||||||
pub system: Vec<ActionLoader>,
|
pub system: Vec<ActionLoader>,
|
||||||
pub boot: Vec<ActionLoader>,
|
pub boot: Vec<ActionLoader>,
|
||||||
pub wake: Vec<ActionLoader>,
|
pub wake: Vec<ActionLoader>,
|
||||||
@@ -127,7 +72,6 @@ pub struct AnimeConfig {
|
|||||||
impl Default for AnimeConfig {
|
impl Default for AnimeConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
AnimeConfig {
|
AnimeConfig {
|
||||||
model_override: None,
|
|
||||||
system: Vec::new(),
|
system: Vec::new(),
|
||||||
boot: Vec::new(),
|
boot: Vec::new(),
|
||||||
wake: Vec::new(),
|
wake: Vec::new(),
|
||||||
@@ -159,7 +103,7 @@ impl StdConfig for AnimeConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StdConfigLoad2<AnimeConfigV460, AnimeConfigV472> for AnimeConfig {}
|
impl StdConfigLoad for AnimeConfig {}
|
||||||
|
|
||||||
impl From<&AnimeConfig> for DeviceState {
|
impl From<&AnimeConfig> for DeviceState {
|
||||||
fn from(config: &AnimeConfig) -> Self {
|
fn from(config: &AnimeConfig) -> Self {
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ use std::sync::Arc;
|
|||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
|
|
||||||
use ::zbus::export::futures_util::lock::Mutex;
|
use ::zbus::export::futures_util::lock::Mutex;
|
||||||
use config_traits::{StdConfig, StdConfigLoad2};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rog_anime::error::AnimeError;
|
use rog_anime::error::AnimeError;
|
||||||
use rog_anime::usb::{
|
use rog_anime::usb::{
|
||||||
get_anime_type, pkt_flush, pkt_set_brightness, pkt_set_enable_display,
|
get_maybe_anime_type, pkt_flush, pkt_set_brightness, pkt_set_enable_display,
|
||||||
pkt_set_enable_powersave_anim, pkts_for_init, Brightness,
|
pkt_set_enable_powersave_anim, pkts_for_init, Brightness,
|
||||||
};
|
};
|
||||||
use rog_anime::{ActionData, AnimeDataBuffer, AnimePacketType, AnimeType};
|
use rog_anime::{ActionData, AnimeDataBuffer, AnimePacketType, AnimeType};
|
||||||
@@ -64,6 +64,12 @@ pub struct CtrlAnime {
|
|||||||
impl CtrlAnime {
|
impl CtrlAnime {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> Result<CtrlAnime, RogError> {
|
pub fn new() -> Result<CtrlAnime, RogError> {
|
||||||
|
let anime_type = get_maybe_anime_type()?;
|
||||||
|
if matches!(anime_type, AnimeType::Unsupported) {
|
||||||
|
info!("No Anime Matrix capable laptop found");
|
||||||
|
return Err(RogError::Anime(AnimeError::NoDevice));
|
||||||
|
}
|
||||||
|
|
||||||
let usb = USBRaw::new(0x193b).ok();
|
let usb = USBRaw::new(0x193b).ok();
|
||||||
let hid = HidRaw::new("193b").ok();
|
let hid = HidRaw::new("193b").ok();
|
||||||
let node = if usb.is_some() {
|
let node = if usb.is_some() {
|
||||||
@@ -91,13 +97,6 @@ impl CtrlAnime {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
let mut config = AnimeConfig::new().load();
|
let mut config = AnimeConfig::new().load();
|
||||||
let mut anime_type = get_anime_type()?;
|
|
||||||
if let AnimeType::Unknown = anime_type {
|
|
||||||
if let Some(model) = config.model_override {
|
|
||||||
warn!("Overriding the Animatrix type as {model:?}");
|
|
||||||
anime_type = model;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info!("Device has an AniMe Matrix display: {anime_type:?}");
|
info!("Device has an AniMe Matrix display: {anime_type:?}");
|
||||||
let mut cache = AnimeConfigCached::default();
|
let mut cache = AnimeConfigCached::default();
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ pub mod config;
|
|||||||
pub mod trait_impls;
|
pub mod trait_impls;
|
||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
|
use log::info;
|
||||||
use rog_platform::hid_raw::HidRaw;
|
use rog_platform::hid_raw::HidRaw;
|
||||||
use rog_platform::usb_raw::USBRaw;
|
use rog_platform::usb_raw::USBRaw;
|
||||||
use rog_slash::error::SlashError;
|
use rog_slash::error::SlashError;
|
||||||
use rog_slash::usb::{get_slash_type, pkt_set_mode, pkt_set_options, pkts_for_init};
|
use rog_slash::usb::{get_maybe_slash_type, pkt_set_mode, pkt_set_options, pkts_for_init};
|
||||||
use rog_slash::{SlashMode, SlashType};
|
use rog_slash::{SlashMode, SlashType};
|
||||||
|
|
||||||
use crate::ctrl_slash::config::SlashConfig;
|
use crate::ctrl_slash::config::SlashConfig;
|
||||||
@@ -39,8 +40,9 @@ pub struct CtrlSlash {
|
|||||||
impl CtrlSlash {
|
impl CtrlSlash {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> Result<CtrlSlash, RogError> {
|
pub fn new() -> Result<CtrlSlash, RogError> {
|
||||||
let slash_type = get_slash_type()?;
|
let slash_type = get_maybe_slash_type()?;
|
||||||
if matches!(slash_type, SlashType::Unknown | SlashType::Unsupported) {
|
if matches!(slash_type, SlashType::Unsupported) {
|
||||||
|
info!("No Slash capable laptop found");
|
||||||
return Err(RogError::Slash(SlashError::NoDevice));
|
return Err(RogError::Slash(SlashError::NoDevice));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +53,7 @@ impl CtrlSlash {
|
|||||||
} else if hid.is_some() {
|
} else if hid.is_some() {
|
||||||
unsafe { Node::Hid(hid.unwrap_unchecked()) }
|
unsafe { Node::Hid(hid.unwrap_unchecked()) }
|
||||||
} else {
|
} else {
|
||||||
return Err(RogError::NotSupported);
|
return Err(RogError::Slash(SlashError::NoDevice));
|
||||||
};
|
};
|
||||||
|
|
||||||
let ctrl = CtrlSlash {
|
let ctrl = CtrlSlash {
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ pub enum AnimeType {
|
|||||||
GA401,
|
GA401,
|
||||||
GA402,
|
GA402,
|
||||||
GU604,
|
GU604,
|
||||||
Unknown,
|
Unsupported,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for AnimeType {
|
impl FromStr for AnimeType {
|
||||||
@@ -73,7 +73,7 @@ impl FromStr for AnimeType {
|
|||||||
"ga401" | "GA401" => Self::GA401,
|
"ga401" | "GA401" => Self::GA401,
|
||||||
"ga402" | "GA402" => Self::GA402,
|
"ga402" | "GA402" => Self::GA402,
|
||||||
"gu604" | "GU604" => Self::GU604,
|
"gu604" | "GU604" => Self::GU604,
|
||||||
_ => Self::Unknown,
|
_ => Self::Unsupported,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
|||||||
|
|
||||||
let mut buffers = match anime.anime {
|
let mut buffers = match anime.anime {
|
||||||
AnimeType::GA401 => vec![[0; 640]; 2],
|
AnimeType::GA401 => vec![[0; 640]; 2],
|
||||||
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unknown => vec![[0; 640]; 3],
|
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unsupported => vec![[0; 640]; 3],
|
||||||
};
|
};
|
||||||
|
|
||||||
for (idx, chunk) in anime.data.as_slice().chunks(PANE_LEN).enumerate() {
|
for (idx, chunk) in anime.data.as_slice().chunks(PANE_LEN).enumerate() {
|
||||||
@@ -176,7 +176,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
|||||||
|
|
||||||
if matches!(
|
if matches!(
|
||||||
anime.anime,
|
anime.anime,
|
||||||
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unknown
|
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unsupported
|
||||||
) {
|
) {
|
||||||
buffers[2][..7].copy_from_slice(&USB_PREFIX3);
|
buffers[2][..7].copy_from_slice(&USB_PREFIX3);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,13 +241,13 @@ impl From<AnimShutdown> for i32 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `get_anime_type` is very broad, matching on part of the laptop board name
|
/// `get_maybe_anime_type` is very broad, matching on part of the laptop board
|
||||||
/// only. For this reason `find_node()` must be used also to verify if the USB
|
/// name only. For this reason `find_node()` must be used also to verify if the
|
||||||
/// device is available.
|
/// USB device is available.
|
||||||
///
|
///
|
||||||
/// The currently known USB device is `19b6`.
|
/// The currently known USB device is `19b6`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_anime_type() -> Result<AnimeType, AnimeError> {
|
pub fn get_maybe_anime_type() -> Result<AnimeType, AnimeError> {
|
||||||
let dmi = DMIID::new().map_err(|_| AnimeError::NoDevice)?; // TODO: better error
|
let dmi = DMIID::new().map_err(|_| AnimeError::NoDevice)?; // TODO: better error
|
||||||
let board_name = dmi.board_name;
|
let board_name = dmi.board_name;
|
||||||
|
|
||||||
@@ -258,8 +258,8 @@ pub fn get_anime_type() -> Result<AnimeType, AnimeError> {
|
|||||||
} else if board_name.contains("GU604V") {
|
} else if board_name.contains("GU604V") {
|
||||||
return Ok(AnimeType::GU604);
|
return Ok(AnimeType::GU604);
|
||||||
}
|
}
|
||||||
log::warn!("AniMe Matrix device found but not yet supported, will default to a GA402 layout");
|
log::warn!("AniMe Matrix device found but could be a slash");
|
||||||
Ok(AnimeType::Unknown)
|
Ok(AnimeType::Unsupported)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the two device initialization packets. These are required for device
|
/// Get the two device initialization packets. These are required for device
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use crate::error::SlashError;
|
|||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub enum SlashType {
|
pub enum SlashType {
|
||||||
GA403,
|
GA403,
|
||||||
Unknown,
|
GA605,
|
||||||
Unsupported,
|
Unsupported,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,7 +22,8 @@ impl FromStr for SlashType {
|
|||||||
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||||
Ok(match s {
|
Ok(match s {
|
||||||
"ga403" | "GA403" => Self::GA403,
|
"ga403" | "GA403" => Self::GA403,
|
||||||
_ => Self::Unknown,
|
"ga605" | "GA605" => Self::GA605,
|
||||||
|
_ => Self::Unsupported,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,12 +28,14 @@ pub type SlashUsbPacket = [u8; PACKET_SIZE];
|
|||||||
///
|
///
|
||||||
/// The currently known USB device is `193B`.
|
/// The currently known USB device is `193B`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_slash_type() -> Result<SlashType, SlashError> {
|
pub fn get_maybe_slash_type() -> Result<SlashType, SlashError> {
|
||||||
let dmi = DMIID::new().map_err(|_| SlashError::NoDevice)?; // TODO: better error
|
let dmi = DMIID::new().map_err(|_| SlashError::NoDevice)?; // TODO: better error
|
||||||
let board_name = dmi.board_name;
|
let board_name = dmi.board_name;
|
||||||
|
|
||||||
if board_name.contains("GA403") {
|
if board_name.contains("GA403") {
|
||||||
return Ok(SlashType::GA403);
|
return Ok(SlashType::GA403);
|
||||||
|
} else if board_name.contains("GA605") {
|
||||||
|
return Ok(SlashType::GA605);
|
||||||
}
|
}
|
||||||
Ok(SlashType::Unsupported)
|
Ok(SlashType::Unsupported)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ impl AniMatrix {
|
|||||||
vertical: 2,
|
vertical: 2,
|
||||||
horizontal: 5,
|
horizontal: 5,
|
||||||
},
|
},
|
||||||
AnimeType::GA402 | AnimeType::Unknown => LedShape {
|
AnimeType::GA402 | AnimeType::Unsupported => LedShape {
|
||||||
vertical: 2,
|
vertical: 2,
|
||||||
horizontal: 5,
|
horizontal: 5,
|
||||||
},
|
},
|
||||||
@@ -56,7 +56,7 @@ impl AniMatrix {
|
|||||||
// Do a hard mapping of each (derived from wireshardk captures)
|
// Do a hard mapping of each (derived from wireshardk captures)
|
||||||
let rows = match model {
|
let rows = match model {
|
||||||
AnimeType::GA401 => GA401.to_vec(),
|
AnimeType::GA401 => GA401.to_vec(),
|
||||||
AnimeType::GA402 | AnimeType::Unknown => GA402.to_vec(),
|
AnimeType::GA402 | AnimeType::Unsupported => GA402.to_vec(),
|
||||||
AnimeType::GU604 => GU604.to_vec(),
|
AnimeType::GU604 => GU604.to_vec(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user