0x6501 · gestures2
发现旧版横向拇指轮手势 46,并读取或修改其转向位。
0x6501 是旧版 Gestures2 描述符功能。包括 MX Master 2S 在内的旧款 MX 鼠标会在这里将横向拇指轮公开为手势 ID 46。较新设备可改为公开专用的 0x2150 thumbwheel 功能。
规格: Logitech HID++ 2.0 —— x6501 gestures2(部分)。用于: 滚动中的旧版拇指轮能力发现。
函数参考
Gestures2Feature 实现 feature 版本 0。它只实现了手势 ID 46 的描述符发现和转向。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
thumbwheel | 0,分页 | () | Option<ThumbwheelGesture> |
has_thumbwheel | 0,分页 | () | bool |
thumbwheel_diverted | 0、3 | () | Option<bool> |
set_thumbwheel_diverted | 0、4 | (diverted: bool) | bool |
所有方法都是 async,并返回 Result<…, Hidpp20Error>。当手势 46 不存在或不可转向时,后两个方法返回 None 或 false。
类型
ThumbwheelGesture
| 字段 | 类型 | 说明 |
|---|---|---|
diversion_index | Option<u16> | 可转向描述符中的顺序索引。None 表示手势 46 存在,但不可转向。 |
常量
| 字段 | 值 | 说明 |
|---|---|---|
THUMBWHEEL_GESTURE_ID | 46 | 横向拇指轮的旧版 Gestures2 ID。 |
事件
Gestures2Feature 不实现 EmittingFeature。它不公开事件。
线格式
OpenLogi 扫描描述符页,直到找到手势 46、遇到结束标记或达到 1,024 个描述符字段。表超过此上限时,它返回 Hidpp20Error::UnsupportedResponse。
描述符页(fn 0)
请求是 [index_hi, index_lo, 0x00]。index 是该页第一个描述符的 u16、BE 索引。响应在偏移 0–1 至 14–15 包含八个两字节描述符字段。
| 描述符字节 | 含义 | OpenLogi 的处理 |
|---|---|---|
high = 0x01 | 结束标记 | 停止扫描。低字节会被忽略。 |
high bit[7] | 手势描述符 | 只有设置此位时,包装器才检查该字段。 |
high bit[1] | 可转向 | 当手势 ID 是 46 时,包装器写入当前转向索引。 |
high bit[0] | 已启用描述符标志 | 包装器不公开或测试此位。 |
high bits[6:2] | 其他描述符标志 | 包装器忽略这些位。 |
| low | 手势 ID | 包装器将其与 46 比较。 |
扫描每个响应前进八个描述符。只有先前描述符的 bit[1] 已设置时,它才递增转向索引。它会忽略非手势描述符及其低字节。
转向状态(fn 3)
对于转向索引 i,offset = i >> 3 且 mask = 1 << (i & 7)。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | offset | 功能转向位图中的字节。 |
| 1 | — | OpenLogi 写入 0x01。 |
| 2 | mask | 此字节中的位掩码。 |
| 响应字节 0 | 状态 | response[0] & mask != 0 表示已转向。 |
| 响应字节 1–15 | — | OpenLogi 忽略这些字节。 |
设置转向(fn 4)
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | offset | i >> 3。 |
| 1 | — | OpenLogi 写入 0x01。 |
| 2 | mask | 1 << (i & 7)。 |
| 3 | value | mask 转向;0 还原。 |
| 4–15 | — | OpenLogi 在长负载中写入 0x00。 |
OpenLogi 忽略写入响应。当手势不存在或不可转向时,它不会发送 fn 4 请求。
OpenLogi 的用法
只有设备没有专用 0x2150 拇指轮时,设备清单才探测 Gestures2Feature::has_thumbwheel。返回 true 会启用旧版拇指轮能力。探测错误会成为 false,因此清单不会从未响应的描述符扫描中公开该能力。
v0.8.15 的设备层不会调用 thumbwheel_diverted 或 set_thumbwheel_diverted。因此,它不执行 Gestures2 转向写入、读回或会话恢复。
未确认的细节
包装器依赖结束标记、bit[7]、bit[1] 和手势 ID 46。它不公开已启用标志或其他描述符标志。尚无硬件抓包验证其完整语义或 fn 4 响应。
Rust 用法
use hidpp::{device::Device, feature::gestures2::Gestures2Feature};
// device: &mut Device, already created via Device::new(channel, index)
device.enumerate_features().await?;
if let Some(feature) = device.get_feature::<Gestures2Feature>() {
if let Some(gesture) = feature.thumbwheel().await? {
println!("diversion index: {:?}", gesture.diversion_index);
let changed = feature.set_thumbwheel_diverted(true).await?;
println!("diverted: {changed}");
}
}