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 = "30s" 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() if cpuTemp >= SPEED_FULL_TEMP || gpuTemp >= SPEED_FULL_TEMP { fan.SetSpeed(100) continue } if cpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP { fan.SetSpeed(75) continue } if cpuTemp >= SPEED_FIFTY_PERCENT_TEMP || gpuTemp >= SPEED_FIFTY_PERCENT_TEMP { fan.SetSpeed(50) continue } if cpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP { fan.SetSpeed(25) continue } if cpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP { fan.SetSpeed(10) continue } // We should never get here but... fan.SetSpeed(100) } }