OpenLogi

0x8060 · adjustableReportRate

枚举 1 ms 至 8 ms 的报告间隔,并读取或写入当前的旧版报告间隔。

adjustableReportRate 控制设备向主机发送 HID 报告的频率。此功能以毫秒表示当前间隔。提供 0x8060 的设备在 1 字节位图中声明每个支持的间隔。

规格: Logitech HID++ 2.0 —— adjustableReportRate。交叉核对: Logi Options+ 2.8(静态分析)、Solaar。用于: 回报率。

函数参考

ReportRateFeature 封装器(0x8060,版本 0+)提供旧版间隔接口。

方法

函数HID++ fn签名返回值
get_report_rate_list0()ReportRateList
get_report_rate1()u8
set_report_rate2(report_rate_ms: u8)()

所有方法均为 async,并返回 Result<…, Hidpp20Error>。

类型

ReportRateList 是 u8 位标志集。位 n 表示 n + 1 ms 的间隔。

标志位或值说明
MS_11 << 01 ms 间隔。
MS_21 << 12 ms 间隔。
MS_31 << 23 ms 间隔。
MS_41 << 34 ms 间隔。
MS_51 << 45 ms 间隔。
MS_61 << 56 ms 间隔。
MS_71 << 67 ms 间隔。
MS_81 << 78 ms 间隔。

事件

ReportRateFeature 未提供事件类型。OpenLogi 没有 0x8060 回报率广播路径。

线格式

所有函数都发送 3 字节短请求。OpenLogi 将函数 0 和 1 读取为 16 字节扩展响应。设置函数只检查 HID++ 确认。

get_report_rate_list(fn 0)

请求:[0x00, 0x00, 0x00]。3 个字节都是填充。

字节或位字段备注
0,位 0~7ReportRateList位 0 表示 1 ms。位 7 表示 8 ms。
1~15保留OpenLogi 忽略这些字节。

get_report_rate(fn 1)

请求:[0x00, 0x00, 0x00]。3 个字节都是填充。

字节字段备注
0report_rate_ms当前间隔,单位为毫秒。OpenLogi 只接受 1..=8。其他值会返回 Hidpp20Error::UnsupportedResponse。
1~15保留OpenLogi 忽略这些字节。

set_report_rate(fn 2)

请求字节字段备注
0report_rate_ms请求间隔,单位为毫秒。OpenLogi 只接受 1..=8。其他值在 I/O 前返回 Hidpp20Error::Feature(ErrorType::InvalidArgument)。
1~2填充OpenLogi 写入 0x00。

响应:HID++ 确认。OpenLogi 忽略所有响应载荷字节。设备可能对范围内但不支持的间隔返回 InvalidArgument。

OpenLogi 的用法

从 v0.8.14 起,PR #1779 会在类型化封装器中拒绝无效的旧版响应和请求间隔。从 v0.8.14 起,PR #1808 将回报率连接到设备层、代理 IPC、桌面版的指针标签页和 openlogi api report-rate。

设备层优先使用 0x8061。只有 0x8061 不受支持时,设备层才回退到 0x8060。对于此功能,设备层把已声明的间隔转换为整数赫兹,并读取列表和当前速率。设备层在写入前拒绝不在列表中的值。

当前速率已是目标值时,设备层会跳过写入。否则,设备层会在确认后独立读取当前速率。不同的读回值会返回 WriteError::ReportRateNotApplied。确认后的读取失败会保留请求值,作为暂定结果。

OpenLogi 只在使用者要求持久化时保存 report_rate。重新连接时,代理只会为具有回报率能力的设备重新应用已保存的值。当前连接还必须声明该值。OpenLogi 退出时不会重置设备回报率。有关 GUI、配置和 CLI 的行为,请参阅回报率。

Rust 用法

use hidpp::{
    device::Device,
    feature::report_rate::{ReportRateFeature, ReportRateList},
    protocol::v20::Hidpp20Error,
};

async fn set_one_millisecond(device: &mut Device) -> Result<(), Hidpp20Error> {
    device.enumerate_features().await?;

    if let Some(feature) = device.get_feature::<ReportRateFeature>() {
        let supported = feature.get_report_rate_list().await?;
        if supported.contains(ReportRateList::MS_1) {
            feature.set_report_rate(1).await?;
        }
    }

    Ok(())
}

本页目录