qmk开源键盘 rgb_matrix_indicators_advanced_user函数
rgb_matrix_indicators_advanced_user
是 QMK 固件中用于自定义 RGB 矩阵指示器的一个钩子函数。它允许用户根据键盘状态(例如按键状态、层状态等)来动态地控制 RGB 矩阵的灯光效果。通过这个函数,您可以实现复杂的灯光效果和状态指示。
函数原型
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max);
led_min
和led_max
参数定义了需要更新的 LED 范围,通常用于优化性能,以避免不必要的更新。
示例
以下是一个示例代码,展示如何使用 rgb_matrix_indicators_advanced_user
函数来根据当前激活的层来改变 RGB 矩阵的灯光效果。
#include "quantum.h"
// 定义不同层的颜色
#define LAYER_0_COLOR RGB_RED
#define LAYER_1_COLOR RGB_GREEN
#define LAYER_2_COLOR RGB_BLUE
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// 获取当前激活的层
uint8_t layer = biton32(layer_state);
// 遍历所有 LED
for (uint8_t i = led_min; i < led_max; i++) {
// 获取 LED 的位置
LED_TYPE *led = &g_led_config[i];
// 根据当前层设置 LED 颜色
switch (layer) {
case 0:
rgb_matrix_set_color(i, LAYER_0_COLOR);
break;
case 1:
rgb_matrix_set_color(i, LAYER_1_COLOR);
break;
case 2:
rgb_matrix_set_color(i, LAYER_2_COLOR);
break;
default:
// 其他层默认关闭 LED
rgb_matrix_set_color(i, 0, 0, 0);
break;
}
}
}
解释
- 获取当前层:使用
biton32(layer_state)
获取当前激活的层。 - 遍历所有 LED:使用
for
循环遍历所有 LED,从led_min
到led_max
。 - 设置 LED 颜色:根据当前层,使用
rgb_matrix_set_color
函数设置 LED 的颜色。
进一步的自定义
您可以根据需要进一步自定义 rgb_matrix_indicators_advanced_user
函数,例如:
- 根据按键状态改变颜色:使用
keyboard_report->keys
检查哪些键被按下,并相应地改变 LED 颜色。 - 实现动态效果:例如根据时间或其他事件改变 LED 颜色,创建动态的灯光效果。
示例:根据按键状态改变颜色
以下是一个示例代码,展示如何根据按键状态来改变 LED 颜色:
#include "quantum.h"
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// 获取当前激活的层
uint8_t layer = biton32(layer_state);
// 遍历所有 LED
for (uint8_t i = led_min; i < led_max; i++) {
// 获取 LED 的位置
LED_TYPE *led = &g_led_config[i];
// 根据当前层设置 LED 颜色
switch (layer) {
case 0:
rgb_matrix_set_color(i, RGB_RED);
break;
case 1:
rgb_matrix_set_color(i, RGB_GREEN);
break;
case 2:
rgb_matrix_set_color(i, RGB_BLUE);
break;
default:
// 其他层默认关闭 LED
rgb_matrix_set_color(i, 0, 0, 0);
break;
}
}
// 根据按键状态改变 LED 颜色
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
for (uint8_t j = 0; j < MATRIX_COLS; j++) {
if (matrix_is_on(i, j)) {
uint8_t led_index = g_led_config.matrix_co[i][j];
if (led_index != NO_LED) {
rgb_matrix_set_color(led_index, RGB_WHITE); // 按键被按下时设置为白色
}
}
}
}
}
解释
- 遍历所有 LED 并设置颜色:根据当前层设置所有 LED 的颜色。
- 根据按键状态改变颜色:遍历键盘矩阵,检查哪些键被按下,并将对应的 LED 设置为白色。
通过这些示例,您可以根据自己的需求自定义 rgb_matrix_indicators_advanced_user
函数,实现丰富多彩的 RGB 矩阵灯光效果