0x0000 · root
将功能 ID 映射到会话索引,并用 ping 确定 HID++ 协议版本。
每个 HID++ 2.0 设备都在功能索引 0 提供 root。它将 16 位功能 ID 映射到会话功能索引。它的 ping 函数也会返回设备协议版本。
**规格:**Logitech HID++ 2.0 —— x0000 root。**交叉核对:**Logi Options+ 2.8(静态分析)。用于:受支持的设备。
函数参考
RootFeature 固定在功能索引 0。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_feature | 0 | (id: u16) | Option<FeatureInformation> |
ping | 1 | (data: u8) | u8 |
所有方法都是异步方法,并返回 Result<…, Hidpp20Error>。响应 byte 0 为零时,get_feature 返回 None。ping 只返回回显字节。
类型
FeatureInformation
get_feature 为受支持功能返回此信息。
| 字段 | 类型 | 说明 |
|---|---|---|
index | u8 | 后续调用使用的会话功能索引。 |
typ | FeatureType | 类型 byte 中的功能分类标志。 |
version | u8 | 最新兼容功能版本。Root v0 设备中为 0。 |
FeatureType
FeatureType 是位字段。OpenLogi 保留未知位,但只为下列位提供字段。
| 字段 | 位 | 说明 |
|---|---|---|
obsolete | 7 | 为兼容旧软件而继续公布的旧功能。 |
hidden | 6 | 终端用户配置软件应该忽略此功能。 |
engineering | 5 | 工程或生产制造功能。 |
manufacturing_deactivatable | 4 | 生产制造可以永久停用此功能。功能类型 v2 提供此位。 |
compliance_deactivatable | 3 | 合规处理可以永久停用此功能。功能类型 v2 提供此位。 |
事件
此功能没有定义事件。
线格式
两个请求都使用 3-byte short payload。OpenLogi 通过 extend_payload() 读取响应,并获得 16-byte payload。
get_feature(fn 0)
请求:[id_hi, id_lo, 0x00]
| 字节 | 字段 | 说明 |
|---|---|---|
| 0–1 | id | 请求的功能 ID,BE。 |
| 2 | 保留 | OpenLogi 写入 0x00。 |
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | index | 会话功能索引。值为 0 表示不支持,OpenLogi 返回 None。 |
| 1 | typ | FeatureType 的位 7–3。OpenLogi 保留其他位,但没有具名字段。 |
| 2 | version | 最新兼容版本。 |
| 3–15 | 尾部 payload | OpenLogi 忽略这些字节。 |
ping(fn 1)
请求:[0x00, 0x00, data]
| 字节 | 字段 | 说明 |
|---|---|---|
| 0–1 | 保留 | OpenLogi 写入 0x00。 |
| 2 | data | 调用方选择的 ping 字节。 |
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | protocol_num | HID++ 协议号。RootFeature::ping 不公开此值。 |
| 1 | target_sw | 目标软件标识符。RootFeature::ping 不公开此值。 |
| 2 | 回显的 data | RootFeature::ping 返回此字节。 |
| 3–15 | 尾部 payload | OpenLogi 忽略这些字节。 |
OpenLogi 的用法
Device::new() 会通过 determine_version 发送 Root ping,然后才安装 RootFeature。它拒绝 HID++ 1.0 外设,并保存检测到的 HID++ 2.x 协议号和目标软件标识符。
Device::enumerate_features() 调用 get_feature(0x0001)。它使用返回的索引安装 FeatureSetFeature,并发现其余功能表。Root 没有需要恢复的设备状态。
Rust 用法
use hidpp::{
device::Device,
feature::root::RootFeature,
protocol::v20::Hidpp20Error,
};
async fn inspect_root(device: &Device) -> Result<(), Hidpp20Error> {
let root: std::sync::Arc<RootFeature> = device.root();
if let Some(info) = root.get_feature(0x1000).await? {
println!("0x1000 is at index {} and supports v{}", info.index, info.version);
}
assert_eq!(root.ping(0x42).await?, 0x42);
Ok(())
}