Skip to content

Commit fd53d71

Browse files
committed
Device enable flag and RGBColor additional methods
1 parent 0e678de commit fd53d71

File tree

2 files changed

+128
-124
lines changed

2 files changed

+128
-124
lines changed

openrgb/orgb.py

Lines changed: 114 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -164,35 +164,35 @@ def resize(self, size: int):
164164
self.update()
165165

166166

167+
167168
class Device(utils.RGBContainer):
168-
'''
169+
"""
169170
A class to represent an RGB Device
170-
'''
171+
"""
171172

172-
def __init__(self, data: utils.ControllerData, device_id: int, network_client: NetworkClient):
173+
def __init__(self, data:utils.ControllerData, device_id: int, network_client: NetworkClient):
173174
self.leds: list[LED] = [None for i in data.leds] # type: ignore
174175
self.zones: list[Zone] = [None for i in data.zones] # type: ignore
175176
self.id = device_id
176177
self.device_id = device_id
177178
self.comms = network_client
179+
self.enabled = True
178180
self._update(data)
179181

180-
def _update(self, data: utils.ControllerData):
182+
def _update(self, data:utils.ControllerData):
181183
self.name = data.name
182184
self.metadata = data.metadata
183185
self.type = data.device_type
184186
if len(self.leds) != len(data.leds):
185187
self.leds = [None for i in data.leds] # type: ignore
186188
for x in range(len(data.leds)):
187189
if self.leds[x] is None:
188-
self.leds[x] = LED(data.leds[x], data.colors[x],
189-
x, self.device_id, self.comms)
190+
self.leds[x] = LED(data.leds[x], data.colors[x], x, self.device_id, self.comms)
190191
else:
191192
self.leds[x]._update(data.leds[x], data.colors[x])
192193
for x in range(len(data.zones)):
193194
if self.zones[x] is None:
194-
self.zones[x] = Zone(
195-
data.zones[x], x, self.device_id, self.comms)
195+
self.zones[x] = Zone(data.zones[x], x, self.device_id, self.comms)
196196
else:
197197
self.zones[x]._update(data.zones[x]) # type: ignore
198198
self.modes = data.modes
@@ -201,165 +201,155 @@ def _update(self, data: utils.ControllerData):
201201
self.active_mode = data.active_mode
202202
self.data = data
203203

204-
def _set_device_color(self, color: utils.RGBColor, fast: bool = False):
205-
'''
204+
def _set_device_color(self, color:utils.RGBColor, fast: bool = False):
205+
"""
206206
Sets the device's color
207207
208208
:param color: the color to set the LED(s) to
209209
:param fast: If you care more about quickly setting colors than having correct internal state data, then set :code:`fast` to :code:`True`
210-
'''
211-
self.comms.send_header(
212-
self.id,
213-
utils.PacketType.RGBCONTROLLER_UPDATELEDS,
214-
struct.calcsize(f"IH{3*(len(self.leds))}b{len(self.leds)}x")
215-
)
216-
buff = struct.pack("H", len(self.leds)) + (color.pack())*len(self.leds)
217-
buff = struct.pack("I", len(buff) + struct.calcsize("I")) + buff
218-
self.comms.send_data(buff)
219-
if not fast:
220-
self.update()
210+
"""
211+
if self.enabled:
212+
self.comms.send_header(
213+
self.id,
214+
utils.PacketType.RGBCONTROLLER_UPDATELEDS,
215+
struct.calcsize(f"IH{3*(len(self.leds))}b{len(self.leds)}x"),
216+
)
217+
buff = struct.pack("H", len(self.leds)) + (color.pack()) * len(self.leds)
218+
buff = struct.pack("I", len(buff) + struct.calcsize("I")) + buff
219+
self.comms.send_data(buff)
220+
if not fast:
221+
self.update()
221222

222223
def _set_device_colors(self, colors: list[utils.RGBColor], fast: bool = False):
223-
'''
224+
"""
224225
Sets the devices LEDs' colors
225226
226227
:param colors: the list of colors, one per LED
227228
:param fast: If you care more about quickly setting colors than having correct internal state data, then set :code:`fast` to :code:`True`
228-
'''
229-
if len(colors) != len(self.leds):
230-
raise IndexError("Number of colors doesn't match number of LEDs")
231-
self.comms.send_header(
232-
self.id,
233-
utils.PacketType.RGBCONTROLLER_UPDATELEDS,
234-
struct.calcsize(f"IH{3*(len(self.leds))}b{len(self.leds)}x")
235-
)
236-
buff = struct.pack("H", len(self.leds)) + \
237-
b''.join((color.pack() for color in colors))
238-
buff = struct.pack("I", len(buff) + struct.calcsize("I")) + buff
239-
self.comms.send_data(buff)
240-
if not fast:
241-
self.update()
242-
243-
def _set_mode_color(self, color: utils.RGBColor):
244-
'''
229+
"""
230+
if self.enabled:
231+
if len(colors) != len(self.leds):
232+
raise IndexError("Number of colors doesn't match number of LEDs")
233+
self.comms.send_header(
234+
self.id,
235+
utils.PacketType.RGBCONTROLLER_UPDATELEDS,
236+
struct.calcsize(f"IH{3*(len(self.leds))}b{len(self.leds)}x"),
237+
)
238+
buff = struct.pack("H", len(self.leds)) + b"".join((color.pack() for color in colors))
239+
buff = struct.pack("I", len(buff) + struct.calcsize("I")) + buff
240+
self.comms.send_data(buff)
241+
if not fast:
242+
self.update()
243+
244+
def _set_mode_color(self, color:utils.RGBColor):
245+
"""
245246
Sets the mode-specific color, if possible
246247
247248
:param color: the color to set the LED(s) to
248-
'''
249-
active_mode = self.modes[self.active_mode]
250-
assert active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC
251-
assert active_mode.colors is not None
252-
active_mode.colors = [color]*active_mode.colors_max # type: ignore
253-
self.set_mode(active_mode)
249+
"""
250+
if self.enabled:
251+
active_mode = self.modes[self.active_mode]
252+
assert active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC
253+
assert active_mode.colors is not None
254+
active_mode.colors = [color] * active_mode.colors_max # type: ignore
255+
self.set_mode(active_mode)
254256

