206 lines
13 KiB
Markdown
206 lines
13 KiB
Markdown
---
|
|
title: List of HID++ 2.0 features
|
|
layout: page
|
|
---
|
|
|
|
# List of HID++ 2.0 features
|
|
|
|
## Feature status
|
|
|
|
See functions in `hidpp20.py` and `settings_templates.py`
|
|
|
|
Feature | ID | Status | Notes
|
|
---------------------------------------|----------|:------------------:|------
|
|
`ROOT` | `0x0000` | Supported | System
|
|
`FEATURE_SET` | `0x0001` | Supported | System
|
|
`FEATURE_INFO` | `0x0002` | Supported | System
|
|
`DEVICE_FW_VERSION` | `0x0003` | Supported | `get_firmware`, `get_ids`, read only
|
|
`DEVICE_UNIT_ID` | `0x0004` | Unsupported |
|
|
`DEVICE_NAME` | `0x0005` | Supported | `get_kind`, `get_name`, read only
|
|
`DEVICE_GROUPS` | `0x0006` | Unsupported |
|
|
`DEVICE_FRIENDLY_NAME` | `0x0007` | Supported | `get_friendly_name`, read only
|
|
`KEEP_ALIVE` | `0x0008` | Unsupported |
|
|
`RESET` | `0x0020` | Unsupported | aka “Config Change”
|
|
`CRYPTO_ID` | `0x0021` | Unsupported |
|
|
`TARGET_SOFTWARE` | `0x0030` | Unsupported |
|
|
`WIRELESS_SIGNAL_STRENGTH` | `0x0080` | Unsupported |
|
|
`DFUCONTROL_LEGACY` | `0x00C0` | Unsupported |
|
|
`DFUCONTROL_UNSIGNED` | `0x00C1` | Unsupported |
|
|
`DFUCONTROL_SIGNED` | `0x00C2` | Unsupported |
|
|
`DFU` | `0x00D0` | Unsupported |
|
|
`BATTERY_STATUS` | `0x1000` | Supported | `get_battery`, read only
|
|
`BATTERY_VOLTAGE` | `0x1001` | Supported | `get_voltage`, read only
|
|
`UNIFIED_BATTERY` | `0x1004` | Supported | `get_battery`, read only
|
|
`CHARGING_CONTROL` | `0x1010` | Unsupported |
|
|
`LED_CONTROL` | `0x1300` | Unsupported |
|
|
`GENERIC_TEST` | `0x1800` | Unsupported |
|
|
`DEVICE_RESET` | `0x1802` | Unsupported |
|
|
`OOBSTATE` | `0x1805` | Unsupported |
|
|
`CONFIG_DEVICE_PROPS` | `0x1806` | Unsupported |
|
|
`CHANGE_HOST` | `0x1814` | Supported | `ChangeHost`
|
|
`HOSTS_INFO` | `0x1815` | Partial Support | `get_host_names`, partial listing only
|
|
`BACKLIGHT` | `0x1981` | Supported | `Backlight`
|
|
`BACKLIGHT2` | `0x1982` | Supported | `Backlight2`, ...
|
|
`BACKLIGHT3` | `0x1983` | Unsupported |
|
|
`PRESENTER_CONTROL` | `0x1A00` | Unsupported |
|
|
`SENSOR_3D` | `0x1A01` | Unsupported |
|
|
`REPROG_CONTROLS` | `0x1B00` | Unsupported |
|
|
`REPROG_CONTROLS_V2` | `0x1B01` | Listing Only | `get_keys`
|
|
`REPROG_CONTROLS_V2_2` | `0x1B02` | Unsupported |
|
|
`REPROG_CONTROLS_V3` | `0x1B03` | Unsupported |
|
|
`REPROG_CONTROLS_V4` | `0x1B04` | Partial Support | `ReprogrammableKeys`, `DivertKeys`, `MouseGesture`, `get_keys`
|
|
`REPORT_HID_USAGE` | `0x1BC0` | Unsupported |
|
|
`PERSISTENT_REMAPPABLE_ACTION` | `0x1C00` | Supported | `PersistentRemappableAction`
|
|
`WIRELESS_DEVICE_STATUS` | `0x1D4B` | Read only | status reporting from device
|
|
`REMAINING_PAIRING` | `0x1DF0` | Unsupported |
|
|
`FIRMWARE_PROPERTIES` | `0x1F1F` | Unsupported |
|
|
`ADC_MEASUREMENT` | `0x1F20` | Supported | `ADCPower`
|
|
`LEFT_RIGHT_SWAP` | `0x2001` | Unsupported |
|
|
`SWAP_BUTTON_CANCEL` | `0x2005` | Unsupported |
|
|
`POINTER_AXIS_ORIENTATION` | `0x2006` | Unsupported |
|
|
`VERTICAL_SCROLLING` | `0x2100` | Supported | `get_vertical_scrolling_info`, read only
|
|
`SMART_SHIFT` | `0x2110` | Supported | `SmartShift`
|
|
`SMART_SHIFT_ENHANCED` | `0x2111` | Supported | `SmartShiftEnhanced`
|
|
`HI_RES_SCROLLING` | `0x2120` | Supported | `HiResScroll`, `get_hi_res_scrolling_info`
|
|
`HIRES_WHEEL` | `0x2121` | Supported | `HiresSmoothInvert`, `HiresSmoothResolution`, `get_hires_wheel`
|
|
`LOWRES_WHEEL` | `0x2130` | Supported | `LowresSmoothScroll`, `get_lowres_wheel_status`
|
|
`THUMB_WHEEL` | `0x2150` | Supported | `ThumbMode`, `ThumbInvert`
|
|
`MOUSE_POINTER` | `0x2200` | Supported | `get_mouse_pointer_info`, read only
|
|
`ADJUSTABLE_DPI` | `0x2201` | Supported | `AdjustableDpi`, `DpiSliding`
|
|
`POINTER_SPEED` | `0x2205` | Supported | `PointerSpeed`, `SpeedChange`, `get_pointer_speed_info`
|
|
`ANGLE_SNAPPING` | `0x2230` | Unsupported |
|
|
`SURFACE_TUNING` | `0x2240` | Unsupported |
|
|
`HYBRID_TRACKING` | `0x2400` | Unsupported |
|
|
`FN_INVERSION` | `0x40A0` | Supported | `FnSwap`
|
|
`NEW_FN_INVERSION` | `0x40A2` | Supported | `NewFnSwap`, `get_new_fn_inversion
|
|
`K375S_FN_INVERSION` | `0x40A3` | Supported | `K375sFnSwap`
|
|
`ENCRYPTION` | `0x4100` | Unsupported |
|
|
`LOCK_KEY_STATE` | `0x4220` | Unsupported |
|
|
`SOLAR_DASHBOARD` | `0x4301` | Unsupported |
|
|
`KEYBOARD_LAYOUT` | `0x4520` | Unsupported | read only
|
|
`KEYBOARD_DISABLE_KEYS` | `0x4521` | Supported | `DisableKeyboardKeys`
|
|
`KEYBOARD_DISABLE_BY_USAGE` | `0x4522` | Unsupported |
|
|
`DUALPLATFORM` | `0x4530` | Supported | `Dualplatform`, untested
|
|
`MULTIPLATFORM` | `0x4531` | Supported | `Multiplatform`
|
|
`KEYBOARD_LAYOUT_2` | `0x4540` | Unsupported | read only
|
|
`CROWN` | `0x4600` | Supported | `DivertCrown`, `CrownSmooth`
|
|
`TOUCHPAD_FW_ITEMS` | `0x6010` | Unsupported |
|
|
`TOUCHPAD_SW_ITEMS` | `0x6011` | Unsupported |
|
|
`TOUCHPAD_WIN8_FW_ITEMS` | `0x6012` | Unsupported |
|
|
`TAP_ENABLE` | `0x6020` | Unsupported |
|
|
`TAP_ENABLE_EXTENDED` | `0x6021` | Unsupported |
|
|
`CURSOR_BALLISTIC` | `0x6030` | Unsupported |
|
|
`TOUCHPAD_RESOLUTION` | `0x6040` | Unsupported |
|
|
`TOUCHPAD_RAW_XY` | `0x6100` | Unsupported |
|
|
`TOUCHMOUSE_RAW_POINTS` | `0x6110` | Unsupported |
|
|
`TOUCHMOUSE_6120` | `0x6120` | Unsupported |
|
|
`GESTURE` | `0x6500` | Unsupported |
|
|
`GESTURE_2` | `0x6501` | Partial Support | `Gesture2Gestures`, `Gesture2Params`
|
|
`GKEY` | `0x8010` | Partial Support | `DivertGkeys`
|
|
`MKEYS` | `0x8020` | Supported | `MkeyLEDs`
|
|
`MR` | `0x8030` | Supported | `MRKeyLED`
|
|
`BRIGHTNESS_CONTROL` | `0x8040` | Supported | `BrightnessControl`
|
|
`REPORT_RATE` | `0x8060` | Supported | `ReportRate`
|
|
`COLOR_LED_EFFECTS` | `0x8070` | Supported | `LEDControl`, `LEDZoneSetting`
|
|
`RGB_EFFECTS` | `0X8071` | Supported | `RGBControl`, `RGBEffectSetting`
|
|
`PER_KEY_LIGHTING` | `0x8080` | Unsupported |
|
|
`PER_KEY_LIGHTING_V2` | `0x8081` | Supported | `PerKeyLighting`
|
|
`MODE_STATUS` | `0x8090` | Unsupported |
|
|
`ONBOARD_PROFILES` | `0x8100` | Supported |
|
|
`MOUSE_BUTTON_SPY` | `0x8110` | Unsupported |
|
|
`LATENCY_MONITORING` | `0x8111` | Unsupported |
|
|
`GAMING_ATTACHMENTS` | `0x8120` | Unsupported |
|
|
`FORCE_FEEDBACK` | `0x8123` | Unsupported |
|
|
`SIDETONE` | `0x8300` | Supported | `Sidetone`
|
|
`EQUALIZER` | `0x8310` | Supported | `Equalizer`
|
|
`HEADSET_OUT` | `0x8320` | Unsupported |
|
|
|
|
A “read only” note means the feature is a read-only feature.
|
|
|
|
## Implementing a feature
|
|
|
|
Features are implemented as settable features in
|
|
`lib/logitech_receiver/settings_templates.py`.
|
|
Some features also have direct implementation in
|
|
`lib/logitech_receiver/hidpp20.py`.
|
|
|
|
In most cases it should suffice to only implement the settable feature
|
|
interface for each setting in the feature. That will add one or more
|
|
widgets in the Solaar main window to show and change the setting,
|
|
will permit storing and restoring changed settings, and
|
|
will output the feature settings in `solaar show`.
|
|
|
|
A setting implementation is a subclass of one of the built-in setting classes
|
|
illustrated by the pointer speed setting implementation.
|
|
|
|
```python
|
|
class PointerSpeed(_Setting):
|
|
name = 'pointer_speed'
|
|
label = _('Sensitivity (Pointer Speed)')
|
|
description = _('Speed multiplier for mouse (256 is normal multiplier).')
|
|
feature = _F.POINTER_SPEED
|
|
validator_class = _RangeV
|
|
min_value = 0x002e
|
|
max_value = 0x01ff
|
|
validator_options = {'byte_count': 2}
|
|
```
|
|
|
|
A setting implementation needs a name, a label, and a description.
|
|
The name is used in the persistent settings structure to store and restore changed settings and
|
|
should be a valid Python identifier. (Some older settings have dashes.)
|
|
The label is displayed in the Solaar main window and the description is used as a tooltip there.
|
|
The label and description should be specified as translatable strings.
|
|
A setting implementation for a feature (for modern devices that use the HID++ 2.0 protocol)
|
|
needs a feature identifier.
|
|
A setting implementation needs a reader/writer and a validator.
|
|
|
|
The reader/writer is responsible for actually writing settings to the device
|
|
and reading them from the device, writing and reading the byte strings that
|
|
represent the setting values on the device.
|
|
For most feature settings the setting implementation can just inherit
|
|
the standard feature reader/writer, `FeatureRW`.
|
|
|
|
Options for `FeatureRW` are supplied by the `rw_options` class variable,
|
|
which is used to provide command numbers for reading and writing as well
|
|
as other information needed to identify the parts of the command and response
|
|
that hold the setting value and modify the reading and writing procedure.
|
|
`PointerSpeed` uses the defaults; here is an example of specifying non-default commands
|
|
for reading and writing:
|
|
|
|
```
|
|
rw_options = {'read_fnid': 0x10, 'write_fnid': 0x20}
|
|
```
|
|
|
|
Some old devices use registers instead and the setting needs to use the register reader/writer.
|
|
Only implement a register interface for the setting if you are very brave and
|
|
you have access to a device that has a register interface for the setting.
|
|
Register interfaces cannot be auto-discovered and need to be stated in descriptors.py
|
|
for each device with the register interface.
|
|
|
|
The validator instance is responsible for turning raw values read from the device into Python data
|
|
and Python data into raw values to be written to the device and validating that the Python data is
|
|
acceptable for the setting.
|
|
There are several possible kinds of Python data for setting interfaces,
|
|
ranging from simple toggles, to ranges, to fixed lists, to
|
|
dynamic choices, to maps of dynamic choices.
|
|
Pointer speed is a setting whose values are integers in a range so _RangeV validator is used.
|
|
Arguments to validators are specified as class variables.
|
|
The _RangeV validator requires the minimum and maximum for the value as separate class variables
|
|
and the byte size of the value on the device as part of `validator_options`.
|
|
Splitting the minimum and maximum makes it easier for code that works with
|
|
settings to determine this information.
|
|
Settings that are toggles or choices work similarly,
|
|
but their validators have different arguments.
|
|
Map settings have more complicated validators and more arguments.
|
|
|
|
Settings where the acceptable values are determined from the device
|
|
subclass the validator and provide a build class method that queries the device
|
|
and creates an instance of the validator.
|
|
This method can also return `None`, indicating that even though the
|
|
device implements the feature it does not usefully support the setting.
|
|
|
|
Settings need to be added to the `SETTINGS` list so that setting discovery can be done.
|
|
|
|
For more information on implementing feature settings
|
|
see the comments in `lib/logitech_receiver/settings_templates.py`.
|