package main import ( "log" "os" "strconv" "github.com/stianeikeland/go-rpio/v4" ) type pwmControl struct { freq int cycleLength uint32 pin rpio.Pin } func NewPwmControl(pin rpio.Pin) *pwmControl { pwm := pwmControl{pin: pin, freq: 64000, cycleLength: 32} pwm.Init() return &pwm } func (pwm *pwmControl) Init() { pwm.pin.Mode(rpio.Pwm) pwm.pin.Freq(pwm.freq) pwm.pin.DutyCycle(0, pwm.cycleLength) } //SetPerc sets the dutylength proportional to cycleLength in percent func (pwm *pwmControl) SetPerc(perc uint32) { dutylen := (perc * pwm.cycleLength) / 100 pwm.pin.DutyCycle(uint32(dutylen), pwm.cycleLength) } func StartPwm(changechan chan change) { err := rpio.Open() if err != nil { os.Exit(1) } defer rpio.Close() pwmMonitorBrightness := NewPwmControl(rpio.Pin(19)) pwmFanSpeed := NewPwmControl(rpio.Pin(20)) for { change := <-changechan value, err := strconv.Atoi(change.value) if err != nil { log.Printf("error updating %s: %s\n", "monitorBrightness", err) continue } if value < 0 || value > 100 { log.Printf("error updating %s: value out of range %v\n", "monitorBrightness", value) continue } switch change.kind { case "monitorBrightness": pwmMonitorBrightness.SetPerc(uint32(value)) case "fanSpeed": pwmFanSpeed.SetPerc(uint32(value)) } } }