From a8bf850b9a43b333bc72ffb6c4014b83aae87507 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 2 Feb 2025 15:26:53 -0500 Subject: [PATCH] settings: better support RGB Effects - not readable --- lib/logitech_receiver/settings.py | 5 +++- lib/logitech_receiver/settings_templates.py | 4 +-- .../test_setting_templates.py | 28 +++++++++++++------ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/logitech_receiver/settings.py b/lib/logitech_receiver/settings.py index 904718f162..9fe57cc26f 100644 --- a/lib/logitech_receiver/settings.py +++ b/lib/logitech_receiver/settings.py @@ -634,7 +634,10 @@ def __init__( def read(self, device, data_bytes=b""): assert self.feature is not None - return device.feature_request(self.feature, self.read_fnid, self.prefix, self.read_prefix, data_bytes) + if self.read_fnid is not None: + return device.feature_request(self.feature, self.read_fnid, self.prefix, self.read_prefix, data_bytes) + else: + return b"" def write(self, device, data_bytes): assert self.feature is not None diff --git a/lib/logitech_receiver/settings_templates.py b/lib/logitech_receiver/settings_templates.py index b9c06adefb..d796e271ff 100644 --- a/lib/logitech_receiver/settings_templates.py +++ b/lib/logitech_receiver/settings_templates.py @@ -1621,7 +1621,7 @@ def setup(cls, device, read_fnid, write_fnid, suffix): prefix = common.int2bytes(zone.index, 1) rw = settings.FeatureRW(cls.feature, read_fnid, write_fnid, prefix=prefix, suffix=suffix) validator = settings_validator.HeteroValidator( - data_class=hidpp20.LEDEffectSetting, options=zone.effects, readable=infos.readable + data_class=hidpp20.LEDEffectSetting, options=zone.effects, readable=infos.readable and read_fnid is not None ) setting = cls(device, rw, validator) setting.name = cls.name + str(int(zone.location)) @@ -1657,7 +1657,7 @@ class RGBEffectSetting(LEDZoneSetting): @classmethod def build(cls, device): - return cls.setup(device, 0xE0, 0x10, b"\x01") + return cls.setup(device, None, 0x10, b"\x01") class PerKeyLighting(settings.Settings): diff --git a/tests/logitech_receiver/test_setting_templates.py b/tests/logitech_receiver/test_setting_templates.py index 4b05c604d0..74f22b8823 100644 --- a/tests/logitech_receiver/test_setting_templates.py +++ b/tests/logitech_receiver/test_setting_templates.py @@ -111,6 +111,7 @@ class FeatureTest: offset: int = 0x04 version: int = 0x00 rewrite: bool = False + readable: bool = True simple_tests = [ @@ -299,6 +300,7 @@ class FeatureTest: settings_templates.RGBEffectSetting, hidpp20.LEDEffectSetting(ID=3, intensity=0x50, period=0x100), hidpp20.LEDEffectSetting(ID=2, color=0x505050, speed=0x50), + readable=False, ), fake_hidpp.Response("FFFF0100000001", 0x0400, "FFFF00"), fake_hidpp.Response("0000000102", 0x0400, "00FF00"), @@ -308,7 +310,12 @@ class FeatureTest: fake_hidpp.Response("00015050505000000000000001", 0x0410, "00015050505000000000000001"), ), Setup( - FeatureTest(settings_templates.RGBEffectSetting, None, hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101)), + FeatureTest( + settings_templates.RGBEffectSetting, + None, + hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101), + readable=False, + ), fake_hidpp.Response("FFFF0100000001", 0x0400, "FFFF00"), fake_hidpp.Response("0000000102", 0x0400, "00FF00"), fake_hidpp.Response("0000000300040005", 0x0400, "000000"), @@ -316,7 +323,12 @@ class FeatureTest: fake_hidpp.Response("00000000000000010160000001", 0x0410, "00000000000000010160000001"), ), Setup( - FeatureTest(settings_templates.RGBEffectSetting, None, hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101)), + FeatureTest( + settings_templates.RGBEffectSetting, + None, + hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101), + readable=False, + ), fake_hidpp.Response("FF000200020004000000000000000000", 0x0400, "FFFF00"), fake_hidpp.Response("00000002040000000000000000000000", 0x0400, "00FF00"), fake_hidpp.Response("00000000000000000000000000000000", 0x0400, "000000"), @@ -487,7 +499,7 @@ def mock_gethostname(mocker): @pytest.mark.parametrize("test", simple_tests) def test_simple_template(test, mocker, mock_gethostname): tst = test.test - print("TEST", tst.sclass.feature) + print("TEST", tst.sclass, tst.sclass.feature) device = fake_hidpp.Device(responses=test.responses, feature=tst.sclass.feature, offset=tst.offset, version=tst.version) spy_request = mocker.spy(device, "request") @@ -501,12 +513,12 @@ def test_simple_template(test, mocker, mock_gethostname): elif test.choices is not None: assert setting.choices == test.choices - value = setting.read(cached=False) - unreadable = hasattr(setting._rw, "read_fnid") and setting._rw.read_fnid is None - assert value == (tst.initial_value if not unreadable else None) + if tst.readable: + value = setting.read(cached=False) + assert value == tst.initial_value - cached_value = setting.read(cached=True) - assert cached_value == tst.initial_value + cached_value = setting.read(cached=True) + assert cached_value == tst.initial_value write_value = setting.write(tst.write_value) if tst.write_value is not None else None assert write_value == tst.write_value