diff --git a/internal/configuration/fans.go b/internal/configuration/fans.go index e921fba..9507de2 100644 --- a/internal/configuration/fans.go +++ b/internal/configuration/fans.go @@ -5,7 +5,7 @@ type FanConfig struct { NeverStop bool `json:"neverStop"` // MinPwm defines the lowest PWM value where the fans are still spinning, when spinning previously MinPwm *int `json:"minPwm,omitempty"` - // MinPwm defines the lowest PWM value where the fans are able to start spinning from a standstill + // StartPwm defines the lowest PWM value where the fans are able to start spinning from a standstill StartPwm *int `json:"startPwm,omitempty"` // MaxPwm defines the highest PWM value that yields an RPM increase MaxPwm *int `json:"maxPwm,omitempty"` diff --git a/internal/controller/controller.go b/internal/controller/controller.go index 26a12e8..8b999f3 100644 --- a/internal/controller/controller.go +++ b/internal/controller/controller.go @@ -136,6 +136,10 @@ func (f *fanController) Run(ctx context.Context) error { ui.Info("PWM settings of fan '%s': Min %d, Start %d, Max %d", fan.GetId(), fan.GetMinPwm(), fan.GetStartPwm(), fan.GetMaxPwm()) ui.Info("Starting controller loop for fan '%s'", fan.GetId()) + if fan.GetMinPwm() > fan.GetStartPwm() { + ui.Warning("Suspicious pwm config of fan '%s': MinPwm (%d) > StartPwm (%d)", fan.GetId(), fan.GetMinPwm(), fan.GetStartPwm()) + } + var g run.Group if fan.Supports(fans.FeatureRpmSensor) { @@ -413,7 +417,7 @@ func (f *fanController) calculateTargetPwm() int { } ui.Warning("WARNING: Increasing minPWM of %s from %d to %d, which is supposed to never stop, but RPM is %d", fan.GetId(), fan.GetMinPwm(), fan.GetMinPwm()+1, int(avgRpm)) - fan.SetMinPwm(fan.GetMinPwm() + 1) + fan.SetMinPwm(fan.GetMinPwm()+1, true) target++ // set the moving avg to a value > 0 to prevent diff --git a/internal/controller/controller_test.go b/internal/controller/controller_test.go index 2520a4a..0f70dd5 100644 --- a/internal/controller/controller_test.go +++ b/internal/controller/controller_test.go @@ -69,7 +69,7 @@ func (fan MockFan) GetStartPwm() int { return 0 } -func (fan *MockFan) SetStartPwm(pwm int) { +func (fan *MockFan) SetStartPwm(pwm int, force bool) { panic("not supported") } @@ -77,7 +77,7 @@ func (fan MockFan) GetMinPwm() int { return fan.MinPWM } -func (fan *MockFan) SetMinPwm(pwm int) { +func (fan *MockFan) SetMinPwm(pwm int, force bool) { fan.MinPWM = pwm } @@ -85,7 +85,7 @@ func (fan MockFan) GetMaxPwm() int { return fans.MaxPwmValue } -func (fan *MockFan) SetMaxPwm(pwm int) { +func (fan *MockFan) SetMaxPwm(pwm int, force bool) { panic("not supported") } diff --git a/internal/fans/cmd.go b/internal/fans/cmd.go index 53aebbf..25b5bc4 100644 --- a/internal/fans/cmd.go +++ b/internal/fans/cmd.go @@ -27,7 +27,7 @@ func (fan CmdFan) GetStartPwm() int { return 1 } -func (fan *CmdFan) SetStartPwm(pwm int) { +func (fan *CmdFan) SetStartPwm(pwm int, force bool) { return } @@ -35,7 +35,7 @@ func (fan CmdFan) GetMinPwm() int { return MinPwmValue } -func (fan *CmdFan) SetMinPwm(pwm int) { +func (fan *CmdFan) SetMinPwm(pwm int, force bool) { // not supported return } @@ -44,7 +44,7 @@ func (fan CmdFan) GetMaxPwm() int { return MaxPwmValue } -func (fan *CmdFan) SetMaxPwm(pwm int) { +func (fan *CmdFan) SetMaxPwm(pwm int, force bool) { // not supported return } diff --git a/internal/fans/common.go b/internal/fans/common.go index b5844c8..16d5a14 100644 --- a/internal/fans/common.go +++ b/internal/fans/common.go @@ -36,17 +36,17 @@ var ( type Fan interface { GetId() string - // GetStartPwm returns the min PWM at which the fan starts to rotate from a stand still - GetStartPwm() int - SetStartPwm(pwm int) - // GetMinPwm returns the lowest PWM value where the fans are still spinning, when spinning previously GetMinPwm() int - SetMinPwm(pwm int) + SetMinPwm(pwm int, force bool) + + // GetStartPwm returns the min PWM at which the fan starts to rotate from a stand still + GetStartPwm() int + SetStartPwm(pwm int, force bool) // GetMaxPwm returns the highest PWM value that yields an RPM increase GetMaxPwm() int - SetMaxPwm(pwm int) + SetMaxPwm(pwm int, force bool) // GetRpm returns the current RPM value of this fan GetRpm() (int, error) @@ -81,7 +81,9 @@ func NewFan(config configuration.FanConfig) (Fan, error) { return &HwMonFan{ Label: config.ID, Index: config.HwMon.Index, + MinPwm: config.MinPwm, StartPwm: config.StartPwm, + MaxPwm: config.MaxPwm, Config: config, }, nil } diff --git a/internal/fans/file.go b/internal/fans/file.go index 5debe81..78d3683 100644 --- a/internal/fans/file.go +++ b/internal/fans/file.go @@ -24,7 +24,7 @@ func (fan FileFan) GetStartPwm() int { return 1 } -func (fan *FileFan) SetStartPwm(pwm int) { +func (fan *FileFan) SetStartPwm(pwm int, force bool) { return } @@ -32,7 +32,7 @@ func (fan FileFan) GetMinPwm() int { return MinPwmValue } -func (fan *FileFan) SetMinPwm(pwm int) { +func (fan *FileFan) SetMinPwm(pwm int, force bool) { // not supported return } @@ -41,7 +41,7 @@ func (fan FileFan) GetMaxPwm() int { return MaxPwmValue } -func (fan *FileFan) SetMaxPwm(pwm int) { +func (fan *FileFan) SetMaxPwm(pwm int, force bool) { // not supported return } diff --git a/internal/fans/hwmon.go b/internal/fans/hwmon.go index ab3ee92..ad2eb2e 100644 --- a/internal/fans/hwmon.go +++ b/internal/fans/hwmon.go @@ -16,7 +16,9 @@ type HwMonFan struct { Index int `json:"index"` RpmMovingAvg float64 `json:"rpmMovingAvg"` Config configuration.FanConfig `json:"config"` - StartPwm *int `json:"startPwm"` // the min PWM at which the fan starts to rotate from a stand still + MinPwm *int `json:"minPwm"` + StartPwm *int `json:"startPwm"` + MaxPwm *int `json:"maxPwm"` FanCurveData *map[int]float64 `json:"fanCurveData"` Rpm int `json:"rpm"` Pwm int `json:"pwm"` @@ -26,50 +28,52 @@ func (fan HwMonFan) GetId() string { return fan.Config.ID } -func (fan HwMonFan) GetStartPwm() int { - if fan.StartPwm != nil { - return *fan.StartPwm - } else { - return MaxPwmValue - } -} - -func (fan *HwMonFan) SetStartPwm(pwm int) { - fan.StartPwm = &pwm -} - func (fan HwMonFan) GetMinPwm() int { // if the fan is never supposed to stop, // use the lowest pwm value where the fan is still spinning if fan.ShouldNeverStop() { - var minPwm int - if fan.Config.MinPwm != nil { - minPwm = *fan.Config.MinPwm + if fan.MinPwm != nil { + return *fan.MinPwm } else { - minPwm = MinPwmValue + return MinPwmValue } - return minPwm } return MinPwmValue } -func (fan *HwMonFan) SetMinPwm(pwm int) { - fan.Config.MinPwm = &pwm +func (fan *HwMonFan) SetMinPwm(pwm int, force bool) { + if fan.Config.MinPwm == nil || force { + fan.MinPwm = &pwm + } +} + +func (fan HwMonFan) GetStartPwm() int { + if fan.StartPwm != nil { + return *fan.StartPwm + } else { + return MaxPwmValue + } +} + +func (fan *HwMonFan) SetStartPwm(pwm int, force bool) { + if fan.Config.StartPwm == nil || force { + fan.StartPwm = &pwm + } } func (fan HwMonFan) GetMaxPwm() int { - var maxPwm int - if fan.Config.MaxPwm != nil { - maxPwm = *fan.Config.MaxPwm + if fan.MaxPwm != nil { + return *fan.MaxPwm } else { - maxPwm = MaxPwmValue + return MaxPwmValue } - return maxPwm } -func (fan *HwMonFan) SetMaxPwm(pwm int) { - fan.Config.MaxPwm = &pwm +func (fan *HwMonFan) SetMaxPwm(pwm int, force bool) { + if fan.Config.MaxPwm == nil || force { + fan.MaxPwm = &pwm + } } func (fan *HwMonFan) GetRpm() (int, error) { @@ -121,11 +125,11 @@ func (fan *HwMonFan) AttachFanCurveData(curveData *map[int]float64) (err error) fan.FanCurveData = curveData startPwm, maxPwm := ComputePwmBoundaries(fan) - fan.SetStartPwm(startPwm) - fan.SetMaxPwm(maxPwm) + fan.SetStartPwm(startPwm, false) + fan.SetMaxPwm(maxPwm, false) // TODO: we don't have a way to determine this yet - fan.SetMinPwm(startPwm) + fan.SetMinPwm(startPwm, false) return err } diff --git a/internal/fans/hwmon_test.go b/internal/fans/hwmon_test.go index 244ff56..981ce33 100644 --- a/internal/fans/hwmon_test.go +++ b/internal/fans/hwmon_test.go @@ -26,7 +26,7 @@ func TestHwMonFan_SetStartPwm(t *testing.T) { fan := HwMonFan{} // WHEN - fan.SetStartPwm(expected) + fan.SetStartPwm(expected, false) startPwm := fan.GetStartPwm() // THEN @@ -37,6 +37,7 @@ func TestHwMonFan_ShouldNeverStop_GetMinPwm(t *testing.T) { // GIVEN expected := 30 fan := HwMonFan{ + MinPwm: &expected, Config: configuration.FanConfig{ NeverStop: true, MinPwm: &expected, @@ -73,6 +74,7 @@ func TestHwMonFan_GetMaxPwm(t *testing.T) { // GIVEN expected := 240 fan := HwMonFan{ + MaxPwm: &expected, Config: configuration.FanConfig{ MaxPwm: &expected, }, @@ -91,7 +93,7 @@ func TestHwMonFan_SetMaxPwm(t *testing.T) { fan := HwMonFan{} // WHEN - fan.SetMaxPwm(expected) + fan.SetMaxPwm(expected, false) maxPwm := fan.GetMaxPwm() // THEN