pwm.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "strconv"
  6. "github.com/stianeikeland/go-rpio/v4"
  7. )
  8. type pwmControl struct {
  9. freq int
  10. cycleLength uint32
  11. pin rpio.Pin
  12. }
  13. func NewPwmControl(pin rpio.Pin) *pwmControl {
  14. pwm := pwmControl{pin: pin, freq: 64000, cycleLength: 32}
  15. pwm.Init()
  16. return &pwm
  17. }
  18. func (pwm *pwmControl) Init() {
  19. pwm.pin.Mode(rpio.Pwm)
  20. pwm.pin.Freq(pwm.freq)
  21. pwm.pin.DutyCycle(0, pwm.cycleLength)
  22. }
  23. //SetPerc sets the dutylength proportional to cycleLength in percent
  24. func (pwm *pwmControl) SetPerc(perc uint32) {
  25. dutylen := (perc * pwm.cycleLength) / 100
  26. pwm.pin.DutyCycle(uint32(dutylen), pwm.cycleLength)
  27. }
  28. func StartPwm(changechan chan change) {
  29. err := rpio.Open()
  30. if err != nil {
  31. os.Exit(1)
  32. }
  33. defer rpio.Close()
  34. pwmMonitorBrightness := NewPwmControl(rpio.Pin(19))
  35. pwmFanSpeed := NewPwmControl(rpio.Pin(20))
  36. for {
  37. change := <-changechan
  38. value, err := strconv.Atoi(change.value)
  39. if err != nil {
  40. log.Printf("error updating %s: %s\n", "monitorBrightness", err)
  41. continue
  42. }
  43. if value < 0 || value > 100 {
  44. log.Printf("error updating %s: value out of range %v\n", "monitorBrightness", value)
  45. continue
  46. }
  47. switch change.kind {
  48. case "monitorBrightness":
  49. pwmMonitorBrightness.SetPerc(uint32(value))
  50. case "fanSpeed":
  51. pwmFanSpeed.SetPerc(uint32(value))
  52. }
  53. }
  54. }