From 9846437efbe61a761b00e1eb9351c003c5011b16 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 24 Apr 2020 23:14:09 +1200 Subject: [PATCH] Writing an interrupt seems so slow... --- Cargo.lock | 4 +- Cargo.toml | 2 +- examples/per-key-effect.rs | 35 +++++++---- src/core.rs | 2 +- src/daemon.rs | 118 ++++++++++++++++++++++++++++--------- src/laptops/gx502.rs | 36 ++++++----- 6 files changed, 133 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1843975..d29f43f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "dbus" -version = "0.8.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f8875bb7afbc20dec12db09e18af3dcbd672b08592d2932950326a6437c616" +checksum = "add8dd36d6d34a084220eb9fe216d3e230d52b37c31702e1ffda4fb2d4ef950e" dependencies = [ "libc", "libdbus-sys", diff --git a/Cargo.toml b/Cargo.toml index 48639eff..d988d094 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ path = "src/main.rs" [dependencies] rusb = "^0.5.5" gumdrop = "^0.8.0" -dbus = "^0.8.2" +dbus = "^0.7.1" serde = "1.0" serde_derive = "1.0" toml = "0.5" diff --git a/examples/per-key-effect.rs b/examples/per-key-effect.rs index 6b62ea47..21ef31a9 100644 --- a/examples/per-key-effect.rs +++ b/examples/per-key-effect.rs @@ -30,7 +30,7 @@ fn main() -> Result<(), Box> { key_colours.set(Key::X, 255, 0, 0); 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::L).0 -= 5; *key_colours.key(Key::I).0 -= 5; @@ -39,7 +39,7 @@ fn main() -> Result<(), Box> { *key_colours.key(Key::X).0 -= 5; 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::L).0 += 5; *key_colours.key(Key::I).0 += 5; @@ -49,7 +49,7 @@ fn main() -> Result<(), Box> { 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 msg = @@ -57,17 +57,26 @@ fn main() -> Result<(), Box> { bus.send(msg).unwrap(); loop { + let now = std::time::Instant::now(); + thread::sleep(time); + for group in &per_key_led { - for row in group.get() { - thread::sleep(time); - let msg = Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledmessage")? - .append1(row.to_vec()); - bus.send(msg).unwrap(); - // if let Some(reply) = r.get1::<&str>() { - // println!("Success: {:x?}", reply); - // return Ok(()); - // } - } + let group = group.get(); + let msg = Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledeffect")? + .append1(&group[0].to_vec()) + .append1(&group[1].to_vec()) + .append1(&group[2].to_vec()) + .append1(&group[3].to_vec()) + .append1(&group[4].to_vec()) + .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()); } } diff --git a/src/core.rs b/src/core.rs index ab39d0c7..3d3edf8f 100644 --- a/src/core.rs +++ b/src/core.rs @@ -127,7 +127,7 @@ impl RogCore { 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 .write_interrupt(self.led_endpoint, message, Duration::from_micros(1)) .unwrap(); diff --git a/src/daemon.rs b/src/daemon.rs index 6596c403..f842ab22 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -8,9 +8,9 @@ use dbus::{ tree::{Factory, MethodErr}, }; use log::{error, info, warn}; +use std::cell::RefCell; use std::error::Error; -use std::sync::{Arc, Mutex}; -use std::thread; +use std::rc::Rc; use std::time::Duration; pub fn start_daemon() -> Result<(), Box> { @@ -39,40 +39,89 @@ pub fn start_daemon() -> Result<(), Box> { }, ); connection.request_name(DBUS_IFACE, false, true, false)?; - let factory = Factory::new_sync::<()>(); + let factory = Factory::new_fn::<()>(); - let input: Arc>>> = Arc::new(Mutex::new(None)); + let input: Rc>>> = Rc::new(RefCell::new(None)); + let effect: Rc>>>> = Rc::new(RefCell::new(None)); let tree = factory.tree(()).add( factory.object_path(DBUS_PATH, ()).add( - factory.interface(DBUS_IFACE, ()).add_m( - factory - // method for ledmessage - .method("ledmessage", (), { - let input = input.clone(); + factory + .interface(DBUS_IFACE, ()) + .add_m( + factory + // method for ledmessage + .method("ledmessage", (), { + let input = input.clone(); - move |m| { - let bytes: Vec = m.msg.read1()?; - if let Ok(mut lock) = input.lock() { - *lock = Some(bytes.to_vec()); - let mret = m - .msg - .method_return() - .append1(&format!("Wrote {:x?}", bytes)); - return Ok(vec![mret]); - } else { - return Err(MethodErr::failed("Could not lock daemon for access")); + move |m| { + let bytes: Vec = m.msg.read1()?; + if let Ok(mut lock) = input.try_borrow_mut() { + *lock = Some(bytes.to_vec()); + let mret = m + .msg + .method_return() + .append1(&format!("Wrote {:x?}", bytes)); + return Ok(vec![mret]); + } else { + return Err(MethodErr::failed( + "Could not lock daemon for access", + )); + } } - } - }) - .outarg::<&str, _>("reply") - .inarg::, _>("bytearray"), - ), + }) + .outarg::<&str, _>("reply") + .inarg::, _>("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![ + 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::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray") + .inarg::, _>("bytearray"), + ), ), ); // 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 {}); @@ -80,18 +129,31 @@ pub fn start_daemon() -> Result<(), Box> { loop { //thread::sleep(Duration::from_millis(2)); connection - .process(Duration::from_millis(20)) + .process(Duration::from_millis(1)) .unwrap_or_else(|err| { error!("{:?}", err); false }); - if let Ok(mut lock) = input.try_lock() { + if let Ok(mut lock) = input.try_borrow_mut() { if let Some(bytes) = &*lock { rogcore.aura_set_and_save(&supported, &bytes)?; *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) { Ok(_) => {} diff --git a/src/laptops/gx502.rs b/src/laptops/gx502.rs index cee599f2..1de8577f 100644 --- a/src/laptops/gx502.rs +++ b/src/laptops/gx502.rs @@ -34,25 +34,23 @@ impl LaptopGX502 { key_colours.set(Key::X, 255, 0, 0); per_key_led.push(key_colours.clone()); - for _ in 0..3 { - for _ in 0..50 { - *key_colours.key(Key::ROG).0 -= 5; - *key_colours.key(Key::L).0 -= 5; - *key_colours.key(Key::I).0 -= 5; - *key_colours.key(Key::N).0 -= 5; - *key_colours.key(Key::U).0 -= 5; - *key_colours.key(Key::X).0 -= 5; - per_key_led.push(key_colours.clone()); - } - for _ in 0..50 { - *key_colours.key(Key::ROG).0 += 5; - *key_colours.key(Key::L).0 += 5; - *key_colours.key(Key::I).0 += 5; - *key_colours.key(Key::N).0 += 5; - *key_colours.key(Key::U).0 += 5; - *key_colours.key(Key::X).0 += 5; - per_key_led.push(key_colours.clone()); - } + for _ in 0..49 { + *key_colours.key(Key::ROG).0 -= 5; + *key_colours.key(Key::L).0 -= 5; + *key_colours.key(Key::I).0 -= 5; + *key_colours.key(Key::N).0 -= 5; + *key_colours.key(Key::U).0 -= 5; + *key_colours.key(Key::X).0 -= 5; + per_key_led.push(key_colours.clone()); + } + for _ in 0..49 { + *key_colours.key(Key::ROG).0 += 5; + *key_colours.key(Key::L).0 += 5; + *key_colours.key(Key::I).0 += 5; + *key_colours.key(Key::N).0 += 5; + *key_colours.key(Key::U).0 += 5; + *key_colours.key(Key::X).0 += 5; + per_key_led.push(key_colours.clone()); } // Find backlight