diff --git a/docs/devices/PRO X Wireless 4093.txt b/docs/devices/PRO X Wireless 4093.txt index a86d7b1c..5ec9a104 100644 --- a/docs/devices/PRO X Wireless 4093.txt +++ b/docs/devices/PRO X Wireless 4093.txt @@ -1,59 +1,62 @@ -Solaar version 1.1.3 +Solaar version 1.1.14 - 1: PRO X Wireless + 2: PRO X Wireless Device path : None WPID : 4093 Codename : PRO X Kind : mouse Protocol : HID++ 4.2 - Polling rate : 8 ms (125Hz) - Serial number: 42F42E12 + Report Rate : 1ms + Serial number: 8B24D1D1 Model ID: 4093C0940000 - Unit ID: 42F42E12 - Bootloader: BL1 25.00.B0013 - Other: - Firmware: MPM 25.01.B0018 + Unit ID: 8B24D1D1 + 1: BL1 25.01.B0018 + 3: + 0: MPM 25.01.B0018 Supports 28 HID++ 2.0 features: - 0: ROOT {0000} - 1: FEATURE SET {0001} - 2: DEVICE FW VERSION {0003} - Firmware: Bootloader BL1 25.00.B0013 AB00BE657A82 - Firmware: Other - Firmware: Firmware MPM 25.01.B0018 4093FE92436C - Unit ID: 42F42E12 Model ID: 4093C0940000 Transport IDs: {'wpid': '4093', 'usbid': 'C094'} - 3: DEVICE NAME {0005} + 0: ROOT {0000} V0 + 1: FEATURE SET {0001} V0 + 2: DEVICE FW VERSION {0003} V3 + Firmware: 1 BL1 25.01.B0018 AB00FE92436C + Firmware: 3 + Firmware: 0 MPM 25.01.B0018 4093FE92436C + Unit ID: 8B24D1D1 Model ID: 4093C0940000 Transport IDs: {'wpid': '4093', 'usbid': 'C094'} + 3: DEVICE NAME {0005} V0 Name: PRO X Wireless Kind: mouse - 4: WIRELESS DEVICE STATUS {1D4B} - 5: RESET {0020} - 6: UNIFIED BATTERY {1004} - 7: COLOR LED EFFECTS {8070} internal, hidden - 8: ONBOARD PROFILES {8100} - Device Mode: Host - Onboard Profiles (saved): Disable - Onboard Profiles : Disable - 9: MOUSE BUTTON SPY {8110} - 10: REPORT RATE {8060} - Polling Rate (ms): 1 - Polling Rate (ms) (saved): 1 - Polling Rate (ms) : 1 - 11: ADJUSTABLE DPI {2201} - Sensitivity (DPI) (saved): 1000 - Sensitivity (DPI) : 1000 - 12: unknown:1500 {1500} - 13: DEVICE RESET {1802} internal, hidden - 14: unknown:1803 {1803} internal, hidden - 15: CONFIG DEVICE PROPS {1806} internal, hidden - 16: unknown:1811 {1811} internal, hidden - 17: OOBSTATE {1805} internal, hidden - 18: unknown:1830 {1830} internal, hidden - 19: unknown:1890 {1890} internal, hidden - 20: unknown:1891 {1891} internal, hidden - 21: unknown:18A1 {18A1} internal, hidden - 22: unknown:1801 {1801} internal, hidden - 23: unknown:18B1 {18B1} internal, hidden - 24: unknown:1E00 {1E00} hidden - 25: unknown:1EB0 {1EB0} internal, hidden - 26: unknown:1863 {1863} internal, hidden - 27: unknown:1E22 {1E22} internal, hidden - Battery: 76%, discharging. + 4: WIRELESS DEVICE STATUS {1D4B} V0 + 5: CONFIG CHANGE {0020} V0 + Configuration: 11000000000000000000000000000000 + 6: UNIFIED BATTERY {1004} V1 + Battery: 71%, 0. + 7: COLOR LED EFFECTS {8070} V4 internal, hidden + LED Control : HID++ error {'number': 2, 'request': 1908, 'error': 5, 'params': b''} + 8: ONBOARD PROFILES {8100} V0 + Device Mode: On-Board + Onboard Profiles (saved): Profile 1 + Onboard Profiles : Profile 1 + 9: MOUSE BUTTON SPY {8110} V0 + 10: REPORT RATE {8060} V0 + Report Rate: 1ms + Report Rate (saved): 1ms + Report Rate : 1ms + 11: ADJUSTABLE DPI {2201} V2 + Sensitivity (DPI) (saved): 800 + Sensitivity (DPI) : 800 + 12: FORCE PAIRING {1500} V0 + 13: DEVICE RESET {1802} V0 internal, hidden + 14: unknown:1803 {1803} V0 internal, hidden + 15: CONFIG DEVICE PROPS {1806} V4 internal, hidden + 16: unknown:1811 {1811} V0 internal, hidden + 17: OOBSTATE {1805} V0 internal, hidden + 18: unknown:1830 {1830} V0 internal, hidden + 19: unknown:1890 {1890} V5 internal, hidden + 20: unknown:1891 {1891} V5 internal, hidden + 21: unknown:18A1 {18A1} V0 internal, hidden + 22: unknown:1801 {1801} V0 internal, hidden + 23: unknown:18B1 {18B1} V0 internal, hidden + 24: unknown:1E00 {1E00} V0 hidden + 25: unknown:1EB0 {1EB0} V0 internal, hidden + 26: unknown:1863 {1863} V0 internal, hidden + 27: unknown:1E22 {1E22} V0 internal, hidden + Battery: 71%, 0. diff --git a/lib/logitech_receiver/hidpp20.py b/lib/logitech_receiver/hidpp20.py index b5ad4236..1db43090 100644 --- a/lib/logitech_receiver/hidpp20.py +++ b/lib/logitech_receiver/hidpp20.py @@ -47,6 +47,7 @@ from .hidpp20_constants import DEVICE_KIND from .hidpp20_constants import ChargeLevel from .hidpp20_constants import ChargeType from .hidpp20_constants import ErrorCode +from .hidpp20_constants import FeatureFlag from .hidpp20_constants import GestureId from .hidpp20_constants import ParamId from .hidpp20_constants import SupportedFeature @@ -137,6 +138,7 @@ class FeaturesArray(dict): self.device = device self.inverse = {} self.version = {} + self.flags = {} self.count = 0 def _check(self) -> bool: @@ -183,6 +185,7 @@ class FeaturesArray(dict): feature = f"unknown:{data:04X}" self[feature] = index self.version[feature] = response[3] + self.flags[feature] = response[2] return feature def enumerate(self): # return all features and their index, ordered by index @@ -195,6 +198,15 @@ class FeaturesArray(dict): if self[feature]: return self.version.get(feature, 0) + def get_flags(self, feature: NamedInt) -> Optional[int]: + if self[feature]: + return self.flags.get(feature, 0) + + def get_hidden(self, feature: NamedInt) -> Optional[bool]: + if self[feature]: + return self.flags.get(feature, 0) & FeatureFlag.INTERNAL + return True + def __contains__(self, feature: NamedInt) -> bool: try: index = self.__getitem__(feature) @@ -215,6 +227,7 @@ class FeaturesArray(dict): index = response[0] self[feature] = index if index else False self.version[feature] = response[2] + self.flags[feature] = response[1] return index if index else False def __setitem__(self, feature, index): diff --git a/lib/logitech_receiver/settings_templates.py b/lib/logitech_receiver/settings_templates.py index 3a63adb8..9c8c4d6d 100644 --- a/lib/logitech_receiver/settings_templates.py +++ b/lib/logitech_receiver/settings_templates.py @@ -1898,6 +1898,8 @@ def check_feature(device, settings_class: SettingsProtocol) -> None | bool | Set return if settings_class.min_version > device.features.get_feature_version(settings_class.feature): return + if device.features.get_hidden(settings_class.feature): + return try: detected = settings_class.build(device) if logger.isEnabledFor(logging.DEBUG):