piframe-go/cmd/fan/fan.go

94 lines
2.1 KiB
Go

package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
argonFan "git.sungo.io/sungo/argon/fan"
"git.kemonine.info/PiFrame/utils"
)
const (
BUS = 1
ADDRESS = 0x1a
)
const (
POLL_INTERVAL = "10s"
SPEED_TWENTY_FIVE_PERCENT_TEMP = 45.00
SPEED_FIFTY_PERCENT_TEMP = 50.00
SPEED_SEVENTY_FIVE_PERCENT_TEMP = 52.00
SPEED_FULL_TEMP = 55.00
)
func main() {
// Setup fan and bail if we can't see it
fan, err := argonFan.New(ADDRESS, BUS)
if err != nil {
log.Fatalf("Error working with fan : %s", err)
}
// Safe exit
defer fan.SafeClose()
sigc := make(chan os.Signal, 1)
signal.Notify(
sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
)
go func() {
<-sigc
fan.SafeClose()
os.Exit(1)
}()
// Control fan speed based on temps via a ticker / timeout
pollInterval, err := time.ParseDuration(POLL_INTERVAL)
if err != nil {
log.Fatalf("Error parsing interval duration : %s", err)
}
ticker := time.NewTicker(pollInterval)
for range ticker.C {
cpuTemp := utils.GetCPUTemp()
gpuTemp := utils.GetGPUTemp()
log.Printf("CPU Temp : %.2f", cpuTemp)
log.Printf("GPU Temp : %.2f", gpuTemp)
if cpuTemp >= SPEED_FULL_TEMP || gpuTemp >= SPEED_FULL_TEMP {
fan.SetSpeed(100)
log.Print("Setting fan speed to 100%")
continue
}
if cpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(75)
log.Print("Setting fan speed to 75%")
continue
}
if cpuTemp >= SPEED_FIFTY_PERCENT_TEMP || gpuTemp >= SPEED_FIFTY_PERCENT_TEMP {
fan.SetSpeed(50)
log.Print("Setting fan speed to 50%")
continue
}
if cpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(25)
log.Print("Setting fan speed to 25%")
continue
}
if cpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(0)
log.Print("Setting fan speed to 0%")
continue
}
// We should never get here but...
log.Print("Shouldn't see this but here we are")
fan.SetSpeed(100)
}
}