OpenLogi

0x0005 · deviceTypeAndName

读取设备市场类型和市场名称,包括 short 或 long 分块名称。

deviceTypeAndName 报告市场类型和市场名称。名称按块读取。调用方先读取报告的数量,再请求连续索引,直到取得完整字符串。

**规格:**Logitech HID++ 2.0 —— x0005 deviceTypeAndName(v2)。**交叉核对:**Logi Options+ 2.8(静态分析)。用于:受支持的设备。

函数参考

DeviceTypeAndNameFeature 实现功能版本 0。

方法

函数HID++ fn签名返回值
get_device_name_count0()u8
get_device_name1(index: u8)Vec<u8>
get_whole_device_name便捷方法()String
get_device_type2()DeviceType

所有方法都是异步方法,并返回 Result<…, Hidpp20Error>。get_whole_device_name 调用一次 fn 0,再调用 fn 1,直到组装的字符串达到报告数量。

类型

DeviceType

变体值说明
Keyboard0键盘。
RemoteControl1遥控器。
Numpad2数字键盘。
Mouse3鼠标。
Trackpad4触摸板。
Trackball5轨迹球。
Presenter6演示器。
Receiver7接收器。
Headset8耳机。
Webcam9摄像头。
SteeringWheel10方向盘。
Joystick11摇杆。
Gamepad12游戏手柄。
Dock13扩展坞。
Speaker14扬声器。
Microphone15麦克风。
IlluminationLight16照明灯。
ProgrammableController17可编程控制器。
CarSimPedals18赛车模拟踏板。
Adapter19适配器。

未知类型 byte 会返回 Hidpp20Error::UnsupportedResponse。

事件

此功能没有定义事件。

线格式

所有请求都使用 3-byte short payload。

get_device_name_count(fn 0)

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

字节字段说明
0count报告的市场名称数量。
1–15尾部 payload在 extend_payload() 后,OpenLogi 忽略这些字节。

get_device_name(fn 1)

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

字节字段说明
0index名称分块开始处的偏移。
1–2保留OpenLogi 写入 0x00。

响应是原始 report payload。OpenLogi 从 short 响应返回全部 3 个 payload 字节,或从 long 响应返回全部 16 个 payload 字节。它不会为该函数的 Vec<u8> 补零。

get_whole_device_name 将每个分块解码为 UTF-8 并追加,再使用组装字符串的长度作为下一个索引。它在最后一个分块后删除尾部 NUL 字符。

get_device_type(fn 2)

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

字节字段说明
0device_typeDeviceType 判别值。
1–15尾部 payload在 extend_payload() 后,OpenLogi 忽略这些字节。

OpenLogi 的用法

库存探测在枚举功能表后调用此功能。它分别读取市场类型和名称。读取失败时,只有相应属性不可用。

OpenLogi 将 DeviceType 映射到设备种类。类型是权威的种类信号。市场名称能补充操作系统返回的通用 HID collection 名称,例如 Windows Bluetooth 中的 Mouse。

新探测缺少类型或市场名称时,缓存回填会保留先前值。此功能没有 setter,所以不使用 read-modify-write,也不恢复设备状态。

Rust 用法

use hidpp::{
    device::Device,
    feature::device_type_and_name::DeviceTypeAndNameFeature,
    protocol::v20::Hidpp20Error,
};

async fn read_marketing_identity(device: &mut Device) -> Result<(), Hidpp20Error> {
    device.enumerate_features().await?;
    let Some(feature) = device.get_feature::<DeviceTypeAndNameFeature>() else {
        return Ok(());
    };

    println!("type: {:?}", feature.get_device_type().await?);
    println!("name: {}", feature.get_whole_device_name().await?);
    Ok(())
}

本页目录