Writing an interrupt seems so slow...

This commit is contained in:
Luke
2020-04-24 23:14:09 +12:00
parent ccae9dd764
commit 9846437efb
6 changed files with 133 additions and 64 deletions

4
Cargo.lock generated
View File

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

View File

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

View File

@@ -30,7 +30,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
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<dyn std::error::Error>> {
*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<dyn std::error::Error>> {
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<dyn std::error::Error>> {
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());
}
}

View File

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

View File

@@ -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<dyn Error>> {
@@ -39,40 +39,89 @@ pub fn start_daemon() -> Result<(), Box<dyn Error>> {
},
);
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(
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<u8> = 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<u8> = 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::<Vec<u8>, _>("bytearray"),
),
})
.outarg::<&str, _>("reply")
.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.
tree.start_receive_send(&connection);
tree.start_receive(&connection);
//thread::spawn(move || loop {});
@@ -80,18 +129,31 @@ pub fn start_daemon() -> Result<(), Box<dyn Error>> {
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(_) => {}

View File

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