mirror of
https://github.com/ivabus/speakersafetyd
synced 2024-11-22 00:05:06 +03:00
Change temperature handling
Headroom goes *above* the limit, not below. Replace the max safe temp thing with a window delta below the limit where attenuation begins. Signed-off-by: Hector Martin <marcan@marcan.st>
This commit is contained in:
parent
b12c8b69da
commit
21023ec426
2 changed files with 10 additions and 10 deletions
|
@ -82,7 +82,7 @@ impl Blackbox {
|
|||
sample_rate: self.blocks[0].sample_rate,
|
||||
channels: self.globals.channels,
|
||||
t_ambient: self.globals.t_ambient,
|
||||
t_safe_max: self.globals.t_safe_max,
|
||||
t_window: self.globals.t_window,
|
||||
t_hysteresis: self.globals.t_hysteresis,
|
||||
blocks: null
|
||||
};
|
||||
|
|
18
src/types.rs
18
src/types.rs
|
@ -186,7 +186,7 @@ pub struct Globals {
|
|||
pub channels: usize,
|
||||
pub period: usize,
|
||||
pub t_ambient: f32,
|
||||
pub t_safe_max: f32,
|
||||
pub t_window: f32,
|
||||
pub t_hysteresis: f32,
|
||||
pub ctl_vsense: String,
|
||||
pub ctl_isense: String,
|
||||
|
@ -201,7 +201,7 @@ impl Globals {
|
|||
channels: helpers::parse_int(config, "Globals", "channels"),
|
||||
period: helpers::parse_int(config, "Globals", "period"),
|
||||
t_ambient: helpers::parse_float(config, "Globals", "t_ambient"),
|
||||
t_safe_max: helpers::parse_float(config, "Globals", "t_safe_max"),
|
||||
t_window: helpers::parse_float(config, "Globals", "t_window"),
|
||||
t_hysteresis: helpers::parse_float(config, "Globals", "t_hysteresis"),
|
||||
ctl_vsense: helpers::parse_string(config, "Controls", "vsense"),
|
||||
ctl_isense: helpers::parse_string(config, "Controls", "isense"),
|
||||
|
@ -286,16 +286,16 @@ impl Speaker {
|
|||
|
||||
s.t_coil = if cold_boot {
|
||||
// Assume warm but not warm enough to limit
|
||||
globals.t_safe_max as f64 - 1f64
|
||||
(new_speaker.t_limit - globals.t_window) as f64 - 1f64
|
||||
} else {
|
||||
// Worst case startup assumption
|
||||
(new_speaker.t_limit - new_speaker.t_headroom) as f64
|
||||
new_speaker.t_limit as f64
|
||||
};
|
||||
s.t_magnet = globals.t_ambient as f64
|
||||
+ (s.t_coil - globals.t_ambient as f64)
|
||||
* (new_speaker.tr_magnet / (new_speaker.tr_magnet + new_speaker.tr_coil)) as f64;
|
||||
|
||||
let max_dt = new_speaker.t_limit - new_speaker.t_headroom - globals.t_ambient;
|
||||
let max_dt = new_speaker.t_limit - globals.t_ambient;
|
||||
let max_pwr = max_dt / (new_speaker.tr_magnet + new_speaker.tr_coil);
|
||||
|
||||
let amp_gain = new_speaker.alsa_iface.get_amp_gain(ctl);
|
||||
|
@ -307,7 +307,7 @@ impl Speaker {
|
|||
|
||||
assert!(new_speaker.is_chan < globals.channels);
|
||||
assert!(new_speaker.vs_chan < globals.channels);
|
||||
assert!(new_speaker.t_limit - new_speaker.t_headroom > globals.t_safe_max);
|
||||
assert!(new_speaker.t_limit - globals.t_window > globals.t_ambient);
|
||||
|
||||
info!(" Group: {}", new_speaker.group);
|
||||
info!(" Max temperature: {:.1} °C", new_speaker.t_limit);
|
||||
|
@ -341,13 +341,13 @@ impl Speaker {
|
|||
s.t_coil = t_coil_target * alpha_coil + s.t_coil * (1. - alpha_coil);
|
||||
s.t_magnet = t_magnet_target * alpha_magnet + s.t_magnet * (1. - alpha_magnet);
|
||||
|
||||
if s.t_coil > self.t_limit as f64 {
|
||||
if s.t_coil > (self.t_limit + self.t_headroom) as f64 {
|
||||
panic!(
|
||||
"{}: Coil temperature limit exceeded ({} > {})",
|
||||
self.name, s.t_coil, self.t_limit
|
||||
);
|
||||
}
|
||||
if s.t_magnet > self.t_limit as f64 {
|
||||
if s.t_magnet > (self.t_limit + self.t_headroom) as f64 {
|
||||
panic!(
|
||||
"{}: Magnet temperature limit exceeded ({} > {})",
|
||||
self.name, s.t_magnet, self.t_limit
|
||||
|
@ -371,7 +371,7 @@ impl Speaker {
|
|||
let temp = s.t_coil_hyst.max(s.t_magnet_hyst);
|
||||
|
||||
let reduction =
|
||||
(temp - self.g.t_safe_max) / (self.t_limit - self.t_headroom - self.g.t_safe_max);
|
||||
(temp - (self.t_limit - self.g.t_window)) / self.g.t_window;
|
||||
let gain = s.min_gain * reduction.max(0.);
|
||||
|
||||
s.gain = gain;
|
||||
|
|
Loading…
Reference in a new issue