settings: ignore hidden features

This commit is contained in:
Peter F. Patel-Schneider 2025-10-26 16:19:35 -04:00
parent 44a647499c
commit 2cb5fa4b97
3 changed files with 67 additions and 49 deletions

View File

@ -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 Device path : None
WPID : 4093 WPID : 4093
Codename : PRO X Codename : PRO X
Kind : mouse Kind : mouse
Protocol : HID++ 4.2 Protocol : HID++ 4.2
Polling rate : 8 ms (125Hz) Report Rate : 1ms
Serial number: 42F42E12 Serial number: 8B24D1D1
Model ID: 4093C0940000 Model ID: 4093C0940000
Unit ID: 42F42E12 Unit ID: 8B24D1D1
Bootloader: BL1 25.00.B0013 1: BL1 25.01.B0018
Other: 3:
Firmware: MPM 25.01.B0018 0: MPM 25.01.B0018
Supports 28 HID++ 2.0 features: Supports 28 HID++ 2.0 features:
0: ROOT {0000} 0: ROOT {0000} V0
1: FEATURE SET {0001} 1: FEATURE SET {0001} V0
2: DEVICE FW VERSION {0003} 2: DEVICE FW VERSION {0003} V3
Firmware: Bootloader BL1 25.00.B0013 AB00BE657A82 Firmware: 1 BL1 25.01.B0018 AB00FE92436C
Firmware: Other Firmware: 3
Firmware: Firmware MPM 25.01.B0018 4093FE92436C Firmware: 0 MPM 25.01.B0018 4093FE92436C
Unit ID: 42F42E12 Model ID: 4093C0940000 Transport IDs: {'wpid': '4093', 'usbid': 'C094'} Unit ID: 8B24D1D1 Model ID: 4093C0940000 Transport IDs: {'wpid': '4093', 'usbid': 'C094'}
3: DEVICE NAME {0005} 3: DEVICE NAME {0005} V0
Name: PRO X Wireless Name: PRO X Wireless
Kind: mouse Kind: mouse
4: WIRELESS DEVICE STATUS {1D4B} 4: WIRELESS DEVICE STATUS {1D4B} V0
5: RESET {0020} 5: CONFIG CHANGE {0020} V0
6: UNIFIED BATTERY {1004} Configuration: 11000000000000000000000000000000
7: COLOR LED EFFECTS {8070} internal, hidden 6: UNIFIED BATTERY {1004} V1
8: ONBOARD PROFILES {8100} Battery: 71%, 0.
Device Mode: Host 7: COLOR LED EFFECTS {8070} V4 internal, hidden
Onboard Profiles (saved): Disable LED Control : HID++ error {'number': 2, 'request': 1908, 'error': 5, 'params': b''}
Onboard Profiles : Disable 8: ONBOARD PROFILES {8100} V0
9: MOUSE BUTTON SPY {8110} Device Mode: On-Board
10: REPORT RATE {8060} Onboard Profiles (saved): Profile 1
Polling Rate (ms): 1 Onboard Profiles : Profile 1
Polling Rate (ms) (saved): 1 9: MOUSE BUTTON SPY {8110} V0
Polling Rate (ms) : 1 10: REPORT RATE {8060} V0
11: ADJUSTABLE DPI {2201} Report Rate: 1ms
Sensitivity (DPI) (saved): 1000 Report Rate (saved): 1ms
Sensitivity (DPI) : 1000 Report Rate : 1ms
12: unknown:1500 {1500} 11: ADJUSTABLE DPI {2201} V2
13: DEVICE RESET {1802} internal, hidden Sensitivity (DPI) (saved): 800
14: unknown:1803 {1803} internal, hidden Sensitivity (DPI) : 800
15: CONFIG DEVICE PROPS {1806} internal, hidden 12: FORCE PAIRING {1500} V0
16: unknown:1811 {1811} internal, hidden 13: DEVICE RESET {1802} V0 internal, hidden
17: OOBSTATE {1805} internal, hidden 14: unknown:1803 {1803} V0 internal, hidden
18: unknown:1830 {1830} internal, hidden 15: CONFIG DEVICE PROPS {1806} V4 internal, hidden
19: unknown:1890 {1890} internal, hidden 16: unknown:1811 {1811} V0 internal, hidden
20: unknown:1891 {1891} internal, hidden 17: OOBSTATE {1805} V0 internal, hidden
21: unknown:18A1 {18A1} internal, hidden 18: unknown:1830 {1830} V0 internal, hidden
22: unknown:1801 {1801} internal, hidden 19: unknown:1890 {1890} V5 internal, hidden
23: unknown:18B1 {18B1} internal, hidden 20: unknown:1891 {1891} V5 internal, hidden
24: unknown:1E00 {1E00} hidden 21: unknown:18A1 {18A1} V0 internal, hidden
25: unknown:1EB0 {1EB0} internal, hidden 22: unknown:1801 {1801} V0 internal, hidden
26: unknown:1863 {1863} internal, hidden 23: unknown:18B1 {18B1} V0 internal, hidden
27: unknown:1E22 {1E22} internal, hidden 24: unknown:1E00 {1E00} V0 hidden
Battery: 76%, discharging. 25: unknown:1EB0 {1EB0} V0 internal, hidden
26: unknown:1863 {1863} V0 internal, hidden
27: unknown:1E22 {1E22} V0 internal, hidden
Battery: 71%, 0.

