@@ -73,19 +73,46 @@ def battery_level():
73
73
64 , 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64 , 64
74
74
))
75
75
76
+
77
+ def hsv_to_rgb (h , s , v ):
78
+ i = (h * 6 ) >> 8
79
+ f = (h * 6 ) & 0xFF
80
+
81
+ p = (v * (256 - s )) >> 8
82
+ q = (v * (65536 - s * f )) >> 16
83
+ t = (v * (65536 - s * (256 - f ))) >> 16
84
+
85
+ if i == 0 : return (v , t , p )
86
+ if i == 1 : return (q , v , p )
87
+ if i == 2 : return (p , v , t )
88
+ if i == 3 : return (p , q , v )
89
+ if i == 4 : return (t , p , v )
90
+ return (v , p , q )
91
+
76
92
77
- def to_rgb (h , s , v ):
93
+ def wheel (h ):
94
+ i = (h * 3 ) >> 8
95
+ a = (h * 3 ) & 0xFF
96
+ b = 255 - a
97
+
98
+ if i == 0 : return (b , a , 0 )
99
+ if i == 1 : return (0 , b , a )
100
+
101
+ return (a , 0 , b )
102
+
103
+
104
+ def wheel2 (h , v ):
78
105
i = (h * 3 ) >> 8
79
- o = (h * 3 ) & 0xFF
106
+ a = (h * 3 ) & 0xFF
107
+ b = 255 - a
80
108
81
- f = v * (255 - s ) // 255
82
- a = f + ((v - f ) * o ) >> 8
83
- b = f + ((v - f ) * (256 - o )) >> 8
109
+ a = a * v // 255
110
+ b = b * v // 255
84
111
85
- if i == 0 : return (b , a , f )
86
- if i == 1 : return (f , b , a )
112
+ if i == 0 : return (b , a , 0 )
113
+ if i == 1 : return (0 , b , a )
87
114
88
- return (a , f , b )
115
+ return (a , 0 , b )
89
116
90
117
91
118
class Backlight :
@@ -95,6 +122,7 @@ def __init__(self):
95
122
self ._bt_led = None
96
123
self .pixel = self .dev .pixel
97
124
125
+ self .enabled = True
98
126
self .hsv = [0 , 255 , 255 ]
99
127
self .keys = {}
100
128
self .n = 0
@@ -104,29 +132,73 @@ def __init__(self):
104
132
self .mode_function = self .modes [self .mode ]
105
133
self .dynamic = True
106
134
135
+ @property
136
+ def hue (self ):
137
+ return self .hsv [0 ]
138
+
139
+ @hue .setter
140
+ def hue (self , h ):
141
+ self .hsv [0 ] = h & 0xFF
142
+ if not self .dynamic :
143
+ self .mode_function ()
144
+
145
+ @property
146
+ def sat (self ):
147
+ return self .hsv [1 ]
148
+
149
+ @sat .setter
150
+ def sat (self , s ):
151
+ self .hsv [1 ] = 0 if s < 0 else (255 if s > 255 else s )
152
+ if not self .dynamic :
153
+ self .mode_function ()
154
+
155
+ @property
156
+ def val (self ):
157
+ return self .dev .brightness
158
+
159
+ @val .setter
160
+ def val (self , v ):
161
+ self .set_brightness (v )
162
+
163
+ def set_brightness (self , v ):
164
+ if v <= 0 :
165
+ self .enabled = False
166
+ self .off ()
167
+ else :
168
+ self .enabled = True
169
+ self .dev .brightness = v if v < 0xFF else 0xFF
170
+ if not self .dynamic :
171
+ self .mode_function ()
172
+
107
173
def on (self , r = 0xFF , g = 0xFF , b = 0xFF ):
108
174
for i in range (63 ):
109
175
self .pixel (i , r , g , b )
110
176
self .update ()
111
177
112
178
def off (self ):
113
- for i in range (64 ):
114
- self .pixel (i , 0 , 0 , 0 )
179
+ self .dev .clear ()
115
180
self .update ()
116
181
182
+ def toggle (self ):
183
+ self .enabled = not self .enabled
184
+ if self .enabled :
185
+ self .set_mode (self .mode )
186
+ else :
187
+ self .off ()
188
+
117
189
def mono (self ):
118
- self .on (* to_rgb (* self .hsv ))
190
+ self .on (* hsv_to_rgb (* self .hsv ))
119
191
120
192
def gradient (self ):
121
193
h0 , s0 , v0 = self .hsv
122
194
for i in range (63 ):
123
195
h = (leds_y [i ] + h0 ) & 0xFF
124
- self .pixel (i , * to_rgb (h , s0 , v0 ))
196
+ self .pixel (i , * hsv_to_rgb (h , s0 , v0 ))
125
197
self .update ()
126
198
127
199
def spectrum (self , offset = 0 ):
128
200
self .n = (self .n + 1 ) & 0xFF
129
- r , g , b = to_rgb (self .n , 255 , 255 )
201
+ r , g , b = wheel (self .n )
130
202
for i in range (63 ):
131
203
self .pixel (i , r , g , b )
132
204
self .update ()
@@ -136,7 +208,7 @@ def spectrum_x(self):
136
208
n = self .n
137
209
for i in range (63 ):
138
210
h = (leds_x [i ] + n ) & 0xFF
139
- self .pixel (i , * to_rgb ( h , 255 , 255 ))
211
+ self .pixel (i , * wheel ( h ))
140
212
self .update ()
141
213
self .n = (n + 1 ) & 0xFF
142
214
return True
@@ -145,21 +217,21 @@ def spectrum_y(self):
145
217
n = self .n
146
218
for i in range (63 ):
147
219
h = (leds_y [i ] + n ) & 0xFF
148
- self .pixel (i , * to_rgb ( h , 255 , 255 ))
220
+ self .pixel (i , * wheel ( h ))
149
221
self .update ()
150
222
self .n = (n + 1 ) & 0xFF
151
223
return True
152
224
153
225
def handle_key (self , key , pressed ):
154
- if self .mode == 6 :
226
+ if self .enabled and self . mode == 6 :
155
227
self .keys [key ] = 255
156
228
157
229
def elapse (self ):
158
230
if 0 == len (self .keys ):
159
231
return False
160
232
for i in self .keys .keys ():
161
233
t = self .keys [i ]
162
- self .pixel (i , * to_rgb (255 - t , 255 , t ))
234
+ self .pixel (i , * wheel2 (255 - t , t ))
163
235
t -= 1
164
236
if t < 0 :
165
237
self .keys .pop (i )
@@ -168,9 +240,6 @@ def elapse(self):
168
240
self .update ()
169
241
return True
170
242
171
- def set_brightness (self , v ):
172
- self .dev .set_brightness (v )
173
-
174
243
def set_hid_leds (self , v ):
175
244
self ._hid_leds = v
176
245
if self ._hid_leds & 2 :
@@ -205,13 +274,12 @@ def update(self):
205
274
self .dev .power .value = 0
206
275
207
276
def check (self ):
208
- if self .dynamic :
277
+ if self .enabled and self . dynamic :
209
278
return self .mode_function ()
210
279
return False
211
280
212
281
def next (self ):
213
- for i in range (63 ):
214
- self .pixel (i , 0 , 0 , 0 )
282
+ self .dev .clear ()
215
283
self .mode += 1
216
284
if self .mode >= len (self .modes ):
217
285
self .mode = 0
@@ -223,3 +291,14 @@ def next(self):
223
291
else :
224
292
self .dynamic = False
225
293
self .mode_function ()
294
+
295
+ def set_mode (self , mode ):
296
+ self .mode = mode if mode < len (self .modes ) else 0
297
+ self .mode_function = self .modes [self .mode ]
298
+ if self .mode == 6 :
299
+ self .keys .clear ()
300
+ if self .mode >= 3 :
301
+ self .dynamic = True
302
+ else :
303
+ self .dynamic = False
304
+ self .mode_function ()
0 commit comments