helios64/fancontrol.rs
2021-02-05 00:26:59 +01:00

48 lines
1.4 KiB
Rust

use std::cmp::{max, min};
use std::path::PathBuf;
use std::fs::{read_dir, read_to_string, write};
use std::thread::sleep;
use std::time::Duration;
const MINTEMP : i32 = 50000;
const MAXTEMP : i32 = 80000;
const MINSTART : i32 = 60;
const MINSTOP : i32 = 29;
const MAXPWM : i32 = 255;
fn adjust(fan: &PathBuf, sensor: &PathBuf) {
let temp: i32 = read_to_string(sensor).unwrap().trim().parse().unwrap();
let prev_pwm: i32 = read_to_string(fan).unwrap().trim().parse().unwrap();
let mut pwm: i32;
pwm = (temp - MINTEMP) * 255 / (MAXTEMP - MINTEMP);
pwm = max(pwm, 0);
if pwm > 0 {
pwm = max(pwm, if prev_pwm < MINSTOP { MINSTART } else { MINSTOP });
pwm = min(pwm, MAXPWM);
}
//println!("sensor: {}, pwm: {}", temp, pwm);
write(fan, pwm.to_string()).unwrap();
}
fn main() {
let mut fans = Vec::new();
for hwmon_dir in ["/sys/devices/platform/p6-fan/hwmon", "/sys/devices/platform/p7-fan/hwmon"].iter() {
for dir in read_dir(hwmon_dir).unwrap() {
let mut p = dir.unwrap().path();
p.push("pwm1");
if p.exists() {
fans.push(p)
}
}
}
let fans = fans;
loop {
for fan in &fans {
adjust(fan, &PathBuf::from("/sys/devices/virtual/thermal/thermal_zone0/hwmon0/temp1_input"))
}
sleep(Duration::from_secs(5));
}
}