From 9e6f91f30f3f9453cdc4dbdcd2ff175c7f1ebc91 Mon Sep 17 00:00:00 2001 From: aggstam Date: Thu, 16 Nov 2023 17:17:24 +0200 Subject: [PATCH 1/6] feat(display): Add label widget --- app/include/zmk/display/widgets/label.h | 18 ++++++++++ app/src/display/status_screen.c | 12 +++++++ app/src/display/widgets/CMakeLists.txt | 1 + app/src/display/widgets/Kconfig | 8 +++++ app/src/display/widgets/label.c | 48 +++++++++++++++++++++++++ docs/docs/config/displays.md | 20 ++++++----- 6 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 app/include/zmk/display/widgets/label.h create mode 100644 app/src/display/widgets/label.c diff --git a/app/include/zmk/display/widgets/label.h b/app/include/zmk/display/widgets/label.h new file mode 100644 index 00000000..371faeee --- /dev/null +++ b/app/include/zmk/display/widgets/label.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +struct zmk_widget_label { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_label_init(struct zmk_widget_label *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_label_obj(struct zmk_widget_label *widget); diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 58de09ae..13a67588 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,10 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif +#if IS_ENABLED(CONFIG_ZMK_WIDGET_LABEL) +static struct zmk_widget_label label_widget; +#endif + lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; screen = lv_obj_create(NULL); @@ -65,5 +70,12 @@ lv_obj_t *zmk_display_status_screen() { zmk_widget_wpm_status_init(&wpm_status_widget, screen); lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), LV_ALIGN_BOTTOM_RIGHT, 0, 0); #endif + +#if IS_ENABLED(CONFIG_ZMK_WIDGET_LABEL) + zmk_widget_label_init(&label_widget, screen); + lv_obj_set_style_text_font(zmk_widget_label_obj(&label_widget), lv_theme_get_font_small(screen), + LV_PART_MAIN); + lv_obj_align(zmk_widget_label_obj(&label_widget), LV_ALIGN_CENTER, 0, 0); +#endif return screen; } diff --git a/app/src/display/widgets/CMakeLists.txt b/app/src/display/widgets/CMakeLists.txt index fbf07072..2aed97e8 100644 --- a/app/src/display/widgets/CMakeLists.txt +++ b/app/src/display/widgets/CMakeLists.txt @@ -6,3 +6,4 @@ target_sources_ifdef(CONFIG_ZMK_WIDGET_OUTPUT_STATUS app PRIVATE output_status.c target_sources_ifdef(CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS app PRIVATE peripheral_status.c) target_sources_ifdef(CONFIG_ZMK_WIDGET_LAYER_STATUS app PRIVATE layer_status.c) target_sources_ifdef(CONFIG_ZMK_WIDGET_WPM_STATUS app PRIVATE wpm_status.c) +target_sources_ifdef(CONFIG_ZMK_WIDGET_LABEL app PRIVATE label.c) diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 7ec20c1f..cd5ea1aa 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -36,4 +36,12 @@ config ZMK_WIDGET_WPM_STATUS select LV_USE_LABEL select ZMK_WPM +config ZMK_WIDGET_LABEL + bool "Widget for displaying custom messages" + select LV_USE_LABEL + +config ZMK_WIDGET_LABEL_TEXT + string "Custom message to display, up to 7 characters" + default "ZMK" + endmenu diff --git a/app/src/display/widgets/label.c b/app/src/display/widgets/label.c new file mode 100644 index 00000000..9b11026b --- /dev/null +++ b/app/src/display/widgets/label.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct label_state {}; + +static struct label_state get_state(const zmk_event_t *_eh) { return (struct label_state){}; } + +static void set_label_symbol(lv_obj_t *label) { + char text[7] = {}; + + strcat(text, CONFIG_ZMK_WIDGET_LABEL_TEXT); + + lv_label_set_text(label, text); +} + +static void label_update_cb() { + struct zmk_widget_label *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_label_symbol(widget->obj); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_label, struct label_state, label_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_label, zmk_activity_state_changed); + +int zmk_widget_label_init(struct zmk_widget_label *widget, lv_obj_t *parent) { + widget->obj = lv_label_create(parent); + + sys_slist_append(&widgets, &widget->node); + + widget_label_init(); + return 0; +} + +lv_obj_t *zmk_widget_label_obj(struct zmk_widget_label *widget) { return widget->obj; } diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 96a0074a..c834db39 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -14,15 +14,17 @@ Definition files: - [zmk/app/src/display/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/Kconfig) - [zmk/app/src/display/widgets/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/widgets/Kconfig) -| Config | Type | Description | Default | -| -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | -| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | -| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | -| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | -| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +| Config | Type | Description | Default | +| -------------------------------------------------- | ------ | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | +| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | +| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | +| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +| `ZMK_WIDGET_LABEL` | bool | Enable a widget to display custom messages | n | +| `ZMK_WIDGET_LABEL_TEXT` | string | Custom message to display, up to 7 characters | ZMK | Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. From c7a33223ccbc5f58ae49021ebb1504c0f78b2c8c Mon Sep 17 00:00:00 2001 From: aggstam Date: Tue, 28 Nov 2023 12:55:43 +0200 Subject: [PATCH 2/6] feat(display): label widget text setup cleanup, added a BUILD_ASSERT for text length. --- app/src/display/widgets/label.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/display/widgets/label.c b/app/src/display/widgets/label.c index 9b11026b..b4478d9b 100644 --- a/app/src/display/widgets/label.c +++ b/app/src/display/widgets/label.c @@ -14,6 +14,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include +#define WIDGET_LABEL_TEXT 7 + +BUILD_ASSERT(sizeof(CONFIG_ZMK_WIDGET_LABEL_TEXT) - 1 <= WIDGET_LABEL_TEXT, + "ERROR: Widget label text length is too long. Max length: 7"); + static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct label_state {}; @@ -21,11 +26,7 @@ struct label_state {}; static struct label_state get_state(const zmk_event_t *_eh) { return (struct label_state){}; } static void set_label_symbol(lv_obj_t *label) { - char text[7] = {}; - - strcat(text, CONFIG_ZMK_WIDGET_LABEL_TEXT); - - lv_label_set_text(label, text); + lv_label_set_text(label, CONFIG_ZMK_WIDGET_LABEL_TEXT); } static void label_update_cb() { From 59506826da6861357f66a71145efa7ad6cd23ec4 Mon Sep 17 00:00:00 2001 From: aggstam Date: Tue, 28 Nov 2023 13:02:59 +0200 Subject: [PATCH 3/6] feat(display): label widget text max definition missing _MAX suffix added --- app/src/display/widgets/label.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/display/widgets/label.c b/app/src/display/widgets/label.c index b4478d9b..104ed297 100644 --- a/app/src/display/widgets/label.c +++ b/app/src/display/widgets/label.c @@ -14,9 +14,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define WIDGET_LABEL_TEXT 7 +#define WIDGET_LABEL_TEXT_MAX 7 -BUILD_ASSERT(sizeof(CONFIG_ZMK_WIDGET_LABEL_TEXT) - 1 <= WIDGET_LABEL_TEXT, +BUILD_ASSERT(sizeof(CONFIG_ZMK_WIDGET_LABEL_TEXT) - 1 <= WIDGET_LABEL_TEXT_MAX, "ERROR: Widget label text length is too long. Max length: 7"); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); From 89b12acb72d92e76f2c160157aa80d33840f3787 Mon Sep 17 00:00:00 2001 From: aggstam Date: Wed, 20 Dec 2023 19:05:00 +0200 Subject: [PATCH 4/6] feat(display): label widget removed subscription and listener code --- app/src/display/widgets/label.c | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/app/src/display/widgets/label.c b/app/src/display/widgets/label.c index 104ed297..37ab9be5 100644 --- a/app/src/display/widgets/label.c +++ b/app/src/display/widgets/label.c @@ -11,38 +11,16 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#include -#include #define WIDGET_LABEL_TEXT_MAX 7 BUILD_ASSERT(sizeof(CONFIG_ZMK_WIDGET_LABEL_TEXT) - 1 <= WIDGET_LABEL_TEXT_MAX, "ERROR: Widget label text length is too long. Max length: 7"); -static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); - -struct label_state {}; - -static struct label_state get_state(const zmk_event_t *_eh) { return (struct label_state){}; } - -static void set_label_symbol(lv_obj_t *label) { - lv_label_set_text(label, CONFIG_ZMK_WIDGET_LABEL_TEXT); -} - -static void label_update_cb() { - struct zmk_widget_label *widget; - SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_label_symbol(widget->obj); } -} - -ZMK_DISPLAY_WIDGET_LISTENER(widget_label, struct label_state, label_update_cb, get_state) -ZMK_SUBSCRIPTION(widget_label, zmk_activity_state_changed); - int zmk_widget_label_init(struct zmk_widget_label *widget, lv_obj_t *parent) { widget->obj = lv_label_create(parent); + lv_label_set_text(widget->obj, CONFIG_ZMK_WIDGET_LABEL_TEXT); - sys_slist_append(&widgets, &widget->node); - - widget_label_init(); return 0; } From 2aaa7bc09ed12d0f65100a09d7010152553ce255 Mon Sep 17 00:00:00 2001 From: aggstam Date: Tue, 6 Feb 2024 13:36:20 +0200 Subject: [PATCH 5/6] feat(display): label widget updated licence year and removed text length limit --- app/include/zmk/display/widgets/label.h | 2 +- app/src/display/widgets/Kconfig | 2 +- app/src/display/widgets/label.c | 10 +--------- docs/docs/config/displays.md | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/include/zmk/display/widgets/label.h b/app/include/zmk/display/widgets/label.h index 371faeee..27156f2e 100644 --- a/app/include/zmk/display/widgets/label.h +++ b/app/include/zmk/display/widgets/label.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 The ZMK Contributors + * Copyright (c) 2024 The ZMK Contributors * * SPDX-License-Identifier: MIT */ diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index cd5ea1aa..cec589b9 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -41,7 +41,7 @@ config ZMK_WIDGET_LABEL select LV_USE_LABEL config ZMK_WIDGET_LABEL_TEXT - string "Custom message to display, up to 7 characters" + string "Custom message to display" default "ZMK" endmenu diff --git a/app/src/display/widgets/label.c b/app/src/display/widgets/label.c index 37ab9be5..87a5ea99 100644 --- a/app/src/display/widgets/label.c +++ b/app/src/display/widgets/label.c @@ -1,22 +1,14 @@ /* - * Copyright (c) 2020 The ZMK Contributors + * Copyright (c) 2024 The ZMK Contributors * * SPDX-License-Identifier: MIT */ #include -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - #include #include -#define WIDGET_LABEL_TEXT_MAX 7 - -BUILD_ASSERT(sizeof(CONFIG_ZMK_WIDGET_LABEL_TEXT) - 1 <= WIDGET_LABEL_TEXT_MAX, - "ERROR: Widget label text length is too long. Max length: 7"); - int zmk_widget_label_init(struct zmk_widget_label *widget, lv_obj_t *parent) { widget->obj = lv_label_create(parent); lv_label_set_text(widget->obj, CONFIG_ZMK_WIDGET_LABEL_TEXT); diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index c834db39..b0bce013 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -24,7 +24,7 @@ Definition files: | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | | `ZMK_WIDGET_LABEL` | bool | Enable a widget to display custom messages | n | -| `ZMK_WIDGET_LABEL_TEXT` | string | Custom message to display, up to 7 characters | ZMK | +| `ZMK_WIDGET_LABEL_TEXT` | string | Custom message to display | ZMK | Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. From 9b996ea10b5c6d081c4a40f9b203e5deacbd871f Mon Sep 17 00:00:00 2001 From: aggstam Date: Mon, 5 Aug 2024 13:10:06 +0300 Subject: [PATCH 6/6] feat(display): added symbol dependency and prefixed the labels in the doc --- app/src/display/widgets/Kconfig | 1 + docs/docs/config/displays.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index cec589b9..1e1a0333 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -43,5 +43,6 @@ config ZMK_WIDGET_LABEL config ZMK_WIDGET_LABEL_TEXT string "Custom message to display" default "ZMK" + depends on ZMK_WIDGET_LABEL endmenu diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index b0bce013..f6c1a0f6 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -23,8 +23,8 @@ Definition files: | `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | -| `ZMK_WIDGET_LABEL` | bool | Enable a widget to display custom messages | n | -| `ZMK_WIDGET_LABEL_TEXT` | string | Custom message to display | ZMK | +| `CONFIG_ZMK_WIDGET_LABEL` | bool | Enable a widget to display custom messages | n | +| `CONFIG_ZMK_WIDGET_LABEL_TEXT` | string | Custom message to display | ZMK | Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images.