| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | 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") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-06 11:05:41 -06:00
										 |  |  | 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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | func Chill(baseCtx context.Context) context.Context { | 
					
						
							|  |  |  | 	ctx, cancel := context.WithCancelCause(baseCtx) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-06 11:05:41 -06:00
										 |  |  | 	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) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | 	go func() { | 
					
						
							| 
									
										
										
										
											2024-11-06 11:05:41 -06:00
										 |  |  | 		for current >= MaxTemp && err == nil { | 
					
						
							| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | 			time.Sleep(Sleep) | 
					
						
							| 
									
										
										
										
											2024-11-06 11:05:41 -06:00
										 |  |  | 			current, err = getCurrentTemp() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			err = ErrChilledOut | 
					
						
							| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-11-06 11:05:41 -06:00
										 |  |  | 		cancel(err) | 
					
						
							| 
									
										
										
										
											2024-10-25 15:52:26 -05:00
										 |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ctx | 
					
						
							|  |  |  | } |