11#!/usr/bin/env python3
22from fanshim import FanShim
3+ from threading import Lock
4+ import colorsys
35import psutil
46import argparse
57import time
68import signal
79import sys
810
911
12+ T_MIN = 35
13+ T_MAX = 95
14+
15+
1016parser = argparse .ArgumentParser ()
1117parser .add_argument ('--threshold' , type = float , default = - 1 , help = 'Temperature threshold in degrees C to enable fan' )
1218parser .add_argument ('--hysteresis' , type = float , default = - 1 , help = 'Distance from threshold before fan is disabled' )
@@ -29,6 +35,20 @@ def clean_exit(signum, frame):
2935 sys .exit (0 )
3036
3137
38+ def update_led_temperature (temp ):
39+ led_busy .acquire ()
40+ temp = float (temp )
41+ temp -= args .off_threshold
42+ temp /= float (args .on_threshold - args .off_threshold )
43+ temp = max (0 , min (1 , temp ))
44+ temp = 1.0 - temp
45+ temp *= 120.0
46+ temp /= 360.0
47+ r , g , b = [int (c * 255.0 ) for c in colorsys .hsv_to_rgb (temp , 1.0 , 1.0 )]
48+ fanshim .set_light (r , g , b )
49+ led_busy .release ()
50+
51+
3252def update_led (state ):
3353 if args .noled :
3454 return
@@ -57,7 +77,7 @@ def set_fan(status):
5777 changed = False
5878 if status != enabled :
5979 changed = True
60- update_led (status )
80+ # update_led(status)
6181 fanshim .set_fan (status )
6282 enabled = status
6383 return changed
@@ -82,7 +102,12 @@ def set_automatic(status):
82102fanshim .set_fan (False )
83103armed = True
84104enabled = False
105+ led_busy = Lock ()
106+ enable = False
107+ is_fast = False
85108last_change = 0
109+ signal .signal (signal .SIGTERM , clean_exit )
110+
86111
87112t = get_cpu_temp ()
88113if t >= args .threshold :
@@ -99,25 +124,19 @@ def release_handler(was_held):
99124 elif not armed :
100125 set_fan (not enabled )
101126
102-
103127 @fanshim .on_hold ()
104128 def held_handler ():
129+ global led_busy
105130 if args .noled :
106- return
131+ return
132+ led_busy .acquire ()
107133 for _ in range (3 ):
108134 fanshim .set_light (0 , 0 , 255 )
109135 time .sleep (0.04 )
110136 fanshim .set_light (0 , 0 , 0 )
111137 time .sleep (0.04 )
112- update_led (enabled )
113-
114-
115- signal .signal (signal .SIGTERM , clean_exit )
138+ led_busy .release ()
116139
117- update_led (fanshim .get_fan ())
118- enable = False
119- is_fast = False
120- last_change = 0
121140
122141try :
123142 while True :
@@ -126,7 +145,7 @@ def held_handler():
126145 was_fast = is_fast
127146 is_fast = (int (f .current ) == int (f .max ))
128147 if args .verbose :
129- print ("Current: {:05.02f} Target: {:05.02f} Freq {: 5.02f} Automatic: {} On: {}" .format (t , args .threshold , f .current / 1000.0 , armed , enabled ))
148+ print ("Current: {:05.02f} Target: {:05.02f} Freq {: 5.02f} Automatic: {} On: {}" .format (t , args .off_threshold , f .current / 1000.0 , armed , enabled ))
130149
131150 if args .preempt and is_fast and was_fast :
132151 enable = True
@@ -139,6 +158,9 @@ def held_handler():
139158 if set_fan (enable ):
140159 last_change = t
141160
161+ if not args .noled :
162+ update_led_temperature (t )
163+
142164 time .sleep (args .delay )
143165except KeyboardInterrupt :
144166 pass
0 commit comments