Try reorder of init loop

This commit is contained in:
Luke
2020-07-08 08:19:11 +12:00
parent 857ef8bcb8
commit dbc5901cb6
3 changed files with 50 additions and 66 deletions

View File

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

View File

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

View File

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