Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
target_sources(app PRIVATE src/behaviors/behavior_bt.c)
target_sources(app PRIVATE src/ble.c)
target_sources(app PRIVATE src/hog.c)
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW_BLE_STATUS app PRIVATE src/rgb_underglow/ble_status.c)
endif()
else()
if (CONFIG_ZMK_BLE)
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW_BLE_STATUS app PRIVATE src/rgb_underglow/ble_peripheral_status.c)
endif()
endif()

Expand All @@ -100,7 +105,21 @@ add_subdirectory_ifdef(CONFIG_ZMK_SPLIT src/split)

target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c)
target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c)
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c)

if (CONFIG_ZMK_RGB_UNDERGLOW)
target_sources(app PRIVATE src/rgb_underglow/current_status.c)
target_sources(app PRIVATE src/rgb_underglow/rgb_underglow_base.c)
target_sources(app PRIVATE src/rgb_underglow/init.c)
target_sources(app PRIVATE src/rgb_underglow/state.c)
if (CONFIG_ZMK_RGB_UNDERGLOW_BLE_STATUS OR CONFIG_ZMK_RGB_UNDERGLOW_BATTERY_STATUS)
target_sources( app PRIVATE src/rgb_underglow/startup_mutex.c)
target_sources( app PRIVATE src/rgb_underglow/status_on_startup.c)
endif()
if (CONFIG_ZMK_RGB_UNDERGLOW_BATTERY_STATUS)
target_sources( app PRIVATE src/rgb_underglow/battery_status.c)
endif()
endif()

target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c)
target_sources_ifdef(CONFIG_ZMK_LOW_PRIORITY_WORK_QUEUE app PRIVATE src/workqueue.c)
target_sources(app PRIVATE src/main.c)
Expand Down
26 changes: 26 additions & 0 deletions app/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,32 @@ config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB
bool "Turn off RGB underglow when USB is disconnected"
depends on USB_DEVICE_STACK

if ZMK_BATTERY_REPORTING
config ZMK_RGB_UNDERGLOW_BATTERY_STATUS
bool "Reflect the battery status with underglow"
default n

config ZMK_RGB_UNDERGLOW_BATTERY_CRIT
int "Threshold for showing the RGB value for critically low battery charge"
range 0 100
default 5

config ZMK_RGB_UNDERGLOW_BATTERY_LOW
int "Threshold for showing the RGB value for low battery charge"
range 0 100
default 15

#ZMK_BATTERY_REPORTING
endif

if ZMK_BLE
config ZMK_RGB_UNDERGLOW_BLE_STATUS
bool "Reflect the ble connection states with underglow"
default n

#ZMK_BLE
endif

endif # ZMK_RGB_UNDERGLOW

menuconfig ZMK_BACKLIGHT
Expand Down
11 changes: 11 additions & 0 deletions app/include/zmk/rgb_underglow/battery_status.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <stdint.h>

int rgb_underglow_set_color_battery(uint8_t state_of_charge);
16 changes: 16 additions & 0 deletions app/include/zmk/rgb_underglow/ble_peripheral_status.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <zephyr/kernel.h>

struct peripheral_ble_state {
bool connected;
};

struct peripheral_ble_state zmk_get_ble_peripheral_state();
int zmk_rgb_underglow_set_color_ble_peripheral(struct peripheral_ble_state ps);
19 changes: 19 additions & 0 deletions app/include/zmk/rgb_underglow/ble_status.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <zmk/endpoints.h>
#include <zmk/event_manager.h>

struct output_state {
struct zmk_endpoint_instance selected_endpoint;
bool active_profile_connected;
bool active_profile_bonded;
};