255257
def _set_mode_colors(self, colors: list[utils.RGBColor]):
256-
'''
258+
"""
257259
Sets the mode-specific color, if possible
258260
259261
:param color: the color to set the LED(s) to
260-
'''
261-
active_mode = self.modes[self.active_mode]
262-
assert active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC
263-
assert active_mode.colors is not None
264-
assert active_mode.colors_min <= len( # type: ignore
265-
colors) <= active_mode.colors_max
266-
active_mode.colors = colors
267-
self.set_mode(active_mode)
268-
269-
def set_color(self, color: utils.RGBColor, fast: bool = False):
270-
'''
262+
"""
263+
if self.enabled:
264+
active_mode = self.modes[self.active_mode]
265+
assert active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC
266+
assert active_mode.colors is not None
267+
assert active_mode.colors_min <= len(colors) <= active_mode.colors_max # type: ignore
268+
active_mode.colors = colors
269+
self.set_mode(active_mode)
270+
271+
def set_color(self, color:utils.RGBColor, fast: bool = False):
272+
"""
271273
Sets the color of the device whether the current mode is per-led or
272274
mode-specific
273275
274276
:param colors: the list of colors, one per LED
275277
:param fast: If you care more about quickly setting colors than having correct internal state data, then set :code:`fast` to :code:`True` (only applies when not setting a mode-specific color)
276-
'''
277-
active_mode = self.modes[self.active_mode]
278-
if active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC:
279-
self._set_mode_color(color)
280-
elif active_mode.color_mode == utils.ModeColors.PER_LED:
281-
self._set_device_color(color, fast)
278+
"""
279+
if self.enabled:
280+
active_mode = self.modes[self.active_mode]
281+
if active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC:
282+
self._set_mode_color(color)
283+
elif active_mode.color_mode == utils.ModeColors.PER_LED:
284+
self._set_device_color(color, fast)
282285

283286
def set_colors(self, colors: list[utils.RGBColor], fast: bool = False):
284-
'''
287+
"""
285288
Sets the colors of the device whether the current mode is per-led or
286289
mode-specific
287290
288291
:param colors: the list of colors, one per LED or per mode-specific color
289292
:param fast: If you care more about quickly setting colors than having correct internal state data, then set :code:`fast` to :code:`True` (only applies when not setting a mode-specific color)
290-
'''
291-
active_mode = self.modes[self.active_mode]
292-
if active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC:
293-
self._set_mode_colors(colors)
294-
elif active_mode.color_mode == utils.ModeColors.PER_LED:
295-
self._set_device_colors(colors, fast)
296-
297-
def set_mode(self, mode: Union[str, int, utils.ModeData], save: bool = False):
298-
'''
293+
"""
294+
if self.enabled:
295+
active_mode = self.modes[self.active_mode]
296+
if active_mode.color_mode == utils.ModeColors.MODE_SPECIFIC:
297+
self._set_mode_colors(colors)
298+
elif active_mode.color_mode == utils.ModeColors.PER_LED:
299+
self._set_device_colors(colors, fast)
300+
301+
def set_mode(self, mode: Union[str, int,utils.ModeData], save: bool = False):
302+
"""
299303
Sets the device's mode
300304
301-
:param mode: the name, id, or the ModeData object itself to set as the mode
302-
'''
303-
if isinstance(mode, str):
304-
try:
305-
mode = next(
306-
(m for m in self.modes if m.name.lower() == mode.lower()))
307-
except StopIteration as e:
308-
raise ValueError(
309-
f"Mode `{mode}` not found for device `{self.name}`") from e
310-
elif isinstance(mode, int):
311-
mode = self.modes[mode]
312-
elif isinstance(mode, utils.ModeData):
313-
pass
314-
else:
315-
raise TypeError()
316-
data = mode.pack(self.comms._protocol_version) # type: ignore
317-
self.comms.send_header(
318-
self.id,
319-
utils.PacketType.RGBCONTROLLER_UPDATEMODE,
320-
len(data)
321-
)
322-
self.comms.send_data(data)
323-
if save:
324-
self.comms.send_header(
325-
self.id,
326-
utils.PacketType.RGBCONTROLLER_SAVEMODE,
327-
len(data)
328-
)
305+
:param mode: the name, id, or theutils.ModeData object itself to set as the mode
306+
"""
307+
if self.enabled:
308+
if isinstance(mode, str):
309+
try:
310+
mode = next((m for m in self.modes if m.name.lower() == mode.lower()))
311+
except StopIteration as e:
312+
raise ValueError(f"Mode `{mode}` not found for device `{self.name}`") from e
313+
elif isinstance(mode, int):
314+
mode = self.modes[mode]
315+
elif isinstance(mode,utils.ModeData):
316+
pass
317+
else:
318+
raise TypeError()
319+
data = mode.pack(self.comms._protocol_version) # type: ignore
320+
self.comms.send_header(self.id,utils.PacketType.RGBCONTROLLER_UPDATEMODE, len(data))
329321
self.comms.send_data(data)
330-
self.update()
322+
if save:
323+
self.comms.send_header(self.id,utils.PacketType.RGBCONTROLLER_SAVEMODE, len(data))
324+
self.comms.send_data(data)
325+
self.update()
331326

332327
def set_custom_mode(self):
333-
'''
328+
"""
334329
Sets the mode to whatever the device supports that provides the most
335330
granular control
336-
'''
337-
self.comms.send_header(
338-
self.id,
339-
utils.PacketType.RGBCONTROLLER_SETCUSTOMMODE,
340-
0
341-
)
342-
self.update()
343-
self.set_mode(self.active_mode)
331+
"""
332+
if self.enabled:
333+
self.comms.send_header(self.id,utils.PacketType.RGBCONTROLLER_SETCUSTOMMODE, 0)
334+
self.update()
335+
self.set_mode(self.active_mode)
344336

