0x40A2 · fnInversionWithDefaultState
单主机 Fn 键翻转——读取或写入全局状态及其报告的默认状态。
0x40a2 控制报告这个 feature 的键盘的全局 Fn 键翻转状态。Off 使 F 行按键默认发送 F1–F12。On 使这些按键默认执行印在键帽上的媒体或快捷功能。这个 feature 还会报告默认状态。
**规格:**Logitech HID++ 2.0——fnInversionWithDefaultState。**交叉核对:**Logi Options+ 2.8(静态分析)。用于:键盘。
函数参考
FnInversionWithDefaultStateFeature 从 feature version 0 开始实现 feature 0x40a2。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_global_fn_inversion | 0 | () | GlobalFnInversion |
set_global_fn_inversion | 1 | (state: FnInversionState) | GlobalFnInversion |
is_state_broadcast | 1,广播 | (function_id: u8) | bool |
get 和 set 方法都是 async,并返回 Result<…, Hidpp20Error>。is_state_broadcast 是同步识别辅助方法,不发送 I/O。
类型
GlobalFnInversion
| 字段 | 类型 | 说明 |
|---|---|---|
state | FnInversionState | 当前翻转状态。 |
default_state | FnInversionState | 报告的默认翻转状态。 |
FnInversionState
这个不可穷举的状态枚举定义了以下值:
| 变体 | 值 | 说明 |
|---|---|---|
Off | 0 | F 行按键默认发送 F1–F12。 |
On | 1 | F 行按键默认执行印在键帽上的媒体或快捷功能。 |
事件
crate 没有提供类型化事件。is_state_broadcast(1) 会把非请求的 function 1 报告识别为状态变更信号。
线格式
所有请求有效载荷都有 3 个字节。这个 feature 没有多字节字段。
get_global_fn_inversion(fn 0)
请求有效载荷:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | state | 0 = Off;1 = On。 |
| 1 | default_state | 0 = Off;1 = On。 |
| 2–15 | / | 没有定义字段。OpenLogi 忽略这些字节。 |
OpenLogi 接受 HID++ 短或长响应。它读取字节 0–1,并在内部把短响应零填充后再解码。其他状态值会返回 Hidpp20Error::UnsupportedResponse。
set_global_fn_inversion(fn 1)
| 字节 | 值 | 备注 |
|---|---|---|
| 0 | u8::from(state) | 0 = Off;1 = On。 |
| 1–2 | 0x00 | OpenLogi 写入固定的零填充。 |
响应具有与 function 0 相同的解码字段。OpenLogi 读取字节 0–1,并忽略其他所有字节。
状态变更广播(fn 1)
Logi Options+ 2.8 把非空的非请求 function 1 报告视为设置变更。现有证据没有确定它的有效载荷布局。OpenLogi 只检查 function ID,不解码广播有效载荷。
清单监听器只考虑 software ID 为 0 且目标为这个 feature 索引的广播。之后它会重新读取权威状态。
OpenLogi 的用法
当 0x40a3 不受支持时,OpenLogi 使用 0x40a2。feature 表含有 0x40a2 时,会启用 Fn 锁能力。它只会在 0x40a2 自身不受支持时继续回退到 0x40a0。
设备设置把 fn_lock = true 映射为翻转 Off。它把 fn_lock = false 映射为翻转 On。请求是完整的单字节状态,因此 OpenLogi 不使用读-改-写。写入后,它将返回的 Fn 锁状态与请求的状态比较。
从 v0.8.14 开始,PR #1791 会记录已识别的状态变更广播,并在桌面应用中重新读取 Fn 锁。广播不会更新 config.toml。OpenLogi 会在重连后重放已配置的 fn_lock 值,而不会在会话结束时恢复先前的值。
未确认的细节
- 硬件抓包尚未确认 Fn+Esc 是否会发出这个 function 1 广播。Options+ 2.8 的静态分析只识别非空报告。OpenLogi 会在每次识别到 function 1 广播后重新读取。
- 非请求报告没有已验证的有效载荷布局。OpenLogi 不解释这个有效载荷,所以这个不确定性不会直接改变显示的状态。
Rust 用法
use hidpp::{
device::Device,
feature::fn_inversion::{FnInversionState, FnInversionWithDefaultStateFeature},
};
async fn inspect(device: &mut Device) -> Result<(), hidpp::protocol::v20::Hidpp20Error> {
let _ = device.enumerate_features().await?;
let Some(feature) = device.get_feature::<FnInversionWithDefaultStateFeature>() else {
return Ok(());
};
let info = feature.get_global_fn_inversion().await?;
println!("state={:?}, default={:?}", info.state, info.default_state);
let updated = feature
.set_global_fn_inversion(FnInversionState::Off)
.await?;
println!("new state={:?}", updated.state);
Ok(())
}