OpenLogi

0x1F20 · adcMeasurement

无线 G 系列耳机通过此功能报告电池电压和链路状态,其中包括 G733。

adcMeasurement 会报告耳机电池电压和链路或充电标志。 G733 等无线 G 系列耳机不提供 0x1000、0x1001 或 0x1004,但提供此功能。 此功能不报告百分比。

**规格:**没有公开的 Logitech 规格。布局来自 Logi Options+ 2.8(静态分析)的逆向。**交叉核对:**Linux HID++ 驱动程序、Solaar、G HUB(静态分析)。**用于:**设备清单和 openlogi list。

函数参考

AdcMeasurementFeature(0x1F20)实现一个请求方法。

方法

函数HID++ fn签名返回值
get_adc_measurement0()AdcMeasurement
is_status_broadcast事件辅助方法(function_id: u8)bool

get_adc_measurement 是异步方法,返回 Result<AdcMeasurement, Hidpp20Error>。 此封装器不公开 G HUB 静态分析所见的扩展设置或睡眠超时操作。

类型

AdcMeasurement

变体字段说明
Unlinked/电池供电的耳机未链接。没有可用读数。
Linkedvoltage_mv: u16、status: AdcChargingStatus实时电池读数。

AdcChargingStatus

变体值说明
Discharging0x01耳机使用电池供电。
Charging0x03存在外部电源,且耳机正在充电。
Full0x07存在外部电源,且充电已经完成。

事件

此封装器未实现 EmittingFeature,也不公开类型化事件。 仅当 function 为 0 时,is_status_broadcast(function_id) 返回 true。

线格式

get_adc_measurement(fn 0)

请求:[0x00, 0x00, 0x00](没有参数)。

响应:

字节字段说明
0~1voltage_mvu16,BE,单位为毫伏。
2flags链路和充电状态。

标志:

位含义说明
0已链接clear 时为 Unlinked,不论其他标志为何值。
1充电中在已知充电值 0x03 中设置。
2充电完成在已知满电值 0x07 中设置。
3~7/未建模任何含义。

已知的已链接标志值是 0x01、0x03 和 0x07。 其他已链接值会返回 Hidpp20Error::UnsupportedResponse。

LogitechInternal feature 错误(0x05)会返回 AdcMeasurement::Unlinked。 G733 dongle 在耳机关闭时会报告此错误。 其他 feature 错误仍会作为错误返回。

状态广播(事件 fn 0)

未请求的 function 0 报告携带与 get_adc_measurement 相同的 3 个字节。 该报告表示电压或耳机链路状态已经变化。

OpenLogi 的用法

只有 0x1004、0x1000 和 0x1001 都缺席时,清单才会选择 ADC measurement。 实时样本会通过 OpenLogi 的 13 个点单节 Li-Po 电压曲线。 结果会成为估算百分比和本地电量等级。

PR #1601 在 v0.8.13 发布了 G733 电池和电源状态支持。 捕获的 G733 样本为 3,905 mV,标志为 0x01,映射为估算的 67%。 LogitechInternal 错误或 clear 链路 bit 会将耳机标记为未链接。

持久清单监听器接受未请求的 software-ID 0、function 0 报告。 即使标志未知,它也会排队一个合并后的重协调。 后续读取会决定耳机是已链接还是不可用。

OpenLogi 只读取此功能。

未确认的细节

对于已链接标志 0x0F,Linux 将结果视为未知或离线。 Logi Options+ 会保留各个标志位。 OpenLogi 返回 UnsupportedResponse,清单会将该读取视为不可用。

OpenLogi 对此功能使用与 0x1001 和 Solaar 相同的 13 个点曲线。 Linux 耳机曲线使用不同的值,约为 3.4~4.03 V。 没有与 Logi Options+ 百分比显示的硬件对比,因此无法确认正确的耳机校准。

G HUB 静态分析发现了扩展设置和睡眠超时操作。 它没有确定这些操作的 function 索引或数据包布局。 OpenLogi 不公开这些操作。

Rust 用法

use hidpp::{
    device::Device,
    feature::{
        adc_measurement::{AdcMeasurement, AdcMeasurementFeature},
    },
};

// `channel` 和 `device_index` 用于标识已打开的 HID++ 设备。
let mut device = Device::new(channel, device_index).await?;
device.enumerate_features().await?;

if let Some(feature) = device.get_feature::<AdcMeasurementFeature>() {
    match feature.get_adc_measurement().await? {
        AdcMeasurement::Linked { voltage_mv, status } => {
            println!("{} mV: {status:?}", voltage_mv);
        }
        AdcMeasurement::Unlinked => println!("headset is unlinked"),
    }
}

另见:0x1001 batteryVoltage 和 0x1004 unifiedBattery。

本页目录