OpenLogi

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_status0()ModeStatus
set_mode_status1(change: ModeStatusChange)()
set_performance_mode1(enabled: bool)()
get_device_config2()ModeStatusCapabilities

所有方法都是 async,并返回 Result<…, Hidpp20Error>。

类型

ModeStatus

字段类型说明
status0ModeStatus0主状态位。OpenLogi 保留未知位。
status1u8次状态字节。v1 将该字节保留。OpenLogi 在读取时保留该字节。

ModeStatusChange

字段类型说明
status0ModeStatus0请求的主状态位。
status1u8请求的次状态字节。
changed_mask0ModeStatus0要更新的主状态位。
changed_mask1u8要更新的次状态位。

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]。

字节字段备注
0status0ModeStatus0。位 0 是 PERFORMANCE。OpenLogi 保留未知位。
1status1次状态字节。
2–15—OpenLogi 不读取这些字节。

set_mode_status(fn 1)

OpenLogi 发送 16 字节的长请求,并且只检查结果状态。

字节字段备注
0status0请求的主状态位。
1status1请求的次状态字节。
2changed_mask0要更新的主状态位。
3changed_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–1capabilitiesu16 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(())
}

本页目录