@@ -57,15 +57,55 @@ def battery_level():
57
57
return BATTERY_VOLTAGE [i ]
58
58
59
59
60
+ leds_x = bytearray ((
61
+ 0 , 16 , 32 , 48 , 64 , 80 , 96 , 112 , 128 , 144 , 160 , 176 , 192 , 216 ,
62
+ 220 ,200 , 184 , 168 , 152 , 136 , 120 , 104 , 88 , 72 , 56 , 40 , 24 , 4 ,
63
+ 6 , 27 , 43 , 59 , 75 , 91 , 107 , 123 , 139 , 155 , 171 , 187 , 214 ,
64
+ 210 , 180 , 164 , 148 , 132 , 116 , 100 , 84 , 68 , 52 , 36 , 10 ,
65
+ 2 , 22 , 42 , 102 , 162 , 182 , 202 , 222 , 123 , 82
66
+ ))
67
+
68
+ leds_y = bytearray ((
69
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
70
+ 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 ,
71
+ 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ,
72
+ 48 , 48 , 48 , 48 , 48 , 48 , 48 , 48 , 48 , 48 , 48 , 48 ,
73
+ 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64
74
+ ))
75
+
76
+
77
+ def to_rgb (h , s , v ):
78
+ i = (h * 3 ) >> 8
79
+ o = (h * 3 ) & 0xFF
80
+
81
+ f = v * (255 - s ) // 255
82
+ a = f + ((v - f ) * o ) >> 8
83
+ b = f + ((v - f ) * (256 - o )) >> 8
84
+
85
+ if i == 0 : return (b , a , f )
86
+ if i == 1 : return (f , b , a )
87
+
88
+ return (a , f , b )
89
+
90
+
60
91
class Backlight :
61
92
def __init__ (self ):
62
93
self .dev = IS31FL3733 ()
63
94
self ._hid_leds = 0
64
95
self ._bt_led = None
65
96
self .pixel = self .dev .pixel
66
97
98
+ self .hsv = [0 , 255 , 255 ]
99
+ self .keys = {}
100
+ self .n = 0
101
+
102
+ self .modes = (self .off , self .mono , self .gradient , self .spectrum , self .spectrum_x , self .spectrum_y , self .elapse )
103
+ self .mode = 6
104
+ self .mode_function = self .modes [self .mode ]
105
+ self .dynamic = True
106
+
67
107
def on (self , r = 0xFF , g = 0xFF , b = 0xFF ):
68
- for i in range (64 ):
108
+ for i in range (63 ):
69
109
self .pixel (i , r , g , b )
70
110
self .update ()
71
111
@@ -74,6 +114,60 @@ def off(self):
74
114
self .pixel (i , 0 , 0 , 0 )
75
115
self .update ()
76
116
117
+ def mono (self ):
118
+ self .on (* to_rgb (* self .hsv ))
119
+
120
+ def gradient (self ):
121
+ h0 , s0 , v0 = self .hsv
122
+ for i in range (63 ):
123
+ h = (leds_y [i ] + h0 ) & 0xFF
124
+ self .pixel (i , * to_rgb (h , s0 , v0 ))
125
+ self .update ()
126
+
127
+ def spectrum (self , offset = 0 ):
128
+ self .n = (self .n + 1 ) & 0xFF
129
+ r , g , b = to_rgb (self .n , 255 , 255 )
130
+ for i in range (63 ):
131
+ self .pixel (i , r , g , b )
132
+ self .update ()
133
+ return True
134
+
135
+ def spectrum_x (self ):
136
+ n = self .n
137
+ for i in range (63 ):
138
+ h = (leds_x [i ] + n ) & 0xFF
139
+ self .pixel (i , * to_rgb (h , 255 , 255 ))
140
+ self .update ()
141
+ self .n = (n + 1 ) & 0xFF
142
+ return True
143
+
144
+ def spectrum_y (self ):
145
+ n = self .n
146
+ for i in range (63 ):
147
+ h = (leds_y [i ] + n ) & 0xFF
148
+ self .pixel (i , * to_rgb (h , 255 , 255 ))
149
+ self .update ()
150
+ self .n = (n + 1 ) & 0xFF
151
+ return True
152
+
153
+ def handle_key (self , key , pressed ):
154
+ if self .mode == 6 :
155
+ self .keys [key ] = 255
156
+
157
+ def elapse (self ):
158
+ if 0 == len (self .keys ):
159
+ return False
160
+ for i in self .keys .keys ():
161
+ t = self .keys [i ]
162
+ self .pixel (i , * to_rgb (255 - t , 255 , t ))
163
+ t -= 1
164
+ if t < 0 :
165
+ self .keys .pop (i )
166
+ else :
167
+ self .keys [i ] = t
168
+ self .update ()
169
+ return True
170
+
77
171
def set_brightness (self , v ):
78
172
self .dev .set_brightness (v )
79
173
@@ -84,8 +178,7 @@ def set_hid_leds(self, v):
84
178
self .dev .update_pixel (28 , 0 , 0x80 , 0 )
85
179
else :
86
180
self .dev .update_pixel (28 , 0 , 0 , 0 )
87
- if self ._bt_led is None and not self .dev .any ():
88
- self .dev .power .value = 0
181
+ self .mode_function ()
89
182
90
183
def set_bt_led (self , v ):
91
184
if self ._bt_led is not None :
@@ -95,7 +188,7 @@ def set_bt_led(self, v):
95
188
self ._bt_led = v
96
189
if v is not None :
97
190
self .dev .breathing_pixel (v , 2 )
98
- elif (self ._hid_leds & 2 ) == 0 :
191
+ elif (self ._hid_leds & 2 ) == 0 and not self . dev . any () :
99
192
self .dev .power .value = 0
100
193
101
194
def update (self ):
@@ -110,3 +203,23 @@ def update(self):
110
203
self .dev .update ()
111
204
if not in_use and not self .dev .any ():
112
205
self .dev .power .value = 0
206
+
207
+ def check (self ):
208
+ if self .dynamic :
209
+ return self .mode_function ()
210
+ return False
211
+
212
+ def next (self ):
213
+ for i in range (63 ):
214
+ self .pixel (i , 0 , 0 , 0 )
215
+ self .mode += 1
216
+ if self .mode >= len (self .modes ):
217
+ self .mode = 0
218
+ self .mode_function = self .modes [self .mode ]
219
+ if self .mode == 6 :
220
+ self .keys .clear ()
221
+ if self .mode >= 3 :
222
+ self .dynamic = True
223
+ else :
224
+ self .dynamic = False
225
+ self .mode_function ()
0 commit comments