From 30d4731cfd4c61ef7d2f1e512bab376a8a1e5737 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 22:39:17 -0400 Subject: [PATCH] vialrgb: set effects using vialrgb id --- src/main/python/keyboard_comm.py | 38 ++++++++++++++++++++++------- src/main/python/rgb_configurator.py | 36 +++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index d1a421e..921c562 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -43,6 +43,7 @@ QMK_RGBLIGHT_COLOR = 0x83 VIALRGB_GET_INFO = 0x40 VIALRGB_GET_MODE = 0x41 +VIALRGB_GET_SUPPORTED = 0x42 VIALRGB_SET_MODE = 0x41 @@ -209,6 +210,7 @@ class Keyboard: # vialrgb self.rgb_mode = self.rgb_speed = self.rgb_version = self.rgb_maximum_brightness = -1 self.rgb_hsv = (0, 0, 0) + self.rgb_supported_effects = set() self.via_protocol = self.vial_protocol = self.keyboard_id = -1 @@ -224,6 +226,7 @@ class Keyboard: self.reload_layers() self.reload_keymap() self.reload_macros() + self.reload_persistent_rgb() self.reload_rgb() self.reload_settings() self.reload_dynamic() @@ -371,12 +374,37 @@ class Keyboard: macros = self.macro.split(b"\x00") + [b""] * self.macro_count self.macro = b"\x00".join(macros[:self.macro_count]) + b"\x00" - def reload_rgb(self): + def reload_persistent_rgb(self): + """ + Reload RGB properties which are slow, and do not change while keyboard is plugged in + e.g. VialRGB supported effects list + """ + if "lighting" in self.definition: self.lighting_qmk_rgblight = self.definition["lighting"] in ["qmk_rgblight", "qmk_backlight_rgblight"] self.lighting_qmk_backlight = self.definition["lighting"] in ["qmk_backlight", "qmk_backlight_rgblight"] self.lighting_vialrgb = self.definition["lighting"] == "vialrgb" + if self.lighting_vialrgb: + data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_LIGHTING_GET_VALUE, VIALRGB_GET_INFO), + retries=20)[2:] + self.rgb_version = data[0] | (data[1] << 8) + if self.rgb_version != 1: + raise RuntimeError("Unsupported VialRGB protocol ({}), update your Vial version to latest" + .format(self.rgb_version)) + self.rgb_maximum_brightness = data[2] + + self.rgb_supported_effects = {0} + max_effect = 0 + while max_effect < 0xFFFF: + data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_LIGHTING_GET_VALUE, VIALRGB_GET_SUPPORTED))[2:] + for x in range(0, len(data), 2): + value = int.from_bytes(data[x:x+2], byteorder="little") + if value != 0xFFFF: + self.rgb_supported_effects.add(value) + max_effect = max(max_effect, value) + + def reload_rgb(self): if self.lighting_qmk_rgblight: self.underglow_brightness = self.usb_send( self.dev, struct.pack(">BB", CMD_VIA_LIGHTING_GET_VALUE, QMK_RGBLIGHT_BRIGHTNESS), retries=20)[2] @@ -396,14 +424,6 @@ class Keyboard: self.dev, struct.pack(">BB", CMD_VIA_LIGHTING_GET_VALUE, QMK_BACKLIGHT_EFFECT), retries=20)[2] if self.lighting_vialrgb: - data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_LIGHTING_GET_VALUE, VIALRGB_GET_INFO), - retries=20)[2:] - self.rgb_version = data[0] | (data[1] << 8) - if self.rgb_version != 1: - raise RuntimeError("Unsupported VialRGB protocol ({}), update your Vial version to latest" - .format(self.rgb_version)) - self.rgb_maximum_brightness = data[2] - data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_LIGHTING_GET_VALUE, VIALRGB_GET_MODE), retries=20)[2:] self.rgb_mode = data[0] diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index 572f4c3..3be7c77 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -60,6 +60,21 @@ QMK_RGBLIGHT_EFFECTS = [ ] +class VialRGBEffect: + + def __init__(self, idx, name): + self.idx = idx + self.name = name + + +VIALRGB_EFFECTS = [ + VialRGBEffect(0, "Disable"), + VialRGBEffect(1, "Direct Control"), + VialRGBEffect(2, "Solid Color"), + VialRGBEffect(3, "Alphas and Mods"), +] + + class BasicHandler(QObject): update = pyqtSignal() @@ -240,11 +255,13 @@ class VialRGBHandler(BasicHandler): self.widgets = [self.lbl_rgb_effect, self.rgb_effect, self.lbl_rgb_brightness, self.rgb_brightness, self.lbl_rgb_color, self.rgb_color] + self.effects = [] + def on_rgb_brightness_changed(self, value): self.keyboard.set_vialrgb_brightness(value) - def on_rgb_effect_changed(self, value): - self.keyboard.set_vialrgb_mode(value) + def on_rgb_effect_changed(self, index): + self.keyboard.set_vialrgb_mode(self.effects[index].idx) def on_rgb_color(self): color = QColorDialog.getColor(self.current_color()) @@ -262,7 +279,22 @@ class VialRGBHandler(BasicHandler): self.keyboard.rgb_hsv[1] / 255.0, 1.0) + def rebuild_effects(self): + self.effects = [] + for effect in VIALRGB_EFFECTS: + if effect.idx in self.keyboard.rgb_supported_effects: + self.effects.append(effect) + + self.rgb_effect.clear() + for effect in self.effects: + self.rgb_effect.addItem(effect.name) + def update_from_keyboard(self): + self.rebuild_effects() + for x, effect in enumerate(self.effects): + if effect.idx == self.keyboard.rgb_mode: + self.rgb_effect.setCurrentIndex(x) + break self.rgb_brightness.setMaximum(self.keyboard.rgb_maximum_brightness) self.rgb_brightness.setValue(self.keyboard.rgb_hsv[2]) self.rgb_color.setStyleSheet("QWidget { background-color: %s}" % self.current_color().name())