feat: add configuration support, update docs (#18)

* chore: remove duplicated import

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>

* chore: rename bcm273x -> bcm2711 to avoid confusion

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>

* feat: add configuration support

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>

* docs: update docs & add install script

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>

* fix: split workflows until release-please is setup on org level

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>

---------

Signed-off-by: Matthias Riegler <matthias.riegler@ankorstore.com>
This commit is contained in:
Matthias Riegler
2023-10-02 23:27:19 +02:00
committed by GitHub
parent 7af2623765
commit 7f166f2ed3
15 changed files with 843 additions and 214 deletions

View File

@@ -11,20 +11,20 @@ type FanController interface {
}
type FanOverrideOpts struct {
Speed uint8
Percent uint8 `mapstructure:"speed"`
}
type FanControllerStep struct {
// Temperature is the temperature to react to
Temperature float64
// Speed is the fan speed in percent
Speed uint8
Temperature float64 `mapstructure:"temperature"`
// Percent is the fan speed in percent
Percent uint8 `mapstructure:"percent"`
}
// FanController configures a fan controller for the computeblade
type FanControllerConfig struct {
// Steps defines the temperature/speed steps for the fan controller
Steps []FanControllerStep
Steps []FanControllerStep `mapstructure:"steps"`
}
// FanController is a simple fan controller that reacts to temperature changes with a linear function
@@ -44,10 +44,10 @@ func NewLinearFanController(config FanControllerConfig) (FanController, error) {
if config.Steps[0].Temperature > config.Steps[1].Temperature {
return nil, fmt.Errorf("step 1 temperature must be lower than step 2 temperature")
}
if config.Steps[0].Speed > config.Steps[1].Speed {
if config.Steps[0].Percent > config.Steps[1].Percent {
return nil, fmt.Errorf("step 1 speed must be lower than step 2 speed")
}
if config.Steps[0].Speed > 100 || config.Steps[1].Speed > 100 {
if config.Steps[0].Percent > 100 || config.Steps[1].Percent > 100 {
return nil, fmt.Errorf("speed must be between 0 and 100")
}
@@ -68,21 +68,21 @@ func (f *fanControllerLinear) GetFanSpeed(temperature float64) uint8 {
defer f.mu.Unlock()
if f.overrideOpts != nil {
return f.overrideOpts.Speed
return f.overrideOpts.Percent
}
if temperature <= f.config.Steps[0].Temperature {
return f.config.Steps[0].Speed
return f.config.Steps[0].Percent
}
if temperature >= f.config.Steps[1].Temperature {
return f.config.Steps[1].Speed
return f.config.Steps[1].Percent
}
// Calculate slope
slope := float64(f.config.Steps[1].Speed-f.config.Steps[0].Speed) / (f.config.Steps[1].Temperature - f.config.Steps[0].Temperature)
slope := float64(f.config.Steps[1].Percent-f.config.Steps[0].Percent) / (f.config.Steps[1].Temperature - f.config.Steps[0].Temperature)
// Calculate speed
speed := float64(f.config.Steps[0].Speed) + slope*(temperature-f.config.Steps[0].Temperature)
speed := float64(f.config.Steps[0].Percent) + slope*(temperature-f.config.Steps[0].Temperature)
return uint8(speed)
}

View File

@@ -12,8 +12,8 @@ func TestFanControllerLinear_GetFanSpeed(t *testing.T) {
config := fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 20, Speed: 30},
{Temperature: 30, Speed: 60},
{Temperature: 20, Percent: 30},
{Temperature: 30, Percent: 60},
},
}
@@ -49,8 +49,8 @@ func TestFanControllerLinear_GetFanSpeedWithOverride(t *testing.T) {
config := fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 20, Speed: 30},
{Temperature: 30, Speed: 60},
{Temperature: 20, Percent: 30},
{Temperature: 30, Percent: 60},
},
}
@@ -59,7 +59,7 @@ func TestFanControllerLinear_GetFanSpeedWithOverride(t *testing.T) {
t.Fatalf("Failed to create fan controller: %v", err)
}
controller.Override(&fancontroller.FanOverrideOpts{
Speed: 99,
Percent: 99,
})
testCases := []struct {
@@ -94,7 +94,7 @@ func TestFanControllerLinear_ConstructionErrors(t *testing.T) {
name: "InvalidStepCount",
config: fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 20, Speed: 30},
{Temperature: 20, Percent: 30},
},
},
errMsg: "exactly two steps must be defined",
@@ -103,8 +103,8 @@ func TestFanControllerLinear_ConstructionErrors(t *testing.T) {
name: "InvalidStepTemperatures",
config: fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 30, Speed: 60},
{Temperature: 20, Speed: 30},
{Temperature: 30, Percent: 60},
{Temperature: 20, Percent: 30},
},
},
errMsg: "step 1 temperature must be lower than step 2 temperature",
@@ -113,8 +113,8 @@ func TestFanControllerLinear_ConstructionErrors(t *testing.T) {
name: "InvalidStepSpeeds",
config: fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 20, Speed: 60},
{Temperature: 30, Speed: 30},
{Temperature: 20, Percent: 60},
{Temperature: 30, Percent: 30},
},
},
errMsg: "step 1 speed must be lower than step 2 speed",
@@ -123,8 +123,8 @@ func TestFanControllerLinear_ConstructionErrors(t *testing.T) {
name: "InvalidSpeedRange",
config: fancontroller.FanControllerConfig{
Steps: []fancontroller.FanControllerStep{
{Temperature: 20, Speed: 10},
{Temperature: 30, Speed: 200},
{Temperature: 20, Percent: 10},
{Temperature: 30, Percent: 200},
},
},
errMsg: "speed must be between 0 and 100",