From a94f21df2353814e6f4e536283bea41cb78c0646 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sun, 2 Oct 2022 15:33:09 +0000 Subject: [PATCH] color range and new funtion to scale hue added --- app/Kconfig | 39 ++++++++++++++++++++++++++++++++-- app/src/rgb_underglow.c | 46 ++++++++++++++++++++++++++++++++--------- 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 02ef2344..294f8a5a 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -267,12 +267,12 @@ config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN int "Color when battery is at 0%" - range 0 359 + range 0 360 default 0 config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MAX int "Color when battery is at 100%" - range 0 359 + range 0 360 default 100 config ZMK_RGB_UNDERGLOW_STATUS_LAYER @@ -285,6 +285,16 @@ config ZMK_RGB_UNDERGLOW_STATUS_LAYER_N default 1 depends on ZMK_RGB_UNDERGLOW_STATUS_LAYER +config ZMK_RGB_UNDERGLOW_STATUS_LAYER_COLOR_MIN + int "Color when lower layer is selected." + range 0 360 + default 320 + +config ZMK_RGB_UNDERGLOW_STATUS_LAYER_COLOR_MAX + int "Color when highest layer is selected." + range 0 360 + default 0 + config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT bool "Shows output status on a LED" default y @@ -295,6 +305,16 @@ config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N default 2 depends on ZMK_RGB_UNDERGLOW_STATUS_OUTPUT +config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_COLOR_MIN + int "Color when usb is selected." + range 0 360 + default 50 + +config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_COLOR_MAX + int "Color when ble is selected." + range 0 360 + default 300 + config ZMK_RGB_UNDERGLOW_STATUS_BLE bool "Shows on a LED the status of the selected ble device." default y @@ -305,6 +325,16 @@ config ZMK_RGB_UNDERGLOW_STATUS_BLE_N default 3 depends on ZMK_RGB_UNDERGLOW_STATUS_BLE +config ZMK_RGB_UNDERGLOW_STATUS_BLE_COLOR_MIN + int "Color when ble selected is the first one." + range 0 360 + default 10 + +config ZMK_RGB_UNDERGLOW_STATUS_BLE_COLOR_MAX + int "Color when ble selected is the last one." + range 0 360 + default 320 + config ZMK_RGB_UNDERGLOW_STATUS_CAPS bool "Shows on a LED the status of caps word." default y @@ -314,6 +344,11 @@ config ZMK_RGB_UNDERGLOW_STATUS_CAPS_N range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS default 4 +config ZMK_RGB_UNDERGLOW_STATUS_CAPS_COLOR + int "Color when caps word is on." + range 0 360 + default 360 + #ZMK_RGB_UNDERGLOW endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 0766e149..bd8beeec 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -81,10 +81,16 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { return hsb; } -static uint16_t hue_scale_range(uint16_t hue) { - int hue_d = abs(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MAX - CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN); - int direc = hue_d - abs(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MAX - CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN - 1); - hue = (hue * hue_d / 100) + (CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN * direc); +static uint16_t hue_scale_to_range(uint16_t hue, uint16_t from_max, uint16_t to_min, uint16_t to_max) { + if (to_max > HUE_MAX) to_max = HUE_MAX; + if (to_min > HUE_MAX) to_min = HUE_MAX; + + if (to_min < 0) to_min = 0; + if (to_max < 0) to_max = 0; + + int hue_d = abs(to_max - to_min); + int direc = hue_d - abs(to_max - to_min - 1); + hue = (hue * hue_d / from_max) + (to_min * direc); return hue; } @@ -198,26 +204,42 @@ static void zmk_rgb_underglow_effect_status() { // ------- Turn on the layer status leds ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) - status_hsb.h = zmk_keymap_highest_layer_active() * 20; + status_hsb.h = hue_scale_to_range( + zmk_keymap_highest_layer_active(), + zmk_keymap_number_of_layers(), + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_COLOR_MIN, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_COLOR_MAX + ); pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_N] = hsb_to_rgb(hsb_scale_min_max(status_hsb)); #endif // ------- Turn on the output status led ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT) - status_hsb.h = zmk_endpoints_selected() * 90; + //status_hsb.h = zmk_endpoints_selected() * 90; + status_hsb.h = hue_scale_to_range( + zmk_endpoints_selected(), + ZMK_ENDPOINT_BLE, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_COLOR_MIN, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_COLOR_MAX + ); pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N] = hsb_to_rgb(hsb_scale_min_max(status_hsb)); #endif // ------- Turn on the status led for selected ble ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE) - status_hsb.h = zmk_ble_active_profile_index() * 80; + status_hsb.h = hue_scale_to_range( + zmk_ble_active_profile_index(), + ZMK_BLE_PROFILE_COUNT, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_COLOR_MIN, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_COLOR_MAX + ); pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_N] = hsb_to_rgb(hsb_scale_min_max(status_hsb)); #endif // ------- Turn on the caps word for status led ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS) struct zmk_led_hsb caps_word_hsb = state.color; - caps_word_hsb.h = zmk_caps_word_state() * 80; + caps_word_hsb.h = zmk_caps_word_state() * CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS_COLOR; caps_word_hsb.b = zmk_caps_word_state() * BRT_MAX; pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS_N] = hsb_to_rgb(hsb_scale_zero_max(caps_word_hsb)); @@ -227,11 +249,15 @@ static void zmk_rgb_underglow_effect_status() { // ------- Turn on the battery status led ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY) struct zmk_led_hsb battery_hsb = state.color; - battery_hsb.h = hue_scale_range(zmk_battery_state_of_charge()); + battery_hsb.h = hue_scale_to_range( + zmk_battery_state_of_charge(), + 100, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN, + CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MAX + ); battery_hsb.b = zmk_battery_state_of_charge(); pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N] = hsb_to_rgb(hsb_scale_zero_max(battery_hsb)); - //LOG_DBG("---------> Battery Level: %d", battery_hsb.h); #endif }