From 9b9301163718f6755c0cccab420825c52f63261f Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 19:27:40 -0400 Subject: [PATCH 01/10] vialrgb: initial --- src/main/python/keyboard_comm.py | 25 +++++++++++++- src/main/python/rgb_configurator.py | 51 +++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index 0eaf7ff..d1ee87d 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -41,6 +41,10 @@ QMK_RGBLIGHT_EFFECT = 0x81 QMK_RGBLIGHT_EFFECT_SPEED = 0x82 QMK_RGBLIGHT_COLOR = 0x83 +VIALRGB_GET_MODE = 0x40 + +VIALRGB_SET_MODE = 0x40 + CMD_VIAL_GET_KEYBOARD_ID = 0x00 CMD_VIAL_GET_SIZE = 0x01 CMD_VIAL_GET_DEFINITION = 0x02 @@ -194,10 +198,13 @@ class Keyboard: self.vibl = False self.custom_keycodes = None - self.lighting_qmk_rgblight = self.lighting_qmk_backlight = False + self.lighting_qmk_rgblight = self.lighting_qmk_backlight = self.lighting_vialrgb = False self.underglow_brightness = self.underglow_effect = self.underglow_effect_speed = -1 self.backlight_brightness = self.backlight_effect = -1 self.underglow_color = (0, 0) + # vialrgb + self.rgb_mode = self.rgb_speed = -1 + self.rgb_hsv = (0, 0, 0) self.via_protocol = self.vial_protocol = self.keyboard_id = -1 @@ -364,6 +371,7 @@ class Keyboard: 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_qmk_rgblight: self.underglow_brightness = self.usb_send( @@ -383,6 +391,12 @@ class Keyboard: self.backlight_effect = self.usb_send( 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_MODE))[2:] + self.rgb_mode = data[0] + self.rgb_speed = data[1] + self.rgb_hsv = (data[2], data[3], data[4]) + def reload_settings(self): self.settings = dict() self.supported_settings = set() @@ -782,6 +796,15 @@ class Keyboard: self.usb_send(self.dev, struct.pack("BBBB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_DYNAMIC_ENTRY_OP, DYNAMIC_VIAL_COMBO_SET, idx) + serialized, retries=20) + def _vialrgb_set_mode(self): + self.usb_send(self.dev, struct.pack("BBBBBBB", CMD_VIA_LIGHTING_SET_VALUE, VIALRGB_SET_MODE, + self.rgb_mode, self.rgb_speed, + self.rgb_hsv[0], self.rgb_hsv[1], self.rgb_hsv[2])) + + def set_vialrgb_brightness(self, value): + self.rgb_hsv = (self.rgb_hsv[0], self.rgb_hsv[1], value) + self._vialrgb_set_mode() + class DummyKeyboard(Keyboard): diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index 33475b5..a747e12 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -240,6 +240,50 @@ class QmkBacklightHandler(BasicHandler): self.device.keyboard.set_qmk_backlight_effect(int(checked)) +class VialRGBHandler(BasicHandler): + + def __init__(self, container): + super().__init__(container) + + row = container.rowCount() + + self.lbl_rgb_brightness = QLabel(tr("RGBConfigurator", "RGB Brightness")) + container.addWidget(self.lbl_rgb_brightness, row + 1, 0) + self.rgb_brightness = QSlider(QtCore.Qt.Horizontal) + self.rgb_brightness.setMinimum(0) + self.rgb_brightness.setMaximum(255) + self.rgb_brightness.valueChanged.connect(self.on_rgb_brightness_changed) + container.addWidget(self.rgb_brightness, row + 1, 1) + + self.widgets = [self.lbl_rgb_brightness, self.rgb_brightness] + + def on_rgb_brightness_changed(self, value): + self.device.keyboard.set_vialrgb_brightness(value) + + def show(self): + for w in self.widgets: + w.show() + + def hide(self): + for w in self.widgets: + w.hide() + + def block_signals(self): + for w in self.widgets: + w.blockSignals(True) + + def unblock_signals(self): + for w in self.widgets: + w.blockSignals(False) + + def update_from_keyboard(self): + print("hsv", self.device.keyboard.rgb_hsv) + self.rgb_brightness.setValue(self.device.keyboard.rgb_hsv[2]) + + def valid(self): + return isinstance(self.device, VialKeyboard) and self.device.keyboard.lighting_vialrgb + + class RGBConfigurator(BasicEditor): def __init__(self): @@ -258,7 +302,9 @@ class RGBConfigurator(BasicEditor): self.handler_backlight.update.connect(self.update_from_keyboard) self.handler_rgblight = QmkRgblightHandler(self.container) self.handler_rgblight.update.connect(self.update_from_keyboard) - self.handlers = [self.handler_backlight, self.handler_rgblight] + self.handler_vialrgb = VialRGBHandler(self.container) + self.handler_vialrgb.update.connect(self.update_from_keyboard) + self.handlers = [self.handler_backlight, self.handler_rgblight, self.handler_vialrgb] self.addStretch() buttons = QHBoxLayout() @@ -273,7 +319,8 @@ class RGBConfigurator(BasicEditor): def valid(self): return isinstance(self.device, VialKeyboard) and \ - (self.device.keyboard.lighting_qmk_rgblight or self.device.keyboard.lighting_qmk_backlight) + (self.device.keyboard.lighting_qmk_rgblight or self.device.keyboard.lighting_qmk_backlight + or self.device.keyboard.lighting_vialrgb) def block_signals(self): for h in self.handlers: From 6efebe82bc64f24b9ab47b5c238647f5ea614c68 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 19:35:27 -0400 Subject: [PATCH 02/10] rgb_configurator: reduce code duplication --- src/main/python/rgb_configurator.py | 80 ++++++----------------------- 1 file changed, 15 insertions(+), 65 deletions(-) diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index a747e12..b963622 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -66,26 +66,32 @@ class BasicHandler(QObject): def __init__(self, container): super().__init__() - self.device = None + self.device = self.keyboard = None + self.widgets = [] def set_device(self, device): self.device = device if self.valid(): + self.keyboard = self.device self.show() else: self.hide() def show(self): - raise NotImplementedError + for w in self.widgets: + w.show() def hide(self): - raise NotImplementedError + for w in self.widgets: + w.hide() def block_signals(self): - raise NotImplementedError + for w in self.widgets: + w.blockSignals(True) def unblock_signals(self): - raise NotImplementedError + for w in self.widgets: + w.blockSignals(False) def update_from_keyboard(self): raise NotImplementedError @@ -124,31 +130,8 @@ class QmkRgblightHandler(BasicHandler): self.underglow_effect.currentIndexChanged.connect(self.on_underglow_effect_changed) - def show(self): - self.lbl_underglow_effect.show() - self.underglow_effect.show() - self.lbl_underglow_brightness.show() - self.underglow_brightness.show() - self.lbl_underglow_color.show() - self.underglow_color.show() - - def hide(self): - self.lbl_underglow_effect.hide() - self.underglow_effect.hide() - self.lbl_underglow_brightness.hide() - self.underglow_brightness.hide() - self.lbl_underglow_color.hide() - self.underglow_color.hide() - - def block_signals(self): - self.underglow_brightness.blockSignals(True) - self.underglow_effect.blockSignals(True) - self.underglow_color.blockSignals(True) - - def unblock_signals(self): - self.underglow_brightness.blockSignals(False) - self.underglow_effect.blockSignals(False) - self.underglow_color.blockSignals(False) + self.widgets = [self.lbl_underglow_effect, self.underglow_effect, self.lbl_underglow_brightness, + self.underglow_brightness, self.lbl_underglow_color, self.underglow_color] def update_from_keyboard(self): self.underglow_brightness.setValue(self.device.keyboard.underglow_brightness) @@ -206,25 +189,8 @@ class QmkBacklightHandler(BasicHandler): self.backlight_breathing.stateChanged.connect(self.on_backlight_breathing_changed) container.addWidget(self.backlight_breathing, row + 1, 1) - def show(self): - self.lbl_backlight_brightness.show() - self.backlight_brightness.show() - self.lbl_backlight_breathing.show() - self.backlight_breathing.show() - - def hide(self): - self.lbl_backlight_brightness.hide() - self.backlight_brightness.hide() - self.lbl_backlight_breathing.hide() - self.backlight_breathing.hide() - - def block_signals(self): - self.backlight_brightness.blockSignals(True) - self.backlight_breathing.blockSignals(True) - - def unblock_signals(self): - self.backlight_brightness.blockSignals(False) - self.backlight_breathing.blockSignals(False) + self.widgets = [self.lbl_backlight_brightness, self.backlight_brightness, self.lbl_backlight_breathing, + self.backlight_breathing] def update_from_keyboard(self): self.backlight_brightness.setValue(self.device.keyboard.backlight_brightness) @@ -260,22 +226,6 @@ class VialRGBHandler(BasicHandler): def on_rgb_brightness_changed(self, value): self.device.keyboard.set_vialrgb_brightness(value) - def show(self): - for w in self.widgets: - w.show() - - def hide(self): - for w in self.widgets: - w.hide() - - def block_signals(self): - for w in self.widgets: - w.blockSignals(True) - - def unblock_signals(self): - for w in self.widgets: - w.blockSignals(False) - def update_from_keyboard(self): print("hsv", self.device.keyboard.rgb_hsv) self.rgb_brightness.setValue(self.device.keyboard.rgb_hsv[2]) From 5cf8a67ba71bf19959e3cb8a929a20367912a8a5 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 20:12:28 -0400 Subject: [PATCH 03/10] rgb_configurator/vialrgb: set color --- src/main/python/keyboard_comm.py | 8 ++++++ src/main/python/rgb_configurator.py | 44 ++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index d1ee87d..6684a03 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -805,6 +805,14 @@ class Keyboard: self.rgb_hsv = (self.rgb_hsv[0], self.rgb_hsv[1], value) self._vialrgb_set_mode() + def set_vialrgb_mode(self, value): + self.rgb_mode = value + self._vialrgb_set_mode() + + def set_vialrgb_color(self, h, s, v): + self.rgb_hsv = (h, s, v) + self._vialrgb_set_mode() + class DummyKeyboard(Keyboard): diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index b963622..33847b2 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -72,7 +72,7 @@ class BasicHandler(QObject): def set_device(self, device): self.device = device if self.valid(): - self.keyboard = self.device + self.keyboard = self.device.keyboard self.show() else: self.hide() @@ -213,6 +213,22 @@ class VialRGBHandler(BasicHandler): row = container.rowCount() + self.lbl_rgb_effect = QLabel(tr("RGBConfigurator", "RGB Effect")) + container.addWidget(self.lbl_rgb_effect, row, 0) + self.rgb_effect = QComboBox() + self.rgb_effect.addItem("0") + self.rgb_effect.addItem("1") + self.rgb_effect.addItem("2") + self.rgb_effect.addItem("3") + self.rgb_effect.currentIndexChanged.connect(self.on_rgb_effect_changed) + container.addWidget(self.rgb_effect, row, 1) + + self.lbl_rgb_color = QLabel(tr("RGBConfigurator", "RGB Color")) + container.addWidget(self.lbl_rgb_color, row + 2, 0) + self.rgb_color = ClickableLabel(" ") + self.rgb_color.clicked.connect(self.on_rgb_color) + container.addWidget(self.rgb_color, row + 2, 1) + self.lbl_rgb_brightness = QLabel(tr("RGBConfigurator", "RGB Brightness")) container.addWidget(self.lbl_rgb_brightness, row + 1, 0) self.rgb_brightness = QSlider(QtCore.Qt.Horizontal) @@ -221,14 +237,34 @@ class VialRGBHandler(BasicHandler): self.rgb_brightness.valueChanged.connect(self.on_rgb_brightness_changed) container.addWidget(self.rgb_brightness, row + 1, 1) - self.widgets = [self.lbl_rgb_brightness, self.rgb_brightness] + self.widgets = [self.lbl_rgb_effect, self.rgb_effect, self.lbl_rgb_brightness, self.rgb_brightness, + self.lbl_rgb_color, self.rgb_color] def on_rgb_brightness_changed(self, value): - self.device.keyboard.set_vialrgb_brightness(value) + self.keyboard.set_vialrgb_brightness(value) + + def on_rgb_effect_changed(self, value): + self.keyboard.set_vialrgb_mode(value) + + def on_rgb_color(self): + color = QColorDialog.getColor(self.current_color()) + if not color.isValid(): + return + self.rgb_color.setStyleSheet("QWidget { background-color: %s}" % color.name()) + h, s, v, a = color.getHsvF() + if h < 0: + h = 0 + self.device.keyboard.set_vialrgb_color(int(255 * h), int(255 * s), int(255 * v)) + self.update.emit() + + def current_color(self): + return QColor.fromHsvF(self.device.keyboard.rgb_hsv[0] / 255.0, + self.device.keyboard.rgb_hsv[1] / 255.0, + 1.0) def update_from_keyboard(self): - print("hsv", self.device.keyboard.rgb_hsv) self.rgb_brightness.setValue(self.device.keyboard.rgb_hsv[2]) + self.rgb_color.setStyleSheet("QWidget { background-color: %s}" % self.current_color().name()) def valid(self): return isinstance(self.device, VialKeyboard) and self.device.keyboard.lighting_vialrgb From 0f46237047d09c5d6ba44949f1171728b207ec06 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 20:20:11 -0400 Subject: [PATCH 04/10] vialrgb: retrieve protocol version, max brightness --- src/main/python/keyboard_comm.py | 22 +++++++++++++++++----- src/main/python/rgb_configurator.py | 3 ++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index 6684a03..ec03495 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -41,9 +41,10 @@ QMK_RGBLIGHT_EFFECT = 0x81 QMK_RGBLIGHT_EFFECT_SPEED = 0x82 QMK_RGBLIGHT_COLOR = 0x83 -VIALRGB_GET_MODE = 0x40 +VIALRGB_GET_INFO = 0x40 +VIALRGB_GET_MODE = 0x41 -VIALRGB_SET_MODE = 0x40 +VIALRGB_SET_MODE = 0x41 CMD_VIAL_GET_KEYBOARD_ID = 0x00 CMD_VIAL_GET_SIZE = 0x01 @@ -199,11 +200,14 @@ class Keyboard: self.custom_keycodes = None self.lighting_qmk_rgblight = self.lighting_qmk_backlight = self.lighting_vialrgb = False + + # underglow self.underglow_brightness = self.underglow_effect = self.underglow_effect_speed = -1 - self.backlight_brightness = self.backlight_effect = -1 self.underglow_color = (0, 0) + # backlight + self.backlight_brightness = self.backlight_effect = -1 # vialrgb - self.rgb_mode = self.rgb_speed = -1 + self.rgb_mode = self.rgb_speed = self.rgb_version = self.rgb_maximum_brightness = -1 self.rgb_hsv = (0, 0, 0) self.via_protocol = self.vial_protocol = self.keyboard_id = -1 @@ -392,7 +396,15 @@ 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_MODE))[2:] + 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") + 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] self.rgb_speed = data[1] self.rgb_hsv = (data[2], data[3], data[4]) diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index 33847b2..6ed110d 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -263,7 +263,8 @@ class VialRGBHandler(BasicHandler): 1.0) def update_from_keyboard(self): - self.rgb_brightness.setValue(self.device.keyboard.rgb_hsv[2]) + 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()) def valid(self): From da984c578f5a79476ba1390e9580e517d65f6a33 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 20:24:46 -0400 Subject: [PATCH 05/10] vialrgb: log protocol version on failure --- src/main/python/keyboard_comm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index ec03495..d1a421e 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -400,7 +400,8 @@ class Keyboard: 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") + 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), From ceae2be4a47202d1b9fde75138440df24ad84a7e Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 20:26:53 -0400 Subject: [PATCH 06/10] vialrgb: don't touch v when changing color --- src/main/python/rgb_configurator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index 6ed110d..572f4c3 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -254,12 +254,12 @@ class VialRGBHandler(BasicHandler): h, s, v, a = color.getHsvF() if h < 0: h = 0 - self.device.keyboard.set_vialrgb_color(int(255 * h), int(255 * s), int(255 * v)) + self.keyboard.set_vialrgb_color(int(255 * h), int(255 * s), self.keyboard.rgb_hsv[2]) self.update.emit() def current_color(self): - return QColor.fromHsvF(self.device.keyboard.rgb_hsv[0] / 255.0, - self.device.keyboard.rgb_hsv[1] / 255.0, + return QColor.fromHsvF(self.keyboard.rgb_hsv[0] / 255.0, + self.keyboard.rgb_hsv[1] / 255.0, 1.0) def update_from_keyboard(self): From 30d4731cfd4c61ef7d2f1e512bab376a8a1e5737 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 22:39:17 -0400 Subject: [PATCH 07/10] 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()) From 6bfd4bc3ec11adf6fd892964a46d4d8b06f28400 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 9 Jul 2021 17:54:15 -0400 Subject: [PATCH 08/10] vialrgb: add all supported effects --- src/main/python/keyboard_comm.py | 3 ++- src/main/python/rgb_configurator.py | 41 ++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index 921c562..f370d98 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -397,7 +397,8 @@ class Keyboard: 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:] + data = self.usb_send(self.dev, struct.pack(" Date: Fri, 9 Jul 2021 18:29:49 -0400 Subject: [PATCH 09/10] vialrgb: switch to 16-bit mode --- src/main/python/keyboard_comm.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index f370d98..9f0be9c 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -427,9 +427,9 @@ class Keyboard: if self.lighting_vialrgb: 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] - self.rgb_speed = data[1] - self.rgb_hsv = (data[2], data[3], data[4]) + self.rgb_mode = int.from_bytes(data[0:2], byteorder="little") + self.rgb_speed = data[2] + self.rgb_hsv = (data[3], data[4], data[5]) def reload_settings(self): self.settings = dict() @@ -831,7 +831,7 @@ class Keyboard: DYNAMIC_VIAL_COMBO_SET, idx) + serialized, retries=20) def _vialrgb_set_mode(self): - self.usb_send(self.dev, struct.pack("BBBBBBB", CMD_VIA_LIGHTING_SET_VALUE, VIALRGB_SET_MODE, + self.usb_send(self.dev, struct.pack("BBHBBBB", CMD_VIA_LIGHTING_SET_VALUE, VIALRGB_SET_MODE, self.rgb_mode, self.rgb_speed, self.rgb_hsv[0], self.rgb_hsv[1], self.rgb_hsv[2])) From 0759f76fd5b1ee9745299355604e0cc5ff1be54d Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 9 Jul 2021 18:38:08 -0400 Subject: [PATCH 10/10] vialrgb: add rgb speed --- src/main/python/keyboard_comm.py | 4 ++++ src/main/python/rgb_configurator.py | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index 9f0be9c..2ddc704 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -839,6 +839,10 @@ class Keyboard: self.rgb_hsv = (self.rgb_hsv[0], self.rgb_hsv[1], value) self._vialrgb_set_mode() + def set_vialrgb_speed(self, value): + self.rgb_speed = value + self._vialrgb_set_mode() + def set_vialrgb_mode(self, value): self.rgb_mode = value self._vialrgb_set_mode() diff --git a/src/main/python/rgb_configurator.py b/src/main/python/rgb_configurator.py index d3a8de4..d50cf53 100644 --- a/src/main/python/rgb_configurator.py +++ b/src/main/python/rgb_configurator.py @@ -278,27 +278,38 @@ class VialRGBHandler(BasicHandler): container.addWidget(self.rgb_effect, row, 1) self.lbl_rgb_color = QLabel(tr("RGBConfigurator", "RGB Color")) - container.addWidget(self.lbl_rgb_color, row + 2, 0) + container.addWidget(self.lbl_rgb_color, row + 1, 0) self.rgb_color = ClickableLabel(" ") self.rgb_color.clicked.connect(self.on_rgb_color) - container.addWidget(self.rgb_color, row + 2, 1) + container.addWidget(self.rgb_color, row + 1, 1) self.lbl_rgb_brightness = QLabel(tr("RGBConfigurator", "RGB Brightness")) - container.addWidget(self.lbl_rgb_brightness, row + 1, 0) + container.addWidget(self.lbl_rgb_brightness, row + 2, 0) self.rgb_brightness = QSlider(QtCore.Qt.Horizontal) self.rgb_brightness.setMinimum(0) self.rgb_brightness.setMaximum(255) self.rgb_brightness.valueChanged.connect(self.on_rgb_brightness_changed) - container.addWidget(self.rgb_brightness, row + 1, 1) + container.addWidget(self.rgb_brightness, row + 2, 1) + + self.lbl_rgb_speed = QLabel(tr("RGBConfigurator", "RGB Speed")) + container.addWidget(self.lbl_rgb_speed, row + 3, 0) + self.rgb_speed = QSlider(QtCore.Qt.Horizontal) + self.rgb_speed.setMinimum(0) + self.rgb_speed.setMaximum(255) + self.rgb_speed.valueChanged.connect(self.on_rgb_speed_changed) + container.addWidget(self.rgb_speed, row + 3, 1) self.widgets = [self.lbl_rgb_effect, self.rgb_effect, self.lbl_rgb_brightness, self.rgb_brightness, - self.lbl_rgb_color, self.rgb_color] + self.lbl_rgb_color, self.rgb_color, self.lbl_rgb_speed, self.rgb_speed] self.effects = [] def on_rgb_brightness_changed(self, value): self.keyboard.set_vialrgb_brightness(value) + def on_rgb_speed_changed(self, value): + self.keyboard.set_vialrgb_speed(value) + def on_rgb_effect_changed(self, index): self.keyboard.set_vialrgb_mode(self.effects[index].idx) @@ -336,6 +347,7 @@ class VialRGBHandler(BasicHandler): break self.rgb_brightness.setMaximum(self.keyboard.rgb_maximum_brightness) self.rgb_brightness.setValue(self.keyboard.rgb_hsv[2]) + self.rgb_speed.setValue(self.keyboard.rgb_speed) self.rgb_color.setStyleSheet("QWidget { background-color: %s}" % self.current_color().name()) def valid(self):