0x8090 · modeStatus
读取并选择性更新设备的性能模式状态,以及硬件或软件切换能力。
modeStatus feature 读取两个模式状态字节,并选择性更新其中的位。在 v1 中,status0 的位 0 选择性能模式。该位清零时选择续航模式。OpenLogi v0.8.15 提供了类型化协议封装,但设备层没有使用它。
**规格:**Logitech HID++ 2.0 —— modeStatus(v1)。**交叉核对:**G HUB(静态分析)。**用于:**OpenLogi 未使用。
函数参考
当 feature 枚举发现版本至少为 1 的 0x8090 时,ModeStatusFeature 可用。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_mode_status | 0 | () | ModeStatus |
set_mode_status | 1 | (change: ModeStatusChange) | () |
set_performance_mode | 1 | (enabled: bool) | () |
get_device_config | 2 | () | ModeStatusCapabilities |
所有方法都是 async,并返回 Result<…, Hidpp20Error>。
类型
ModeStatus
| 字段 | 类型 | 说明 |
|---|---|---|
status0 | ModeStatus0 | 主状态位。OpenLogi 保留未知位。 |
status1 | u8 | 次状态字节。v1 将该字节保留。OpenLogi 在读取时保留该字节。 |
ModeStatusChange
| 字段 | 类型 | 说明 |
|---|---|---|
status0 | ModeStatus0 | 请求的主状态位。 |
status1 | u8 | 请求的次状态字节。 |
changed_mask0 | ModeStatus0 | 要更新的主状态位。 |
changed_mask1 | u8 | 要更新的次状态位。 |
ModeStatus0
| 变体 | 值 | 说明 |
|---|---|---|
PERFORMANCE | 位 0 | 性能模式。该位清零时选择续航模式。 |
ModeStatusCapabilities
| 变体 | 值 | 说明 |
|---|---|---|
HARDWARE_SWITCH | 位 0 | 硬件开关可以更改模式位。 |
SOFTWARE_SWITCH | 位 1 | 软件可以更改模式位。 |
事件
OpenLogi v0.8.15 中的 ModeStatusFeature 没有事件监听器或事件解码器。
线格式
短请求包含 3 个零字节。OpenLogi 在解码前将短响应扩展到 16 字节的载荷缓冲区。
get_mode_status(fn 0)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | status0 | ModeStatus0。位 0 是 PERFORMANCE。OpenLogi 保留未知位。 |
| 1 | status1 | 次状态字节。 |
| 2–15 | — | OpenLogi 不读取这些字节。 |
set_mode_status(fn 1)
OpenLogi 发送 16 字节的长请求,并且只检查结果状态。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | status0 | 请求的主状态位。 |
| 1 | status1 | 请求的次状态字节。 |
| 2 | changed_mask0 | 要更新的主状态位。 |
| 3 | changed_mask1 | 要更新的次状态位。 |
| 4–15 | — | OpenLogi 写入零。 |
set_performance_mode(fn 1)
该便捷方法使用 fn 1 的布局。它写入 PERFORMANCE 或空的 status0。它将 changed_mask0 设为 PERFORMANCE。它将两个次状态字段都写为零。
get_device_config(fn 2)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–1 | capabilities | u16 BE。位 0 和位 1 分别映射到 HARDWARE_SWITCH 和 SOFTWARE_SWITCH。OpenLogi 保留未知位。 |
| 2–15 | — | OpenLogi 不读取这些字节。 |
状态事件(event 0)
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–3 | 状态载荷 | G HUB 原样把 4 个字节传给上层。字段映射尚未恢复。G HUB |
OpenLogi v0.8.15 不订阅或解码此事件。
OpenLogi 的用法
当设备报告版本至少为 1 的 0x8090 时,OpenLogi 会在 feature 枚举时创建 ModeStatusFeature。v0.8.15 中没有设备层写入器、会话、库存路径、CLI 命令或用户页面调用该封装。因此,OpenLogi 不执行读改写、读回检查、状态恢复或额外能力门控。
未确认的细节
G HUB 的静态分析识别了 4 字节状态事件,但没有恢复字节含义。设备行为和事件载荷需要硬件验证,然后 OpenLogi 才能添加事件解码器或设备层策略。
Rust 用法
use hidpp::{
device::Device,
feature::mode_status::{
ModeStatus0, ModeStatusCapabilities, ModeStatusFeature,
},
protocol::v20::Hidpp20Error,
};
async fn enable_performance_mode(device: &mut Device) -> Result<(), Hidpp20Error> {
device.enumerate_features().await?;
let Some(feature) = device.get_feature::<ModeStatusFeature>() else {
return Ok(());
};
let status = feature.get_mode_status().await?;
println!("performance mode: {}", status.status0.contains(ModeStatus0::PERFORMANCE));
let capabilities = feature.get_device_config().await?;
if capabilities.contains(ModeStatusCapabilities::SOFTWARE_SWITCH) {
feature.set_performance_mode(true).await?;
}
Ok(())
}