345337
def save_mode(self):
346-
'''
338+
"""
347339
Saves the currently selected mode
348-
'''
349-
data = self.modes[self.active_mode].pack(self.comms._protocol_version)
350-
self.comms.send_header(
351-
self.id,
352-
utils.PacketType.RGBCONTROLLER_SAVEMODE,
353-
len(data)
354-
)
355-
self.comms.send_data(data)
340+
"""
341+
if self.enabled:
342+
data = self.modes[self.active_mode].pack(self.comms._protocol_version)
343+
self.comms.send_header(self.id, utils.PacketType.RGBCONTROLLER_SAVEMODE, len(data))
344+
self.comms.send_data(data)
356345

357346
def off(self):
358-
'''
347+
"""
359348
Turns off device by setting the custom mode and then calling :any:`RGBObject.clear`
360-
'''
361-
self.set_custom_mode()
362-
self.clear()
349+
"""
350+
if self.enabled:
351+
self.set_custom_mode()
352+
self.clear()
363353

364354

365355
class OpenRGBClient(utils.RGBObject):

openrgb/utils.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,20 @@ def fromHEX(cls, hex: str) -> RGBColor:
201201
return cls(*(int(hex.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)))
202202

203203

204+
def toHex(self) -> str:
205+
"""Get hex representation of color"""
206+
return f"#{self.red:02x}{self.green:02x}{self.blue:02x}".upper()
207+
208+
def toHsv(self) -> tuple[float, float, float]:
209+
return colorsys.rgb_to_hsv(self.red / 255, self.green / 255, self.blue / 255)
210+
211+
def __mul__(self, factor):
212+
return RGBColor(
213+
red=round(self.red * factor),
214+
green=round(self.green * factor),
215+
blue=round(self.blue * factor),
216+
)
217+
204218
@dataclass
205219
class LEDData:
206220
name: str

0 commit comments

Comments
 (0)