1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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))
- }
- }
- }
|