Skip to content

Commit

Permalink
settings: better support RGB Effects - not readable
Browse files Browse the repository at this point in the history
  • Loading branch information
pfps committed Feb 8, 2025
1 parent cefc502 commit a8bf850
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 11 deletions.
5 changes: 4 additions & 1 deletion lib/logitech_receiver/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions lib/logitech_receiver/settings_templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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):
Expand Down
28 changes: 20 additions & 8 deletions tests/logitech_receiver/test_setting_templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ class FeatureTest:
offset: int = 0x04
version: int = 0x00
rewrite: bool = False
readable: bool = True


simple_tests = [
Expand Down Expand Up @@ -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"),
Expand All @@ -308,15 +310,25 @@ 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"),
fake_hidpp.Response("0001000200080009", 0x0400, "000100"),
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"),
Expand Down Expand Up @@ -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")

Expand All @@ -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
Expand Down

0 comments on commit a8bf850

Please sign in to comment.