OpenLogi

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_feature0(id: u16)Option<FeatureInformation>
ping1(data: u8)u8

所有方法都是异步方法,并返回 Result<…, Hidpp20Error>。响应 byte 0 为零时,get_feature 返回 None。ping 只返回回显字节。

类型

FeatureInformation

get_feature 为受支持功能返回此信息。

字段类型说明
indexu8后续调用使用的会话功能索引。
typFeatureType类型 byte 中的功能分类标志。
versionu8最新兼容功能版本。Root v0 设备中为 0。

FeatureType

FeatureType 是位字段。OpenLogi 保留未知位,但只为下列位提供字段。

字段位说明
obsolete7为兼容旧软件而继续公布的旧功能。
hidden6终端用户配置软件应该忽略此功能。
engineering5工程或生产制造功能。
manufacturing_deactivatable4生产制造可以永久停用此功能。功能类型 v2 提供此位。
compliance_deactivatable3合规处理可以永久停用此功能。功能类型 v2 提供此位。

事件

此功能没有定义事件。

线格式

两个请求都使用 3-byte short payload。OpenLogi 通过 extend_payload() 读取响应,并获得 16-byte payload。

get_feature(fn 0)

请求:[id_hi, id_lo, 0x00]

字节字段说明
0–1id请求的功能 ID,BE。
2保留OpenLogi 写入 0x00。
字节字段说明
0index会话功能索引。值为 0 表示不支持,OpenLogi 返回 None。
1typFeatureType 的位 7–3。OpenLogi 保留其他位,但没有具名字段。
2version最新兼容版本。
3–15尾部 payloadOpenLogi 忽略这些字节。

ping(fn 1)

请求:[0x00, 0x00, data]

字节字段说明
0–1保留OpenLogi 写入 0x00。
2data调用方选择的 ping 字节。
字节字段说明
0protocol_numHID++ 协议号。RootFeature::ping 不公开此值。
1target_sw目标软件标识符。RootFeature::ping 不公开此值。
2回显的 dataRootFeature::ping 返回此字节。
3–15尾部 payloadOpenLogi 忽略这些字节。

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(())
}

本页目录