From d52d946910614aed5b527d53f5d20ee79af3bde4 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Wed, 28 Sep 2022 00:05:55 +0000 Subject: [PATCH 01/10] Testing battery --- app/Kconfig | 22 +++++++++++++++- app/src/rgb_underglow.c | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index f89d3279..76d17c4f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -236,7 +236,7 @@ config ZMK_RGB_UNDERGLOW_SPD_START config ZMK_RGB_UNDERGLOW_EFF_START int "RGB underglow start effect int value related to the effect enum list" - range 0 3 + range 0 4 default 0 config ZMK_RGB_UNDERGLOW_ON_START @@ -250,6 +250,26 @@ config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB bool "Turn off RGB underglow when USB is disconnected" depends on USB_DEVICE_STACK +config ZMK_RGB_UNDERGLOW_STATUS_BATTERY + bool "Shows battery status on a LED" + default y + +config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N + int "LED number to show the battery status" + range 0 26 + default 0 + depends on ZMK_RGB_UNDERGLOW_STATUS_BATTERY + +config ZMK_RGB_UNDERGLOW_STATUS_LAYER + bool "Shows layer status on a LED" + default y + +config ZMK_RGB_UNDERGLOW_STATUS_LAYER_N + int "LED number to show the layer status" + range 0 26 + default 1 + depends on ZMK_RGB_UNDERGLOW_STATUS_LAYER + #ZMK_RGB_UNDERGLOW endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 25d4466e..6a69b3cf 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -25,6 +25,9 @@ #include #include +#include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define STRIP_LABEL DT_LABEL(DT_CHOSEN(zmk_underglow)) @@ -42,6 +45,7 @@ enum rgb_underglow_effect { UNDERGLOW_EFFECT_BREATHE, UNDERGLOW_EFFECT_SPECTRUM, UNDERGLOW_EFFECT_SWIRL, + UNDERGLOW_EFFECT_STATUS, UNDERGLOW_EFFECT_NUMBER // Used to track number of underglow effects }; @@ -168,6 +172,37 @@ static void zmk_rgb_underglow_effect_swirl() { state.animation_step = state.animation_step % HUE_MAX; } +static void zmk_rgb_underglow_effect_status() { + struct zmk_led_hsb hsb = state.color; + hsb.b = 0; + + // Turn off all LEDs + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + pixels[i] = hsb_to_rgb(hsb_scale_zero_max(hsb)); + } + + // and turn on specific ones. + + // ------- Turn on the layer status leds ------- + struct zmk_led_hsb layer_hsb = state.color; + #if CONFIG_ZMK_SPLIT_ROLE_CENTRAL + layer_hsb.h = zmk_keymap_highest_layer_active() * 20; + #endif + + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_N] = hsb_to_rgb(hsb_scale_min_max(layer_hsb)); + #endif + + // ------- Turn on the battery status led ------- + struct zmk_led_hsb battery_hsb = state.color; + battery_hsb.h = zmk_battery_state_of_charge(); + + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY) + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N] = hsb_to_rgb(hsb_scale_min_max(battery_hsb)); + LOG_DBG("---------> Battery Level: %d", battery_hsb.h); + #endif +} + static void zmk_rgb_underglow_tick(struct k_work *work) { switch (state.current_effect) { case UNDERGLOW_EFFECT_SOLID: @@ -182,6 +217,9 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { case UNDERGLOW_EFFECT_SWIRL: zmk_rgb_underglow_effect_swirl(); break; + case UNDERGLOW_EFFECT_STATUS: + zmk_rgb_underglow_effect_status(); + break; } led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); @@ -505,4 +543,24 @@ ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); ZMK_SUBSCRIPTION(rgb_underglow, zmk_usb_conn_state_changed); #endif +// ---------------------------------------------------------------------------- +#if IS_ENABLED(ZMK_RGB_UNDERGLOW_STATUS_BATTERY) +static int rgb_status_battery_event_listener(const zmk_event_t *eh) { + struct zmk_led_hsb hsb = state.color; + //state.pressed = abs(state.pressed - 1); + //hsb.h = abs(state.pressed - 1) * 20; + //hsb.b + hsb.h = zmk_battery_state_of_charge(); + + //pixels[i] = hsb_to_rgb(hsb_scale_zero_max(hsb)); + state.color = hsb; + +} + +ZMK_LISTENER(rgb_status_press, rgb_status_battery_event_listener); +ZMK_SUBSCRIPTION(rgb_status_press, zmk_battery_state_changed); +#endif // IS_ENABLED(ZMK_RGB_UNDERGLOW_STATUS_BATTERY) + +// ---------------------------------------------------------------------------- + SYS_INIT(zmk_rgb_underglow_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); From 34264e3d92ec5b6d2f7e6e53f4a72cc257820c69 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Thu, 29 Sep 2022 04:32:14 +0000 Subject: [PATCH 02/10] More status options added --- app/Kconfig | 20 ++++++++++++++++++++ app/src/rgb_underglow.c | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 76d17c4f..e797efc1 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -270,6 +270,26 @@ config ZMK_RGB_UNDERGLOW_STATUS_LAYER_N default 1 depends on ZMK_RGB_UNDERGLOW_STATUS_LAYER +config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT + bool "Shows output status on a LED" + default y + +config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N + int "LED number to show the output status" + range 0 26 + default 2 + depends on ZMK_RGB_UNDERGLOW_STATUS_OUTPUT + +config ZMK_RGB_UNDERGLOW_STATUS_BLE + bool "Shows on a LED the status of the selected ble device." + default y + +config ZMK_RGB_UNDERGLOW_STATUS_BLE_N + int "LED number to show the selected ble" + range 0 26 + default 3 + depends on ZMK_RGB_UNDERGLOW_STATUS_BLE + #ZMK_RGB_UNDERGLOW endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 6a69b3cf..625de2bc 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,6 +27,8 @@ #include #include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -183,23 +185,41 @@ static void zmk_rgb_underglow_effect_status() { // and turn on specific ones. - // ------- Turn on the layer status leds ------- - struct zmk_led_hsb layer_hsb = state.color; #if CONFIG_ZMK_SPLIT_ROLE_CENTRAL - layer_hsb.h = zmk_keymap_highest_layer_active() * 20; - #endif + // ------- Turn on the layer status leds ------- + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) + struct zmk_led_hsb layer_hsb = state.color; + layer_hsb.h = zmk_keymap_highest_layer_active() * 20; - #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) - pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_N] = hsb_to_rgb(hsb_scale_min_max(layer_hsb)); + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_N] = hsb_to_rgb(hsb_scale_min_max(layer_hsb)); + #endif + + // ------- Turn on the output status led ------- + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT) + struct zmk_led_hsb output_hsb = state.color; + output_hsb.h = zmk_endpoints_selected() * 40; + + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N] = hsb_to_rgb(hsb_scale_min_max(output_hsb)); + #endif + + // ------- Turn on the status led for selected ble ------- + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE) + struct zmk_led_hsb ble_hsb = state.color; + ble_hsb.h = zmk_ble_active_profile_index() * 80; + + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_N] = hsb_to_rgb(hsb_scale_min_max(ble_hsb)); + //LOG_DBG("---------> BLE selected: %d", ble_hsb.h); + #endif #endif // ------- Turn on the battery status led ------- - struct zmk_led_hsb battery_hsb = state.color; - battery_hsb.h = zmk_battery_state_of_charge(); - #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY) + struct zmk_led_hsb battery_hsb = state.color; + battery_hsb.h = zmk_battery_state_of_charge(); + battery_hsb.b = zmk_battery_state_of_charge(); + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N] = hsb_to_rgb(hsb_scale_min_max(battery_hsb)); - LOG_DBG("---------> Battery Level: %d", battery_hsb.h); + //LOG_DBG("---------> Battery Level: %d", battery_hsb.h); #endif } From 9f2dd537ee6ca6b01f4f7cd75ad146b12a2a4e30 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Fri, 30 Sep 2022 00:00:57 +0000 Subject: [PATCH 03/10] color selection for battery status added --- app/Kconfig | 23 +++++++++++++++++++---- app/src/rgb_underglow.c | 32 +++++++++++++++++--------------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index e797efc1..dbe8aa22 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -250,23 +250,38 @@ config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB bool "Turn off RGB underglow when USB is disconnected" depends on USB_DEVICE_STACK +config ZMK_RGB_UNDERGLOW_NUM_LEDS + int "Numer of leds on the pcb" + range 0 100 + default 100 + config ZMK_RGB_UNDERGLOW_STATUS_BATTERY bool "Shows battery status on a LED" default y config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N int "LED number to show the battery status" - range 0 26 + range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS default 0 depends on ZMK_RGB_UNDERGLOW_STATUS_BATTERY +config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MIN + int "Color when battery is at 0%" + range 0 359 + default 0 + +config ZMK_RGB_UNDERGLOW_STATUS_BATTERY_COLOR_MAX + int "Color when battery is at 100%" + range 0 359 + default 100 + config ZMK_RGB_UNDERGLOW_STATUS_LAYER bool "Shows layer status on a LED" default y config ZMK_RGB_UNDERGLOW_STATUS_LAYER_N int "LED number to show the layer status" - range 0 26 + range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS default 1 depends on ZMK_RGB_UNDERGLOW_STATUS_LAYER @@ -276,7 +291,7 @@ config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT config ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N int "LED number to show the output status" - range 0 26 + range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS default 2 depends on ZMK_RGB_UNDERGLOW_STATUS_OUTPUT @@ -286,7 +301,7 @@ config ZMK_RGB_UNDERGLOW_STATUS_BLE config ZMK_RGB_UNDERGLOW_STATUS_BLE_N int "LED number to show the selected ble" - range 0 26 + range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS default 3 depends on ZMK_RGB_UNDERGLOW_STATUS_BLE diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 625de2bc..2fa2e5b4 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -80,6 +80,13 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { return hsb; } +static uint8_t hue_scale_range(uint8_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); + return hue; +} + static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { double r, g, b; @@ -186,36 +193,31 @@ static void zmk_rgb_underglow_effect_status() { // and turn on specific ones. #if CONFIG_ZMK_SPLIT_ROLE_CENTRAL + struct zmk_led_hsb status_hsb = state.color; + // ------- Turn on the layer status leds ------- - #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) - struct zmk_led_hsb layer_hsb = state.color; - layer_hsb.h = zmk_keymap_highest_layer_active() * 20; - - pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER_N] = hsb_to_rgb(hsb_scale_min_max(layer_hsb)); + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) + status_hsb.h = zmk_keymap_highest_layer_active() * 20; + 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) - struct zmk_led_hsb output_hsb = state.color; - output_hsb.h = zmk_endpoints_selected() * 40; - - pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N] = hsb_to_rgb(hsb_scale_min_max(output_hsb)); + status_hsb.h = zmk_endpoints_selected() * 40; + 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) - struct zmk_led_hsb ble_hsb = state.color; - ble_hsb.h = zmk_ble_active_profile_index() * 80; - - pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_N] = hsb_to_rgb(hsb_scale_min_max(ble_hsb)); - //LOG_DBG("---------> BLE selected: %d", ble_hsb.h); + status_hsb.h = zmk_ble_active_profile_index() * 80; + pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BLE_N] = hsb_to_rgb(hsb_scale_min_max(status_hsb)); #endif #endif // ------- 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 = zmk_battery_state_of_charge(); + battery_hsb.h = hue_scale_range(zmk_battery_state_of_charge()); battery_hsb.b = zmk_battery_state_of_charge(); pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N] = hsb_to_rgb(hsb_scale_min_max(battery_hsb)); From 85e31544e6e64adc38ce025cabcce295a66fd172 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Fri, 30 Sep 2022 02:27:34 +0000 Subject: [PATCH 04/10] cleaning code --- app/src/rgb_underglow.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 2fa2e5b4..71c568a8 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -194,7 +194,7 @@ static void zmk_rgb_underglow_effect_status() { #if CONFIG_ZMK_SPLIT_ROLE_CENTRAL struct zmk_led_hsb status_hsb = state.color; - + // ------- Turn on the layer status leds ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_LAYER) status_hsb.h = zmk_keymap_highest_layer_active() * 20; @@ -565,24 +565,4 @@ ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); ZMK_SUBSCRIPTION(rgb_underglow, zmk_usb_conn_state_changed); #endif -// ---------------------------------------------------------------------------- -#if IS_ENABLED(ZMK_RGB_UNDERGLOW_STATUS_BATTERY) -static int rgb_status_battery_event_listener(const zmk_event_t *eh) { - struct zmk_led_hsb hsb = state.color; - //state.pressed = abs(state.pressed - 1); - //hsb.h = abs(state.pressed - 1) * 20; - //hsb.b - hsb.h = zmk_battery_state_of_charge(); - - //pixels[i] = hsb_to_rgb(hsb_scale_zero_max(hsb)); - state.color = hsb; - -} - -ZMK_LISTENER(rgb_status_press, rgb_status_battery_event_listener); -ZMK_SUBSCRIPTION(rgb_status_press, zmk_battery_state_changed); -#endif // IS_ENABLED(ZMK_RGB_UNDERGLOW_STATUS_BATTERY) - -// ---------------------------------------------------------------------------- - SYS_INIT(zmk_rgb_underglow_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); From 8d0cf0a8feeefee7f7d76ecbfd43f78d516b794d Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sat, 1 Oct 2022 21:56:06 +0000 Subject: [PATCH 05/10] exposing caps word state --- app/CMakeLists.txt | 1 + app/include/zmk/caps_word.h | 12 ++++++++++++ app/src/behaviors/behavior_caps_word.c | 7 +++++++ app/src/caps_word.c | 6 ++++++ 4 files changed, 26 insertions(+) create mode 100644 app/include/zmk/caps_word.h create mode 100644 app/src/caps_word.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4b61fc72..f69e65f7 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -60,6 +60,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/events/endpoint_selection_changed.c) target_sources(app PRIVATE src/hid_listener.c) target_sources(app PRIVATE src/keymap.c) + target_sources(app PRIVATE src/caps_word.c) target_sources(app PRIVATE src/events/layer_state_changed.c) target_sources(app PRIVATE src/events/modifiers_state_changed.c) target_sources(app PRIVATE src/events/keycode_state_changed.c) diff --git a/app/include/zmk/caps_word.h b/app/include/zmk/caps_word.h new file mode 100644 index 00000000..46ee77d2 --- /dev/null +++ b/app/include/zmk/caps_word.h @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +extern bool last_state_of_caps_word; +bool zmk_caps_word_state(); \ No newline at end of file diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 3842a31f..159140d3 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -20,6 +20,11 @@ #include #include +#include + +bool last_state_of_caps_word = false; +//bool zmk_caps_word_state() { return last_state_of_caps_word; } + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) @@ -44,12 +49,14 @@ struct behavior_caps_word_data { static void activate_caps_word(const struct device *dev) { struct behavior_caps_word_data *data = dev->data; + last_state_of_caps_word = true; data->active = true; } static void deactivate_caps_word(const struct device *dev) { struct behavior_caps_word_data *data = dev->data; + last_state_of_caps_word = false; data->active = false; } diff --git a/app/src/caps_word.c b/app/src/caps_word.c new file mode 100644 index 00000000..7a7d49c1 --- /dev/null +++ b/app/src/caps_word.c @@ -0,0 +1,6 @@ +#include + +#include +#include + +bool zmk_caps_word_state() { return last_state_of_caps_word; } \ No newline at end of file From fa0fccdbf569c3f2d3c4ccde3756707467f40ef7 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sat, 1 Oct 2022 22:58:17 +0000 Subject: [PATCH 06/10] caps word added to the status --- app/Kconfig | 9 +++++++ app/src/rgb_underglow.c | 57 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index dbe8aa22..02ef2344 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -305,6 +305,15 @@ config ZMK_RGB_UNDERGLOW_STATUS_BLE_N default 3 depends on ZMK_RGB_UNDERGLOW_STATUS_BLE +config ZMK_RGB_UNDERGLOW_STATUS_CAPS + bool "Shows on a LED the status of caps word." + default y + +config ZMK_RGB_UNDERGLOW_STATUS_CAPS_N + int "LED number to show the status of caps word" + range 0 ZMK_RGB_UNDERGLOW_NUM_LEDS + default 4 + #ZMK_RGB_UNDERGLOW endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 71c568a8..0766e149 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -29,6 +29,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -80,7 +81,7 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { return hsb; } -static uint8_t hue_scale_range(uint8_t hue) { +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); @@ -203,7 +204,7 @@ static void zmk_rgb_underglow_effect_status() { // ------- Turn on the output status led ------- #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT) - status_hsb.h = zmk_endpoints_selected() * 40; + status_hsb.h = zmk_endpoints_selected() * 90; pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_OUTPUT_N] = hsb_to_rgb(hsb_scale_min_max(status_hsb)); #endif @@ -212,6 +213,15 @@ static void zmk_rgb_underglow_effect_status() { status_hsb.h = zmk_ble_active_profile_index() * 80; 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.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)); + #endif #endif // ------- Turn on the battery status led ------- @@ -220,7 +230,7 @@ static void zmk_rgb_underglow_effect_status() { battery_hsb.h = hue_scale_range(zmk_battery_state_of_charge()); battery_hsb.b = zmk_battery_state_of_charge(); - pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_BATTERY_N] = hsb_to_rgb(hsb_scale_min_max(battery_hsb)); + 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 } @@ -565,4 +575,45 @@ ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); ZMK_SUBSCRIPTION(rgb_underglow, zmk_usb_conn_state_changed); #endif + +/*#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS) + +static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { + struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); + if (ev == NULL || !ev->state) { + return ZMK_EV_EVENT_BUBBLE; + } + + for (int i = 0; i < DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT); i++) { + const struct device *dev = devs[i]; + if (dev == NULL) { + continue; + } + + struct behavior_caps_word_data *data = dev->data; + if (!data->active) { + continue; + } + + const struct behavior_caps_word_config *config = dev->config; + + caps_word_enhance_usage(config, ev); + + if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) && + !is_mod(ev->usage_page, ev->keycode) && + !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, + ev->implicit_modifiers)) { + LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode); + deactivate_caps_word(dev); + } + } + + return ZMK_EV_EVENT_BUBBLE; +} + +ZMK_LISTENER(rgb_underglow_caps_word, caps_word_keycode_state_changed_listener); +ZMK_SUBSCRIPTION(rgb_underglow_caps_word, zmk_keycode_state_changed); + +#endif*/ + SYS_INIT(zmk_rgb_underglow_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); From 58897e29a5eb32a115cd290a526fa205dbbe043d Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sun, 2 Oct 2022 03:32:02 +0000 Subject: [PATCH 07/10] added a function to get the number of layers. --- app/include/zmk/keymap.h | 1 + app/src/keymap.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 1195b943..f196ea9a 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -14,6 +14,7 @@ uint8_t zmk_keymap_layer_default(); zmk_keymap_layers_state_t zmk_keymap_layer_state(); bool zmk_keymap_layer_active(uint8_t layer); uint8_t zmk_keymap_highest_layer_active(); +uint8_t zmk_keymap_number_of_layers(); int zmk_keymap_layer_activate(uint8_t layer); int zmk_keymap_layer_deactivate(uint8_t layer); int zmk_keymap_layer_toggle(uint8_t layer); diff --git a/app/src/keymap.c b/app/src/keymap.c index e586316f..cd559b08 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -124,6 +124,10 @@ uint8_t zmk_keymap_highest_layer_active() { return zmk_keymap_layer_default(); } +uint8_t zmk_keymap_number_of_layers() { + return ZMK_KEYMAP_LAYERS_LEN; +} + int zmk_keymap_layer_activate(uint8_t layer) { return set_layer_state(layer, true); }; int zmk_keymap_layer_deactivate(uint8_t layer) { return set_layer_state(layer, false); }; From a94f21df2353814e6f4e536283bea41cb78c0646 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sun, 2 Oct 2022 15:33:09 +0000 Subject: [PATCH 08/10] 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 } From 96e2d3dd61793143827af28789ba68c0467cdfbf Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sun, 2 Oct 2022 16:26:35 +0000 Subject: [PATCH 09/10] caps word status led brighness max match users one --- app/src/rgb_underglow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index bd8beeec..7b666772 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -240,7 +240,7 @@ static void zmk_rgb_underglow_effect_status() { #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() * CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS_COLOR; - caps_word_hsb.b = zmk_caps_word_state() * BRT_MAX; + caps_word_hsb.b = zmk_caps_word_state() * caps_word_hsb.b; pixels[CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS_N] = hsb_to_rgb(hsb_scale_zero_max(caps_word_hsb)); #endif From 0810792cffe3eed0d7138a6c13a3bf8e7fc97777 Mon Sep 17 00:00:00 2001 From: SpaceComet Date: Sun, 2 Oct 2022 17:10:08 +0000 Subject: [PATCH 10/10] cleaning code --- app/src/behaviors/behavior_caps_word.c | 1 - app/src/rgb_underglow.c | 41 -------------------------- 2 files changed, 42 deletions(-) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 159140d3..3cd2e81d 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -23,7 +23,6 @@ #include bool last_state_of_caps_word = false; -//bool zmk_caps_word_state() { return last_state_of_caps_word; } LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 7b666772..148f50a8 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -601,45 +601,4 @@ ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); ZMK_SUBSCRIPTION(rgb_underglow, zmk_usb_conn_state_changed); #endif - -/*#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_STATUS_CAPS) - -static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { - struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); - if (ev == NULL || !ev->state) { - return ZMK_EV_EVENT_BUBBLE; - } - - for (int i = 0; i < DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT); i++) { - const struct device *dev = devs[i]; - if (dev == NULL) { - continue; - } - - struct behavior_caps_word_data *data = dev->data; - if (!data->active) { - continue; - } - - const struct behavior_caps_word_config *config = dev->config; - - caps_word_enhance_usage(config, ev); - - if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) && - !is_mod(ev->usage_page, ev->keycode) && - !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, - ev->implicit_modifiers)) { - LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode); - deactivate_caps_word(dev); - } - } - - return ZMK_EV_EVENT_BUBBLE; -} - -ZMK_LISTENER(rgb_underglow_caps_word, caps_word_keycode_state_changed_listener); -ZMK_SUBSCRIPTION(rgb_underglow_caps_word, zmk_keycode_state_changed); - -#endif*/ - SYS_INIT(zmk_rgb_underglow_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);