From f05103b5c9d2d8fdc03eaa80ca82be130ef45b27 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 24 Apr 2020 23:41:00 +1200 Subject: [PATCH] Am I writing slow code? No, it's the keyboard EC who is slow - Seymour --- examples/per-key-effect-2.rs | 83 ++++++++++++++++++++++++++++++++++++ examples/per-key-effect.rs | 31 ++++++-------- src/core.rs | 13 ++++-- src/daemon.rs | 18 +++++--- 4 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 examples/per-key-effect-2.rs diff --git a/examples/per-key-effect-2.rs b/examples/per-key-effect-2.rs new file mode 100644 index 00000000..beaeb806 --- /dev/null +++ b/examples/per-key-effect-2.rs @@ -0,0 +1,83 @@ +use daemon::aura::{BuiltInModeByte, Key, KeyColourArray}; +use daemon::daemon::{DBUS_IFACE, DBUS_NAME, DBUS_PATH}; +use dbus::Error as DbusError; +use dbus::{ffidisp::Connection, Message}; +use std::{thread, time}; + +pub fn dbus_led_builtin_write(bytes: &[u8]) -> Result<(), Box> { + let bus = Connection::new_system()?; + //let proxy = bus.with_proxy(DBUS_IFACE, "/", Duration::from_millis(5000)); + let msg = Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledmessage")? + .append1(bytes.to_vec()); + let r = bus.send_with_reply_and_block(msg, 5000)?; + if let Some(reply) = r.get1::<&str>() { + println!("Success: {:x?}", reply); + return Ok(()); + } + Err(Box::new(DbusError::new_custom("name", "message"))) +} + +fn main() -> Result<(), Box> { + let bus = Connection::new_system()?; + + let mut per_key_led = Vec::new(); + let mut key_colours = KeyColourArray::new(); + key_colours.set(Key::ROG, 255, 0, 0); + key_colours.set(Key::L, 255, 0, 0); + key_colours.set(Key::I, 255, 0, 0); + key_colours.set(Key::N, 255, 0, 0); + key_colours.set(Key::U, 255, 0, 0); + key_colours.set(Key::X, 255, 0, 0); + 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()); + } + + let time = time::Duration::from_millis(1200); + + let row = KeyColourArray::get_init_msg(); + let msg = + Message::new_method_call(DBUS_NAME, DBUS_PATH, DBUS_IFACE, "ledmessage")?.append1(row); + bus.send(msg).unwrap(); + + loop { + let now = std::time::Instant::now(); + thread::sleep(time); + + for group in &per_key_led { + 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()); + return Ok(()); + } +} diff --git a/examples/per-key-effect.rs b/examples/per-key-effect.rs index 21ef31a9..d8b4bdae 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..49 { + for _ in 0..46 { *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..49 { + for _ in 0..46 { *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(1000); + let time = time::Duration::from_micros(1600); let row = KeyColourArray::get_init_msg(); let msg = @@ -58,22 +58,17 @@ fn main() -> Result<(), Box> { loop { let now = std::time::Instant::now(); - thread::sleep(time); - for group in &per_key_led { - 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(); + 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 after = std::time::Instant::now(); let diff = after.duration_since(now); diff --git a/src/core.rs b/src/core.rs index 3d3edf8f..7692e7e8 100644 --- a/src/core.rs +++ b/src/core.rs @@ -128,9 +128,16 @@ impl RogCore { } pub fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> { - self.handle - .write_interrupt(self.led_endpoint, message, Duration::from_micros(1)) - .unwrap(); + match self + .handle + .write_interrupt(self.led_endpoint, message, Duration::from_millis(1)) + { + Ok(_) => {} + Err(err) => match err { + rusb::Error::Timeout => {} + _ => error!("Failed to read keyboard interrupt: {:?}", err), + }, + } Ok(()) } diff --git a/src/daemon.rs b/src/daemon.rs index f842ab22..8fe0a294 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -127,31 +127,37 @@ pub fn start_daemon() -> Result<(), Box> { let supported = Vec::from(laptop.supported_modes()); loop { + // A no-comp loop takes 2 milliseconds + // With effect, up to 16ms + // With single write, 3ms + // Actual EC for keyboard seems to take longer to process //thread::sleep(Duration::from_millis(2)); connection - .process(Duration::from_millis(1)) + .process(Duration::from_millis(20)) .unwrap_or_else(|err| { error!("{:?}", err); false }); + // 700u per write 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(); + // It takes up to 10 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()); + // let after = std::time::Instant::now(); + // let diff = after.duration_since(now); + // dbg!(diff.as_millis()); } }