View File

@ -47,6 +47,7 @@ from .hidpp20_constants import DEVICE_KIND
from .hidpp20_constants import ChargeLevel from .hidpp20_constants import ChargeLevel
from .hidpp20_constants import ChargeType from .hidpp20_constants import ChargeType
from .hidpp20_constants import ErrorCode from .hidpp20_constants import ErrorCode
from .hidpp20_constants import FeatureFlag
from .hidpp20_constants import GestureId from .hidpp20_constants import GestureId
from .hidpp20_constants import ParamId from .hidpp20_constants import ParamId
from .hidpp20_constants import SupportedFeature from .hidpp20_constants import SupportedFeature
@ -137,6 +138,7 @@ class FeaturesArray(dict):
self.device = device self.device = device
self.inverse = {} self.inverse = {}
self.version = {} self.version = {}
self.flags = {}
self.count = 0 self.count = 0
def _check(self) -> bool: def _check(self) -> bool:
@ -183,6 +185,7 @@ class FeaturesArray(dict):
feature = f"unknown:{data:04X}" feature = f"unknown:{data:04X}"
self[feature] = index self[feature] = index
self.version[feature] = response[3] self.version[feature] = response[3]
self.flags[feature] = response[2]
return feature return feature
def enumerate(self): # return all features and their index, ordered by index def enumerate(self): # return all features and their index, ordered by index
@ -195,6 +198,15 @@ class FeaturesArray(dict):
if self[feature]: if self[feature]:
return self.version.get(feature, 0) 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: def __contains__(self, feature: NamedInt) -> bool:
try: try:
index = self.__getitem__(feature) index = self.__getitem__(feature)
@ -215,6 +227,7 @@ class FeaturesArray(dict):
index = response[0] index = response[0]
self[feature] = index if index else False self[feature] = index if index else False
self.version[feature] = response[2] self.version[feature] = response[2]
self.flags[feature] = response[1]
return index if index else False return index if index else False
def __setitem__(self, feature, index): def __setitem__(self, feature, index):

View File

@ -1898,6 +1898,8 @@ def check_feature(device, settings_class: SettingsProtocol) -> None | bool | Set
return return
if settings_class.min_version > device.features.get_feature_version(settings_class.feature): if settings_class.min_version > device.features.get_feature_version(settings_class.feature):
return return
if device.features.get_hidden(settings_class.feature):
return
try: try:
detected = settings_class.build(device) detected = settings_class.build(device)
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):