Try to re-get AniMe dev handle on write error

This commit is contained in:
Luke D. Jones
2021-08-27 22:31:50 +12:00
parent a13dedf500
commit 6aba60f604

View File

@@ -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