mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Refactor and rename a large amount of things to cleanup meanings
This commit is contained in:
216
README.md
216
README.md
@@ -1,36 +1,23 @@
|
|||||||
# ROG-Core
|
# ASUS NB Ctrl
|
||||||
|
|
||||||
**NOTICE:**
|
**NOTICE:**
|
||||||
I have completed kernel patches to move a large chunk of rog-core functionality
|
|
||||||
in to the Linux kernel. The patch is not in mainline yet, but can be found in the
|
This program requires the kernel patch in `./kernel-patch/` to be applied.
|
||||||
`./kernel-patch/` directory. The patch enables the following in kernel:
|
As of 04/08/2020 these have been submitted to lkml.
|
||||||
|
|
||||||
|
The patch enables the following in kernel:
|
||||||
|
|
||||||
- All hotkeys (FN+Key combos)
|
- All hotkeys (FN+Key combos)
|
||||||
- Control of keyboard brightness using FN+Key combos (not RGB)
|
- Control of keyboard brightness using FN+Key combos (not RGB)
|
||||||
- FN+F5 (fan) to toggle fan modes. You can watch the path `/sys/devices/platform/asus-nb-wmi/throttle_thermal_policy`
|
- FN+F5 (fan) to toggle fan modes
|
||||||
to see which mode you are in
|
|
||||||
|
|
||||||
You will not get RGB control in kernel (yet), and rog-core is still required to
|
You will not get RGB control in kernel (yet), and asusd is still required to
|
||||||
change modes and RGB settings. The current version in master and last release
|
change modes and RGB settings. The previous version of this program is named
|
||||||
still take full control of the interfaces
|
`rog-core` and takes full control of the interfaces required - if you can't
|
||||||
|
apply the kernel patches then `rog-core` is still highly usable.
|
||||||
**work on a version of rog-core for use with the kernel patch is in another branch**
|
|
||||||
|
|
||||||
The last version of rog-core will work with any kernel with or without this patch
|
|
||||||
and provide full functions.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
rog-core is a utility for Linux to control many aspects (eventually) of the ASUS
|
asusd is a utility for Linux to control many aspects of various ASUS laptops.
|
||||||
ROG laptops like the Zephyrus GX502GW.
|
|
||||||
|
|
||||||
One of the benefits of this app (for me at least) is that you *don't* require a
|
|
||||||
kernel with correct support for the laptop keyboard EC. The app
|
|
||||||
reads and writes direct to the device interrupts, and can be customised (in
|
|
||||||
source) quite extensively to do what you want such as directly controlling your
|
|
||||||
laptop backlight rather than emitting a key-press for the DE to handle.
|
|
||||||
|
|
||||||
Other laptop functions such as fan modes or battery charge limiting will need
|
|
||||||
kernel level support which exists in most newer kernels (higher than 5.6.10).
|
|
||||||
|
|
||||||
## Discord
|
## Discord
|
||||||
|
|
||||||
@@ -38,6 +25,8 @@ kernel level support which exists in most newer kernels (higher than 5.6.10).
|
|||||||
|
|
||||||
## SUPPORTED LAPTOPS
|
## SUPPORTED LAPTOPS
|
||||||
|
|
||||||
|
If your laptop is not in the following lists, it may still work with fan-mode switching and charge limit control.
|
||||||
|
|
||||||
**Please help test or provide info for:**
|
**Please help test or provide info for:**
|
||||||
|
|
||||||
- GL703(0x1869)
|
- GL703(0x1869)
|
||||||
@@ -47,34 +36,32 @@ kernel level support which exists in most newer kernels (higher than 5.6.10).
|
|||||||
a little between models, e.g, some RGB modes are missing, or it's a single colour.
|
a little between models, e.g, some RGB modes are missing, or it's a single colour.
|
||||||
As far as I can see, the EC does not give us a way to find what modes are supported.
|
As far as I can see, the EC does not give us a way to find what modes are supported.
|
||||||
|
|
||||||
### KEYS + OTHER FUNCTIONS
|
### ANIME AND OTHER FUNCTIONS
|
||||||
|
|
||||||
Media keys are Volume -/+, Mute output, previous, next, play/pause. These keys are grouped together on one interface block on the keyboard EC
|
| MODEL | AniMe |Touchpad-Numpad| Fan Modes | Charge Limit |
|
||||||
as a "Consumer Device" HID, all other fn+<key> combo are on another interface which is "Vendor Custom", this includes things like keyboard
|
|:-----:|:-----:|:-------------:|:---------:|:------------:|
|
||||||
LED brightness and mode change keys, Calc, fan-mode toggles etc.
|
| GM501 | | | X | X |
|
||||||
|
| GX502 | | | X | X |
|
||||||
| MODEL |Media keys| Additional FN+<KEY> | AniMe |Touchpad-Numpad| Fan Modes | Charge Limit |
|
| GX531 | | | X | X |
|
||||||
|:-----:|:--------:|:-------------------:|:-----:|:-------------:|:---------:|:------------:|
|
| GX701 | | | X | X |
|
||||||
| GM501 | X | X | | | X | X |
|
| G512 | | | X | X |
|
||||||
| GX502 | X | X | | | X | X |
|
| G712 | | | X | X |
|
||||||
| GX531 | X | X | | | X | X |
|
| G531 | | | X | X |
|
||||||
| GX701 | X | X | | | X | X |
|
| G731 | | | X | X |
|
||||||
| G512 | X | X | | | X | X |
|
| G532 | | | X | X |
|
||||||
| G712 | X | X | | | X | X |
|
| GA401 | X | | X | X |
|
||||||
| G531 | X | X | | | X | X |
|
| GA502 | X | | X | X |
|
||||||
| G731 | X | X | | | X | X |
|
| GU502 | X | | X | X |
|
||||||
| G532 | X | X | | | X | X |
|
|
||||||
| GA401 | X | X | X | | X | X |
|
|
||||||
| GA502 | X | X | X | | X | X |
|
|
||||||
| GU502 | X | X | X | | X | X |
|
|
||||||
|
|
||||||
**NOTE:** GA14/GA401 and GA15/GA502/GU502, You will need kernel [patches](https://lab.retarded.farm/zappel/asus-rog-zephyrus-g14/-/tree/master/kernel_patches).
|
**NOTE:** GA14/GA401 and GA15/GA502/GU502, You will need kernel [patches](https://lab.retarded.farm/zappel/asus-rog-zephyrus-g14/-/tree/master/kernel_patches).
|
||||||
|
|
||||||
### LED MODES
|
**NOTE:** If charge limit or fan modes are not working, then you may require a kernel newer than 5.6.10.
|
||||||
|
|
||||||
|
### KEYBOARD BACKLIGHT MODES
|
||||||
|
|
||||||
Models GA401, GA502, GU502 support LED brightness change only (no RGB).
|
Models GA401, GA502, GU502 support LED brightness change only (no RGB).
|
||||||
|
|
||||||
| MODEL | SINGLE | BREATHING | STROBE | RAINBOW | STAR | RAIN | HIGHLIGHT | LASER | RIPPLE | PULSE | COMET | FLASH | ZONES | PER-KEY RGB |
|
| MODEL | STATIC | BREATHING | STROBE | RAINBOW | STAR | RAIN | HIGHLIGHT | LASER | RIPPLE | PULSE | COMET | FLASH | ZONES | PER-KEY RGB |
|
||||||
|:------:|:------:|:---------:|:------:|:-------:|:----:|:----:|:---------:|:-----:|:------:|:-----:|:-----:|:-----:|:-----:|:-----------:|
|
|:------:|:------:|:---------:|:------:|:-------:|:----:|:----:|:---------:|:-----:|:------:|:-----:|:-----:|:-----:|:-----:|:-----------:|
|
||||||
| G512LI | X | X | X | X | | | | | | | | | | |
|
| G512LI | X | X | X | X | | | | | | | | | | |
|
||||||
| G712LI | X | X | X | X | | | | | | | | | | |
|
| G712LI | X | X | X | X | | | | | | | | | | |
|
||||||
@@ -88,26 +75,13 @@ Models GA401, GA502, GU502 support LED brightness change only (no RGB).
|
|||||||
| G731 | X | X | X | X | X | X | X | X | X | X | X | X | X | X |
|
| G731 | X | X | X | X | X | X | X | X | X | X | X | X | X | X |
|
||||||
| G532 | X | X | X | X | X | X | X | X | X | X | X | X | | X |
|
| G532 | X | X | X | X | X | X | X | X | X | X | X | X | | X |
|
||||||
|
|
||||||
|
|
||||||
## Implemented
|
## Implemented
|
||||||
|
|
||||||
|
- [X] Daemon
|
||||||
- [X] Setting/modifying built-in LED modes
|
- [X] Setting/modifying built-in LED modes
|
||||||
- [X] Per-key LED setting
|
- [X] Per-key LED setting
|
||||||
- [X] Fancy LED modes (See examples)
|
- [X] Fancy LED modes (See examples)
|
||||||
- [X] Daemon mode
|
|
||||||
- [X] Saving settings for reload
|
- [X] Saving settings for reload
|
||||||
- [ ] System control
|
|
||||||
+ [X] ROG key custom mapping (Can be done in source)
|
|
||||||
+ [X] Fan/Performance mode
|
|
||||||
+ [ ] Screen off? Now mapped to a keycode but has no effect
|
|
||||||
+ [X] Screen brightness up/down
|
|
||||||
+ [X] Touchpad toggle
|
|
||||||
+ [X] Sleep
|
|
||||||
+ [X] Airplane mode
|
|
||||||
- [X] Capture and use hotkeys
|
|
||||||
+ [X] Aura control by Aura keys
|
|
||||||
+ [X] Volume + media controls work
|
|
||||||
+ [X] Mic mute
|
|
||||||
- [X] Logging - required for journalctl
|
- [X] Logging - required for journalctl
|
||||||
- [X] AniMatrix display on G14 models that include it
|
- [X] AniMatrix display on G14 models that include it
|
||||||
- [X] Set battery charge limit (with kernel supporting this)
|
- [X] Set battery charge limit (with kernel supporting this)
|
||||||
@@ -131,40 +105,22 @@ started when the device is initialised and ready.
|
|||||||
If you are upgrading from a previous installed version, you will need to restart the service or reboot.
|
If you are upgrading from a previous installed version, you will need to restart the service or reboot.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ systemctl daemon-reload && systemctl restart rog-core
|
$ systemctl daemon-reload && systemctl restart asusd
|
||||||
```
|
```
|
||||||
|
|
||||||
You may also need to activate the service for debian install. If running Pop!_OS, I suggest disabling `system76-power`
|
You may also need to activate the service for debian install. If running Pop!_OS, I suggest disabling `system76-power`
|
||||||
gnome-shell extension, or at least limiting use of the power-management parts as `rog-core` lets you set the same things
|
gnome-shell extension, or at least limiting use of the power-management parts as `asusd` lets you set the same things
|
||||||
(one or the other will overwrite pstates). I will create a shell extension at some point similar to system76, but using
|
(one or the other will overwrite pstates). I will create a shell extension at some point similar to system76, but using
|
||||||
the rog-core parts. It is safe to leave `system76-power.service` enabled and use for switching between graphics modes.
|
the asusd parts. It is safe to leave `system76-power.service` enabled and use for switching between graphics modes.
|
||||||
|
|
||||||
### Ubuntu PPA
|
## Uninstalling
|
||||||
|
|
||||||
Alternatively, instead of building manually you can use the PPA.
|
Run `sudo make uninstall` in the source repo, and remove `/etc/asusd.conf`.
|
||||||
|
|
||||||
```
|
|
||||||
sudo add-apt-repository ppa:lukedjones/rog-core
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install rog-core
|
|
||||||
```
|
|
||||||
|
|
||||||
the rog-core service will run when the device is initialised.
|
|
||||||
|
|
||||||
### Gentoo ebuild
|
|
||||||
|
|
||||||
Thanks to @aspann you can grab it here [sys-power/rog-core](https://lab.retarded.farm/zappel/zGentoo/-/tree/master/sys-power/rog-core)
|
|
||||||
|
|
||||||
### Arch AUR
|
|
||||||
|
|
||||||
You can find the thingimajig [here](https://aur.archlinux.org/packages/rog-core/). If
|
|
||||||
you are using a GA14 or GA15 series, you may need kernel [patches](https://lab.retarded.farm/zappel/asus-rog-zephyrus-g14/-/tree/master/kernel_patches).
|
|
||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
|
||||||
Occasionally I might break things for you by tweaking or changing the config file layout. Usually this will mean you
|
Occasionally you need to remove `/etc/asusd.conf` and restart the daemon to create a new one. You *can* back up the old
|
||||||
need to remove `/etc/rog-core.conf` and restart the daemon to create a new one. You *can* back up the old one and copy
|
one and copy settings back over (then restart daemon again).
|
||||||
settings back over (then restart daemon again).
|
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
@@ -182,27 +138,27 @@ the daemon mode over dbus.
|
|||||||
Commands are given by:
|
Commands are given by:
|
||||||
|
|
||||||
```
|
```
|
||||||
rog-core <option> <command> <command-options>
|
asusd <option> <command> <command-options>
|
||||||
```
|
```
|
||||||
|
|
||||||
Help is available through:
|
Help is available through:
|
||||||
|
|
||||||
```
|
```
|
||||||
rog-core --help
|
asusd --help
|
||||||
rog-core <command> --help
|
asusd <command> --help
|
||||||
```
|
```
|
||||||
|
|
||||||
Some commands may have subcommands:
|
Some commands may have subcommands:
|
||||||
|
|
||||||
```
|
```
|
||||||
rog-core <command> <subcommand> --help
|
asusd <command> <subcommand> --help
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
```
|
```
|
||||||
$ rog-core --help
|
$ asusd --help
|
||||||
Usage: rog-core [OPTIONS]
|
Usage: asusd [OPTIONS]
|
||||||
|
|
||||||
Optional arguments:
|
Optional arguments:
|
||||||
-h, --help print help message
|
-h, --help print help message
|
||||||
@@ -214,8 +170,8 @@ Optional arguments:
|
|||||||
Available commands:
|
Available commands:
|
||||||
led-mode Set the keyboard lighting from built-in modes
|
led-mode Set the keyboard lighting from built-in modes
|
||||||
|
|
||||||
$ rog-core led-mode --help
|
$ asusd led-mode --help
|
||||||
Usage: rog-core led-mode [OPTIONS]
|
Usage: asusd led-mode [OPTIONS]
|
||||||
|
|
||||||
Optional arguments:
|
Optional arguments:
|
||||||
-h, --help print help message
|
-h, --help print help message
|
||||||
@@ -235,15 +191,15 @@ Available commands:
|
|||||||
flash set a wide vertical line zooming from left
|
flash set a wide vertical line zooming from left
|
||||||
multi-static 4-zone multi-colour
|
multi-static 4-zone multi-colour
|
||||||
|
|
||||||
$ rog-core led-mode stable --help
|
$ asusd led-mode stable --help
|
||||||
Usage: rog-core led-mode stable [OPTIONS]
|
Usage: asusd led-mode stable [OPTIONS]
|
||||||
|
|
||||||
Optional arguments:
|
Optional arguments:
|
||||||
-h, --help print help message
|
-h, --help print help message
|
||||||
-c HEX set the RGB value e.g, ff00ff
|
-c HEX set the RGB value e.g, ff00ff
|
||||||
|
|
||||||
$ rog-core led-mode star --help
|
$ asusd led-mode star --help
|
||||||
Usage: rog-core led-mode star [OPTIONS]
|
Usage: asusd led-mode star [OPTIONS]
|
||||||
|
|
||||||
Optional arguments:
|
Optional arguments:
|
||||||
-h, --help print help message
|
-h, --help print help message
|
||||||
@@ -252,39 +208,6 @@ Optional arguments:
|
|||||||
-s SPEED set the speed: low, med, high
|
-s SPEED set the speed: low, med, high
|
||||||
```
|
```
|
||||||
|
|
||||||
## ROG Key
|
|
||||||
|
|
||||||
The ROG key can be customized in a limited way by use of presets:
|
|
||||||
- Power
|
|
||||||
- Sleep
|
|
||||||
- MediaRecord
|
|
||||||
- MediaFastFwd
|
|
||||||
- MediaRewind
|
|
||||||
- MediaNext
|
|
||||||
- MediaPrev
|
|
||||||
- MediaStop
|
|
||||||
- MediaPlayPause
|
|
||||||
- MediaVolMute
|
|
||||||
- MediaVolUp
|
|
||||||
- MediaVolDown
|
|
||||||
- BacklightInc
|
|
||||||
- BacklightDec
|
|
||||||
- ControlConfig
|
|
||||||
- LaunchTextEditor
|
|
||||||
- LaunchEmailApp
|
|
||||||
- LaunchNewsReader
|
|
||||||
- LaunchCalendar
|
|
||||||
- LaunchCalculator
|
|
||||||
- LaunchWebBrowser
|
|
||||||
- FileBrowser
|
|
||||||
|
|
||||||
This key can be changed in /etc/rogcore.conf, for example:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
"rog_key": "FileBrowser",
|
|
||||||
```
|
|
||||||
|
|
||||||
## Daemon mode
|
## Daemon mode
|
||||||
|
|
||||||
If the daemon service is enabled then on boot the following will be reloaded from save:
|
If the daemon service is enabled then on boot the following will be reloaded from save:
|
||||||
@@ -316,38 +239,7 @@ TODO: see `./wireshark_data/` for some captures.
|
|||||||
|
|
||||||
### Supporting more laptops
|
### Supporting more laptops
|
||||||
|
|
||||||
At a minimum it probably needs to be a Zephyrus laptop. If there is enough interest I will remove the restriction on
|
Please file a support request.
|
||||||
board names so that anyone can try the app.
|
|
||||||
|
|
||||||
From there I'll need wireshark captures from Windows using Armoury Crate if possible:
|
|
||||||
|
|
||||||
- *No* USB devices plugged in
|
|
||||||
- One action per capture, 2 or 3 times
|
|
||||||
- An action may be switching a mode or pressing a button
|
|
||||||
|
|
||||||
The real ticket items are:
|
|
||||||
|
|
||||||
- Captures from installing Armoury Crate. To do this you need to uninstall almost all ASUS junkware and such
|
|
||||||
- Byte sequence captures from hotkeys pressed in linux (which I need to make a tool for)
|
|
||||||
- lsusb output
|
|
||||||
|
|
||||||
lsusb:
|
|
||||||
|
|
||||||
First do `lsusb |grep 0b05` and check the part after `0b05:`, output looks like:
|
|
||||||
|
|
||||||
```text
|
|
||||||
Bus 001 Device 005: ID 0b05:1866 ASUSTek Computer, Inc. N-KEY Device
|
|
||||||
```
|
|
||||||
|
|
||||||
Then do `sudo lsusb -vd 0b05:1866 > ~/laptop_info` and give that to me.
|
|
||||||
|
|
||||||
Other helpful info can be gained from `sudo usbhid-dump`, for which you may need to unload kernel drivers. Please google
|
|
||||||
this.
|
|
||||||
|
|
||||||
Also required (for my book-keeping of data):
|
|
||||||
- `cat /sys/class/dmi/id/product_name`
|
|
||||||
- `cat /sys/class/dmi/id/product_family`
|
|
||||||
- `cat /sys/class/dmi/id/board_name`
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ pub static CONFIG_PATH: &str = "/etc/asusd.conf";
|
|||||||
|
|
||||||
#[derive(Default, Deserialize, Serialize)]
|
#[derive(Default, Deserialize, Serialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub fan_mode: u8,
|
pub power_profile: u8,
|
||||||
pub bat_charge_limit: u8,
|
pub bat_charge_limit: u8,
|
||||||
pub brightness: u8,
|
pub kbd_boot_brightness: u8,
|
||||||
pub current_mode: u8,
|
pub kbd_backlight_mode: u8,
|
||||||
pub builtin_modes: Vec<AuraModes>,
|
pub kbd_backlight_modes: Vec<AuraModes>,
|
||||||
pub mode_performance: FanModeSettings,
|
pub power_profiles: FanModeProfile,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
@@ -31,10 +31,10 @@ impl Config {
|
|||||||
// create a default config here
|
// create a default config here
|
||||||
let mut c = Config::default();
|
let mut c = Config::default();
|
||||||
c.bat_charge_limit = 100;
|
c.bat_charge_limit = 100;
|
||||||
c.current_mode = 0;
|
c.kbd_backlight_mode = 0;
|
||||||
|
|
||||||
for n in supported_led_modes {
|
for n in supported_led_modes {
|
||||||
c.builtin_modes.push(AuraModes::from(*n))
|
c.kbd_backlight_modes.push(AuraModes::from(*n))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should be okay to unwrap this as is since it is a Default
|
// Should be okay to unwrap this as is since it is a Default
|
||||||
@@ -76,17 +76,17 @@ impl Config {
|
|||||||
|
|
||||||
pub fn set_mode_data(&mut self, mode: AuraModes) {
|
pub fn set_mode_data(&mut self, mode: AuraModes) {
|
||||||
let byte: u8 = (&mode).into();
|
let byte: u8 = (&mode).into();
|
||||||
for (index, n) in self.builtin_modes.iter().enumerate() {
|
for (index, n) in self.kbd_backlight_modes.iter().enumerate() {
|
||||||
if byte == u8::from(n) {
|
if byte == u8::from(n) {
|
||||||
// Consume it, OMNOMNOMNOM
|
// Consume it, OMNOMNOMNOM
|
||||||
self.builtin_modes[index] = mode;
|
self.kbd_backlight_modes[index] = mode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_led_mode_data(&self, num: u8) -> Option<&AuraModes> {
|
pub fn get_led_mode_data(&self, num: u8) -> Option<&AuraModes> {
|
||||||
for mode in &self.builtin_modes {
|
for mode in &self.kbd_backlight_modes {
|
||||||
if u8::from(mode) == num {
|
if u8::from(mode) == num {
|
||||||
return Some(mode);
|
return Some(mode);
|
||||||
}
|
}
|
||||||
@@ -96,22 +96,22 @@ impl Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Deserialize, Serialize)]
|
#[derive(Default, Deserialize, Serialize)]
|
||||||
pub struct FanModeSettings {
|
pub struct FanModeProfile {
|
||||||
pub normal: IntelPState,
|
pub normal: CPUSettings,
|
||||||
pub boost: IntelPState,
|
pub boost: CPUSettings,
|
||||||
pub silent: IntelPState,
|
pub silent: CPUSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub struct IntelPState {
|
pub struct CPUSettings {
|
||||||
pub min_percentage: u8,
|
pub min_percentage: u8,
|
||||||
pub max_percentage: u8,
|
pub max_percentage: u8,
|
||||||
pub no_turbo: bool,
|
pub no_turbo: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for IntelPState {
|
impl Default for CPUSettings {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
IntelPState {
|
CPUSettings {
|
||||||
min_percentage: 0,
|
min_percentage: 0,
|
||||||
max_percentage: 100,
|
max_percentage: 100,
|
||||||
no_turbo: false,
|
no_turbo: false,
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ impl crate::Controller for CtrlFanAndCPU {
|
|||||||
|
|
||||||
async fn reload_from_config(&mut self, config: &mut Config) -> Result<(), Box<dyn Error>> {
|
async fn reload_from_config(&mut self, config: &mut Config) -> Result<(), Box<dyn Error>> {
|
||||||
let mut file = OpenOptions::new().write(true).open(self.path)?;
|
let mut file = OpenOptions::new().write(true).open(self.path)?;
|
||||||
file.write_all(format!("{:?}\n", config.fan_mode).as_bytes())
|
file.write_all(format!("{:?}\n", config.power_profile).as_bytes())
|
||||||
.unwrap_or_else(|err| error!("Could not write to {}, {:?}", self.path, err));
|
.unwrap_or_else(|err| error!("Could not write to {}, {:?}", self.path, err));
|
||||||
self.set_pstate_for_fan_mode(FanLevel::from(config.fan_mode), config)?;
|
self.set_pstate_for_fan_mode(FanLevel::from(config.power_profile), config)?;
|
||||||
info!("Reloaded fan mode: {:?}", FanLevel::from(config.fan_mode));
|
info!("Reloaded fan mode: {:?}", FanLevel::from(config.power_profile));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,13 +98,13 @@ impl CtrlFanAndCPU {
|
|||||||
let mut buf = [0u8; 1];
|
let mut buf = [0u8; 1];
|
||||||
file.read_exact(&mut buf)?;
|
file.read_exact(&mut buf)?;
|
||||||
if let Some(num) = char::from(buf[0]).to_digit(10) {
|
if let Some(num) = char::from(buf[0]).to_digit(10) {
|
||||||
if config.fan_mode != num as u8 {
|
if config.power_profile != num as u8 {
|
||||||
config.fan_mode = num as u8;
|
config.power_profile = num as u8;
|
||||||
config.write();
|
config.write();
|
||||||
self.set_pstate_for_fan_mode(FanLevel::from(config.fan_mode), config)?;
|
self.set_pstate_for_fan_mode(FanLevel::from(config.power_profile), config)?;
|
||||||
info!(
|
info!(
|
||||||
"Fan mode was changed: {:?}",
|
"Fan mode was changed: {:?}",
|
||||||
FanLevel::from(config.fan_mode)
|
FanLevel::from(config.power_profile)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -123,12 +123,12 @@ impl CtrlFanAndCPU {
|
|||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
let mut fan_ctrl = OpenOptions::new().write(true).open(self.path)?;
|
let mut fan_ctrl = OpenOptions::new().write(true).open(self.path)?;
|
||||||
|
|
||||||
config.fan_mode = n;
|
config.power_profile = n;
|
||||||
config.write();
|
config.write();
|
||||||
fan_ctrl
|
fan_ctrl
|
||||||
.write_all(format!("{:?}\n", config.fan_mode).as_bytes())
|
.write_all(format!("{:?}\n", config.power_profile).as_bytes())
|
||||||
.unwrap_or_else(|err| error!("Could not write to {}, {:?}", self.path, err));
|
.unwrap_or_else(|err| error!("Could not write to {}, {:?}", self.path, err));
|
||||||
info!("Fan mode set to: {:?}", FanLevel::from(config.fan_mode));
|
info!("Fan mode set to: {:?}", FanLevel::from(config.power_profile));
|
||||||
self.set_pstate_for_fan_mode(FanLevel::from(n), config)?;
|
self.set_pstate_for_fan_mode(FanLevel::from(n), config)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -142,36 +142,36 @@ impl CtrlFanAndCPU {
|
|||||||
if let Ok(pstate) = intel_pstate::PState::new() {
|
if let Ok(pstate) = intel_pstate::PState::new() {
|
||||||
match mode {
|
match mode {
|
||||||
FanLevel::Normal => {
|
FanLevel::Normal => {
|
||||||
pstate.set_min_perf_pct(config.mode_performance.normal.min_percentage)?;
|
pstate.set_min_perf_pct(config.power_profiles.normal.min_percentage)?;
|
||||||
pstate.set_max_perf_pct(config.mode_performance.normal.max_percentage)?;
|
pstate.set_max_perf_pct(config.power_profiles.normal.max_percentage)?;
|
||||||
pstate.set_no_turbo(config.mode_performance.normal.no_turbo)?;
|
pstate.set_no_turbo(config.power_profiles.normal.no_turbo)?;
|
||||||
info!(
|
info!(
|
||||||
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
||||||
config.mode_performance.normal.min_percentage,
|
config.power_profiles.normal.min_percentage,
|
||||||
config.mode_performance.normal.max_percentage,
|
config.power_profiles.normal.max_percentage,
|
||||||
!config.mode_performance.normal.no_turbo
|
!config.power_profiles.normal.no_turbo
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
FanLevel::Boost => {
|
FanLevel::Boost => {
|
||||||
pstate.set_min_perf_pct(config.mode_performance.boost.min_percentage)?;
|
pstate.set_min_perf_pct(config.power_profiles.boost.min_percentage)?;
|
||||||
pstate.set_max_perf_pct(config.mode_performance.boost.max_percentage)?;
|
pstate.set_max_perf_pct(config.power_profiles.boost.max_percentage)?;
|
||||||
pstate.set_no_turbo(config.mode_performance.boost.no_turbo)?;
|
pstate.set_no_turbo(config.power_profiles.boost.no_turbo)?;
|
||||||
info!(
|
info!(
|
||||||
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
||||||
config.mode_performance.boost.min_percentage,
|
config.power_profiles.boost.min_percentage,
|
||||||
config.mode_performance.boost.max_percentage,
|
config.power_profiles.boost.max_percentage,
|
||||||
!config.mode_performance.boost.no_turbo
|
!config.power_profiles.boost.no_turbo
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
FanLevel::Silent => {
|
FanLevel::Silent => {
|
||||||
pstate.set_min_perf_pct(config.mode_performance.silent.min_percentage)?;
|
pstate.set_min_perf_pct(config.power_profiles.silent.min_percentage)?;
|
||||||
pstate.set_max_perf_pct(config.mode_performance.silent.max_percentage)?;
|
pstate.set_max_perf_pct(config.power_profiles.silent.max_percentage)?;
|
||||||
pstate.set_no_turbo(config.mode_performance.silent.no_turbo)?;
|
pstate.set_no_turbo(config.power_profiles.silent.no_turbo)?;
|
||||||
info!(
|
info!(
|
||||||
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
"Intel CPU Power: min: {:?}%, max: {:?}%, turbo: {:?}",
|
||||||
config.mode_performance.silent.min_percentage,
|
config.power_profiles.silent.min_percentage,
|
||||||
config.mode_performance.silent.max_percentage,
|
config.power_profiles.silent.max_percentage,
|
||||||
!config.mode_performance.silent.no_turbo
|
!config.power_profiles.silent.no_turbo
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,7 +187,7 @@ impl CtrlFanAndCPU {
|
|||||||
})?;
|
})?;
|
||||||
match mode {
|
match mode {
|
||||||
FanLevel::Normal => {
|
FanLevel::Normal => {
|
||||||
let boost = if config.mode_performance.normal.no_turbo {
|
let boost = if config.power_profiles.normal.no_turbo {
|
||||||
"0"
|
"0"
|
||||||
} else {
|
} else {
|
||||||
"1"
|
"1"
|
||||||
@@ -198,7 +198,7 @@ impl CtrlFanAndCPU {
|
|||||||
info!("AMD CPU Turbo: {:?}", boost);
|
info!("AMD CPU Turbo: {:?}", boost);
|
||||||
}
|
}
|
||||||
FanLevel::Boost => {
|
FanLevel::Boost => {
|
||||||
let boost = if config.mode_performance.boost.no_turbo {
|
let boost = if config.power_profiles.boost.no_turbo {
|
||||||
"0"
|
"0"
|
||||||
} else {
|
} else {
|
||||||
"1"
|
"1"
|
||||||
@@ -209,7 +209,7 @@ impl CtrlFanAndCPU {
|
|||||||
info!("AMD CPU Turbo: {:?}", boost);
|
info!("AMD CPU Turbo: {:?}", boost);
|
||||||
}
|
}
|
||||||
FanLevel::Silent => {
|
FanLevel::Silent => {
|
||||||
let boost = if config.mode_performance.silent.no_turbo {
|
let boost = if config.power_profiles.silent.no_turbo {
|
||||||
"0"
|
"0"
|
||||||
} else {
|
} else {
|
||||||
"1"
|
"1"
|
||||||
|
|||||||
@@ -71,9 +71,9 @@ impl crate::Controller for CtrlKbdBacklight {
|
|||||||
async fn reload_from_config(&mut self, config: &mut Config) -> Result<(), Box<dyn Error>> {
|
async fn reload_from_config(&mut self, config: &mut Config) -> Result<(), Box<dyn Error>> {
|
||||||
// set current mode (if any)
|
// set current mode (if any)
|
||||||
if self.supported_modes.len() > 1 {
|
if self.supported_modes.len() > 1 {
|
||||||
if self.supported_modes.contains(&config.current_mode) {
|
if self.supported_modes.contains(&config.kbd_backlight_mode) {
|
||||||
let mode = config
|
let mode = config
|
||||||
.get_led_mode_data(config.current_mode)
|
.get_led_mode_data(config.kbd_backlight_mode)
|
||||||
.ok_or(RogError::NotSupported)?
|
.ok_or(RogError::NotSupported)?
|
||||||
.to_owned();
|
.to_owned();
|
||||||
self.write_mode(&mode).await?;
|
self.write_mode(&mode).await?;
|
||||||
@@ -81,19 +81,19 @@ impl crate::Controller for CtrlKbdBacklight {
|
|||||||
} else {
|
} else {
|
||||||
warn!(
|
warn!(
|
||||||
"An unsupported mode was set: {}, reset to first mode available",
|
"An unsupported mode was set: {}, reset to first mode available",
|
||||||
<&str>::from(&<AuraModes>::from(config.current_mode))
|
<&str>::from(&<AuraModes>::from(config.kbd_backlight_mode))
|
||||||
);
|
);
|
||||||
for (idx, mode) in config.builtin_modes.iter_mut().enumerate() {
|
for (idx, mode) in config.kbd_backlight_modes.iter_mut().enumerate() {
|
||||||
if !self.supported_modes.contains(&mode.into()) {
|
if !self.supported_modes.contains(&mode.into()) {
|
||||||
config.builtin_modes.remove(idx);
|
config.kbd_backlight_modes.remove(idx);
|
||||||
config.write();
|
config.write();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config.current_mode = self.supported_modes[0];
|
config.kbd_backlight_mode = self.supported_modes[0];
|
||||||
// TODO: do a recursive call with a boxed dyn future later
|
// TODO: do a recursive call with a boxed dyn future later
|
||||||
let mode = config
|
let mode = config
|
||||||
.get_led_mode_data(config.current_mode)
|
.get_led_mode_data(config.kbd_backlight_mode)
|
||||||
.ok_or(RogError::NotSupported)?
|
.ok_or(RogError::NotSupported)?
|
||||||
.to_owned();
|
.to_owned();
|
||||||
self.write_mode(&mode).await?;
|
self.write_mode(&mode).await?;
|
||||||
@@ -102,7 +102,7 @@ impl crate::Controller for CtrlKbdBacklight {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reload brightness
|
// Reload brightness
|
||||||
let bright = config.brightness;
|
let bright = config.kbd_boot_brightness;
|
||||||
let bytes = aura_brightness_bytes(bright);
|
let bytes = aura_brightness_bytes(bright);
|
||||||
self.write_bytes(&bytes).await?;
|
self.write_bytes(&bytes).await?;
|
||||||
info!("Reloaded last used brightness");
|
info!("Reloaded last used brightness");
|
||||||
@@ -186,7 +186,7 @@ impl CtrlKbdBacklight {
|
|||||||
AuraModes::LedBrightness(n) => {
|
AuraModes::LedBrightness(n) => {
|
||||||
let bytes: [u8; LED_MSG_LEN] = (&mode).into();
|
let bytes: [u8; LED_MSG_LEN] = (&mode).into();
|
||||||
self.write_bytes(&bytes).await?;
|
self.write_bytes(&bytes).await?;
|
||||||
config.brightness = n;
|
config.kbd_boot_brightness = n;
|
||||||
config.write();
|
config.write();
|
||||||
info!("LED brightness set to {:#?}", n);
|
info!("LED brightness set to {:#?}", n);
|
||||||
}
|
}
|
||||||
@@ -201,7 +201,7 @@ impl CtrlKbdBacklight {
|
|||||||
_ => {
|
_ => {
|
||||||
let mode_num: u8 = u8::from(&mode);
|
let mode_num: u8 = u8::from(&mode);
|
||||||
self.write_mode(&mode).await?;
|
self.write_mode(&mode).await?;
|
||||||
config.current_mode = mode_num;
|
config.kbd_backlight_mode = mode_num;
|
||||||
config.set_mode_data(mode);
|
config.set_mode_data(mode);
|
||||||
config.write();
|
config.write();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,15 +168,15 @@ fn start_signal_task(
|
|||||||
) {
|
) {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
// Some small things we need to track, without passing all sorts of stuff around
|
// 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_fan_mode = config.lock().await.power_profile;
|
||||||
let mut last_charge_limit = config.lock().await.bat_charge_limit;
|
let mut last_charge_limit = config.lock().await.bat_charge_limit;
|
||||||
loop {
|
loop {
|
||||||
// Use tokio sleep to not hold up other threads
|
// Use tokio sleep to not hold up other threads
|
||||||
tokio::time::delay_for(std::time::Duration::from_millis(500)).await;
|
tokio::time::delay_for(std::time::Duration::from_millis(500)).await;
|
||||||
|
|
||||||
let config = config.lock().await;
|
let config = config.lock().await;
|
||||||
if config.fan_mode != last_fan_mode {
|
if config.power_profile != last_fan_mode {
|
||||||
last_fan_mode = config.fan_mode;
|
last_fan_mode = config.power_profile;
|
||||||
connection
|
connection
|
||||||
.send(
|
.send(
|
||||||
fanmode_signal
|
fanmode_signal
|
||||||
@@ -210,7 +210,7 @@ async fn send_boot_signals(
|
|||||||
|
|
||||||
let config = config.lock().await;
|
let config = config.lock().await;
|
||||||
|
|
||||||
if let Some(data) = config.get_led_mode_data(config.current_mode) {
|
if let Some(data) = config.get_led_mode_data(config.kbd_backlight_mode) {
|
||||||
connection
|
connection
|
||||||
.send(
|
.send(
|
||||||
led_changed_signal
|
led_changed_signal
|
||||||
@@ -224,7 +224,7 @@ async fn send_boot_signals(
|
|||||||
.send(
|
.send(
|
||||||
fanmode_signal
|
fanmode_signal
|
||||||
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
.msg(&DBUS_PATH.into(), &DBUS_IFACE.into())
|
||||||
.append1(config.fan_mode),
|
.append1(config.power_profile),
|
||||||
)
|
)
|
||||||
.unwrap_or_else(|_| 0);
|
.unwrap_or_else(|_| 0);
|
||||||
|
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ fn get_keyboard_backlight(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
|||||||
.method("GetKeyBacklight", (), {
|
.method("GetKeyBacklight", (), {
|
||||||
move |m| {
|
move |m| {
|
||||||
if let Ok(lock) = config.try_lock() {
|
if let Ok(lock) = config.try_lock() {
|
||||||
for mode in &lock.builtin_modes {
|
for mode in &lock.kbd_backlight_modes {
|
||||||
if lock.current_mode == <u8>::from(mode) {
|
if lock.kbd_backlight_mode == <u8>::from(mode) {
|
||||||
let mode = serde_json::to_string(&mode).unwrap();
|
let mode = serde_json::to_string(&mode).unwrap();
|
||||||
let mret = m.msg.method_return().append1(mode);
|
let mret = m.msg.method_return().append1(mode);
|
||||||
return Ok(vec![mret]);
|
return Ok(vec![mret]);
|
||||||
@@ -63,7 +63,7 @@ fn get_keyboard_backlight_modes(config: Arc<Mutex<Config>>) -> Method<MTSync, ()
|
|||||||
.method("GetKeyBacklightModes", (), {
|
.method("GetKeyBacklightModes", (), {
|
||||||
move |m| {
|
move |m| {
|
||||||
if let Ok(lock) = config.try_lock() {
|
if let Ok(lock) = config.try_lock() {
|
||||||
let mode = serde_json::to_string(&lock.builtin_modes).unwrap();
|
let mode = serde_json::to_string(&lock.kbd_backlight_modes).unwrap();
|
||||||
let mret = m.msg.method_return().append1(mode);
|
let mret = m.msg.method_return().append1(mode);
|
||||||
Ok(vec![mret])
|
Ok(vec![mret])
|
||||||
} else {
|
} else {
|
||||||
@@ -124,7 +124,7 @@ fn get_fan_mode(config: Arc<Mutex<Config>>) -> Method<MTSync, ()> {
|
|||||||
.method("GetFanMode", (), {
|
.method("GetFanMode", (), {
|
||||||
move |m| {
|
move |m| {
|
||||||
if let Ok(lock) = config.try_lock() {
|
if let Ok(lock) = config.try_lock() {
|
||||||
let mret = m.msg.method_return().append1(lock.fan_mode);
|
let mret = m.msg.method_return().append1(lock.power_profile);
|
||||||
Ok(vec![mret])
|
Ok(vec![mret])
|
||||||
} else {
|
} else {
|
||||||
Err(MethodErr::failed("Could not lock config for access"))
|
Err(MethodErr::failed("Could not lock config for access"))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use asus_nb::aura_modes::{
|
use asus_nb::aura_modes::{
|
||||||
AuraModes, BREATHING, COMET, FLASH, HIGHLIGHT, LASER, MULTISTATIC, PULSE, RAIN, RAINBOW, RGB,
|
AuraModes, BREATHING, COMET, FLASH, HIGHLIGHT, LASER, MULTISTATIC, PULSE, RAIN, RAINBOW, RGB,
|
||||||
RIPPLE, SINGLE, STAR, STROBE,
|
RIPPLE, STATIC, STAR, STROBE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static HELP_ADDRESS: &str = "https://gitlab.com/asus-linux/asus-nb-ctrl";
|
static HELP_ADDRESS: &str = "https://gitlab.com/asus-linux/asus-nb-ctrl";
|
||||||
@@ -17,7 +17,7 @@ pub fn match_laptop() -> LaptopBase {
|
|||||||
info!("Found GL753 or similar");
|
info!("Found GL753 or similar");
|
||||||
return LaptopBase {
|
return LaptopBase {
|
||||||
usb_product: "1854".to_string(),
|
usb_product: "1854".to_string(),
|
||||||
supported_modes: vec![SINGLE, BREATHING, STROBE],
|
supported_modes: vec![STATIC, BREATHING, STROBE],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -54,12 +54,12 @@ fn select_1866_device(prod: String) -> LaptopBase {
|
|||||||
|| board_name.starts_with("G532")
|
|| board_name.starts_with("G532")
|
||||||
{
|
{
|
||||||
laptop.supported_modes = vec![
|
laptop.supported_modes = vec![
|
||||||
SINGLE, BREATHING, STROBE, RAINBOW, STAR, RAIN, HIGHLIGHT, LASER, RIPPLE, PULSE, COMET,
|
STATIC, BREATHING, STROBE, RAINBOW, STAR, RAIN, HIGHLIGHT, LASER, RIPPLE, PULSE, COMET,
|
||||||
FLASH, RGB,
|
FLASH, RGB,
|
||||||
];
|
];
|
||||||
} else if board_name.starts_with("G531") || board_name.starts_with("G731") {
|
} else if board_name.starts_with("G531") || board_name.starts_with("G731") {
|
||||||
laptop.supported_modes = vec![
|
laptop.supported_modes = vec![
|
||||||
SINGLE,
|
STATIC,
|
||||||
BREATHING,
|
BREATHING,
|
||||||
STROBE,
|
STROBE,
|
||||||
RAINBOW,
|
RAINBOW,
|
||||||
@@ -76,14 +76,14 @@ fn select_1866_device(prod: String) -> LaptopBase {
|
|||||||
];
|
];
|
||||||
// RGB, limited effects, no zones
|
// RGB, limited effects, no zones
|
||||||
} else if board_name.starts_with("G512LI") || board_name.starts_with("G712LI") {
|
} else if board_name.starts_with("G512LI") || board_name.starts_with("G712LI") {
|
||||||
laptop.supported_modes = vec![SINGLE, BREATHING, STROBE, RAINBOW, PULSE];
|
laptop.supported_modes = vec![STATIC, BREATHING, STROBE, RAINBOW, PULSE];
|
||||||
// RGB, limited effects, 4-zone RGB
|
// RGB, limited effects, 4-zone RGB
|
||||||
} else if board_name.starts_with("GM501")
|
} else if board_name.starts_with("GM501")
|
||||||
|| board_name.starts_with("GX531")
|
|| board_name.starts_with("GX531")
|
||||||
|| board_name.starts_with("G512")
|
|| board_name.starts_with("G512")
|
||||||
|| board_name.starts_with("G712")
|
|| board_name.starts_with("G712")
|
||||||
{
|
{
|
||||||
laptop.supported_modes = vec![SINGLE, BREATHING, STROBE, RAINBOW, PULSE, MULTISTATIC];
|
laptop.supported_modes = vec![STATIC, BREATHING, STROBE, RAINBOW, PULSE, MULTISTATIC];
|
||||||
} else {
|
} else {
|
||||||
warn!(
|
warn!(
|
||||||
"Unsupported laptop, please request support at {}",
|
"Unsupported laptop, please request support at {}",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use gumdrop::Options;
|
|||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
cli_options::{LedBrightness, SetAuraBuiltin},
|
cli_options::{LedBrightness, SetAuraBuiltin},
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
};
|
};
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
@@ -14,11 +14,11 @@ struct CLIStart {
|
|||||||
#[options(help = "show program version number")]
|
#[options(help = "show program version number")]
|
||||||
version: bool,
|
version: bool,
|
||||||
#[options(meta = "VAL", help = "<off, low, med, high>")]
|
#[options(meta = "VAL", help = "<off, low, med, high>")]
|
||||||
bright: Option<LedBrightness>,
|
kbd_bright: Option<LedBrightness>,
|
||||||
#[options(meta = "FAN", help = "<silent, normal, boost>")]
|
#[options(meta = "PWR", help = "<silent, normal, boost>")]
|
||||||
fan_mode: Option<FanLevel>,
|
pwr_profile: Option<FanLevel>,
|
||||||
#[options(meta = "CHRG", help = "<20-100>")]
|
#[options(meta = "CHRG", help = "<20-100>")]
|
||||||
charge_limit: Option<u8>,
|
chg_limit: Option<u8>,
|
||||||
#[options(command)]
|
#[options(command)]
|
||||||
command: Option<Command>,
|
command: Option<Command>,
|
||||||
}
|
}
|
||||||
@@ -52,21 +52,21 @@ pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
println!("Version: {}", daemon::VERSION);
|
println!("Version: {}", daemon::VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
let writer = AuraDbusWriter::new()?;
|
let writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
if let Some(Command::LedMode(mode)) = parsed.command {
|
if let Some(Command::LedMode(mode)) = parsed.command {
|
||||||
if let Some(command) = mode.command {
|
if let Some(command) = mode.command {
|
||||||
writer.write_builtin_mode(&command.into())?
|
writer.write_builtin_mode(&command.into())?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(brightness) = parsed.bright {
|
if let Some(brightness) = parsed.kbd_bright {
|
||||||
writer.write_brightness(brightness.level())?;
|
writer.write_brightness(brightness.level())?;
|
||||||
}
|
}
|
||||||
if let Some(fan_level) = parsed.fan_mode {
|
if let Some(fan_level) = parsed.pwr_profile {
|
||||||
writer.write_fan_mode(fan_level.into())?;
|
writer.write_fan_mode(fan_level.into())?;
|
||||||
}
|
}
|
||||||
if let Some(charge_limit) = parsed.charge_limit {
|
if let Some(chg_limit) = parsed.chg_limit {
|
||||||
writer.write_charge_limit(charge_limit)?;
|
writer.write_charge_limit(chg_limit)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
fancy::{GX502Layout, Key, KeyColourArray, KeyLayout},
|
fancy::{GX502Layout, Key, KeyColourArray, KeyLayout},
|
||||||
};
|
};
|
||||||
use std::collections::LinkedList;
|
use std::collections::LinkedList;
|
||||||
@@ -54,7 +54,7 @@ impl Ball {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let mut writer = AuraDbusWriter::new()?;
|
let mut writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
let mut colours = KeyColourArray::new();
|
let mut colours = KeyColourArray::new();
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
fancy::{GX502Layout, KeyColourArray, KeyLayout},
|
fancy::{GX502Layout, KeyColourArray, KeyLayout},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let mut writer = AuraDbusWriter::new()?;
|
let mut writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
let layout = GX502Layout::default();
|
let layout = GX502Layout::default();
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
fancy::{GX502Layout, Key, KeyColourArray, KeyLayout},
|
fancy::{GX502Layout, Key, KeyColourArray, KeyLayout},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let mut writer = AuraDbusWriter::new()?;
|
let mut writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
let mut key_colours = KeyColourArray::new();
|
let mut key_colours = KeyColourArray::new();
|
||||||
let layout = GX502Layout::default();
|
let layout = GX502Layout::default();
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
fancy::{Key, KeyColourArray},
|
fancy::{Key, KeyColourArray},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let mut writer = AuraDbusWriter::new()?;
|
let mut writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
let mut key_colours = KeyColourArray::new();
|
let mut key_colours = KeyColourArray::new();
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use asus_nb::{
|
use asus_nb::{
|
||||||
core_dbus::AuraDbusWriter,
|
core_dbus::AuraDbusClient,
|
||||||
fancy::{GX502Layout, KeyColourArray, KeyLayout},
|
fancy::{GX502Layout, KeyColourArray, KeyLayout},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let mut writer = AuraDbusWriter::new()?;
|
let mut writer = AuraDbusClient::new()?;
|
||||||
|
|
||||||
let mut key_colours = KeyColourArray::new();
|
let mut key_colours = KeyColourArray::new();
|
||||||
let layout = GX502Layout::default();
|
let layout = GX502Layout::default();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use crate::cli_options;
|
|||||||
use crate::cli_options::SetAuraBuiltin;
|
use crate::cli_options::SetAuraBuiltin;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub const SINGLE: u8 = 0x00;
|
pub const STATIC: u8 = 0x00;
|
||||||
pub const BREATHING: u8 = 0x01;
|
pub const BREATHING: u8 = 0x01;
|
||||||
pub const STROBE: u8 = 0x02;
|
pub const STROBE: u8 = 0x02;
|
||||||
pub const RAINBOW: u8 = 0x03;
|
pub const RAINBOW: u8 = 0x03;
|
||||||
@@ -26,7 +26,7 @@ impl From<cli_options::Colour> for Colour {
|
|||||||
}
|
}
|
||||||
impl Default for Colour {
|
impl Default for Colour {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Colour(255, 255, 255)
|
Colour(128, 0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ impl From<cli_options::SingleColourSpeed> for SingleColourSpeed {
|
|||||||
|
|
||||||
#[derive(Clone, Deserialize, Serialize)]
|
#[derive(Clone, Deserialize, Serialize)]
|
||||||
pub enum AuraModes {
|
pub enum AuraModes {
|
||||||
Stable(SingleColour),
|
Static(SingleColour),
|
||||||
Breathe(TwoColourSpeed),
|
Breathe(TwoColourSpeed),
|
||||||
Strobe(SingleSpeed),
|
Strobe(SingleSpeed),
|
||||||
Rainbow(SingleSpeedDirection),
|
Rainbow(SingleSpeedDirection),
|
||||||
@@ -186,7 +186,7 @@ pub enum AuraModes {
|
|||||||
impl From<SetAuraBuiltin> for AuraModes {
|
impl From<SetAuraBuiltin> for AuraModes {
|
||||||
fn from(mode: SetAuraBuiltin) -> Self {
|
fn from(mode: SetAuraBuiltin) -> Self {
|
||||||
match mode {
|
match mode {
|
||||||
SetAuraBuiltin::Stable(x) => AuraModes::Stable(x.into()),
|
SetAuraBuiltin::Static(x) => AuraModes::Static(x.into()),
|
||||||
SetAuraBuiltin::Breathe(x) => AuraModes::Breathe(x.into()),
|
SetAuraBuiltin::Breathe(x) => AuraModes::Breathe(x.into()),
|
||||||
SetAuraBuiltin::Strobe(x) => AuraModes::Strobe(x.into()),
|
SetAuraBuiltin::Strobe(x) => AuraModes::Strobe(x.into()),
|
||||||
SetAuraBuiltin::Rainbow(x) => AuraModes::Rainbow(x.into()),
|
SetAuraBuiltin::Rainbow(x) => AuraModes::Rainbow(x.into()),
|
||||||
@@ -221,7 +221,7 @@ impl From<&mut AuraModes> for u8 {
|
|||||||
impl From<&AuraModes> for u8 {
|
impl From<&AuraModes> for u8 {
|
||||||
fn from(mode: &AuraModes) -> Self {
|
fn from(mode: &AuraModes) -> Self {
|
||||||
match mode {
|
match mode {
|
||||||
AuraModes::Stable(_) => SINGLE,
|
AuraModes::Static(_) => STATIC,
|
||||||
AuraModes::Breathe(_) => BREATHING,
|
AuraModes::Breathe(_) => BREATHING,
|
||||||
AuraModes::Strobe(_) => STROBE,
|
AuraModes::Strobe(_) => STROBE,
|
||||||
AuraModes::Rainbow(_) => RAINBOW,
|
AuraModes::Rainbow(_) => RAINBOW,
|
||||||
@@ -243,7 +243,7 @@ impl From<&AuraModes> for u8 {
|
|||||||
impl From<&AuraModes> for &str {
|
impl From<&AuraModes> for &str {
|
||||||
fn from(mode: &AuraModes) -> Self {
|
fn from(mode: &AuraModes) -> Self {
|
||||||
match mode {
|
match mode {
|
||||||
AuraModes::Stable(_) => "Static",
|
AuraModes::Static(_) => "Static",
|
||||||
AuraModes::Breathe(_) => "Breathing",
|
AuraModes::Breathe(_) => "Breathing",
|
||||||
AuraModes::Strobe(_) => "Strobing",
|
AuraModes::Strobe(_) => "Strobing",
|
||||||
AuraModes::Rainbow(_) => "Rainbow",
|
AuraModes::Rainbow(_) => "Rainbow",
|
||||||
@@ -267,7 +267,7 @@ impl From<&AuraModes> for &str {
|
|||||||
impl From<u8> for AuraModes {
|
impl From<u8> for AuraModes {
|
||||||
fn from(byte: u8) -> Self {
|
fn from(byte: u8) -> Self {
|
||||||
match byte {
|
match byte {
|
||||||
SINGLE => AuraModes::Stable(SingleColour::default()),
|
STATIC => AuraModes::Static(SingleColour::default()),
|
||||||
BREATHING => AuraModes::Breathe(TwoColourSpeed::default()),
|
BREATHING => AuraModes::Breathe(TwoColourSpeed::default()),
|
||||||
STROBE => AuraModes::Strobe(SingleSpeed::default()),
|
STROBE => AuraModes::Strobe(SingleSpeed::default()),
|
||||||
RAINBOW => AuraModes::Rainbow(SingleSpeedDirection::default()),
|
RAINBOW => AuraModes::Rainbow(SingleSpeedDirection::default()),
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ pub struct SingleColourSpeed {
|
|||||||
#[derive(Options, Deserialize, Serialize)]
|
#[derive(Options, Deserialize, Serialize)]
|
||||||
pub enum SetAuraBuiltin {
|
pub enum SetAuraBuiltin {
|
||||||
#[options(help = "set a single static colour")]
|
#[options(help = "set a single static colour")]
|
||||||
Stable(SingleColour),
|
Static(SingleColour),
|
||||||
#[options(help = "pulse between one or two colours")]
|
#[options(help = "pulse between one or two colours")]
|
||||||
Breathe(TwoColourSpeed),
|
Breathe(TwoColourSpeed),
|
||||||
#[options(help = "strobe through all colours")]
|
#[options(help = "strobe through all colours")]
|
||||||
@@ -207,7 +207,7 @@ pub enum SetAuraBuiltin {
|
|||||||
|
|
||||||
impl Default for SetAuraBuiltin {
|
impl Default for SetAuraBuiltin {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
SetAuraBuiltin::Stable(SingleColour {
|
SetAuraBuiltin::Static(SingleColour {
|
||||||
help: false,
|
help: false,
|
||||||
colour: Colour(255, 0, 0),
|
colour: Colour(255, 0, 0),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ use std::sync::{
|
|||||||
use std::{thread, time::Duration};
|
use std::{thread, time::Duration};
|
||||||
|
|
||||||
/// Simplified way to write a effect block
|
/// Simplified way to write a effect block
|
||||||
pub struct AuraDbusWriter {
|
pub struct AuraDbusClient {
|
||||||
connection: Box<Connection>,
|
connection: Box<Connection>,
|
||||||
block_time: u64,
|
block_time: u64,
|
||||||
stop: Arc<AtomicBool>,
|
stop: Arc<AtomicBool>,
|
||||||
stop_token: Token,
|
stop_token: Token,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AuraDbusWriter {
|
impl AuraDbusClient {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> Result<Self, Box<dyn Error>> {
|
pub fn new() -> Result<Self, Box<dyn Error>> {
|
||||||
let connection = Connection::new_system()?;
|
let connection = Connection::new_system()?;
|
||||||
@@ -32,7 +32,7 @@ impl AuraDbusWriter {
|
|||||||
true
|
true
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(AuraDbusWriter {
|
Ok(AuraDbusClient {
|
||||||
connection: Box::new(connection),
|
connection: Box::new(connection),
|
||||||
block_time: 33333,
|
block_time: 33333,
|
||||||
stop,
|
stop,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
pub static DBUS_NAME: &str = "org.asus-linux.Daemon";
|
pub static DBUS_NAME: &str = "org.asuslinux.Daemon";
|
||||||
pub static DBUS_PATH: &str = "/org/asus-linux/Daemon";
|
pub static DBUS_PATH: &str = "/org/asus/linux/Daemon";
|
||||||
pub static DBUS_IFACE: &str = "org.asus-linux.Daemon";
|
pub static DBUS_IFACE: &str = "org.asuslinux.Daemon";
|
||||||
pub const LED_MSG_LEN: usize = 17;
|
pub const LED_MSG_LEN: usize = 17;
|
||||||
|
|
||||||
pub mod aura_modes;
|
pub mod aura_modes;
|
||||||
@@ -145,7 +145,7 @@ impl From<&AuraModes> for [u8; LED_MSG_LEN] {
|
|||||||
msg[1] = 0xb3;
|
msg[1] = 0xb3;
|
||||||
match mode {
|
match mode {
|
||||||
AuraModes::LedBrightness(n) => return aura_brightness_bytes(*n),
|
AuraModes::LedBrightness(n) => return aura_brightness_bytes(*n),
|
||||||
AuraModes::Stable(_) => msg[3] = 0x00,
|
AuraModes::Static(_) => msg[3] = 0x00,
|
||||||
AuraModes::Breathe(_) => msg[3] = 0x01,
|
AuraModes::Breathe(_) => msg[3] = 0x01,
|
||||||
AuraModes::Strobe(_) => msg[3] = 0x02,
|
AuraModes::Strobe(_) => msg[3] = 0x02,
|
||||||
AuraModes::Rainbow(_) => msg[3] = 0x03,
|
AuraModes::Rainbow(_) => msg[3] = 0x03,
|
||||||
@@ -192,7 +192,7 @@ impl From<&AuraModes> for [u8; LED_MSG_LEN] {
|
|||||||
msg[6] = settings.colour.2;
|
msg[6] = settings.colour.2;
|
||||||
msg[7] = settings.speed as u8;
|
msg[7] = settings.speed as u8;
|
||||||
}
|
}
|
||||||
AuraModes::Stable(settings)
|
AuraModes::Static(settings)
|
||||||
| AuraModes::Pulse(settings)
|
| AuraModes::Pulse(settings)
|
||||||
| AuraModes::Comet(settings)
|
| AuraModes::Comet(settings)
|
||||||
| AuraModes::Flash(settings) => {
|
| AuraModes::Flash(settings) => {
|
||||||
|
|||||||
@@ -3,20 +3,20 @@
|
|||||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||||
<busconfig>
|
<busconfig>
|
||||||
<policy group="adm">
|
<policy group="adm">
|
||||||
<allow send_destination="org.asus-linux.Daemon"/>
|
<allow send_destination="org.asuslinux.Daemon"/>
|
||||||
<allow receive_sender="org.asus-linux.Daemon"/>
|
<allow receive_sender="org.asuslinux.Daemon"/>
|
||||||
</policy>
|
</policy>
|
||||||
<policy group="sudo">
|
<policy group="sudo">
|
||||||
<allow send_destination="org.asus-linux.Daemon"/>
|
<allow send_destination="org.asuslinux.Daemon"/>
|
||||||
<allow receive_sender="org.asus-linux.Daemon"/>
|
<allow receive_sender="org.asuslinux.Daemon"/>
|
||||||
</policy>
|
</policy>
|
||||||
<policy group="wheel">
|
<policy group="wheel">
|
||||||
<allow send_destination="org.asus-linux.Daemon"/>
|
<allow send_destination="org.asuslinux.Daemon"/>
|
||||||
<allow receive_sender="org.asus-linux.Daemon"/>
|
<allow receive_sender="org.asuslinux.Daemon"/>
|
||||||
</policy>
|
</policy>
|
||||||
<policy user="root">
|
<policy user="root">
|
||||||
<allow own="org.asus-linux.Daemon"/>
|
<allow own="org.asuslinux.Daemon"/>
|
||||||
<allow send_destination="org.asus-linux.Daemon"/>
|
<allow send_destination="org.asuslinux.Daemon"/>
|
||||||
<allow receive_sender="org.asus-linux.Daemon"/>
|
<allow receive_sender="org.asuslinux.Daemon"/>
|
||||||
</policy>
|
</policy>
|
||||||
</busconfig>
|
</busconfig>
|
||||||
|
|||||||
Reference in New Issue
Block a user