build/packages/bsp/clockworkpi-a06/temp_fan_daemon_a06.py

136 lines
3.1 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/python3
# source: https://github.com/clockworkpi/DevTerm/tree/main/Code/devterm_fan_daemon_cpi_a06
import glob
import os
import sys
import getopt
import subprocess
import time
cpus = []
mid_freq = 0
max_freq = 0
# Replace fan-on temperature w/ 55C, rather than 70C which doesn't seem to be enough to avoid overheating
MAX_TEMP = 55000
ONCE_TIME = 30
def init_fan_gpio():
os.popen("gpio mode 41 out")
def fan_on():
init_fan_gpio()
os.popen("gpio write 41 1")
time.sleep(ONCE_TIME)
def fan_off():
init_fan_gpio()
os.popen("gpio write 41 0")
def isDigit(x):
try:
float(x)
return True
except ValueError:
return False
def cpu_infos():
global cpus
global mid_freq
global max_freq
cpus = glob.glob('/sys/devices/system/cpu/cpu[0-9]')
cpus.sort()
# /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
# /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
scaling_available_freq = open(os.path.join(
cpus[0], "cpufreq/scaling_available_frequencies"), "r").read()
scaling_available_freq = scaling_available_freq.strip("\n")
scaling_available_freqs = scaling_available_freq.split(" ")
for var in scaling_available_freqs:
if isDigit(var):
if(int(var) > 1000000):
if(mid_freq == 0):
mid_freq = int(var)
max_freq = int(var)
def set_gov(gov):
global cpus
for var in cpus:
gov_f = os.path.join(var, "cpufreq/scaling_governor")
# print(gov_f)
subprocess.run("echo %s | sudo tee %s" % (gov, gov_f), shell=True)
def set_performance(scale):
global cpus
global mid_freq
global max_freq
freq = mid_freq
if scale == "mid":
freq = mid_freq
elif scale == "max":
freq = max_freq
for var in cpus:
_f = os.path.join(var, "cpufreq/scaling_max_freq")
# print(_f)
subprocess.run("echo %s | sudo tee %s" % (freq, _f), shell=True)
def fan_loop():
while True:
temps = glob.glob('/sys/class/thermal/thermal_zone[0-9]/')
temps.sort()
for var in temps:
_f = os.path.join(var, "temp")
#print( open(_f).read().strip("\n") )
_t = open(_f).read().strip("\n")
if isDigit(_t):
if int(_t) > MAX_TEMP:
fan_on()
fan_off()
time.sleep(5)
def main(argv):
global cpus
scale = 'mid'
gov = 'powersave'
try:
opts, args = getopt.getopt(argv, "hs:g:", ["scale=", "governor="])
except getopt.GetoptError:
print('test.py -s <scale> -g <governor>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print('test.py -s <scale>')
sys.exit()
elif opt in ("-s", "--scale"):
scale = arg
elif opt in ("-g", "--governor"):
gov = arg
print('Scale is ', scale, "Gov is ", gov)
init_fan_gpio()
cpu_infos()
set_gov(gov)
set_performance(scale)
fan_loop()
if __name__ == "__main__":
main(sys.argv[1:])