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_measurement | 0 | () | AdcMeasurement |
is_status_broadcast | 事件辅助方法 | (function_id: u8) | bool |
get_adc_measurement 是异步方法,返回 Result<AdcMeasurement, Hidpp20Error>。
此封装器不公开 G HUB 静态分析所见的扩展设置或睡眠超时操作。
类型
AdcMeasurement
| 变体 | 字段 | 说明 |
|---|---|---|
Unlinked | / | 电池供电的耳机未链接。没有可用读数。 |
Linked | voltage_mv: u16、status: AdcChargingStatus | 实时电池读数。 |
AdcChargingStatus
| 变体 | 值 | 说明 |
|---|---|---|
Discharging | 0x01 | 耳机使用电池供电。 |
Charging | 0x03 | 存在外部电源,且耳机正在充电。 |
Full | 0x07 | 存在外部电源,且充电已经完成。 |
事件
此封装器未实现 EmittingFeature,也不公开类型化事件。
仅当 function 为 0 时,is_status_broadcast(function_id) 返回 true。
线格式
get_adc_measurement(fn 0)
请求:[0x00, 0x00, 0x00](没有参数)。
响应:
| 字节 | 字段 | 说明 |
|---|---|---|
| 0~1 | voltage_mv | u16,BE,单位为毫伏。 |
| 2 | flags | 链路和充电状态。 |
标志:
| 位 | 含义 | 说明 |
|---|---|---|
| 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"),
}
}