61 lines
1 KiB
Go
61 lines
1 KiB
Go
package chill
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
var TempFile string = "/sys/class/thermal/thermal_zone2/temp"
|
|
var MaxTemp int = 72500
|
|
var Sleep = time.Second * 10
|
|
var ErrChilledOut = errors.New("temperature dropped below threshold")
|
|
|
|
func getCurrentTemp() (o int, err error) {
|
|
var by []byte
|
|
by, err = os.ReadFile(TempFile)
|
|
if err != nil {
|
|
return
|
|
}
|
|
by = bytes.TrimSpace(by)
|
|
o, err = strconv.Atoi(string(by))
|
|
return
|
|
}
|
|
|
|
func Chill(baseCtx context.Context) context.Context {
|
|
ctx, cancel := context.WithCancelCause(baseCtx)
|
|
|
|
ret := func(e error) context.Context {
|
|
cancel(e)
|
|
return ctx
|
|
}
|
|
|
|
current, err := getCurrentTemp()
|
|
if err != nil {
|
|
return ret(err)
|
|
}
|
|
|
|
if current < MaxTemp {
|
|
return ret(ErrChilledOut)
|
|
}
|
|
|
|
go runChill(current, cancel)
|
|
|
|
return ctx
|
|
}
|
|
|
|
func runChill(current int, cancel context.CancelCauseFunc) {
|
|
var err error
|
|
for current >= MaxTemp && err == nil {
|
|
time.Sleep(Sleep)
|
|
current, err = getCurrentTemp()
|
|
}
|
|
if err == nil {
|
|
err = ErrChilledOut
|
|
}
|
|
cancel(err)
|
|
|
|
}
|