struct output_state zmk_get_output_state(void);
int zmk_rgb_underglow_set_color_ble(struct output_state os);
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
/*
* Copyright (c) 2020 The ZMK Contributors
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

struct zmk_led_hsb {
uint16_t h;
uint8_t s;
uint8_t b;
};
#include <zmk/rgb_underglow/rgb_underglow_base.h>

int zmk_rgb_underglow_toggle(void);
int zmk_rgb_underglow_get_state(bool *state);
Expand All @@ -27,3 +23,5 @@ int zmk_rgb_underglow_change_sat(int direction);
int zmk_rgb_underglow_change_brt(int direction);
int zmk_rgb_underglow_change_spd(int direction);
int zmk_rgb_underglow_set_hsb(struct zmk_led_hsb color);
int zmk_rgb_underglow_apply_current_state(void);
void zmk_rgb_underglow_init(void);
10 changes: 10 additions & 0 deletions app/include/zmk/rgb_underglow/init.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

int zmk_rgb_ug_on(void);
int zmk_rgb_ug_off(void);
26 changes: 26 additions & 0 deletions app/include/zmk/rgb_underglow/rgb_underglow_base.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <zephyr/kernel.h>
#include <zephyr/devicetree.h>
#include <zmk/rgb_underglow/state.h>

#if !DT_HAS_CHOSEN(zmk_underglow)

#error "A zmk,underglow chosen node must be declared"

#endif

#define STRIP_CHOSEN DT_CHOSEN(zmk_underglow)
#define STRIP_NUM_PIXELS DT_PROP(STRIP_CHOSEN, chain_length)

int zmk_rgb_ug_select_effect(int effect);
int zmk_rgb_ug_set_spd(int speed);
int zmk_rgb_ug_set_hsb(struct zmk_led_hsb color);
void zmk_rgb_ug_tick(struct k_work *work);
void zmk_rgb_ug_tools_init(const struct device *led_strip);
13 changes: 13 additions & 0 deletions app/include/zmk/rgb_underglow/startup_mutex.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <zephyr/kernel.h>

bool is_starting_up(void);
bool start_startup(void);
void stop_startup(void);
52 changes: 52 additions & 0 deletions app/include/zmk/rgb_underglow/state.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#pragma once

#include <zephyr/kernel.h>

#define HUE_MAX 360
#define SAT_MAX 100
#define BRT_MAX 100

struct zmk_led_hsb {
uint16_t h;
uint8_t s;
uint8_t b;
};

struct rgb_underglow_state {
struct zmk_led_hsb color;
uint8_t animation_speed;
uint8_t current_effect;
uint16_t animation_step;
bool on;
};

enum rgb_underglow_effect {
UNDERGLOW_EFFECT_SOLID,
UNDERGLOW_EFFECT_BREATHE,
UNDERGLOW_EFFECT_SPECTRUM,
UNDERGLOW_EFFECT_SWIRL,
UNDERGLOW_EFFECT_NUMBER // Used to track number of underglow effects
};

static const struct rgb_underglow_state default_rgb_settings = (struct rgb_underglow_state){
color : {
h : CONFIG_ZMK_RGB_UNDERGLOW_HUE_START,
s : CONFIG_ZMK_RGB_UNDERGLOW_SAT_START,
b : CONFIG_ZMK_RGB_UNDERGLOW_BRT_START,
},
animation_speed : CONFIG_ZMK_RGB_UNDERGLOW_SPD_START,
current_effect : CONFIG_ZMK_RGB_UNDERGLOW_EFF_START,
animation_step : 0,
on : IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_ON_START)
};

struct rgb_underglow_state *zmk_rgb_ug_get_state(void);
struct rgb_underglow_state *zmk_rgb_ug_get_save_state(void);
int zmk_rgb_ug_save_state(void);
int zmk_rgb_ug_state_init(void);
2 changes: 1 addition & 1 deletion app/src/behaviors/behavior_rgb_underglow.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include <zephyr/logging/log.h>

#include <dt-bindings/zmk/rgb.h>
#include <zmk/rgb_underglow.h>
#include <zmk/rgb_underglow/current_status.h>
#include <zmk/keymap.h>

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
Expand Down
Loading