|
|
|
@ -28,6 +28,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
@@ -28,6 +28,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
|
|
|
|
#define SAT_MAX 100 |
|
|
|
|
#define BRT_MAX 100 |
|
|
|
|
|
|
|
|
|
BUILD_ASSERT(CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN <= CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX, |
|
|
|
|
"ERROR: RGB underglow maximum brightness is less than minimum brightness"); |
|
|
|
|
|
|
|
|
|
enum rgb_underglow_effect { |
|
|
|
|
UNDERGLOW_EFFECT_SOLID, |
|
|
|
|
UNDERGLOW_EFFECT_BREATHE, |
|
|
|
@ -54,6 +57,17 @@ static struct rgb_underglow_state state;
@@ -54,6 +57,17 @@ static struct rgb_underglow_state state;
|
|
|
|
|
static const struct device *ext_power; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static struct zmk_led_hsb hsb_scale_min_max(struct zmk_led_hsb hsb) { |
|
|
|
|
hsb.b = CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN + |
|
|
|
|
(CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX - CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN) * hsb.b / BRT_MAX; |
|
|
|
|
return hsb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { |
|
|
|
|
hsb.b = hsb.b * CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX / BRT_MAX; |
|
|
|
|
return hsb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { |
|
|
|
|
double r, g, b; |
|
|
|
|
|
|
|
|
@ -105,7 +119,7 @@ static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) {
@@ -105,7 +119,7 @@ static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) {
|
|
|
|
|
|
|
|
|
|
static void zmk_rgb_underglow_effect_solid() { |
|
|
|
|
for (int i = 0; i < STRIP_NUM_PIXELS; i++) { |
|
|
|
|
pixels[i] = hsb_to_rgb(state.color); |
|
|
|
|
pixels[i] = hsb_to_rgb(hsb_scale_min_max(state.color)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -114,7 +128,7 @@ static void zmk_rgb_underglow_effect_breathe() {
@@ -114,7 +128,7 @@ static void zmk_rgb_underglow_effect_breathe() {
|
|
|
|
|
struct zmk_led_hsb hsb = state.color; |
|
|
|
|
hsb.b = abs(state.animation_step - 1200) / 12; |
|
|
|
|
|
|
|
|
|
pixels[i] = hsb_to_rgb(hsb); |
|
|
|
|
pixels[i] = hsb_to_rgb(hsb_scale_zero_max(hsb)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
state.animation_step += state.animation_speed * 10; |
|
|
|
@ -129,7 +143,7 @@ static void zmk_rgb_underglow_effect_spectrum() {
@@ -129,7 +143,7 @@ static void zmk_rgb_underglow_effect_spectrum() {
|
|
|
|
|
struct zmk_led_hsb hsb = state.color; |
|
|
|
|
hsb.h = state.animation_step; |
|
|
|
|
|
|
|
|
|
pixels[i] = hsb_to_rgb(hsb); |
|
|
|
|
pixels[i] = hsb_to_rgb(hsb_scale_min_max(hsb)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
state.animation_step += state.animation_speed; |
|
|
|
@ -141,7 +155,7 @@ static void zmk_rgb_underglow_effect_swirl() {
@@ -141,7 +155,7 @@ static void zmk_rgb_underglow_effect_swirl() {
|
|
|
|
|
struct zmk_led_hsb hsb = state.color; |
|
|
|
|
hsb.h = (HUE_MAX / STRIP_NUM_PIXELS * i + state.animation_step) % HUE_MAX; |
|
|
|
|
|
|
|
|
|
pixels[i] = hsb_to_rgb(hsb); |
|
|
|
|
pixels[i] = hsb_to_rgb(hsb_scale_min_max(hsb)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
state.animation_step += state.animation_speed * 2; |
|
|
|
@ -371,12 +385,7 @@ struct zmk_led_hsb zmk_rgb_underglow_calc_brt(int direction) {
@@ -371,12 +385,7 @@ struct zmk_led_hsb zmk_rgb_underglow_calc_brt(int direction) {
|
|
|
|
|
struct zmk_led_hsb color = state.color; |
|
|
|
|
|
|
|
|
|
int b = color.b + (direction * CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP); |
|
|
|
|
if (b < 0) { |
|
|
|
|
b = 0; |
|
|
|
|
} else if (b > BRT_MAX) { |
|
|
|
|
b = BRT_MAX; |
|
|
|
|
} |
|
|
|
|
color.b = b; |
|
|
|
|
color.b = CLAMP(b, 0, BRT_MAX); |
|
|
|
|
|
|
|
|
|
return color; |
|
|
|
|
} |
|
|
|
|