0x8071 · rgbEffects
按集群控制 RGB 效果的引擎。它管理效果、非易失配置、软件控制权、电源模式和 RGB 通知。
rgbEffects 是 0x8070 colorLedEffects 的按集群后继功能。每个集群有自己的效果序号。软件必须先取得目标集群的控制权,才能设置集群效果。
**规格:**Logitech HID++ 2.0 —— rgbEffects(v4)。**交叉核对:**Logi Options+ 2.8(静态分析)、Solaar、G HUB(静态分析)。用于:键盘灯光。
函数参考
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_device_info | 0 | () | RgbDeviceInfo |
get_cluster_info | 0 | (cluster_index: u8) | RgbClusterInfo |
get_effect_info | 0 | (cluster_index: u8, cluster_effect_index: u8) | RgbEffectInfo |
get_onboard_effect_info | 0 | (cluster_index: u8, cluster_effect_index: u8, slot: u8, slot_info_type: SlotInfoType) | [u8; ONBOARD_INFO_PARAM_COUNT] |
set_rgb_cluster_effect | 1 | (cluster_index: u8, cluster_effect_index: u8, params: [u8; CLUSTER_EFFECT_PARAM_COUNT], persistence: RgbPersistence, power_mode: PowerModeTarget) | () |
set_multi_led_cluster_pattern | 2 | (cluster_index: u8, pattern: u8) | () |
get_nv_config | 3 | (capability: RgbNvCapabilities) | RgbNvConfig |
set_nv_config | 3 | (config: &RgbNvConfig) | () |
get_led_bin_info | 4 | (cluster_index: u8, led_bin_index: LedBinIndex, backup: bool) | [u8; LED_BIN_PARAM_COUNT] |
set_led_bin_info | 4 | (cluster_index: u8, led_bin_index: LedBinIndex, params: [u8; LED_BIN_PARAM_COUNT]) | () |
get_sw_control | 5 | () | RgbSwControl |
set_sw_control | 5 | (control: SwControlFlags, events: EventsNotificationFlags) | () |
set_effect_sync_correction | 6 | (cluster_index: u8, drift_value: i16) | () |
get_power_mode_config | 7 | () | RgbPowerModeConfig |
set_power_mode_config | 7 | (config: RgbPowerModeConfig) | () |
get_power_mode | 8 | () | RgbPowerMode |
set_power_mode | 8 | (mode: RgbPowerMode) | () |
shutdown | 9 | () | () |
listen | — | (&self) | async_channel::Receiver<RgbEffectsEvent> |
除 listen 外,所有操作都是返回 Result<_, Hidpp20Error> 的 async fn。listen 由 EmittingFeature<RgbEffectsEvent> 提供。
类型
CLUSTER_EFFECT_PARAM_COUNT 的值为 10。ONBOARD_INFO_PARAM_COUNT 的值为 13。LED_BIN_PARAM_COUNT 的值为 8。ALL_CLUSTERS 和 ALL_EFFECTS 均为 0xff。
数据结构
| 类型 | 字段 | 说明 |
|---|---|---|
RgbDeviceInfo | cluster_count: u8、nv_capabilities: RgbNvCapabilities、ext_capabilities: RgbExtCapabilities、multicluster_effect_count: u8 | 设备级信息。 |
RgbClusterInfo | cluster_index: u8、location: u16、effects_number: u8、display_persistency: DisplayPersistencyCapabilities、effect_persistency: bool、multiled_pattern: bool | 一个集群。location 是原始 locationEffect 值。 |
RgbEffectInfo | cluster_index: u8、cluster_effect_index: u8、effect_id: u16、effect_capabilities: u16、effect_period: u16 | 一个集群效果。两个标识符均为原始值。能力为零时使用 Raptor 兼容默认值。周期为零表示不可用。 |
RgbSwControl | control: SwControlFlags、events: EventsNotificationFlags | 软件控制权和事件请求标志。 |
RgbNvConfig | capability: RgbNvCapabilities、state: u8、params: [u8; 6] | 一个非易失配置项。6 个参数均与能力相关。 |
RgbPowerModeConfig | flags: u16、no_activity_timeout_to_power_save: u16、no_activity_timeout_to_off: u16 | 原始标志和两个以秒为单位的超时值。 |
RgbNvConfig 是非穷举类型。crate 外部的调用方必须通过 get_nv_config 获取它,修改所需字段后再传给 set_nv_config。
枚举
| 类型 | 变体 | 值 |
|---|---|---|
SlotInfoType | SlotState、Defaults、Uuid0To10、Uuid11To16、EffectName0To10、EffectName11To21、EffectName21To31 | 按列出顺序为 0~6。 |
RgbPowerMode | FullRgb、PowerSave、PowerOff | 1、2、3。 |
PowerModeTarget | FullPower、PowerSave | 0、1。 |
LedBinIndex | BinValueBrightness、BinValueColor、CalibrationFactors、Brightness、ColorimetricX、ColorimetricY | 按列出顺序为 0~5。 |
ActivityEventType | NoActivityTimeoutReached、UserActivityDetected、Other(u8) | 0、1 或未建模原始值。 |
位标志
| 类型 | 标志 | 位 | 含义 |
|---|---|---|---|
RgbPersistence | VOLATILE | 1 << 0 | 将效果应用到 RAM。 |
RgbPersistence | NON_VOLATILE | 1 << 1 | 将效果保存到 EEPROM。 |
RgbExtCapabilities | GET_ZONE_EFFECT | 1 << 0 | 支持存储效果的 get_info 模式。 |
RgbExtCapabilities | SET_LED_BIN_INFO | 1 << 2 | 支持 set_led_bin_info。 |
RgbExtCapabilities | MONOCHROME_ONLY | 1 << 3 | 只支持单色效果。 |
RgbExtCapabilities | NO_EFFECT_SYNC | 1 << 4 | 不支持效果同步和校正。 |
RgbExtCapabilities | SHUTDOWN | 1 << 5 | 支持 shutdown。 |
RgbExtCapabilities | CLUSTER_CHANGED_EVENT | 1 << 6 | 支持集群变化事件。 |
RgbNvCapabilities | BOOT_UP_EFFECT | 1 << 0 | 开机效果。 |
RgbNvCapabilities | DEMO | 1 << 1 | 演示模式。 |
RgbNvCapabilities | USER_DEMO_MODE | 1 << 2 | 用户演示模式。 |
RgbNvCapabilities | EVENTS_DISPLAY | 1 << 3 | 事件显示。 |
RgbNvCapabilities | ACTIVE_DIMMING | 1 << 4 | 主动调光。 |
RgbNvCapabilities | RAMP_DOWN_TO_OFF | 1 << 5 | 渐暗至关闭。 |
RgbNvCapabilities | SHUTDOWN_EFFECT | 1 << 6 | 关闭效果。 |
SwControlFlags | ALL_CLUSTERS | 1 << 0 | 软件控制 RGB 集群。 |
SwControlFlags | POWER_MODES | 1 << 1 | 软件控制电源模式。 |
EventsNotificationFlags | EFFECTS_SYNC | 1 << 0 | 请求效果同步事件。 |
EventsNotificationFlags | USER_ACTIVITY | 1 << 1 | 请求用户活动事件。 |
EventsNotificationFlags | NO_USER_ACTIVITY_TIMEOUT | 1 << 2 | 请求无用户活动超时事件。 |
DisplayPersistencyCapabilities | ALWAYS_ON | 1 << 0 | 集群可持久保存常亮状态。 |
DisplayPersistencyCapabilities | ALWAYS_OFF | 1 << 1 | 集群可持久保存常灭状态。 |
DisplayPersistencyCapabilities | ON_THEN_OFF | 1 << 2 | 集群可持久保存先亮后灭状态。 |
这些位标志类型会保留未知位。封装会公开能力标志,但不会在发送前统一门控这些操作。
事件
RgbEffectsFeature 实现 EmittingFeature<RgbEffectsEvent>。
| 变体 | 字段 | 说明 |
|---|---|---|
EffectSync | cluster_index: u8、effect_counter: u16 | 周期效果到达同步点。0xff 指向所有集群。计数器单位为毫秒。 |
UserActivity | ActivityEventType | 用户活动开始,或用户无活动已超时。 |
ClusterChanged | cluster_index: u8、cluster_effect_index: u8、params: [u8; CLUSTER_EFFECT_PARAM_COUNT]、persistence: RgbPersistence、power_mode: Option<PowerModeTarget> | 一个集群效果发生变化。未建模的 2 位电源模式值会返回 None。 |
NvEffectSync | payload: [u8; 16] | 设备保存的 NV 效果配置可能已变化。payload 是原始字节,其布局未知。短报告会用零扩展到 16 个字节。请把此事件当作提示,用 get_nv_config 重新读取你依赖的每个 NV 能力。 |
线格式
以下偏移量均为 payload 字节。短请求携带 3 个字节。长请求携带 16 个字节。以下每个多字节值均为 BE。
get_device_info(fn 0)
请求:[0xff, 0xff, 0x00],分别表示所有集群、所有效果和常规信息。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–1 | / | OpenLogi 忽略这两个回复字节。 |
| 2 | cluster_count | 集群数量。 |
| 3–4 | nv_capabilities | RgbNvCapabilities,BE u16。 |
| 5–6 | ext_capabilities | RgbExtCapabilities,BE u16。 |
| 7 | multicluster_effect_count | 多集群效果数量。 |
get_cluster_info(fn 0)
请求:[cluster_index, 0xff, 0x00],分别表示目标集群、所有效果和常规信息。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | cluster_index | 回显。OpenLogi 要求它与请求值相同。 |
| 1 | / | OpenLogi 忽略此回复字节。 |
| 2–3 | location | 原始位置标识符,BE u16。 |
| 4 | effects_number | 此集群的效果数量。 |
| 5 | display_persistency | DisplayPersistencyCapabilities。 |
| 6 | effect_persistency | 非零表示支持 EEPROM 效果持久化。 |
| 7 | multiled_pattern | 非零表示支持多 LED 图案。 |
OpenLogi 要求长回复。短回复或索引不匹配时,OpenLogi 返回 UnsupportedResponse。
get_effect_info(fn 0)
请求:[cluster_index, cluster_effect_index, 0x00],用于获取常规信息。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | cluster_index | 回复回显。 |
| 1 | cluster_effect_index | 回复回显。 |
| 2–3 | effect_id | 原始效果标识符,BE u16。 |
| 4–5 | effect_capabilities | 效果专属位掩码,BE u16。 |
| 6–7 | effect_period | 周期,单位为毫秒,BE u16;零表示不可用。 |
get_onboard_effect_info(fn 0)
**请求:**长请求,[cluster_index, cluster_effect_index, 0x01, slot, slot_info_type, 0x00…]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–2 | / | OpenLogi 忽略这些回复字节。 |
| 3–15 | 返回值 | 原始 [u8; ONBOARD_INFO_PARAM_COUNT]。含义取决于 SlotInfoType。 |
set_rgb_cluster_effect(fn 1)
**请求:**长请求,16 个字节。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | cluster_index | 目标集群。 |
| 1 | cluster_effect_index | 此集群中的效果序号。 |
| 2–11 | params | 10 个效果专属字节。 |
| 12 | 标志 | RgbPersistence 位于位 0–1。PowerModeTarget 位于位 2–3。 |
| 13–15 | 填充 | OpenLogi 写入 0x00。 |
封装先等待原生写入完成,再等待确认。软件必须先设置 SwControlFlags::ALL_CLUSTERS。
set_multi_led_cluster_pattern(fn 2)
请求:[cluster_index, pattern, 0x00]。
封装等待确认,并丢弃确认 payload。
get_nv_config(fn 3)
请求:[0x00, cap_hi, cap_lo]。字节 0 选择读取。能力值采用 BE u16。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 选择器 | OpenLogi 忽略此回复字节。 |
| 1–2 | capability | RgbNvCapabilities,BE u16。 |
| 3 | state | 能力专属状态字节。 |
| 4–9 | params | 6 个能力专属字节。OpenLogi 保留全部 6 个字节。 |
OpenLogi 要求长回复。封装不命名这 6 个参数,因为它们的含义取决于能力。
set_nv_config(fn 3)
**请求:**长请求,16 个字节。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 选择器 | OpenLogi 写入 0x01 表示写入。 |
| 1–2 | capability | RgbNvCapabilities,BE u16。 |
| 3 | state | 能力专属状态字节。 |
| 4–9 | params | 来自 RgbNvConfig 的全部 6 个字节。 |
| 10–15 | 填充 | OpenLogi 写入 0x00。 |
从 v0.8.14 开始,crate 外部只能传入已读取的 RgbNvConfig。这会在读取、修改和写回时保留每个参数。
get_led_bin_info(fn 4)
请求:[selector, cluster_index, led_bin_index]。选择器 0x00 表示活动数据。选择器 0x02 表示备份数据。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0–2 | / | OpenLogi 忽略这些回复字节。 |
| 3–10 | 返回值 | 原始 [u8; LED_BIN_PARAM_COUNT]。 |
set_led_bin_info(fn 4)
**请求:**长请求,[0x01, cluster_index, led_bin_index, params[0..8], 0x00…]。
封装等待确认,并丢弃确认 payload。
get_sw_control(fn 5)
请求:[0x00, 0x00, 0x00]。字节 0 选择读取。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 选择器 | OpenLogi 忽略此回复字节。 |
| 1 | control | SwControlFlags。 |
| 2 | events | EventsNotificationFlags。 |
set_sw_control(fn 5)
请求:[0x01, control.bits(), events.bits()]。字节 0 选择写入。
确认必须回显全部 3 个请求字节。OpenLogi 先等待原生写入完成,再开始有界确认等待。
set_effect_sync_correction(fn 6)
**请求:**长请求,[cluster_index, 0x00, drift_hi, drift_lo, 0x00…]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | cluster_index | 0xff 指向所有集群。 |
| 1 | 保留 | OpenLogi 写入 0x00。 |
| 2–3 | drift_value | 毫秒,BE i16。 |
| 4–15 | 填充 | OpenLogi 写入 0x00。 |
get_power_mode_config(fn 7)
请求:[0x00, 0x00, 0x00]。字节 0 选择读取。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 选择器 | OpenLogi 忽略此回复字节。 |
| 1–2 | flags | 原始标志,BE u16。 |
| 3–4 | no_activity_timeout_to_power_save | 秒,BE u16。 |
| 5–6 | no_activity_timeout_to_off | 秒,BE u16。 |
set_power_mode_config(fn 7)
**请求:**长请求,[0x01, flags_hi, flags_lo, psave_hi, psave_lo, off_hi, off_lo, 0x00…]。
标志和两个超时值均为 BE u16。封装等待确认,并丢弃确认 payload。
get_power_mode(fn 8)
请求:[0x00, 0x00, 0x00]。字节 0 选择读取。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 选择器 | OpenLogi 忽略此回复字节。 |
| 1 | RgbPowerMode | 1 为全 RGB,2 为省电,3 为关闭。 |
set_power_mode(fn 8)
请求:[0x01, mode, 0x00]。字节 0 选择写入。
软件必须先设置 SwControlFlags::POWER_MODES。封装等待确认,并丢弃确认 payload。
shutdown(fn 9)
请求:[0x00, 0x00, 0x00]。
封装等待确认,并丢弃确认 payload。设备通过 RgbExtCapabilities::SHUTDOWN 报告此操作。
事件(主动上报)
| 子 ID | 事件 | 字节布局 |
|---|---|---|
| 0 | EffectSync | 字节 0 是 cluster_index。字节 1–2 是 effect_counter,即 BE u16 毫秒值。0xff 指向所有集群。 |
| 1 | UserActivity | 字节 0 是 ActivityEventType。 |
| 2 | ClusterChanged | 字节 0 是 cluster_index。字节 1 是 cluster_effect_index。字节 2–11 是参数。字节 12 的位 0–1 存放持久化,位 2–3 存放目标电源模式。 |
| 3 | NvEffectSync | Options+ 2.8 有第四个通知处理器。其 payload 布局未确认。OpenLogi 把字节 0–15 以原始字节发布到 payload。 |
OpenLogi 的用法
自动灯光路径仅在 0x8070 无法提供固定颜色时使用 0x8071。它会在写入前枚举每个集群和每个集群的效果。只有每个集群都具有静态效果 ID 1 时,它才取得控制权。
对于 0x8081 逐键输出,如果此效果引擎存在,OpenLogi 会使用同一控制权。它先为每个支持的集群应用静态颜色,再发送帧,并在新取得控制权后重复该帧。部分可用的引擎会在取得控制权前回退。
从 v0.8.14 开始,PR #1769 会把成功的控制权请求记录为代理会话租约。PR #1770 修复了交还竞争。代理正常退出时,OpenLogi 先拒绝新的灯光写入,最多等待 2 秒处理已接纳写入,再在共享的 2 秒预算内交还每个已记录设备的控制权。
交还操作只清除 ALL_CLUSTERS。它保留保存的事件标志和其他保存的控制标志。设备断开或交还失败时只记录日志,不延迟退出。独立诊断写入会保留易失颜色和控制权。
键盘灯光标签页提供一种静态颜色和亮度。它不提供动画效果、逐键编辑、电源模式配置或 NV 配置。从 v0.8.14 开始,PR #1753 会在封装调用方修改已读取配置时保留全部 6 个 NV 参数。
未确认的细节
第四个通知
Options+ 2.8 的静态分析将子 ID 3 标识为 NV 效果同步通知。该分析没有恢复 payload schema。OpenLogi 逐字段解码子 ID 0~2。从 PR #1951 开始,OpenLogi 以原始字节发布子 ID 3 的 16 字节 payload。对应的事件变体是 NvEffectSync。
payload 的含义仍未确认。需要硬件抓包、公开规格或更强的分析证据,OpenLogi 才能发布类型化字段。本页不会猜测此通知的字节含义。
速率限制
G HUB 静态分析列出了此功能的速率限制操作。提供的证据没有确定其函数索引或 payload 布局。OpenLogi v0.8.15 未公开该操作。
Rust 用法
use hidpp::feature::rgb_effects::{RgbEffectsFeature, RgbNvCapabilities};
use hidpp::protocol::v20::Hidpp20Error;
async fn enable_boot_effect(feature: &RgbEffectsFeature) -> Result<(), Hidpp20Error> {
let device = feature.get_device_info().await?;
if !device
.nv_capabilities
.contains(RgbNvCapabilities::BOOT_UP_EFFECT)
{
return Ok(());
}
let mut config = feature
.get_nv_config(RgbNvCapabilities::BOOT_UP_EFFECT)
.await?;
config.state = 1;
feature.set_nv_config(&config).await
}