OpenLogi

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签名返回值
thumbwheel0,分页()Option<ThumbwheelGesture>
has_thumbwheel0,分页()bool
thumbwheel_diverted0、3()Option<bool>
set_thumbwheel_diverted0、4(diverted: bool)bool

所有方法都是 async,并返回 Result<…, Hidpp20Error>。当手势 46 不存在或不可转向时,后两个方法返回 None 或 false。

类型

ThumbwheelGesture

字段类型说明
diversion_indexOption<u16>可转向描述符中的顺序索引。None 表示手势 46 存在,但不可转向。

常量

字段值说明
THUMBWHEEL_GESTURE_ID46横向拇指轮的旧版 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)。

字节字段备注
0offset功能转向位图中的字节。
1—OpenLogi 写入 0x01。
2mask此字节中的位掩码。
响应字节 0状态response[0] & mask != 0 表示已转向。
响应字节 1–15—OpenLogi 忽略这些字节。

设置转向(fn 4)

字节字段备注
0offseti >> 3。
1—OpenLogi 写入 0x01。
2mask1 << (i & 7)。
3valuemask 转向;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}");
    }
}

本页目录