mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Try to re-get AniMe dev handle on write error
This commit is contained in:
@@ -13,11 +13,7 @@ use rog_anime::{
|
|||||||
};
|
};
|
||||||
use rog_supported::AnimeSupportedFunctions;
|
use rog_supported::AnimeSupportedFunctions;
|
||||||
use rusb::{Device, DeviceHandle};
|
use rusb::{Device, DeviceHandle};
|
||||||
use std::{
|
use std::{cell::{RefCell}, error::Error, sync::{Arc, Mutex}, thread::sleep};
|
||||||
error::Error,
|
|
||||||
sync::{Arc, Mutex},
|
|
||||||
thread::sleep,
|
|
||||||
};
|
|
||||||
use std::{
|
use std::{
|
||||||
sync::atomic::{AtomicBool, Ordering},
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
@@ -36,7 +32,7 @@ impl GetSupported for CtrlAnime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct CtrlAnime {
|
pub struct CtrlAnime {
|
||||||
handle: DeviceHandle<rusb::GlobalContext>,
|
handle: RefCell<DeviceHandle<rusb::GlobalContext>>,
|
||||||
cache: AnimeConfigCached,
|
cache: AnimeConfigCached,
|
||||||
config: AnimeConfig,
|
config: AnimeConfig,
|
||||||
// set to force thread to exit
|
// set to force thread to exit
|
||||||
@@ -48,6 +44,25 @@ pub struct CtrlAnime {
|
|||||||
impl CtrlAnime {
|
impl CtrlAnime {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(config: AnimeConfig) -> Result<CtrlAnime, Box<dyn Error>> {
|
pub fn new(config: AnimeConfig) -> Result<CtrlAnime, Box<dyn Error>> {
|
||||||
|
let device = Self::get_dev_handle()?;
|
||||||
|
|
||||||
|
info!("Device has an AniMe Matrix display");
|
||||||
|
let mut cache = AnimeConfigCached::default();
|
||||||
|
cache.init_from_config(&config)?;
|
||||||
|
|
||||||
|
let ctrl = CtrlAnime {
|
||||||
|
handle: RefCell::new(device),
|
||||||
|
cache,
|
||||||
|
config,
|
||||||
|
thread_exit: Arc::new(AtomicBool::new(false)),
|
||||||
|
thread_running: Arc::new(AtomicBool::new(false)),
|
||||||
|
};
|
||||||
|
ctrl.do_initialization();
|
||||||
|
|
||||||
|
Ok(ctrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_dev_handle() -> Result<DeviceHandle<rusb::GlobalContext>, Box<dyn Error>> {
|
||||||
// We don't expect this ID to ever change
|
// We don't expect this ID to ever change
|
||||||
let device = CtrlAnime::get_device(0x0b05, 0x193b)?;
|
let device = CtrlAnime::get_device(0x0b05, 0x193b)?;
|
||||||
|
|
||||||
@@ -64,20 +79,7 @@ impl CtrlAnime {
|
|||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
info!("Device has an AniMe Matrix display");
|
Ok(device)
|
||||||
let mut cache = AnimeConfigCached::default();
|
|
||||||
cache.init_from_config(&config)?;
|
|
||||||
|
|
||||||
let ctrl = CtrlAnime {
|
|
||||||
handle: device,
|
|
||||||
cache,
|
|
||||||
config,
|
|
||||||
thread_exit: Arc::new(AtomicBool::new(false)),
|
|
||||||
thread_running: Arc::new(AtomicBool::new(false)),
|
|
||||||
};
|
|
||||||
ctrl.do_initialization();
|
|
||||||
|
|
||||||
Ok(ctrl)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_device(vendor: u16, product: u16) -> Result<Device<rusb::GlobalContext>, rusb::Error> {
|
fn get_device(vendor: u16, product: u16) -> Result<Device<rusb::GlobalContext>, rusb::Error> {
|
||||||
@@ -186,7 +188,9 @@ impl CtrlAnime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn write_bytes(&self, message: &[u8]) {
|
fn write_bytes(&self, message: &[u8]) {
|
||||||
match self.handle.write_control(
|
let mut error = false;
|
||||||
|
|
||||||
|
match self.handle.borrow().write_control(
|
||||||
0x21, // request_type
|
0x21, // request_type
|
||||||
0x09, // request
|
0x09, // request
|
||||||
0x35e, // value
|
0x35e, // value
|
||||||
@@ -197,9 +201,24 @@ impl CtrlAnime {
|
|||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) => match err {
|
Err(err) => match err {
|
||||||
rusb::Error::Timeout => {}
|
rusb::Error::Timeout => {}
|
||||||
_ => error!("Failed to write to led interrupt: {}", err),
|
_ => {
|
||||||
|
error = true;
|
||||||
|
error!("Failed to write to led interrupt: {}", err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if error {
|
||||||
|
warn!("Will attempt to get AniMe device handle again");
|
||||||
|
match Self::get_dev_handle() {
|
||||||
|
Ok(dev) => {
|
||||||
|
self.handle.replace(dev);
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("Failed to get AniMe device: {}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write only a data packet. This will modify the leds brightness using the
|
/// Write only a data packet. This will modify the leds brightness using the
|
||||||
|
|||||||
Reference in New Issue
Block a user