From 9f222fe700a83bf24298349915f4070f8be9a998 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 19 Apr 2022 13:37:44 -0400 Subject: [PATCH 01/23] fix: Exclude `sof` module to avoid build breakage. --- app/west.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/west.yml b/app/west.yml index 14c494c0..f7e1ae12 100644 --- a/app/west.yml +++ b/app/west.yml @@ -31,5 +31,6 @@ manifest: - openthread - edtt - trusted-firmware-m + - sof self: west-commands: scripts/west-commands.yml From 56465354cfdc00d277339a8603d045f1075f0d90 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 21 Apr 2022 04:05:25 +0000 Subject: [PATCH 02/23] feat(blog): Add second birthday post. --- docs/blog/2022-04-21-zmk-2yo.md | 71 ++++++++++++++++++ .../2022-04-21-zmk-2yo/first-zmk-keyboard.jpg | Bin 0 -> 113210 bytes .../2022-04-21-zmk-2yo/kyria-first-split.jpg | Bin 0 -> 56855 bytes 3 files changed, 71 insertions(+) create mode 100644 docs/blog/2022-04-21-zmk-2yo.md create mode 100644 docs/blog/assets/2022-04-21-zmk-2yo/first-zmk-keyboard.jpg create mode 100644 docs/blog/assets/2022-04-21-zmk-2yo/kyria-first-split.jpg diff --git a/docs/blog/2022-04-21-zmk-2yo.md b/docs/blog/2022-04-21-zmk-2yo.md new file mode 100644 index 00000000..6ebadb96 --- /dev/null +++ b/docs/blog/2022-04-21-zmk-2yo.md @@ -0,0 +1,71 @@ +--- +title: "ZMK's Second Birthday" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [keyboards, firmware, oss] +--- + +Two years ago, today, I minted the first ever commit for ZMK: + +``` +commit 85c8be89dea8f7a00e8efb06d38e2b32f3459935 +Author: Pete Johanson +Date: Tue Apr 21 16:20:34 2020 -0400 + + Initial work. + + .gitignore | 1 + + .gitmodules | 3 +++ + CMakeLists.txt | 40 +++++++++++++++++++++++++++++++++++++++ + src/main.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/zmk_lib.h | 7 +++++++ + zephyr-rust | 1 + + 6 files changed, 112 insertions(+) +``` + +I will never forget that commit. Not because of the code it contained (please don't look, it's not worth it!), but for what it started. + +Working on ZMK has given me the opportunity to reconnect with old friends ([@brixmeister](https://twitter.com/brixmeister) was my Gentoo mentor/sponsor when I became a contributor there on my first ever OSS project, and is a current active Zephyr RTOS contributor!), make new ones, and learn so much from the amazing mechanical keyboard community. + +## First Keyboard + +But I'm getting ahead of myself! Back to early ZMK. I present you the first ZMK keyboard: + +![stm32wb55rg dev kit keyboard](assets/2022-04-21-zmk-2yo/first-zmk-keyboard.jpg) + +That first "keyboard" taught me a _lot_. It forced me to dust off my long forgotten, rudimentary electronics knowledge, and gave me my first taste of really combining the physical/tangible with code in a way that years of doing backend API development never had. + +I was _hooked_. + +## Zephyr RTOS + +Early in my brainstorming, I knew I needed a foundation to build upon that would get me "a lot for free." I evaluated several different real-time operating systems (RTOSes) and happened upon [Zephyr](https://zephyrproject.org/). It immediately ticked all the boxes I wanted: + +- Robust, open source Bluetooth stack, supporting multiple SoCs. At the time, I was trying out stm32wb thanks to some interest among keyboard designers, but I also so there were other compelling choices that might be a good fit. +- An open source, non-copyleft license. I am a firm believer in F/OSS, and wanted to use a license that was as unrestricted as possible. +- Had a lot of core APIs available, so I could focus on the keyboard functionality, not the plumbing. I love tinkering, but I wanted to focus my time on the interesting bits, not infrastructure. + +I'm really happy with the choice, it has served us incredibly well the past two years. + +## Real Keyboard + +At some point, somehow, [innovaker] introduced me to [nicell] who graciously sent me a few of the early pre-production nice!nano controllers, which I was able to get running on my Kyria. Doing so required the first split code, as well as lots of general improvements. + +![kyria keyboard](assets/2022-04-21-zmk-2yo/kyria-first-split.jpg) + +The day I was finally able to type on a wireless, split keyboard running ZMK was deeply momentous for me! + +## Onward and Upward + +We've come a long way since then, with our [supported hardware](/docs/hardware), [features](/docs/features/keymaps) and [behaviors](/docs/behaviors/key-press) growing regularly. + +ZMK powered keyboards are now available in group buys and in stock at various vendors; compatible controllers have been used in a wide range of builds to empower our users to free themselves from their USB/TRRS cables and move about untethered. + +This progress is only possible thanks to all of the contributors who've joined me in the vision for a wireless-first world. I am so grateful for everyone who has given their time to contribute code, answer questions on our Discord server, write more documentation, and especially all the users who have trusted us to make their input devices work. + +I can't wait to see what we can accomplish together in the next two years. + +[innovaker]: https://github.com/innovaker +[nicell]: https://github.com/Nicell diff --git a/docs/blog/assets/2022-04-21-zmk-2yo/first-zmk-keyboard.jpg b/docs/blog/assets/2022-04-21-zmk-2yo/first-zmk-keyboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae119f521f6f509be89e4f54a2f34142eed13467 GIT binary patch literal 113210 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 e0PLM Date: Thu, 21 Apr 2022 22:14:40 +0200 Subject: [PATCH 03/23] doc(backlight): small typo --- docs/docs/features/backlight.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index 6632a0f0..03d206f1 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -103,7 +103,7 @@ Finally you need to add backlight to the `chosen` element of the root devicetree chosen { zmk,backlight = &backlight; }; -}: +}; ``` From 486174fc4139a4364f29e97cdfa93c3245eb80f7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 24 Apr 2022 18:34:45 +0000 Subject: [PATCH 04/23] fix(split): Raise split notification stack size. * Larger stack for split peripheral notifications to avois stack overflow with logging on. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 8b13d524..0ea557d2 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -192,7 +192,7 @@ if !ZMK_SPLIT_BLE_ROLE_CENTRAL config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE int "BLE split peripheral notify thread stack size" - default 512 + default 650 config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY int "BLE split peripheral notify thread priority" From 7443a917cb01484f2bb9fb9294c680eda343e24d Mon Sep 17 00:00:00 2001 From: Luigi311 Date: Sun, 4 Jul 2021 07:06:05 +0000 Subject: [PATCH 05/23] Add ble connection interval support Signed-off-by: Luigi311 --- app/Kconfig | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 0ea557d2..f26b6eb4 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -142,6 +142,30 @@ config ZMK_BLE_PASSKEY_ENTRY bool "Experimental: Requiring typing passkey from host to pair BLE connection" default n +config BT_GAP_AUTO_UPDATE_CONN_PARAMS + bool "Automatic Update of Connection Parameters" + default y + +config BT_GAP_PERIPHERAL_PREF_PARAMS + bool "Configure peripheral preferred connection parameters" + default y + +config BT_PERIPHERAL_PREF_MIN_INT + int "Peripheral preferred minimum connection interval in 1.25ms units" + default 6 + +config BT_PERIPHERAL_PREF_MAX_INT + int "Peripheral preferred maximum connection interval in 1.25ms units" + default 12 + +config BT_PERIPHERAL_PREF_SLAVE_LATENCY + int "Peripheral preferred slave latency in Connection Intervals" + default 30 + +config BT_PERIPHERAL_PREF_TIMEOUT + int "Peripheral preferred supervision timeout in 10ms units" + default 400 + #ZMK_BLE endif @@ -211,9 +235,6 @@ config BT_MAX_PAIRED config BT_MAX_CONN default 1 -config BT_GAP_AUTO_UPDATE_CONN_PARAMS - default n - #!ZMK_SPLIT_BLE_ROLE_CENTRAL endif From 13014d3f284517329fb51e86bc1a94d2764e233a Mon Sep 17 00:00:00 2001 From: Luigi311 Date: Sat, 31 Jul 2021 11:30:42 -0600 Subject: [PATCH 06/23] Remove descriptions and defaults for already set variables Signed-off-by: Luigi311 --- app/Kconfig | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index f26b6eb4..17ea750d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -142,28 +142,16 @@ config ZMK_BLE_PASSKEY_ENTRY bool "Experimental: Requiring typing passkey from host to pair BLE connection" default n -config BT_GAP_AUTO_UPDATE_CONN_PARAMS - bool "Automatic Update of Connection Parameters" - default y - -config BT_GAP_PERIPHERAL_PREF_PARAMS - bool "Configure peripheral preferred connection parameters" - default y - config BT_PERIPHERAL_PREF_MIN_INT - int "Peripheral preferred minimum connection interval in 1.25ms units" default 6 config BT_PERIPHERAL_PREF_MAX_INT - int "Peripheral preferred maximum connection interval in 1.25ms units" default 12 config BT_PERIPHERAL_PREF_SLAVE_LATENCY - int "Peripheral preferred slave latency in Connection Intervals" default 30 config BT_PERIPHERAL_PREF_TIMEOUT - int "Peripheral preferred supervision timeout in 10ms units" default 400 #ZMK_BLE From 2c7e5b9232ad751da85eafd8104e0b5111b91f02 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Thu, 14 Apr 2022 14:25:43 -0500 Subject: [PATCH 07/23] refactor(ble): Use auto phy/conn for split --- app/Kconfig | 6 +++++- app/src/ble.c | 9 --------- app/src/split/bluetooth/central.c | 6 ------ 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 17ea750d..59924f7f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -148,7 +148,7 @@ config BT_PERIPHERAL_PREF_MIN_INT config BT_PERIPHERAL_PREF_MAX_INT default 12 -config BT_PERIPHERAL_PREF_SLAVE_LATENCY +config BT_PERIPHERAL_PREF_LATENCY default 30 config BT_PERIPHERAL_PREF_TIMEOUT @@ -175,6 +175,7 @@ menuconfig ZMK_SPLIT_BLE depends on ZMK_BLE default y select BT_USER_PHY_UPDATE + select BT_AUTO_PHY_UPDATE if ZMK_SPLIT_BLE @@ -223,6 +224,9 @@ config BT_MAX_PAIRED config BT_MAX_CONN default 1 +config BT_PERIPHERAL_PREF_MAX_INT + default 6 + #!ZMK_SPLIT_BLE_ROLE_CENTRAL endif diff --git a/app/src/ble.c b/app/src/ble.c index ed823178..aecf6023 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -398,15 +398,6 @@ static void connected(struct bt_conn *conn, uint8_t err) { LOG_DBG("Connected %s", log_strdup(addr)); - err = bt_conn_le_param_update(conn, BT_LE_CONN_PARAM(0x0006, 0x000c, 30, 400)); - if (err) { - LOG_WRN("Failed to update LE parameters (err %d)", err); - } - -#if IS_SPLIT_PERIPHERAL - bt_conn_le_phy_update(conn, BT_CONN_LE_PHY_PARAM_2M); -#endif - if (bt_conn_set_security(conn, BT_SECURITY_L2)) { LOG_ERR("Failed to set security"); } diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 7eacc675..2f02faaf 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -403,12 +403,6 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { BT_HCI_OP_LE_CREATE_CONN); start_scan(); } - - err = bt_conn_le_phy_update(slot->conn, BT_CONN_LE_PHY_PARAM_2M); - if (err) { - LOG_ERR("Update phy conn failed (err %d)", err); - start_scan(); - } } return false; From 2a38849f4e7ef8afbf8d9574294025ef332b4274 Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Mon, 25 Apr 2022 09:00:28 -0700 Subject: [PATCH 08/23] fix(docs): Fix link to `BT_CTLR_TX_PWR` adjustment in Zephyr docs --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index b163e7ba..46901d15 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -105,7 +105,7 @@ Some users may experience a poor connection between the keyboard and the host. T CONFIG_BT_CTLR_TX_PWR_PLUS_8=y ``` -For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_BT_CTLR_TX_PWR_PLUS_8.html) +For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) ### Other notes and warnings From a3a9510e473276df59dfb955238f03211fda8792 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 25 Apr 2022 16:13:09 -0500 Subject: [PATCH 09/23] refactor(kscan): Use GPIO DT spec macros in matrix driver --- app/drivers/kscan/kscan_gpio_matrix.c | 61 +++++++++------------------ 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index b41e09b7..30bd53fa 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -51,29 +51,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define COND_POLL_OR_INTERRUPTS(pollcode, intcode) \ COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) -// TODO (Zephr 2.6): replace the following -// kscan_gpio_dt_spec -> gpio_dt_spec -// KSCAN_GPIO_DT_SPEC_GET_BY_IDX -> GPIO_DT_SPEC_GET_BY_IDX -// gpio_pin_get -> gpio_pin_get_dt -// gpio_pin_set -> gpio_pin_set_dt -// gpio_pin_interrupt_configure -> gpio_pin_interrupt_configure_dt -struct kscan_gpio_dt_spec { - const struct device *port; - gpio_pin_t pin; - gpio_dt_flags_t dt_flags; -}; - -#define KSCAN_GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, idx) \ - { \ - .port = DEVICE_DT_GET(DT_GPIO_CTLR_BY_IDX(node_id, prop, idx)), \ - .pin = DT_GPIO_PIN_BY_IDX(node_id, prop, idx), \ - .dt_flags = DT_GPIO_FLAGS_BY_IDX(node_id, prop, idx), \ - } - #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - KSCAN_GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx), #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - KSCAN_GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx), enum kscan_diode_direction { KSCAN_ROW2COL, @@ -103,7 +84,7 @@ struct kscan_matrix_data { }; struct kscan_gpio_list { - const struct kscan_gpio_dt_spec *gpios; + const struct gpio_dt_spec *gpios; size_t len; }; @@ -146,9 +127,9 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct kscan_gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; - int err = gpio_pin_set(gpio->port, gpio->pin, value); + int err = gpio_pin_set_dt(gpio, value); if (err) { LOG_ERR("Failed to set output %i to %i: %i", i, value, err); return err; @@ -163,9 +144,9 @@ static int kscan_matrix_interrupt_configure(const struct device *dev, const gpio const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->inputs.len; i++) { - const struct kscan_gpio_dt_spec *gpio = &config->inputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; - int err = gpio_pin_interrupt_configure(gpio->port, gpio->pin, flags); + int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { LOG_ERR("Unable to configure interrupt for pin %u on %s", gpio->pin, gpio->port->name); return err; @@ -248,25 +229,25 @@ static int kscan_matrix_read(const struct device *dev) { // Scan the matrix. for (int o = 0; o < config->outputs.len; o++) { - const struct kscan_gpio_dt_spec *out_gpio = &config->outputs.gpios[o]; + const struct gpio_dt_spec *out_gpio = &config->outputs.gpios[o]; - int err = gpio_pin_set(out_gpio->port, out_gpio->pin, 1); + int err = gpio_pin_set_dt(out_gpio, 1); if (err) { LOG_ERR("Failed to set output %i active: %i", o, err); return err; } for (int i = 0; i < config->inputs.len; i++) { - const struct kscan_gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; + const struct gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; const int index = state_index_io(config, i, o); - const bool active = gpio_pin_get(in_gpio->port, in_gpio->pin); + const bool active = gpio_pin_get_dt(in_gpio); debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, &config->debounce_config); } - err = gpio_pin_set(out_gpio->port, out_gpio->pin, 0); + err = gpio_pin_set_dt(out_gpio, 0); if (err) { LOG_ERR("Failed to set output %i inactive: %i", o, err); return err; @@ -342,14 +323,14 @@ static int kscan_matrix_disable(const struct device *dev) { #endif } -static int kscan_matrix_init_input_inst(const struct device *dev, - const struct kscan_gpio_dt_spec *gpio, const int index) { +static int kscan_matrix_init_input_inst(const struct device *dev, const struct gpio_dt_spec *gpio, + const int index) { if (!device_is_ready(gpio->port)) { LOG_ERR("GPIO is not ready: %s", gpio->port->name); return -ENODEV; } - int err = gpio_pin_configure(gpio->port, gpio->pin, GPIO_INPUT | gpio->dt_flags); + int err = gpio_pin_configure_dt(gpio, GPIO_INPUT); if (err) { LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); return err; @@ -377,7 +358,7 @@ static int kscan_matrix_init_inputs(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->inputs.len; i++) { - const struct kscan_gpio_dt_spec *gpio = &config->inputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; int err = kscan_matrix_init_input_inst(dev, gpio, i); if (err) { return err; @@ -388,13 +369,13 @@ static int kscan_matrix_init_inputs(const struct device *dev) { } static int kscan_matrix_init_output_inst(const struct device *dev, - const struct kscan_gpio_dt_spec *gpio) { + const struct gpio_dt_spec *gpio) { if (!device_is_ready(gpio->port)) { LOG_ERR("GPIO is not ready: %s", gpio->port->name); return -ENODEV; } - int err = gpio_pin_configure(gpio->port, gpio->pin, GPIO_OUTPUT | gpio->dt_flags); + int err = gpio_pin_configure_dt(gpio, GPIO_OUTPUT); if (err) { LOG_ERR("Unable to configure pin %u on %s for output", gpio->pin, gpio->port->name); return err; @@ -409,7 +390,7 @@ static int kscan_matrix_init_outputs(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct kscan_gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; int err = kscan_matrix_init_output_inst(dev, gpio); if (err) { return err; @@ -445,10 +426,10 @@ static const struct kscan_driver_api kscan_matrix_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(index) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct kscan_gpio_dt_spec kscan_matrix_rows_##index[] = { \ + static const struct gpio_dt_spec kscan_matrix_rows_##index[] = { \ UTIL_LISTIFY(INST_ROWS_LEN(index), KSCAN_GPIO_ROW_CFG_INIT, index)}; \ \ - static const struct kscan_gpio_dt_spec kscan_matrix_cols_##index[] = { \ + static const struct gpio_dt_spec kscan_matrix_cols_##index[] = { \ UTIL_LISTIFY(INST_COLS_LEN(index), KSCAN_GPIO_COL_CFG_INIT, index)}; \ \ static struct debounce_state kscan_matrix_state_##index[INST_MATRIX_LEN(index)]; \ From 6d6efa32f5cb279e4dc5836a023b3ae3fafc6f6f Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 25 Apr 2022 16:48:33 -0500 Subject: [PATCH 10/23] refactor(kscan): Auto enable kscan drivers The key scanning drivers are now automatically enabled when a DT node with the matching "compatible" property is present and enabled, so they no longer need to be manually set for each board. --- app/Kconfig | 6 ---- app/boards/arm/ferris/Kconfig.defconfig | 3 -- app/boards/arm/ferris/ferris_rev02_defconfig | 2 -- app/boards/native_posix.conf | 3 -- app/boards/native_posix_64.conf | 3 -- app/drivers/kscan/CMakeLists.txt | 6 ++-- app/drivers/kscan/Kconfig | 32 +++++++++++++++++-- app/drivers/kscan/kscan_gpio_demux.c | 4 --- app/drivers/kscan/kscan_gpio_direct.c | 4 --- app/drivers/kscan/kscan_gpio_matrix.c | 4 --- .../backlight/basic/native_posix_64.conf | 3 -- .../backlight/config-brt/native_posix_64.conf | 3 -- .../backlight/config-on/native_posix_64.conf | 3 -- .../config-step/native_posix_64.conf | 3 -- .../backlight/cycle/native_posix_64.conf | 3 -- .../low-brightness/native_posix_64.conf | 3 -- .../1-single_keypress/native_posix_64.conf | 3 -- .../2-multiple_keypress/native_posix_64.conf | 3 -- 18 files changed, 33 insertions(+), 58 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 59924f7f..fea2203d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -461,12 +461,6 @@ config ZMK_KSCAN_EVENT_QUEUE_SIZE int "Size of the event queue for KSCAN events to buffer events" default 4 -config ZMK_KSCAN_MOCK_DRIVER - bool "Enable mock kscan driver to simulate key presses" - -config ZMK_KSCAN_COMPOSITE_DRIVER - bool "Enable composite kscan driver to combine kscan devices" - #KSCAN Settings endmenu diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig index 23bc8a1e..c59cb902 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -17,7 +17,4 @@ config ZMK_USB config ZMK_KSCAN_MATRIX_POLLING default y -config ZMK_KSCAN_COMPOSITE_DRIVER - default y - endif # BOARD_FERRIS diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig index 8742cd86..934dc4a0 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -17,8 +17,6 @@ CONFIG_I2C=y # ZMK Settings CONFIG_ZMK_USB=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=y -CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER=y CONFIG_ZMK_KSCAN_MATRIX_POLLING=y CONFIG_USB_SELF_POWERED=n diff --git a/app/boards/native_posix.conf b/app/boards/native_posix.conf index fa9d953e..c3d0260e 100644 --- a/app/boards/native_posix.conf +++ b/app/boards/native_posix.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=n CONFIG_ZMK_BLE=n CONFIG_LOG=y diff --git a/app/boards/native_posix_64.conf b/app/boards/native_posix_64.conf index 7d3e62b7..0d8e0d81 100644 --- a/app/boards/native_posix_64.conf +++ b/app/boards/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=n # Enable to have the native posix build expose USBIP device(s) # CONFIG_ZMK_USB=y diff --git a/app/drivers/kscan/CMakeLists.txt b/app/drivers/kscan/CMakeLists.txt index c19fa431..ced31e6f 100644 --- a/app/drivers/kscan/CMakeLists.txt +++ b/app/drivers/kscan/CMakeLists.txt @@ -5,8 +5,8 @@ zephyr_library_named(zmk__drivers__kscan) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) -zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio_matrix.c) -zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio_direct.c) -zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio_demux.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DEMUX kscan_gpio_demux.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_MOCK_DRIVER kscan_mock.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER kscan_composite.c) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 3ffec09c..c9ace0a3 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -1,11 +1,39 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT +DT_COMPAT_ZMK_KSCAN_COMPOSITE := zmk,kscan-composite +DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX := zmk,kscan-gpio-demux +DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT := zmk,kscan-gpio-direct +DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix +DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock + +config ZMK_KSCAN_COMPOSITE_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) + config ZMK_KSCAN_GPIO_DRIVER - bool "Enable GPIO kscan driver to detect key presses" - default y + bool select GPIO +config ZMK_KSCAN_GPIO_DEMUX + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) + select ZMK_KSCAN_GPIO_DRIVER + +config ZMK_KSCAN_GPIO_DIRECT + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) + select ZMK_KSCAN_GPIO_DRIVER + +config ZMK_KSCAN_GPIO_MATRIX + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) + select ZMK_KSCAN_GPIO_DRIVER + +config ZMK_KSCAN_MOCK_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) + if ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_MATRIX_POLLING diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index e064a942..6e3d9e79 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -13,8 +13,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - struct kscan_gpio_item_config { char *label; gpio_pin_t pin; @@ -251,5 +249,3 @@ struct kscan_gpio_item_config { &gpio_driver_api_##n); DT_INST_FOREACH_STATUS_OKAY(GPIO_INST_INIT) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 3f4f5a1b..a67f0895 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -13,8 +13,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - struct kscan_gpio_item_config { char *label; gpio_pin_t pin; @@ -242,5 +240,3 @@ static const struct kscan_driver_api gpio_driver_api = { &gpio_driver_api); DT_INST_FOREACH_STATUS_OKAY(GPIO_INST_INIT) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 30bd53fa..4ef5d5a0 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -19,8 +19,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DT_DRV_COMPAT zmk_kscan_gpio_matrix -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - #define INST_DIODE_DIR(n) DT_ENUM_IDX(DT_DRV_INST(n), diode_direction) #define COND_DIODE_DIR(n, row2col_code, col2row_code) \ COND_CODE_0(INST_DIODE_DIR(n), row2col_code, col2row_code) @@ -463,5 +461,3 @@ static const struct kscan_driver_api kscan_matrix_api = { CONFIG_APPLICATION_INIT_PRIORITY, &kscan_matrix_api); DT_INST_FOREACH_STATUS_OKAY(KSCAN_MATRIX_INIT); - -#endif // DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/tests/backlight/basic/native_posix_64.conf b/app/tests/backlight/basic/native_posix_64.conf index 565121d3..bd29a072 100644 --- a/app/tests/backlight/basic/native_posix_64.conf +++ b/app/tests/backlight/basic/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/backlight/config-brt/native_posix_64.conf b/app/tests/backlight/config-brt/native_posix_64.conf index 0d0758c0..65cdd326 100644 --- a/app/tests/backlight/config-brt/native_posix_64.conf +++ b/app/tests/backlight/config-brt/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/backlight/config-on/native_posix_64.conf b/app/tests/backlight/config-on/native_posix_64.conf index 241c66a7..eb9e7c8a 100644 --- a/app/tests/backlight/config-on/native_posix_64.conf +++ b/app/tests/backlight/config-on/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/backlight/config-step/native_posix_64.conf b/app/tests/backlight/config-step/native_posix_64.conf index 4df7a861..c03eb7b0 100644 --- a/app/tests/backlight/config-step/native_posix_64.conf +++ b/app/tests/backlight/config-step/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/backlight/cycle/native_posix_64.conf b/app/tests/backlight/cycle/native_posix_64.conf index 565121d3..bd29a072 100644 --- a/app/tests/backlight/cycle/native_posix_64.conf +++ b/app/tests/backlight/cycle/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/backlight/low-brightness/native_posix_64.conf b/app/tests/backlight/low-brightness/native_posix_64.conf index 565121d3..bd29a072 100644 --- a/app/tests/backlight/low-brightness/native_posix_64.conf +++ b/app/tests/backlight/low-brightness/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=y CONFIG_GPIO_EMUL=y CONFIG_ZMK_BLE=n diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.conf b/app/tests/wpm/1-single_keypress/native_posix_64.conf index 360e77d5..670f63d8 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.conf +++ b/app/tests/wpm/1-single_keypress/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=n CONFIG_ZMK_BLE=n CONFIG_LOG=y diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.conf b/app/tests/wpm/2-multiple_keypress/native_posix_64.conf index f0e1a480..980eff5c 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.conf +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.conf @@ -1,6 +1,3 @@ -CONFIG_KSCAN=n -CONFIG_ZMK_KSCAN_MOCK_DRIVER=y -CONFIG_ZMK_KSCAN_GPIO_DRIVER=n CONFIG_GPIO=n CONFIG_ZMK_BLE=n CONFIG_LOG=y From 11ab52582c0aa66de221d80795af63ea3a9b5428 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 18 Apr 2022 21:02:20 -0500 Subject: [PATCH 11/23] refactor(battery): Auto enable battery drivers CONFIG_ZMK_BATTERY_NRF_VDDH and CONFIG_ZMK_BATTERY_VOLTAGE_DIVIDER are now automatically enabled if a DT node with the matching "compatible" property is present and enabled, so they no longer need to be manually set for each board. --- app/boards/arm/bluemicro840/Kconfig.defconfig | 3 --- app/boards/arm/bt60/Kconfig.defconfig | 3 --- app/boards/arm/mikoto/Kconfig.defconfig | 3 --- app/boards/arm/nice60/Kconfig.defconfig | 3 --- app/boards/arm/nice_nano/Kconfig.defconfig | 14 -------------- app/boards/arm/nrfmicro/Kconfig.defconfig | 3 --- app/boards/arm/s40nc/Kconfig.defconfig | 3 --- app/boards/seeeduino_xiao_ble.conf | 1 - app/drivers/sensor/battery/Kconfig | 9 +++++++-- 9 files changed, 7 insertions(+), 35 deletions(-) diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index bc68f311..5d911ec6 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -24,7 +24,4 @@ config ZMK_BLE config ZMK_USB default y -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - endif # BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig index 7e7ab124..bad1e7cd 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -25,9 +25,6 @@ config ZMK_BLE config ZMK_USB default y -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - config ZMK_KEYBOARD_NAME default "BT60" diff --git a/app/boards/arm/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig index 2ca77b9e..6aafc613 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -34,7 +34,4 @@ choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA endchoice -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - endif # BOARD_MIKOTO_520 diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index 42d417ab..39cf1540 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -22,7 +22,4 @@ config ZMK_BLE config ZMK_USB default y -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - endif # BOARD_NICE60 diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index 24571653..ad3fefef 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -23,17 +23,3 @@ config ZMK_USB default y endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 - -if BOARD_NICE_NANO - -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - -endif # BOARD_NICE_NANO - -if BOARD_NICE_NANO_V2 - -config ZMK_BATTERY_NRF_VDDH - default y - -endif # BOARD_NICE_NANO_V2 diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 754a430e..159d9ade 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -32,9 +32,6 @@ if BOARD_NRFMICRO_13 config BOARD_NRFMICRO_CHARGER default y -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - endif # BOARD_NRFMICRO_13 endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig index 0f407151..266f8443 100644 --- a/app/boards/arm/s40nc/Kconfig.defconfig +++ b/app/boards/arm/s40nc/Kconfig.defconfig @@ -25,7 +25,4 @@ config ZMK_BLE config ZMK_USB default y -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - endif # BOARD_S40NC diff --git a/app/boards/seeeduino_xiao_ble.conf b/app/boards/seeeduino_xiao_ble.conf index 22e6a9b5..92367028 100644 --- a/app/boards/seeeduino_xiao_ble.conf +++ b/app/boards/seeeduino_xiao_ble.conf @@ -3,7 +3,6 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_UART_INTERRUPT_DRIVEN=n -CONFIG_ZMK_BATTERY_VOLTAGE_DIVIDER=y CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index fd8cd26d..d7c82bb0 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -1,20 +1,25 @@ # Copyright (c) 2020-2021 The ZMK Contributors # SPDX-License-Identifier: MIT +DT_COMPAT_ZMK_BATTERY_NRF_VDDH := zmk,battery-nrf-vddh +DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER := zmk,battery-voltage-divider + config ZMK_BATTERY bool "ZMK battery monitoring" help Enable battery monitoring config ZMK_BATTERY_NRF_VDDH - bool "ZMK nRF VDDH battery monitoring" + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) select ADC select ZMK_BATTERY help Enable ZMK nRF VDDH voltage driver for battery monitoring. config ZMK_BATTERY_VOLTAGE_DIVIDER - bool "ZMK battery voltage divider" + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) select ADC select ZMK_BATTERY help From dffae5cf2b5f7ad399363109088bb5a75228d893 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Tue, 26 Apr 2022 12:12:52 -0400 Subject: [PATCH 12/23] fix(docs): Correct default Mod-Tap behavior --- docs/docs/behaviors/mod-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/mod-tap.md b/docs/docs/behaviors/mod-tap.md index 9ad25f39..cc2b1ce0 100644 --- a/docs/docs/behaviors/mod-tap.md +++ b/docs/docs/behaviors/mod-tap.md @@ -46,4 +46,4 @@ You can configure a different tapping term in your keymap: ### Additional information -The mod-tap is a [hold-tap](hold-tap.md) under the hood with the "balanced" flavor and tapping-term-ms 200. +The mod-tap is a [hold-tap](hold-tap.md) under the hood with the "hold-preferred" flavor and tapping-term-ms 200. From b5efc7a7eb0f64a6c98b7c487cc94bc26948c146 Mon Sep 17 00:00:00 2001 From: Andrew Rae <56003701+andrewjrae@users.noreply.github.com> Date: Wed, 27 Apr 2022 05:33:22 -0700 Subject: [PATCH 13/23] feat(behaviors): Add `global-quick-tap` --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 ++ app/src/behaviors/behavior_hold_tap.c | 33 ++++++++++++++----- .../1-basic/events.patterns | 6 ++++ .../1-basic/keycode_events.snapshot | 24 ++++++++++++++ .../1-basic/native_posix.keymap | 25 ++++++++++++++ .../2-double-hold/events.patterns | 6 ++++ .../2-double-hold/keycode_events.snapshot | 12 +++++++ .../2-double-hold/native_posix.keymap | 20 +++++++++++ .../8-global-quick-tap/behavior_keymap.dtsi | 29 ++++++++++++++++ .../1-basic/events.patterns | 6 ++++ .../1-basic/keycode_events.snapshot | 24 ++++++++++++++ .../1-basic/native_posix.keymap | 25 ++++++++++++++ .../2-double-hold/events.patterns | 6 ++++ .../2-double-hold/keycode_events.snapshot | 12 +++++++ .../2-double-hold/native_posix.keymap | 20 +++++++++++ .../8-global-quick-tap/behavior_keymap.dtsi | 29 ++++++++++++++++ .../1-basic/events.patterns | 6 ++++ .../1-basic/keycode_events.snapshot | 24 ++++++++++++++ .../1-basic/native_posix.keymap | 25 ++++++++++++++ .../2-double-hold/events.patterns | 6 ++++ .../2-double-hold/keycode_events.snapshot | 12 +++++++ .../2-double-hold/native_posix.keymap | 20 +++++++++++ .../8-global-quick-tap/behavior_keymap.dtsi | 29 ++++++++++++++++ .../1-basic/events.patterns | 6 ++++ .../1-basic/keycode_events.snapshot | 24 ++++++++++++++ .../1-basic/native_posix.keymap | 25 ++++++++++++++ .../2-double-hold/events.patterns | 6 ++++ .../2-double-hold/keycode_events.snapshot | 12 +++++++ .../2-double-hold/native_posix.keymap | 20 +++++++++++ .../6-global-quick-tap/behavior_keymap.dtsi | 29 ++++++++++++++++ docs/docs/behaviors/hold-tap.md | 23 +++++++++++++ 31 files changed, 538 insertions(+), 8 deletions(-) create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix.keymap create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix.keymap create mode 100644 app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix.keymap create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap create mode 100644 app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix.keymap create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap create mode 100644 app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix.keymap create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix.keymap create mode 100644 app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index 09691159..e4cfaeab 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -20,6 +20,8 @@ properties: default: -1 quick_tap_ms: # deprecated type: int + global-quick-tap: + type: boolean flavor: type: string required: false diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 030cd3dd..413806b4 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -57,6 +57,7 @@ struct behavior_hold_tap_config { char *hold_behavior_dev; char *tap_behavior_dev; int quick_tap_ms; + bool global_quick_tap; enum flavor flavor; bool retro_tap; int32_t hold_trigger_key_positions_len; @@ -88,22 +89,33 @@ struct active_hold_tap active_hold_taps[ZMK_BHV_HOLD_TAP_MAX_HELD] = {}; // We capture most position_state_changed events and some modifiers_state_changed events. const zmk_event_t *captured_events[ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS] = {}; -// Keep track of which key was tapped most recently for 'quick_tap_ms' +// Keep track of which key was tapped most recently for the standard, if it is a hold-tap +// a position, will be given, if not it will just be INT32_MIN struct last_tapped { int32_t position; - int64_t tap_deadline; + int64_t timestamp; }; -struct last_tapped last_tapped; +struct last_tapped last_tapped = {INT32_MIN, INT64_MIN}; -static void store_last_tapped(struct active_hold_tap *hold_tap) { +static void store_last_tapped(int64_t timestamp) { + if (timestamp > last_tapped.timestamp) { + last_tapped.position = INT32_MIN; + last_tapped.timestamp = timestamp; + } +} + +static void store_last_hold_tapped(struct active_hold_tap *hold_tap) { last_tapped.position = hold_tap->position; - last_tapped.tap_deadline = hold_tap->timestamp + hold_tap->config->quick_tap_ms; + last_tapped.timestamp = hold_tap->timestamp; } static bool is_quick_tap(struct active_hold_tap *hold_tap) { - return last_tapped.position == hold_tap->position && - last_tapped.tap_deadline > hold_tap->timestamp; + if (hold_tap->config->global_quick_tap || last_tapped.position == hold_tap->position) { + return (last_tapped.timestamp + hold_tap->config->quick_tap_ms) > hold_tap->timestamp; + } else { + return false; + } } static int capture_event(const zmk_event_t *event) { @@ -362,7 +374,7 @@ static int press_binding(struct active_hold_tap *hold_tap) { } else { binding.behavior_dev = hold_tap->config->tap_behavior_dev; binding.param1 = hold_tap->param_tap; - store_last_tapped(hold_tap); + store_last_hold_tapped(hold_tap); } return behavior_keymap_binding_pressed(&binding, event); } @@ -619,6 +631,10 @@ static int keycode_state_changed_listener(const zmk_event_t *eh) { // we want to catch layer-up events too... how? struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); + if (ev->state && !is_mod(ev->usage_page, ev->keycode)) { + store_last_tapped(ev->timestamp); + } + if (undecided_hold_tap == NULL) { // LOG_DBG("0x%02X bubble (no undecided hold_tap active)", ev->keycode); return ZMK_EV_EVENT_BUBBLE; @@ -680,6 +696,7 @@ static int behavior_hold_tap_init(const struct device *dev) { .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ + .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot new file mode 100644 index 00000000..dc1ac805 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot @@ -0,0 +1,24 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (balanced decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (balanced decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-timer (balanced decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (balanced decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix.keymap new file mode 100644 index 00000000..93076055 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix.keymap @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot new file mode 100644 index 00000000..baaadf04 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-timer (balanced decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-timer (balanced decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix.keymap new file mode 100644 index 00000000..37c37f55 --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix.keymap @@ -0,0 +1,20 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi new file mode 100644 index 00000000..0966ce0d --- /dev/null +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi @@ -0,0 +1,29 @@ +#include +#include +#include + +/ { + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C + &kp D &none>; + }; + }; +}; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot new file mode 100644 index 00000000..27feeb8e --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot @@ -0,0 +1,24 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (hold-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (hold-preferred decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (hold-preferred decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix.keymap new file mode 100644 index 00000000..ee0d5e80 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix.keymap @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot new file mode 100644 index 00000000..797a6ab4 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-timer (hold-preferred decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap new file mode 100644 index 00000000..37c37f55 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap @@ -0,0 +1,20 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi new file mode 100644 index 00000000..fee3361e --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -0,0 +1,29 @@ +#include +#include +#include + +/ { + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &hp LEFT_SHIFT F &hp LEFT_CONTROL G + &kp D &none>; + }; + }; +}; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot new file mode 100644 index 00000000..455b3330 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot @@ -0,0 +1,24 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix.keymap new file mode 100644 index 00000000..93076055 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix.keymap @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot new file mode 100644 index 00000000..ef428873 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-timer (tap-preferred decision moment timer) +kp_pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap new file mode 100644 index 00000000..37c37f55 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix.keymap @@ -0,0 +1,20 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi new file mode 100644 index 00000000..4771ab75 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -0,0 +1,29 @@ +#include +#include +#include + +/ { + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL C + &kp D &none>; + }; + }; +}; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot new file mode 100644 index 00000000..03bc0289 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot @@ -0,0 +1,24 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-unless-interrupted decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-unless-interrupted decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-unless-interrupted decision moment timer) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-unless-interrupted decision moment quick-tap) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix.keymap new file mode 100644 index 00000000..93076055 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix.keymap @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns new file mode 100644 index 00000000..4db21917 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns @@ -0,0 +1,6 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p +s/.*update_hold_status_for_retro_tap/update_hold_status_for_retro_tap/p +s/.*decide_retro_tap/decide_retro_tap/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot new file mode 100644 index 00000000..dfd2e934 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-unless-interrupted decision moment timer) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-unless-interrupted decision moment timer) +kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix.keymap new file mode 100644 index 00000000..37c37f55 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix.keymap @@ -0,0 +1,20 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi new file mode 100644 index 00000000..6ca7ac72 --- /dev/null +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi @@ -0,0 +1,29 @@ +#include +#include +#include + +/ { + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; +}; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f7c386b3..d0255c70 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -48,6 +48,29 @@ If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`. +#### `global-quick-tap` + +If global quick tap is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped but for any key tap before it. This effectively disables the hold tap when typing quickly, which can be quite useful for home row mods. It can also have the effect of removing the input delay when typing quickly. + +For example, the following hold-tap configuration enables global quick tap with a 125 millisecond term. + +``` +gqt: global-quick-tap { + compatible = "zmk,behavior-hold-tap"; + label = "GLOBAL_QUICK_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <125>; + global-quick-tap; + bindings = <&kp>, <&kp>; +}; +``` + +If you press `&kp A` and then `&gqt LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `quick-tap-ms`. This quick-tap behavior will work for any key press, whether it is within a behavior like hold-tap, or a simple `&kp`. This means the `&gqt LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** a key press. + +Note that the higher the `quick-tap-ms` the harder it will be to use the hold behavior, making this less applicable for something like capitalizing letter while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. + #### `retro-tap` If retro tap is enabled, the tap behavior is triggered when releasing the hold-tap key if no other key was pressed in the meantime. From 16ffc7aca68d98c46fcafe5c69f5827a2498957e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 29 Apr 2022 15:19:47 +0000 Subject: [PATCH 14/23] fix(build): Temporarily disable user build caching * GH Actions errors, disabling caching of west modules for now. --- .github/workflows/build-user-config.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index cb462b1a..465ceb1a 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -1,21 +1,21 @@ name: Reusable user config build -on: +on: workflow_call: inputs: build_matrix_path: - description: 'Path to the build matrix file' - default: 'build.yaml' + description: "Path to the build matrix file" + default: "build.yaml" required: false type: string config_path: - description: 'Path to the config directory' - default: 'config' + description: "Path to the config directory" + default: "config" required: false type: string fallback_binary: - description: 'Fallback binary format, if no *.uf2 file was built' - default: 'bin' + description: "Fallback binary format, if no *.uf2 file was built" + default: "bin" required: false type: string @@ -71,6 +71,7 @@ jobs: - name: Cache west modules uses: actions/cache@v3.0.1 + if: false # Disabled for now, caching is broken env: cache-name: cache-zephyr-${{ steps.variables.outputs.zephyr-version }}-modules with: @@ -101,7 +102,7 @@ jobs: - name: ${{ steps.variables.outputs.display-name }} Kconfig file run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" | sort - + - name: Rename artifacts run: | mkdir build/artifacts @@ -112,7 +113,7 @@ jobs: then cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ steps.variables.outputs.artifact-name }}.${{ inputs.fallback_binary }}" fi - + - name: Archive (${{ steps.variables.outputs.display-name }}) uses: actions/upload-artifact@v2 with: From aa3773fb9333dce03e1d5d9507b25ce92ee091d3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 29 Apr 2022 16:31:26 +0000 Subject: [PATCH 15/23] fix(build): Use `continue-on-error` for cache. * Switch to attempting caching, but with `continue-on-error` so we don't fail builds while waiting on GH Actions fix. --- .github/workflows/build-user-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 465ceb1a..c3aeff20 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -71,7 +71,7 @@ jobs: - name: Cache west modules uses: actions/cache@v3.0.1 - if: false # Disabled for now, caching is broken + continue-on-error: true env: cache-name: cache-zephyr-${{ steps.variables.outputs.zephyr-version }}-modules with: From e5843b268c3f4c6f08e8076a79695f4da3e604a6 Mon Sep 17 00:00:00 2001 From: Dom H Date: Fri, 29 Apr 2022 17:03:32 +0100 Subject: [PATCH 16/23] fix(docs): Clarify `timeout-ms` for Combos --- docs/docs/features/combos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 550bd251..55e1563c 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -25,7 +25,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - The name of the combo doesn't really matter, but convention is to start the node name with `combo_`. - The `compatible` property should always be `"zmk,combos"` for combos. -- `timeout-ms` is the number of milliseconds that all keys of the combo must be pressed. +- `timeout-ms` is the length of the window (in milliseconds) in which all keys of the combo must be pressed in order to successfully trigger the combo. - `key-positions` is an array of key positions. See the info section below about how to figure out the positions on your board. - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. From d33b35513b4a01b365f6b82f6c0d63e22e56d849 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Tue, 26 Apr 2022 12:59:16 -0500 Subject: [PATCH 17/23] feat(usb): Set default HID interval to 1ms (1000Hz) --- app/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index fea2203d..9b47c4c2 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -88,6 +88,9 @@ if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES default 10 +config USB_HID_POLL_INTERVAL_MS + default 1 + #ZMK_USB endif From d7b912b79843391d79b96a592ebb611324e68c1b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:37:51 -0500 Subject: [PATCH 18/23] fix(docs): Fix broken links in FAQs --- docs/docs/faq.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 6a16f6f8..36ecc010 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -7,10 +7,10 @@ sidebar_label: FAQs As a best-in-class RTOS, Zephyr™ brings many [benefits](https://www.zephyrproject.org/benefits) to ZMK, such as: -- A _single_ platform [supporting](https://docs.zephyrproject.org/latest/boards) many architectures, processors and boards. +- A _single_ platform [supporting](https://docs.zephyrproject.org/latest/boards/index.html) many architectures, processors and boards. - Optimization for low-powered, small memory footprint devices. -- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/latest/guides/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/latest/guides/kconfig/index.html). -- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG. +- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/latest/guides/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/latest/build/kconfig/index.html). +- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG. - Multi-processor support, which is critical for power efficiency in upcoming MCUs. - Permissive licensing with its Apache 2.0 open source [license](https://www.apache.org/licenses/LICENSE-2.0). - A buzzing developer [community](https://github.com/zephyrproject-rtos/zephyr) including many leading [embedded technology](https://www.zephyrproject.org/project-members) companies. From 8bbbf530a70685fa5b84e24526cb685c70c099e5 Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Sun, 1 May 2022 12:59:38 -0700 Subject: [PATCH 19/23] fix(docs): Remove code-snippet backticks from customization.md title Discussed here: https://discord.com/channels/719497620560543766/883452966114324550/970385441134104747 Code snippets in titles are not formatted properly in page titles --- docs/docs/customization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/customization.md b/docs/docs/customization.md index 47ebe417..ff5da61d 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -1,5 +1,5 @@ --- -title: Customizing ZMK/`zmk-config` folders +title: Customizing ZMK/zmk-config folders sidebar_label: Customizing ZMK --- From 6227866e8c0672247eb747de3f3cb4d0ede875e4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 3 May 2022 02:54:38 +0000 Subject: [PATCH 20/23] feat(setup): Disallow split w/ wired controller. For now, disallow wired split combination during setup. --- docs/src/setup-script-generation-plugin/index.js | 1 + docs/src/templates/setup.ps1.mustache | 11 +++++++++++ docs/src/templates/setup.sh.mustache | 7 +++++++ 3 files changed, 19 insertions(+) diff --git a/docs/src/setup-script-generation-plugin/index.js b/docs/src/setup-script-generation-plugin/index.js index 908ac659..87e77141 100644 --- a/docs/src/setup-script-generation-plugin/index.js +++ b/docs/src/setup-script-generation-plugin/index.js @@ -30,6 +30,7 @@ function generateSetupScripts() { if (item.features?.includes("keys")) { agg.keyboards.push(item); } else { + item.usb_only = !item.outputs?.includes("ble"); agg.boards.push(item); } break; diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index 4af4d79d..54c5ae82 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -125,12 +125,23 @@ if ($keyboard_type -eq "shield") { {{id}} = "{{{name}}}"; {{/boards}} } + $boards_usb_only = [ordered]@{ + {{#boards}} + {{id}} = "{{usb_only}}"; + {{/boards}} + } Write-Host "$title" Write-Host "" Write-Host "MCU Board Selection:" $choice = Get-Choice-From-Options -Options $boards.values -Prompt $prompt + + if ($keyboard_split -eq "true" -and $($($boards_usb_only.values)[$choice]) -eq "true") { + Write-Host "Wired split is not yet supported by ZMK." + exit 1 + } + $shields = $keyboard_siblings $board = $($($boards.keys)[$choice]) $boards = ( $board ) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index cec164a2..a8a2da22 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -120,6 +120,7 @@ if [ "$keyboard_shield" == "y" ]; then prompt="Pick an MCU board:" options=({{#boards}}"{{{name}}}" {{/boards}}) board_ids=({{#boards}}"{{id}}" {{/boards}}) + boards_usb_only=({{#boards}}"{{#usb_only}}y{{/usb_only}}{{^usb_only}}n{{/usb_only}}" {{/boards}}) echo "" echo "MCU Board Selection:" @@ -134,6 +135,12 @@ if [ "$keyboard_shield" == "y" ]; then echo "Invalid option. Try another one." continue fi + + if [ -n "${!keyboard_sibling_first}" ] && [ "${boards_usb_only[$board_index]}" = "y" ] ; then + echo "Wired split is not yet supported by ZMK." + exit 1 + fi + board_index=$(( $REPLY-1 )) board=${board_ids[$board_index]} board_title=${options[$board_index]} From 41dc774848dace9b4bcfa59691c81a229dd416e1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 May 2022 22:58:56 -0400 Subject: [PATCH 21/23] fix(boards): Fix key position 4 flakiness w/ RGB * Remove MISO pin from pinctrl for BDN9 rev2 board, to avoid the 4th switch being set up for an alternate function, which was causing spurious key press events to be triggered. --- app/boards/arm/bdn9/bdn9_rev2.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index 8a66be07..e75893d6 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -72,7 +72,7 @@ &spi2 { status = "okay"; - pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; pinctrl-names = "default"; led_strip: ws2812@0 { From eca37b62192716b8a2a1b923c7eee1ff24b7bad1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 8 May 2022 18:22:03 +0000 Subject: [PATCH 22/23] fix(boards): Add flash/settings for XIAO BLE * Ensure flash/NVS/settings configs are enabled. --- app/boards/seeeduino_xiao_ble.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/boards/seeeduino_xiao_ble.conf b/app/boards/seeeduino_xiao_ble.conf index 92367028..205f67e9 100644 --- a/app/boards/seeeduino_xiao_ble.conf +++ b/app/boards/seeeduino_xiao_ble.conf @@ -6,3 +6,10 @@ CONFIG_UART_INTERRUPT_DRIVEN=n CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y \ No newline at end of file From 19cc96b86dd53bfa7a9926b4b7ddb448ddf4c4d3 Mon Sep 17 00:00:00 2001 From: zhiayang Date: Mon, 9 May 2022 23:28:41 +0800 Subject: [PATCH 23/23] fix(boards): Fix battery ADC channel for Mikoto --- app/boards/arm/mikoto/mikoto_520.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 44321e79..49d9d6be 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -38,7 +38,7 @@ vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; - io-channels = <&adc 2>; + io-channels = <&adc 1>; output-ohms = <10000000>; full-ohms = <(10000000 + 4000000)>; };