mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Try reorder of init loop
This commit is contained in:
@@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
## [0.14.4] - 2020-07-07
|
||||||
|
### Changed
|
||||||
|
- Changes to the way rog-core is initialised
|
||||||
|
|
||||||
## [0.14.3] - 2020-05-07
|
## [0.14.3] - 2020-05-07
|
||||||
### Changed
|
### Changed
|
||||||
- Proper fix of laptop mode conversion bug
|
- Proper fix of laptop mode conversion bug
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const SET: u8 = 0xc4;
|
|||||||
|
|
||||||
use log::{error, warn};
|
use log::{error, warn};
|
||||||
use rog_client::error::AuraError;
|
use rog_client::error::AuraError;
|
||||||
use rusb::DeviceHandle;
|
use rusb::{Device, DeviceHandle};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@@ -33,34 +33,41 @@ impl AniMeWriter {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> Result<AniMeWriter, Box<dyn Error>> {
|
pub fn new() -> Result<AniMeWriter, Box<dyn Error>> {
|
||||||
// We don't expect this ID to ever change
|
// We don't expect this ID to ever change
|
||||||
let mut dev_handle = AniMeWriter::get_device(0x0b05, 0x193b).map_err(|err| {
|
let device = AniMeWriter::get_device(0x0b05, 0x193b).map_err(|err| {
|
||||||
warn!("Could not get AniMe display handle: {:?}", err);
|
warn!("Could not get AniMe display handle: {:?}", err);
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
dev_handle.reset()?;
|
|
||||||
// This config seems to be the required device config for writing
|
|
||||||
dev_handle.set_active_configuration(1).unwrap_or(());
|
|
||||||
|
|
||||||
// For the animatrix device there is only one interface and one endpoint
|
let mut device = device.open()?;
|
||||||
let interface = 0;
|
device.reset()?;
|
||||||
|
|
||||||
dev_handle
|
device.set_auto_detach_kernel_driver(true).map_err(|err| {
|
||||||
.set_auto_detach_kernel_driver(true)
|
error!("Auto-detach kernel driver failed: {:?}", err);
|
||||||
.map_err(|err| {
|
err
|
||||||
error!("Auto-detach kernel driver failed: {:?}", err);
|
})?;
|
||||||
err
|
|
||||||
})?;
|
device.claim_interface(0).map_err(|err| {
|
||||||
dev_handle.claim_interface(interface).map_err(|err| {
|
|
||||||
error!("Could not claim device interface: {:?}", err);
|
error!("Could not claim device interface: {:?}", err);
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(AniMeWriter {
|
Ok(AniMeWriter {
|
||||||
handle: dev_handle,
|
handle: device,
|
||||||
initialised: false,
|
initialised: false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn get_device(vendor: u16, product: u16) -> Result<Device<rusb::GlobalContext>, rusb::Error> {
|
||||||
|
for device in rusb::devices()?.iter() {
|
||||||
|
let device_desc = device.device_descriptor()?;
|
||||||
|
if device_desc.vendor_id() == vendor && device_desc.product_id() == product {
|
||||||
|
return Ok(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(rusb::Error::NoDevice)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn do_command(&mut self, command: AnimatrixCommand) -> Result<(), AuraError> {
|
pub async fn do_command(&mut self, command: AnimatrixCommand) -> Result<(), AuraError> {
|
||||||
if !self.initialised {
|
if !self.initialised {
|
||||||
self.do_initialization().await?
|
self.do_initialization().await?
|
||||||
@@ -125,21 +132,6 @@ impl AniMeWriter {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: save/reload last frame
|
|
||||||
#[inline]
|
|
||||||
fn get_device(
|
|
||||||
vendor: u16,
|
|
||||||
product: u16,
|
|
||||||
) -> Result<DeviceHandle<rusb::GlobalContext>, rusb::Error> {
|
|
||||||
for device in rusb::devices()?.iter() {
|
|
||||||
let device_desc = device.device_descriptor()?;
|
|
||||||
if device_desc.vendor_id() == vendor && device_desc.product_id() == product {
|
|
||||||
return device.open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(rusb::Error::NoDevice)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
async fn do_initialization(&mut self) -> Result<(), AuraError> {
|
async fn do_initialization(&mut self) -> Result<(), AuraError> {
|
||||||
let mut init = [0; PACKET_SIZE];
|
let mut init = [0; PACKET_SIZE];
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use crate::{config::Config, error::RogError, virt_device::VirtKeys};
|
use crate::{config::Config, error::RogError, virt_device::VirtKeys};
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rusb::DeviceHandle;
|
use rusb::{Device, DeviceHandle};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::OpenOptions;
|
use std::fs::OpenOptions;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
@@ -35,16 +35,17 @@ pub struct RogCore {
|
|||||||
|
|
||||||
impl RogCore {
|
impl RogCore {
|
||||||
pub fn new(vendor: u16, product: u16, match_endpoint: u8) -> Result<RogCore, Box<dyn Error>> {
|
pub fn new(vendor: u16, product: u16, match_endpoint: u8) -> Result<RogCore, Box<dyn Error>> {
|
||||||
let mut dev_handle = RogCore::get_device(vendor, product).map_err(|err| {
|
let device = RogCore::get_device(vendor, product).map_err(|err| {
|
||||||
error!("Could not get keyboard device handle: {:?}", err);
|
error!("Could not find keyboard device: {:?}", err);
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
dev_handle.set_active_configuration(0).unwrap_or(());
|
|
||||||
|
|
||||||
let dev_config = dev_handle.device().config_descriptor(0).map_err(|err| {
|
let dev_config = device.config_descriptor(0).map_err(|err| {
|
||||||
error!("Could not get keyboard device config: {:?}", err);
|
error!("Could not get keyboard device config: {:?}", err);
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
|
info!("ACTIVE CONFIG: {:?}", dev_config.number());
|
||||||
|
|
||||||
// Interface with outputs
|
// Interface with outputs
|
||||||
let mut interface = 2; // The interface with keyboard consumer device and LED control
|
let mut interface = 2; // The interface with keyboard consumer device and LED control
|
||||||
// is #2 on 0x1866 device at least
|
// is #2 on 0x1866 device at least
|
||||||
@@ -65,39 +66,29 @@ impl RogCore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Err(err) = dev_handle.set_auto_detach_kernel_driver(true) {
|
let mut device = device.open().map_err(|err| {
|
||||||
|
error!("Could not open device: {:?}", err);
|
||||||
|
err
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if let Err(err) = device.set_auto_detach_kernel_driver(true) {
|
||||||
warn!("Auto-detach kernel driver failed: {:?}", err);
|
warn!("Auto-detach kernel driver failed: {:?}", err);
|
||||||
let mut fail_count = 5;
|
warn!("Trying device reset");
|
||||||
while fail_count > 0 {
|
device.reset()?;
|
||||||
warn!("Trying device reset");
|
std::thread::sleep(std::time::Duration::from_millis(500));
|
||||||
fail_count -= 1;
|
device.set_auto_detach_kernel_driver(true)?;
|
||||||
dev_handle.reset()?;
|
|
||||||
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
||||||
dev_handle
|
|
||||||
.set_auto_detach_kernel_driver(true)
|
|
||||||
.map_err(|err| {
|
|
||||||
error!("Auto-detach kernel driver failed: {:?}", err);
|
|
||||||
err
|
|
||||||
})?;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Err(err) = dev_handle.claim_interface(interface) {
|
if let Err(err) = device.claim_interface(interface) {
|
||||||
warn!("Could not claim keyboard device interface: {:?}", err);
|
warn!("Could not claim keyboard device interface: {:?}", err);
|
||||||
let mut fail_count = 5;
|
warn!("Sleeping 5 seconds");
|
||||||
while fail_count > 0 {
|
std::thread::sleep(std::time::Duration::from_millis(5000));
|
||||||
warn!("Sleeping");
|
device.claim_interface(interface)?;
|
||||||
fail_count -= 1;
|
|
||||||
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
||||||
dev_handle.claim_interface(interface).map_err(|err| {
|
|
||||||
error!("Could not claim keyboard device interface: {:?}", err);
|
|
||||||
err
|
|
||||||
})?;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// std::thread::sleep(std::time::Duration::from_millis(500));
|
||||||
Ok(RogCore {
|
Ok(RogCore {
|
||||||
handle: dev_handle,
|
handle: device,
|
||||||
virt_keys: VirtKeys::new(),
|
virt_keys: VirtKeys::new(),
|
||||||
_pin: PhantomPinned,
|
_pin: PhantomPinned,
|
||||||
})
|
})
|
||||||
@@ -107,14 +98,11 @@ impl RogCore {
|
|||||||
&mut self.virt_keys
|
&mut self.virt_keys
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_device(
|
fn get_device(vendor: u16, product: u16) -> Result<Device<rusb::GlobalContext>, rusb::Error> {
|
||||||
vendor: u16,
|
|
||||||
product: u16,
|
|
||||||
) -> Result<DeviceHandle<rusb::GlobalContext>, rusb::Error> {
|
|
||||||
for device in rusb::devices()?.iter() {
|
for device in rusb::devices()?.iter() {
|
||||||
let device_desc = device.device_descriptor()?;
|
let device_desc = device.device_descriptor()?;
|
||||||
if device_desc.vendor_id() == vendor && device_desc.product_id() == product {
|
if device_desc.vendor_id() == vendor && device_desc.product_id() == product {
|
||||||
return device.open();
|
return Ok(device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(rusb::Error::NoDevice)
|
Err(rusb::Error::NoDevice)
|
||||||
|
|||||||
Reference in New Issue
Block a user