mirror of
https://github.com/compute-blade-community/compute-blade-agent.git
synced 2026-04-21 17:45:43 +02:00
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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user