mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Dbus signals (#28)
* Small rename of dbus args * Split out parts of main loop to tasks * Send signals on boot
This commit is contained in:
2
Makefile
2
Makefile
@@ -33,7 +33,7 @@ distclean:
|
|||||||
rm -rf .cargo vendor vendor.tar.xz
|
rm -rf .cargo vendor vendor.tar.xz
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
install -D -m 04755 "target/release/$(BIN)" "$(DESTDIR)$(bindir)/$(BIN)"
|
install -D -m 0755 "target/release/$(BIN)" "$(DESTDIR)$(bindir)/$(BIN)"
|
||||||
install -D -m 0644 "data/$(BIN).conf" "$(DESTDIR)$(sysconfdir)/dbus-1/system.d/$(BIN).conf"
|
install -D -m 0644 "data/$(BIN).conf" "$(DESTDIR)$(sysconfdir)/dbus-1/system.d/$(BIN).conf"
|
||||||
install -D -m 0644 "data/$(BIN).service" "$(DESTDIR)$(libdir)/systemd/system/$(BIN).service"
|
install -D -m 0644 "data/$(BIN).service" "$(DESTDIR)$(libdir)/systemd/system/$(BIN).service"
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,28 @@ When emitted, it will include the integer the charging limit was changed to.
|
|||||||
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"Stable": {"colour": [ 80, 0, 40]}}'
|
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"Stable": {"colour": [ 80, 0, 40]}}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"Star":{"colour":[0,255,255],"colour2":[0,0,0],"speed":"Med"}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** setting colour2 to `[0,0,255]` activates random star colour. Colour2 has no effect on the
|
||||||
|
mode otherwise.
|
||||||
|
```
|
||||||
|
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"Star":{"colour":[0,255,255],"colour2":[0,0,255],"speed":"Med"}}'
|
||||||
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"LedBrightness":3}'
|
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetKeyBacklight string:'{"LedBrightness":3}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
dbus-send --system --type=method_call --dest=org.rogcore.Daemon /org/rogcore/Daemon org.rogcore.Daemon.SetFanMode byte:'2'
|
||||||
|
```
|
||||||
|
|
||||||
|
Monitoring dbus while sending commands via `rog-core` will give you the json structure if you are otherwise unsure, e.g: `dbus-monitor --system |grep -A2 rogcore`.
|
||||||
|
|
||||||
|
## Getting an introspection .xml
|
||||||
|
|
||||||
|
```
|
||||||
|
dbus-send --system --print-reply --dest=org.rogcore.Daemon /org/rogcore/Daemon org.freedesktop.DBus.Introspectable.Introspect > xml/dbus-0.14.4.xml
|
||||||
|
```
|
||||||
@@ -4,6 +4,8 @@ Description=ROG Core Daemon
|
|||||||
[Service]
|
[Service]
|
||||||
ExecStart=/usr/bin/rog-core -d
|
ExecStart=/usr/bin/rog-core -d
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
|
Type=dbus
|
||||||
|
BusName=org.rogcore.Daemon
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
@@ -24,7 +24,8 @@ impl Ball {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, key_map: &Vec<[Key; 17]>) {
|
#[allow(clippy::if_same_then_else)]
|
||||||
|
fn update(&mut self, key_map: &[[Key; 17]]) {
|
||||||
let pos = self.position;
|
let pos = self.position;
|
||||||
let dir = self.direction;
|
let dir = self.direction;
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,14 @@ use crate::{
|
|||||||
rogcore::*,
|
rogcore::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
use dbus::{channel::Sender, nonblock::Process};
|
use dbus::{channel::Sender, nonblock::Process, nonblock::SyncConnection, tree::Signal};
|
||||||
|
|
||||||
use dbus_tokio::connection;
|
use dbus_tokio::connection;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rog_client::{aura_modes::AuraModes, DBUS_IFACE, DBUS_NAME, DBUS_PATH};
|
use rog_client::{aura_modes::AuraModes, DBUS_IFACE, DBUS_NAME, DBUS_PATH};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
pub(super) type DbusU8Type = Arc<Mutex<Option<u8>>>;
|
pub(super) type DbusU8Type = Arc<Mutex<Option<u8>>>;
|
||||||
@@ -62,6 +63,13 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
laptop.led_endpoint(),
|
laptop.led_endpoint(),
|
||||||
laptop.supported_modes().to_owned(),
|
laptop.supported_modes().to_owned(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let keyboard_reader = KeyboardReader::new(
|
||||||
|
rogcore.get_raw_device_handle(),
|
||||||
|
laptop.key_endpoint(),
|
||||||
|
laptop.key_filter().to_owned(),
|
||||||
|
);
|
||||||
|
|
||||||
led_writer
|
led_writer
|
||||||
.reload_last_builtin(&mut config)
|
.reload_last_builtin(&mut config)
|
||||||
.await
|
.await
|
||||||
@@ -86,20 +94,33 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
mut animatrix_recv,
|
mut animatrix_recv,
|
||||||
fan_mode,
|
fan_mode,
|
||||||
charge_limit,
|
charge_limit,
|
||||||
effect_cancel_signal,
|
led_changed_signal,
|
||||||
fanmode_signal,
|
fanmode_signal,
|
||||||
charge_limit_signal,
|
charge_limit_signal,
|
||||||
) = dbus_create_tree(config.clone());
|
) = dbus_create_tree(config.clone());
|
||||||
// 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_send(&*connection);
|
||||||
|
|
||||||
|
// Send boot signals
|
||||||
|
send_boot_signals(
|
||||||
|
connection.clone(),
|
||||||
|
config.clone(),
|
||||||
|
fanmode_signal.clone(),
|
||||||
|
charge_limit_signal.clone(),
|
||||||
|
led_changed_signal.clone(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// For helping with processing signals
|
||||||
|
start_signal_task(
|
||||||
|
connection.clone(),
|
||||||
|
config.clone(),
|
||||||
|
fanmode_signal,
|
||||||
|
charge_limit_signal,
|
||||||
|
);
|
||||||
|
|
||||||
// Keyboard reader goes in separate task because we want a high interrupt timeout
|
// Keyboard reader goes in separate task because we want a high interrupt timeout
|
||||||
// and don't want that to hold up other tasks, or miss keystrokes
|
// and don't want that to hold up other tasks, or miss keystrokes
|
||||||
let keyboard_reader = KeyboardReader::new(
|
|
||||||
rogcore.get_raw_device_handle(),
|
|
||||||
laptop.key_endpoint(),
|
|
||||||
laptop.key_filter().to_owned(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Possible Animatrix
|
// Possible Animatrix
|
||||||
if laptop.support_animatrix() {
|
if laptop.support_animatrix() {
|
||||||
@@ -117,8 +138,9 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let config1 = config.clone();
|
|
||||||
// start the keyboard reader and laptop-action loop
|
// start the keyboard reader and laptop-action loop
|
||||||
|
let config1 = config.clone();
|
||||||
|
// spawning this in a function causes a segfault for reasons I haven't investigated yet
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
// Fan mode
|
// Fan mode
|
||||||
@@ -150,41 +172,6 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// For helping with processing signals
|
|
||||||
let connection1 = connection.clone();
|
|
||||||
let config1 = config.clone();
|
|
||||||
tokio::spawn(async move {
|
|
||||||
// Some small things we need to track, without passing all sorts of stuff around
|
|
||||||
let mut last_fan_mode = config1.lock().await.fan_mode;
|
|
||||||
let mut last_charge_limit = config1.lock().await.bat_charge_limit;
|
|
||||||
loop {
|
|
||||||
// Use tokio sleep to not hold up other threads
|
|
||||||
tokio::time::delay_for(std::time::Duration::from_millis(500)).await;
|
|
||||||
|
|
||||||
let config = config1.lock().await;
|
|
||||||
if config.fan_mode != last_fan_mode {
|
|
||||||
last_fan_mode = config.fan_mode;
|
|
||||||
connection1
|
|
||||||
.send(
|
|
||||||
fanmode_signal
|
|
||||||
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
|
||||||
.append1(last_fan_mode),
|
|
||||||
)
|
|
||||||
.unwrap_or_else(|_| 0);
|
|
||||||
}
|
|
||||||
if config.bat_charge_limit != last_charge_limit {
|
|
||||||
last_charge_limit = config.bat_charge_limit;
|
|
||||||
connection1
|
|
||||||
.send(
|
|
||||||
charge_limit_signal
|
|
||||||
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
|
||||||
.append1(last_charge_limit),
|
|
||||||
)
|
|
||||||
.unwrap_or_else(|_| 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// start the main loop
|
// start the main loop
|
||||||
loop {
|
loop {
|
||||||
connection.process_all();
|
connection.process_all();
|
||||||
@@ -206,7 +193,7 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
.unwrap_or_else(|err| warn!("{}", err));
|
.unwrap_or_else(|err| warn!("{}", err));
|
||||||
connection
|
connection
|
||||||
.send(
|
.send(
|
||||||
effect_cancel_signal
|
led_changed_signal
|
||||||
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
.append1(json),
|
.append1(json),
|
||||||
)
|
)
|
||||||
@@ -216,3 +203,122 @@ pub async fn start_daemon() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn start_signal_task(
|
||||||
|
connection: Arc<SyncConnection>,
|
||||||
|
config: Arc<Mutex<Config>>,
|
||||||
|
fanmode_signal: Arc<Signal<()>>,
|
||||||
|
charge_limit_signal: Arc<Signal<()>>,
|
||||||
|
) {
|
||||||
|
tokio::spawn(async move {
|
||||||
|
// Some small things we need to track, without passing all sorts of stuff around
|
||||||
|
let mut last_fan_mode = config.lock().await.fan_mode;
|
||||||
|
let mut last_charge_limit = config.lock().await.bat_charge_limit;
|
||||||
|
loop {
|
||||||
|
// Use tokio sleep to not hold up other threads
|
||||||
|
tokio::time::delay_for(std::time::Duration::from_millis(500)).await;
|
||||||
|
|
||||||
|
let config = config.lock().await;
|
||||||
|
if config.fan_mode != last_fan_mode {
|
||||||
|
last_fan_mode = config.fan_mode;
|
||||||
|
connection
|
||||||
|
.send(
|
||||||
|
fanmode_signal
|
||||||
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
|
.append1(last_fan_mode),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|_| 0);
|
||||||
|
}
|
||||||
|
if config.bat_charge_limit != last_charge_limit {
|
||||||
|
last_charge_limit = config.bat_charge_limit;
|
||||||
|
connection
|
||||||
|
.send(
|
||||||
|
charge_limit_signal
|
||||||
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
|
.append1(last_charge_limit),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|_| 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn send_boot_signals(
|
||||||
|
connection: Arc<SyncConnection>,
|
||||||
|
config: Arc<Mutex<Config>>,
|
||||||
|
fanmode_signal: Arc<Signal<()>>,
|
||||||
|
charge_limit_signal: Arc<Signal<()>>,
|
||||||
|
led_changed_signal: Arc<Signal<()>>,
|
||||||
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
let config = config.lock().await;
|
||||||
|
if let Some(data) = config.get_led_mode_data(config.current_mode) {
|
||||||
|
connection
|
||||||
|
.send(
|
||||||
|
led_changed_signal
|
||||||
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
|
.append1(serde_json::to_string(data)?),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|_| 0);
|
||||||
|
}
|
||||||
|
connection
|
||||||
|
.send(
|
||||||
|
fanmode_signal
|
||||||
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
|
.append1(config.fan_mode),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|_| 0);
|
||||||
|
connection
|
||||||
|
.send(
|
||||||
|
charge_limit_signal
|
||||||
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
|
.append1(config.bat_charge_limit),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|_| 0);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn start_keyboard_task(
|
||||||
|
// fan_mode: Arc<Mutex<Option<u8>>>,
|
||||||
|
// charge_limit: Arc<Mutex<Option<u8>>>,
|
||||||
|
// config: Arc<Mutex<Config>>,
|
||||||
|
// aura_command_sender: mpsc::Sender<AuraModes>,
|
||||||
|
// mut rogcore: RogCore,
|
||||||
|
// laptop: LaptopBase,
|
||||||
|
// ) -> tokio::task::JoinHandle<()> {
|
||||||
|
// let keyboard_reader = KeyboardReader::new(
|
||||||
|
// rogcore.get_raw_device_handle(),
|
||||||
|
// laptop.key_endpoint(),
|
||||||
|
// laptop.key_filter().to_owned(),
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// tokio::spawn(async move {
|
||||||
|
// loop {
|
||||||
|
// // Fan mode
|
||||||
|
// if let Ok(mut lock) = fan_mode.try_lock() {
|
||||||
|
// if let Some(n) = lock.take() {
|
||||||
|
// let mut config = config.lock().await;
|
||||||
|
// rogcore
|
||||||
|
// .set_fan_mode(n, &mut config)
|
||||||
|
// .unwrap_or_else(|err| warn!("{:?}", err));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// // Charge limit
|
||||||
|
// if let Ok(mut lock) = charge_limit.try_lock() {
|
||||||
|
// if let Some(n) = lock.take() {
|
||||||
|
// let mut config = config.lock().await;
|
||||||
|
// rogcore
|
||||||
|
// .set_charge_limit(n, &mut config)
|
||||||
|
// .unwrap_or_else(|err| warn!("{:?}", err));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// // Keyboard reads
|
||||||
|
// let data = keyboard_reader.poll_keyboard().await;
|
||||||
|
// if let Some(bytes) = data {
|
||||||
|
// laptop
|
||||||
|
// .run(&mut rogcore, &config, bytes, aura_command_sender.clone())
|
||||||
|
// .await
|
||||||
|
// .unwrap_or_else(|err| warn!("{}", err));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ fn get_keyboard_backlight(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.outarg::<&str, _>("value")
|
.outarg::<&str, _>("json")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_keyboard_backlight_modes(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
fn get_keyboard_backlight_modes(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
||||||
@@ -72,7 +72,7 @@ fn get_keyboard_backlight_modes(config: Arc<Mutex<Config>>) -> Method<MTSync, ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.outarg::<&str, _>("value")
|
.outarg::<&str, _>("json")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_animatrix(
|
fn set_animatrix(
|
||||||
@@ -115,7 +115,7 @@ fn set_fan_mode(data: DbusU8Type) -> Method<MTSync, ()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.inarg::<u8, _>("byte")
|
.inarg::<u8, _>("mode")
|
||||||
.annotate("org.freedesktop.DBus.Method.NoReply", "true")
|
.annotate("org.freedesktop.DBus.Method.NoReply", "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ fn get_fan_mode(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.outarg::<&str, _>("value")
|
.outarg::<u8, _>("mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_charge_limit(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
fn get_charge_limit(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
||||||
@@ -148,7 +148,7 @@ fn get_charge_limit(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.outarg::<&str, _>("value")
|
.outarg::<u8, _>("limit")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_charge_limit(data: DbusU8Type) -> Method<MTSync, ()> {
|
fn set_charge_limit(data: DbusU8Type) -> Method<MTSync, ()> {
|
||||||
@@ -167,7 +167,7 @@ fn set_charge_limit(data: DbusU8Type) -> Method<MTSync, ()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.inarg::<u8, _>("byte")
|
.inarg::<u8, _>("limit")
|
||||||
.annotate("org.freedesktop.DBus.Method.NoReply", "true")
|
.annotate("org.freedesktop.DBus.Method.NoReply", "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,14 +195,14 @@ pub(super) fn dbus_create_tree(
|
|||||||
let key_backlight_changed = Arc::new(
|
let key_backlight_changed = Arc::new(
|
||||||
factory
|
factory
|
||||||
.signal("KeyBacklightChanged", ())
|
.signal("KeyBacklightChanged", ())
|
||||||
.sarg::<&str, _>("value"),
|
.sarg::<&str, _>("json"),
|
||||||
);
|
);
|
||||||
let chrg_limit_changed = Arc::new(
|
let chrg_limit_changed = Arc::new(
|
||||||
factory
|
factory
|
||||||
.signal("ChargeLimitChanged", ())
|
.signal("ChargeLimitChanged", ())
|
||||||
.sarg::<u8, _>("value"),
|
.sarg::<u8, _>("limit"),
|
||||||
);
|
);
|
||||||
let fanmode_changed = Arc::new(factory.signal("FanModeChanged", ()).sarg::<u8, _>("value"));
|
let fanmode_changed = Arc::new(factory.signal("FanModeChanged", ()).sarg::<u8, _>("mode"));
|
||||||
|
|
||||||
let tree = factory
|
let tree = factory
|
||||||
.tree(())
|
.tree(())
|
||||||
|
|||||||
Reference in New Issue
Block a user