#!/usr/bin/env python # -*- coding: utf-8 -*- import sys,os,time LEVELS = {1:[0,53],2:[52,56],3:[54,62],4:[62,99]} FANVALUES = [0,30,60,100] DEBUG = 0 PIDFILE = "/var/run/eeed.pid" def daemon(loop): if __name__ == "__main__": # do the UNIX double-fork magic, see Stevens' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") #don't prevent unmounting.... os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before #print "Daemon PID %d" % pid open(PIDFILE,'w').write("%d"%pid) sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) loop() def setManual(): f = open("/proc/eee/fan_manual","w") f.write("1") f.close() def getTemp(): f = open("/proc/eee/temperature") temp = int(f.read().strip()) f.close() return temp def setFan(percent): f = open("/proc/eee/fan_speed","w") f.write(str(percent)) f.close() def saveLevel(value=0): f = open("/var/cache/eeed","w") f.write(str(value)) f.close() def getLevel(): f = open("/var/cache/eeed","r") level = int(f.read().strip()) f.close() return level def mainloop(): setManual() saveLevel() while 1: temp = getTemp() level = getLevel() for x in LEVELS: if level == x and LEVELS[x][0] >= temp: if x > 1: saveLevel(x-1) nl = x-1 else: saveLevel(1) nl = 1 setFan(FANVALUES[nl-1]) if DEBUG: print "Level %d (DOWN) speed:%d"%(nl,FANVALUES[nl-1]) elif level == x and LEVELS[x][1] < temp: if x < 4: saveLevel(x+1) nl = x+1 else: saveLevel(4) nl = 4 setFan(FANVALUES[nl-1]) if DEBUG: print "Level %d (UP) speed:%d"%(nl,FANVALUES[nl-1]) elif x == level and DEBUG: print "Same: Level %d"%x #print "%d > %d and %d < %d and %d != %d"%(temp,LEVELS[x][0],temp,LEVELS[x][1],level,x) #if temp >= LEVELS[x][0] and temp < LEVELS[x][1] and level != x: # setFan(FANVALUES[x-1]) # saveLevel(x) # if DEBUG: print "Level %d"%x if level == 0: setFan(FANVALUES[1]) saveLevel(2) if DEBUG: print "Init: Level 2" time.sleep(5) if "nodaemon" in sys.argv: mainloop() else: daemon(mainloop)