mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Writing an interrupt seems so slow...
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -138,9 +138,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dbus"
|
name = "dbus"
|
||||||
version = "0.8.2"
|
version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38f8875bb7afbc20dec12db09e18af3dcbd672b08592d2932950326a6437c616"
|
checksum = "add8dd36d6d34a084220eb9fe216d3e230d52b37c31702e1ffda4fb2d4ef950e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"libdbus-sys",
|
"libdbus-sys",
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ path = "src/main.rs"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rusb = "^0.5.5"
|
rusb = "^0.5.5"
|
||||||
gumdrop = "^0.8.0"
|
gumdrop = "^0.8.0"
|
||||||
dbus = "^0.8.2"
|
dbus = "^0.7.1"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
toml = "0.5"
|
toml = "0.5"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
key_colours.set(Key::X, 255, 0, 0);
|
key_colours.set(Key::X, 255, 0, 0);
|
||||||
per_key_led.push(key_colours.clone());
|
per_key_led.push(key_colours.clone());
|
||||||
|
|
||||||
for _ in 0..51 {
|
for _ in 0..49 {
|
||||||
*key_colours.key(Key::ROG).0 -= 5;
|
*key_colours.key(Key::ROG).0 -= 5;
|
||||||
*key_colours.key(Key::L).0 -= 5;
|
*key_colours.key(Key::L).0 -= 5;
|
||||||
*key_colours.key(Key::I).0 -= 5;
|
*key_colours.key(Key::I).0 -= 5;
|
||||||
@@ -39,7 +39,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
*key_colours.key(Key::X).0 -= 5;
|
*key_colours.key(Key::X).0 -= 5;
|
||||||
per_key_led.push(key_colours.clone());
|
per_key_led.push(key_colours.clone());
|
||||||
}
|
}
|
||||||
for _ in 0..51 {
|
for _ in 0..49 {
|
||||||
*key_colours.key(Key::ROG).0 += 5;
|
*key_colours.key(Key::ROG).0 += 5;
|
||||||
*key_colours.key(Key::L).0 += 5;
|
*key_colours.key(Key::L).0 += 5;
|
||||||
*key_colours.key(Key::I).0 += 5;
|
*key_colours.key(Key::I).0 += 5;
|
||||||
@@ -49,7 +49,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
per_key_led.push(key_colours.clone());
|
per_key_led.push(key_colours.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let time = time::Duration::from_millis(2);
|
let time = time::Duration::from_millis(1000);
|
||||||
|
|
||||||
let row = KeyColourArray::get_init_msg();
|
let row = KeyColourArray::get_init_msg();
|
||||||
let msg =
|
let msg =
|
||||||
@@ -57,17 +57,26 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
bus.send(msg).unwrap();
|
bus.send(msg).unwrap();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
let now = std::time::Instant::now();
|
||||||
|
thread::sleep(time);
|
||||||
|
|
||||||
for group in &per_key_led {
|
for group in &per_key_led {
|
||||||
for row in group.get() {
|
let group = group.get();
|
||||||
thread::sleep(time);
|
let msg = Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledeffect")?
|
||||||
let msg = Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledmessage")?
|
.append1(&group[0].to_vec())
|
||||||
.append1(row.to_vec());
|
.append1(&group[1].to_vec())
|
||||||
bus.send(msg).unwrap();
|
.append1(&group[2].to_vec())
|
||||||
// if let Some(reply) = r.get1::<&str>() {
|
.append1(&group[3].to_vec())
|
||||||
// println!("Success: {:x?}", reply);
|
.append1(&group[4].to_vec())
|
||||||
// return Ok(());
|
.append1(&group[5].to_vec())
|
||||||
// }
|
.append1(&group[6].to_vec())
|
||||||
}
|
.append1(&group[7].to_vec())
|
||||||
|
.append1(&group[8].to_vec())
|
||||||
|
.append1(&group[9].to_vec());
|
||||||
|
bus.send(msg).unwrap();
|
||||||
}
|
}
|
||||||
|
let after = std::time::Instant::now();
|
||||||
|
let diff = after.duration_since(now);
|
||||||
|
dbg!(diff.as_millis());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ impl RogCore {
|
|||||||
Err(AuraError::UsbError(rusb::Error::NoDevice))
|
Err(AuraError::UsbError(rusb::Error::NoDevice))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> {
|
pub fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> {
|
||||||
self.handle
|
self.handle
|
||||||
.write_interrupt(self.led_endpoint, message, Duration::from_micros(1))
|
.write_interrupt(self.led_endpoint, message, Duration::from_micros(1))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|||||||
118
src/daemon.rs
118
src/daemon.rs
@@ -8,9 +8,9 @@ use dbus::{
|
|||||||
tree::{Factory, MethodErr},
|
tree::{Factory, MethodErr},
|
||||||
};
|
};
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::rc::Rc;
|
||||||
use std::thread;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
pub fn start_daemon() -> Result<(), Box<dyn Error>> {
|
pub fn start_daemon() -> Result<(), Box<dyn Error>> {
|
||||||
@@ -39,40 +39,89 @@ pub fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
connection.request_name(DBUS_IFACE, false, true, false)?;
|
connection.request_name(DBUS_IFACE, false, true, false)?;
|
||||||
let factory = Factory::new_sync::<()>();
|
let factory = Factory::new_fn::<()>();
|
||||||
|
|
||||||
let input: Arc<Mutex<Option<Vec<u8>>>> = Arc::new(Mutex::new(None));
|
let input: Rc<RefCell<Option<Vec<u8>>>> = Rc::new(RefCell::new(None));
|
||||||
|
let effect: Rc<RefCell<Option<Vec<Vec<u8>>>>> = Rc::new(RefCell::new(None));
|
||||||
|
|
||||||
let tree = factory.tree(()).add(
|
let tree = factory.tree(()).add(
|
||||||
factory.object_path(DBUS_PATH, ()).add(
|
factory.object_path(DBUS_PATH, ()).add(
|
||||||
factory.interface(DBUS_IFACE, ()).add_m(
|
factory
|
||||||
factory
|
.interface(DBUS_IFACE, ())
|
||||||
// method for ledmessage
|
.add_m(
|
||||||
.method("ledmessage", (), {
|
factory
|
||||||
let input = input.clone();
|
// method for ledmessage
|
||||||
|
.method("ledmessage", (), {
|
||||||
|
let input = input.clone();
|
||||||
|
|
||||||
move |m| {
|
move |m| {
|
||||||
let bytes: Vec<u8> = m.msg.read1()?;
|
let bytes: Vec<u8> = m.msg.read1()?;
|
||||||
if let Ok(mut lock) = input.lock() {
|
if let Ok(mut lock) = input.try_borrow_mut() {
|
||||||
*lock = Some(bytes.to_vec());
|
*lock = Some(bytes.to_vec());
|
||||||
let mret = m
|
let mret = m
|
||||||
.msg
|
.msg
|
||||||
.method_return()
|
.method_return()
|
||||||
.append1(&format!("Wrote {:x?}", bytes));
|
.append1(&format!("Wrote {:x?}", bytes));
|
||||||
return Ok(vec![mret]);
|
return Ok(vec![mret]);
|
||||||
} else {
|
} else {
|
||||||
return Err(MethodErr::failed("Could not lock daemon for access"));
|
return Err(MethodErr::failed(
|
||||||
|
"Could not lock daemon for access",
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.outarg::<&str, _>("reply")
|
||||||
.outarg::<&str, _>("reply")
|
.inarg::<Vec<u8>, _>("bytearray"),
|
||||||
.inarg::<Vec<u8>, _>("bytearray"),
|
)
|
||||||
),
|
.add_m(
|
||||||
|
factory
|
||||||
|
// method for ledmessage
|
||||||
|
.method("ledeffect", (), {
|
||||||
|
let effect = effect.clone();
|
||||||
|
move |m| {
|
||||||
|
if let Ok(mut lock) = effect.try_borrow_mut() {
|
||||||
|
let mut iter = m.msg.iter_init();
|
||||||
|
let byte_array: Vec<Vec<u8>> = vec![
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
iter.read()?,
|
||||||
|
];
|
||||||
|
|
||||||
|
*lock = Some(byte_array);
|
||||||
|
let mret =
|
||||||
|
m.msg.method_return().append1(&format!("Got effect part"));
|
||||||
|
return Ok(vec![mret]);
|
||||||
|
} else {
|
||||||
|
return Err(MethodErr::failed(
|
||||||
|
"Could not lock daemon for access",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.outarg::<&str, _>("reply")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray")
|
||||||
|
.inarg::<Vec<u8>, _>("bytearray"),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// We add the tree to the connection so that incoming method calls will be handled.
|
// We add the tree to the connection so that incoming method calls will be handled.
|
||||||
tree.start_receive_send(&connection);
|
tree.start_receive(&connection);
|
||||||
|
|
||||||
//thread::spawn(move || loop {});
|
//thread::spawn(move || loop {});
|
||||||
|
|
||||||
@@ -80,18 +129,31 @@ pub fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
loop {
|
loop {
|
||||||
//thread::sleep(Duration::from_millis(2));
|
//thread::sleep(Duration::from_millis(2));
|
||||||
connection
|
connection
|
||||||
.process(Duration::from_millis(20))
|
.process(Duration::from_millis(1))
|
||||||
.unwrap_or_else(|err| {
|
.unwrap_or_else(|err| {
|
||||||
error!("{:?}", err);
|
error!("{:?}", err);
|
||||||
false
|
false
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Ok(mut lock) = input.try_lock() {
|
if let Ok(mut lock) = input.try_borrow_mut() {
|
||||||
if let Some(bytes) = &*lock {
|
if let Some(bytes) = &*lock {
|
||||||
rogcore.aura_set_and_save(&supported, &bytes)?;
|
rogcore.aura_set_and_save(&supported, &bytes)?;
|
||||||
*lock = None;
|
*lock = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Ok(mut lock) = effect.try_borrow_mut() {
|
||||||
|
if let Some(bytes) = &*lock {
|
||||||
|
// It takes up to 20 milliseconds to write a complete colour block...
|
||||||
|
//let now = std::time::Instant::now();
|
||||||
|
for row in bytes {
|
||||||
|
rogcore.aura_write(&row)?;
|
||||||
|
}
|
||||||
|
*lock = None;
|
||||||
|
//let after = std::time::Instant::now();
|
||||||
|
//let diff = after.duration_since(now);
|
||||||
|
//dbg!(diff.as_millis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match laptop.run(&mut rogcore) {
|
match laptop.run(&mut rogcore) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
|||||||
@@ -34,25 +34,23 @@ impl LaptopGX502 {
|
|||||||
key_colours.set(Key::X, 255, 0, 0);
|
key_colours.set(Key::X, 255, 0, 0);
|
||||||
per_key_led.push(key_colours.clone());
|
per_key_led.push(key_colours.clone());
|
||||||
|
|
||||||
for _ in 0..3 {
|
for _ in 0..49 {
|
||||||
for _ in 0..50 {
|
*key_colours.key(Key::ROG).0 -= 5;
|
||||||
*key_colours.key(Key::ROG).0 -= 5;
|
*key_colours.key(Key::L).0 -= 5;
|
||||||
*key_colours.key(Key::L).0 -= 5;
|
*key_colours.key(Key::I).0 -= 5;
|
||||||
*key_colours.key(Key::I).0 -= 5;
|
*key_colours.key(Key::N).0 -= 5;
|
||||||
*key_colours.key(Key::N).0 -= 5;
|
*key_colours.key(Key::U).0 -= 5;
|
||||||
*key_colours.key(Key::U).0 -= 5;
|
*key_colours.key(Key::X).0 -= 5;
|
||||||
*key_colours.key(Key::X).0 -= 5;
|
per_key_led.push(key_colours.clone());
|
||||||
per_key_led.push(key_colours.clone());
|
}
|
||||||
}
|
for _ in 0..49 {
|
||||||
for _ in 0..50 {
|
*key_colours.key(Key::ROG).0 += 5;
|
||||||
*key_colours.key(Key::ROG).0 += 5;
|
*key_colours.key(Key::L).0 += 5;
|
||||||
*key_colours.key(Key::L).0 += 5;
|
*key_colours.key(Key::I).0 += 5;
|
||||||
*key_colours.key(Key::I).0 += 5;
|
*key_colours.key(Key::N).0 += 5;
|
||||||
*key_colours.key(Key::N).0 += 5;
|
*key_colours.key(Key::U).0 += 5;
|
||||||
*key_colours.key(Key::U).0 += 5;
|
*key_colours.key(Key::X).0 += 5;
|
||||||
*key_colours.key(Key::X).0 += 5;
|
per_key_led.push(key_colours.clone());
|
||||||
per_key_led.push(key_colours.clone());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find backlight
|
// Find backlight
|
||||||
|
|||||||
Reference in New Issue
Block a user