--- a/src/main.rs +++ b/src/main.rs @@ -174,19 +174,20 @@ fn start_temp_loop( } } - let sum_temp: u16 = temps.iter().map(|t| *t as u16).sum(); - let mean_temp = sum_temp / (temps.len() as u16); - if mean_temp == last_temp { + // Max over the rolling window tracks spikes; the upstream mean can lag several + // seconds behind bursty GPU/CPU load. + let control_temp = temps.iter().copied().max().expect("non-empty after push_back"); + if control_temp == last_temp { std::thread::sleep(std::time::Duration::from_secs(1)); was_long_sleep = true; } else { - last_temp = mean_temp; + last_temp = control_temp; for fan in fans { - fan.set_speed(fan.calc_speed(mean_temp as u8))?; + fan.set_speed(fan.calc_speed(control_temp))?; } std::thread::sleep(std::time::Duration::from_millis(100)); was_long_sleep = false; } }