diff --git a/lib/logitech_receiver/hidpp20.py b/lib/logitech_receiver/hidpp20.py index 71baca18..4dd8ec79 100644 --- a/lib/logitech_receiver/hidpp20.py +++ b/lib/logitech_receiver/hidpp20.py @@ -22,6 +22,7 @@ import struct import threading from enum import Flag +from enum import IntEnum from typing import Any from typing import Dict from typing import Generator @@ -671,20 +672,24 @@ SUB_PARAM = { # (byte count, minimum, maximum) ParamId.SCALE_FACTOR: (SubParam("scale", 2, 0x002E, 0x01FF, "Scale"),), } -# Spec Ids for feature GESTURE_2 -SPEC = common.NamedInts( - DVI_field_width=1, - field_widths=2, - period_unit=3, - resolution=4, - multiplier=5, - sensor_size=6, - finger_width_and_height=7, - finger_major_minor_axis=8, - finger_force=9, - zone=10, -) -SPEC._fallback = lambda x: f"unknown:{x:04X}" + +class SpecGesture(IntEnum): + """Spec IDs for feature GESTURE_2.""" + + DVI_FIELD_WIDTH = 1 + FIELD_WIDTHS = 2 + PERIOD_UNIT = 3 + RESOLUTION = 4 + MULTIPLIER = 5 + SENSOR_SIZE = 6 + FINGER_WIDTH_AND_HEIGHT = 7 + FINGER_MAJOR_MINOR_AXIS = 8 + FINGER_FORCE = 9 + ZONE = 10 + + def __str__(self): + return f"{self.name.replace('_', ' ').lower()}" + # Action Ids for feature GESTURE_2 ACTION_ID = common.NamedInts( @@ -836,10 +841,13 @@ class Param: class Spec: - def __init__(self, device, low, high): + def __init__(self, device, low: int, high): self._device = device self.id = low - self.spec = SPEC[low] + try: + self.spec = SpecGesture(low) + except ValueError: + self.spec = f"unknown:{low:04X}" self.byte_count = high & 0x0F self._value = None diff --git a/tests/logitech_receiver/test_hidpp20_complex.py b/tests/logitech_receiver/test_hidpp20_complex.py index eb46e446..f8e9e340 100644 --- a/tests/logitech_receiver/test_hidpp20_complex.py +++ b/tests/logitech_receiver/test_hidpp20_complex.py @@ -560,14 +560,14 @@ def test_param(responses, prm, id, index, size, value, default_value, write1, wr @pytest.mark.parametrize( - "responses, id, s, byte_count, value, string", + "responses, id, s, byte_count, expected_value, expected_string", [ - (fake_hidpp.responses_gestures, 1, "DVI field width", 1, 8, "[DVI field width=8]"), - (fake_hidpp.responses_gestures, 2, "field widths", 1, 8, "[field widths=8]"), - (fake_hidpp.responses_gestures, 3, "period unit", 2, 2048, "[period unit=2048]"), + (fake_hidpp.responses_gestures, 1, hidpp20.SpecGesture.DVI_FIELD_WIDTH, 1, 8, "[dvi field width=8]"), + (fake_hidpp.responses_gestures, 2, hidpp20.SpecGesture.FIELD_WIDTHS, 1, 8, "[field widths=8]"), + (fake_hidpp.responses_gestures, 3, hidpp20.SpecGesture.PERIOD_UNIT, 2, 2048, "[period unit=2048]"), ], ) -def test_Spec(responses, id, s, byte_count, value, string): +def test_spec(responses, id, s, byte_count, expected_value, expected_string): device = fake_hidpp.Device("GESTURE", responses=responses, feature=hidpp20_constants.SupportedFeature.GESTURE_2) gestures = _hidpp20.get_gestures(device) @@ -576,8 +576,8 @@ def test_Spec(responses, id, s, byte_count, value, string): assert spec.id == id assert spec.spec == s assert spec.byte_count == byte_count - assert spec.value == value - assert repr(spec) == string + assert spec.value == expected_value + assert repr(spec) == expected_string def test_Gestures():