0x0001 · featureSet
读取功能数量和每个从 1 开始的功能条目,以枚举设备功能表。
featureSet 列出一次设备连接期间可用的 HID++ 功能。功能表不含始终使用索引 0 的 root。客户端先读取数量,再读取条目 1 到该数量。
**规格:**Logitech HID++ 2.0 —— x0001 featureSet。**交叉核对:**Logi Options+ 2.8(静态分析)。用于:受支持的设备。
函数参考
FeatureSetFeature 实现功能版本 0。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
count | 0 | () | u8 |
get_feature | 1 | (index: u8) | FeatureInformation |
两个方法都是异步方法,并返回 Result<…, Hidpp20Error>。
类型
FeatureInformation
get_feature 返回功能表中的一个条目。
| 字段 | 类型 | 说明 |
|---|---|---|
id | u16 | HID++ 功能 ID。 |
typ | FeatureType | 功能分类标志。 |
version | u8 | 最新兼容功能版本。旧功能表版本中为 0。 |
FeatureType
FeatureType 使用与 0x0000 root 相同的类型 byte 位字段。OpenLogi 保留未知位,并将位 7–3 公开为 obsolete、hidden、engineering、manufacturing_deactivatable 和 compliance_deactivatable。
事件
此功能没有定义事件。
线格式
两个请求都使用 3-byte short payload。OpenLogi 通过 extend_payload() 读取响应,并获得 16-byte payload。
count(fn 0)
请求:[0x00, 0x00, 0x00]
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | count | 功能表条目数。不包括索引 0 的 Root。 |
| 1–15 | 尾部 payload | OpenLogi 忽略这些字节。 |
get_feature(fn 1)
请求:[index, 0x00, 0x00]
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | index | 从 1 开始的功能表索引。索引 0 是 Root,协议不允许在此使用。OpenLogi 原样传递该值。 |
| 1–2 | 保留 | OpenLogi 写入 0x00。 |
| 字节 | 字段 | 说明 |
|---|---|---|
| 0–1 | id | 功能 ID,BE。 |
| 2 | typ | 功能类型 byte。OpenLogi 解码位 7–3,并保留其他位。 |
| 3 | version | 最新兼容功能版本。 |
| 4–15 | 尾部 payload | OpenLogi 忽略这些字节。 |
OpenLogi 的用法
Device::enumerate_features() 先通过 Root 发现 0x0001。它调用一次 count(),再遍历 1..=count。它按每个返回的功能 ID 和版本注册已知封装。
功能表在连接期间不可变。因此,count() 和 get_feature() 可以接收已放弃相同请求留下的响应。设备层最多重试丢失的条目 4 次。每次尝试的期限为 700 ms,退避时间为 120 ms。
OpenLogi 在库存探测期间使用此表推导能力和事件功能索引。该遍历不修改设备状态,也不需要恢复操作。
Rust 用法
use hidpp::{device::Device, protocol::v20::Hidpp20Error};
async fn list_features(device: &mut Device) -> Result<(), Hidpp20Error> {
let Some(features) = device.enumerate_features().await? else {
return Ok(());
};
for feature in features {
println!("0x{:04x} at index {} (v{})", feature.id, feature.index, feature.version);
}
Ok(())
}