settings: better support RGB Effects - not readable

This commit is contained in:
Peter F. Patel-Schneider 2025-02-02 15:26:53 -05:00
parent 94155dbbf1
commit 198067519d
3 changed files with 26 additions and 11 deletions

View File

@ -634,7 +634,10 @@ class FeatureRW:
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

View File

@ -1621,7 +1621,7 @@ class LEDZoneSetting(settings.Setting):
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):

View File

@ -111,6 +111,7 @@ class FeatureTest:
offset: int = 0x04
version: int = 0x00
rewrite: bool = False
readable: bool = True
simple_tests = [
@ -299,6 +300,7 @@ simple_tests = [
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 @@ simple_tests = [
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 @@ simple_tests = [
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