mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Further fan-curve graph work
This commit is contained in:
@@ -1,7 +1,5 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use futures_lite::StreamExt;
|
use futures_lite::StreamExt;
|
||||||
@@ -73,11 +71,11 @@ impl CtrlFanCurveZbus {
|
|||||||
ThrottlePolicy::Performance,
|
ThrottlePolicy::Performance,
|
||||||
ThrottlePolicy::Quiet,
|
ThrottlePolicy::Quiet,
|
||||||
] {
|
] {
|
||||||
let mut dev = find_fan_curve_node()?;
|
|
||||||
// For each profile we need to switch to it before we
|
// For each profile we need to switch to it before we
|
||||||
// can read the existing values from hardware. The ACPI method used
|
// can read the existing values from hardware. The ACPI method used
|
||||||
// for this is what limits us.
|
// for this is what limits us.
|
||||||
platform.set_throttle_thermal_policy(this.into())?;
|
platform.set_throttle_thermal_policy(this.into())?;
|
||||||
|
let mut dev = find_fan_curve_node()?;
|
||||||
fan_curves.set_active_curve_to_defaults(this, &mut dev)?;
|
fan_curves.set_active_curve_to_defaults(this, &mut dev)?;
|
||||||
|
|
||||||
info!("{MOD_NAME}: {this:?}:");
|
info!("{MOD_NAME}: {this:?}:");
|
||||||
|
|||||||
@@ -6,7 +6,19 @@ export component Graph inherits Rectangle {
|
|||||||
in-out property <[Node]> nodes;
|
in-out property <[Node]> nodes;
|
||||||
in property <Node> node_min: { x: 0px, y: 0px };
|
in property <Node> node_min: { x: 0px, y: 0px };
|
||||||
in property <Node> node_max: { x: 100px, y: 255px };
|
in property <Node> node_max: { x: 100px, y: 255px };
|
||||||
property <length> graph_padding: 20px;
|
property <length> graph_padding: 40px;
|
||||||
|
property <length> axis_font_size: 14px;
|
||||||
|
// Text {
|
||||||
|
// x: 0;
|
||||||
|
// text: "Fan PWM";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Text {
|
||||||
|
// x: root.width / 2;
|
||||||
|
// y: root.height - self.height;
|
||||||
|
// text: "Temperature";
|
||||||
|
// }
|
||||||
|
|
||||||
graph := Rectangle {
|
graph := Rectangle {
|
||||||
width: root.width - root.graph_padding * 2;
|
width: root.width - root.graph_padding * 2;
|
||||||
height: root.height - root.graph_padding * 2;
|
height: root.height - root.graph_padding * 2;
|
||||||
@@ -14,13 +26,66 @@ export component Graph inherits Rectangle {
|
|||||||
y: root.graph_padding;
|
y: root.graph_padding;
|
||||||
function scale_x_to_graph(x: length) -> length {
|
function scale_x_to_graph(x: length) -> length {
|
||||||
((x - node_min.x) / (node_max.x - node_min.x)) * graph.width
|
((x - node_min.x) / (node_max.x - node_min.x)) * graph.width
|
||||||
}function scale_y_to_graph(y: length) -> length {
|
}//
|
||||||
|
function scale_y_to_graph(y: length) -> length {
|
||||||
((y - node_min.y) / (node_max.y - node_min.y)) * graph.height
|
((y - node_min.y) / (node_max.y - node_min.y)) * graph.height
|
||||||
}function scale_x_to_node(x: length) -> length {
|
}//
|
||||||
|
function scale_x_to_node(x: length) -> length {
|
||||||
(x / graph.width) * (node_max.x - node_min.x)
|
(x / graph.width) * (node_max.x - node_min.x)
|
||||||
}function scale_y_to_node(y: length) -> length {
|
}//
|
||||||
|
function scale_y_to_node(y: length) -> length {
|
||||||
(y / graph.height) * (node_max.y - node_min.y)
|
(y / graph.height) * (node_max.y - node_min.y)
|
||||||
}for l[idx] in nodes: path := Rectangle {
|
}//
|
||||||
|
|
||||||
|
for n in 11: Path {
|
||||||
|
viewbox-width: self.width / 1px;
|
||||||
|
viewbox-height: self.height / 1px;
|
||||||
|
stroke: Palette.alternate-foreground.darker(200%);
|
||||||
|
stroke-width: 1px;
|
||||||
|
MoveTo {
|
||||||
|
x: scale_x_to_graph(n*10px) / 1px;
|
||||||
|
y: 0; // scale_y_to_graph(n*1px) / 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
LineTo {
|
||||||
|
x: scale_x_to_graph(n*10px) / 1px;
|
||||||
|
y: graph.height / 1px; //scale_y_to_graph(n*1px) / 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for n in 11: Text {
|
||||||
|
color: Palette.accent-background;
|
||||||
|
font-size <=> root.axis_font_size;
|
||||||
|
text: "\{n*10}c";
|
||||||
|
x: scale_x_to_graph(n*10px) - self.width / 3;
|
||||||
|
y: graph.height + 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
for n in 11: Path {
|
||||||
|
viewbox-width: self.width / 1px;
|
||||||
|
viewbox-height: self.height / 1px;
|
||||||
|
stroke: Palette.alternate-foreground.darker(200%);
|
||||||
|
stroke-width: 1px;
|
||||||
|
MoveTo {
|
||||||
|
x: 0; //scale_x_to_graph(n*10px) / 1px;
|
||||||
|
y: scale_y_to_graph(n*25.5px) / 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
LineTo {
|
||||||
|
x: graph.width / 1px; //scale_x_to_graph(n*10px) / 1px;
|
||||||
|
y: scale_y_to_graph(n*25.5px) / 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for n in 11: Text {
|
||||||
|
color: Palette.accent-background;
|
||||||
|
font-size <=> root.axis_font_size;
|
||||||
|
text: "\{n*10}%";
|
||||||
|
x: - self.width;
|
||||||
|
y: graph.height - scale_y_to_graph(n*25.5px) - self.height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for l[idx] in nodes: path := Rectangle {
|
||||||
if idx + 1 != nodes.length: Path {
|
if idx + 1 != nodes.length: Path {
|
||||||
viewbox-width: self.width / 1px;
|
viewbox-width: self.width / 1px;
|
||||||
viewbox-height: self.height / 1px;
|
viewbox-height: self.height / 1px;
|
||||||
@@ -40,13 +105,18 @@ export component Graph inherits Rectangle {
|
|||||||
|
|
||||||
for n[idx] in nodes: Rectangle {
|
for n[idx] in nodes: Rectangle {
|
||||||
states [
|
states [
|
||||||
pressed when touch.pressed: {
|
pressed when touch.pressed: {
|
||||||
state.background: Palette.selection-background;
|
point.background: Palette.selection-background;
|
||||||
|
tip.background: Palette.selection-background;
|
||||||
|
tip.opacity: 1.0;
|
||||||
}
|
}
|
||||||
hover when touch.has-hover: {
|
hover when touch.has-hover: {
|
||||||
state.background: Palette.accent-background;
|
point.background: Palette.accent-background;
|
||||||
|
tip.background: Palette.accent-background;
|
||||||
|
tip.opacity: 1.0;
|
||||||
}
|
}
|
||||||
]state := Rectangle {
|
]//
|
||||||
|
point := Rectangle {
|
||||||
background: Palette.control-foreground;
|
background: Palette.control-foreground;
|
||||||
x: scale_x_to_graph(n.x) - self.width / 2;
|
x: scale_x_to_graph(n.x) - self.width / 2;
|
||||||
y: graph.height - scale_y_to_graph(n.y) - self.height / 2;
|
y: graph.height - scale_y_to_graph(n.y) - self.height / 2;
|
||||||
@@ -94,13 +164,14 @@ export component Graph inherits Rectangle {
|
|||||||
n.y = nodes[idx - 1].y + pad;
|
n.y = nodes[idx - 1].y + pad;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}moved => {
|
}//
|
||||||
|
moved => {
|
||||||
if (self.pressed) {
|
if (self.pressed) {
|
||||||
n.x += scale_x_to_node(self.mouse-x - self.pressed-x);
|
n.x += scale_x_to_node(self.mouse-x - self.pressed-x);
|
||||||
n.y -= scale_y_to_node(self.mouse-y - self.pressed-y);
|
n.y -= scale_y_to_node(self.mouse-y - self.pressed-y);
|
||||||
self.check();
|
self.check();
|
||||||
// nodes[idx] = n;
|
// nodes[idx] = n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clicked => {
|
clicked => {
|
||||||
@@ -109,6 +180,43 @@ export component Graph inherits Rectangle {
|
|||||||
mouse-cursor: move;
|
mouse-cursor: move;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tip := Rectangle {
|
||||||
|
background: Palette.control-foreground;
|
||||||
|
opacity: 0.3;
|
||||||
|
x: final_x_pos();
|
||||||
|
y: final_y_pos();
|
||||||
|
width: label.preferred-width;
|
||||||
|
height: label.preferred-height;
|
||||||
|
function x_pos() -> length {
|
||||||
|
scale_x_to_graph(n.x) - label.preferred-width - 8px
|
||||||
|
}//
|
||||||
|
function final_x_pos() -> length {
|
||||||
|
if x_pos() > 0 {
|
||||||
|
x_pos()
|
||||||
|
} else {
|
||||||
|
x_pos() + label.preferred-width
|
||||||
|
}
|
||||||
|
}//
|
||||||
|
function y_pos() -> length {
|
||||||
|
graph.height - scale_y_to_graph(n.y) - self.height - 4px
|
||||||
|
}//
|
||||||
|
function final_y_pos() -> length {
|
||||||
|
if y_pos() > 0 {
|
||||||
|
y_pos()
|
||||||
|
} else {
|
||||||
|
y_pos() + label.preferred-height
|
||||||
|
}
|
||||||
|
}//
|
||||||
|
function fan_pct() -> int {
|
||||||
|
Math.floor(n.y / 1px) / 255 * 100
|
||||||
|
}//
|
||||||
|
label := Text {
|
||||||
|
color: Palette.accent-foreground;
|
||||||
|
font-size: 16px;
|
||||||
|
text: "\{Math.floor(n.x / 1px)}c, \{fan_pct()}%";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user