From 0988523851236da07c68e7683261ca8464df5b3a Mon Sep 17 00:00:00 2001 From: russell-myers1 <124931768+russell-myers1@users.noreply.github.com> Date: Tue, 19 Nov 2024 12:37:39 -0800 Subject: [PATCH 1/5] Fix typo in docs/api_development_overview.md (#24620) --- docs/api_development_overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api_development_overview.md b/docs/api_development_overview.md index e55d0341006..eb164bec525 100644 --- a/docs/api_development_overview.md +++ b/docs/api_development_overview.md @@ -4,7 +4,7 @@ This page attempts to introduce developers to the QMK Compiler. It does not go i # Overview -The QMK Compile API consists of a few movings parts: +The QMK Compile API consists of a few moving parts: ![Architecture Diagram](https://raw.githubusercontent.com/qmk/qmk_api/master/docs/architecture.svg) From c843ad1268863849f84dead17c3cea57800879df Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 20 Nov 2024 08:59:07 +1100 Subject: [PATCH 2/5] Add Sagittarius encoder support. (#24617) --- .../cannonkeys/sagittarius/keyboard.json | 8 ++++ .../sagittarius/keymaps/default/keymap.c | 7 ++++ .../sagittarius/keymaps/default/rules.mk | 2 + .../cannonkeys/sagittarius/sagittarius.c | 40 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 keyboards/cannonkeys/sagittarius/keymaps/default/rules.mk create mode 100644 keyboards/cannonkeys/sagittarius/sagittarius.c diff --git a/keyboards/cannonkeys/sagittarius/keyboard.json b/keyboards/cannonkeys/sagittarius/keyboard.json index 8f83a42984b..e64268ab53a 100644 --- a/keyboards/cannonkeys/sagittarius/keyboard.json +++ b/keyboards/cannonkeys/sagittarius/keyboard.json @@ -60,6 +60,14 @@ "resync": true } }, + "encoder": { + "rotary": [ + {"pin_a": "B12", "pin_b": "B11", "resolution": 2}, + {"pin_a": "B12", "pin_b": "B11", "resolution": 2}, + {"pin_a": "B12", "pin_b": "B11", "resolution": 2}, + {"pin_a": "B12", "pin_b": "B11", "resolution": 2} + ] + }, "layouts": { "LAYOUT_default": { "layout": [ diff --git a/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c b/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c index 093895bb99f..a97574c7745 100644 --- a/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c +++ b/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c @@ -44,3 +44,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_HUED, UG_HUEU), ENCODER_CCW_CW(UG_SATD, UG_SATU) }, + [1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU), ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, +}; +#endif diff --git a/keyboards/cannonkeys/sagittarius/keymaps/default/rules.mk b/keyboards/cannonkeys/sagittarius/keymaps/default/rules.mk new file mode 100644 index 00000000000..376fe3d8dcd --- /dev/null +++ b/keyboards/cannonkeys/sagittarius/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +ENCODER_ENABLE = yes +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cannonkeys/sagittarius/sagittarius.c b/keyboards/cannonkeys/sagittarius/sagittarius.c new file mode 100644 index 00000000000..1000f7dd43a --- /dev/null +++ b/keyboards/cannonkeys/sagittarius/sagittarius.c @@ -0,0 +1,40 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +#if defined(ENCODER_ENABLE) || defined(ENCODER_MAP_ENABLE) + +# if !defined(ENCODER_SETTLE_PIN_STATE_DELAY_US) +# define ENCODER_SETTLE_PIN_STATE_DELAY_US 2 +# endif + +static pin_t matrix_row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; + +void encoder_driver_task(void) { + // Set all relevant rows to output, which is different to the matrix expectations + for (uint8_t i = 0; i < 4; i++) { + gpio_set_pin_output(matrix_row_pins[i]); + } + + // Read each encoder + for (uint8_t i = 0; i < 4; i++) { + // Set the row pin low for the corresponding encoder... + for (uint8_t j = 0; j < 4; j++) { + gpio_write_pin(matrix_row_pins[j], (i == j) ? 0 : 1); + } + // ...and let them settle. + wait_us(ENCODER_SETTLE_PIN_STATE_DELAY_US); + + // Run the normal encoder handling + extern void encoder_quadrature_handle_read(uint8_t index, uint8_t pin_a_state, uint8_t pin_b_state); + extern uint8_t encoder_quadrature_read_pin(uint8_t index, bool pad_b); + encoder_quadrature_handle_read(i, encoder_quadrature_read_pin(i, false), encoder_quadrature_read_pin(i, true)); + } + + // Set all rows back to input-high as per matrix expectations + for (uint8_t i = 0; i < 4; i++) { + gpio_set_pin_input_high(matrix_row_pins[i]); + } +} + +#endif // defined(ENCODER_ENABLE) || defined(ENCODER_MAP_ENABLE) From 8cbcdcac62d58ff8faadfdb29bafbd12bef4d7ed Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 21 Nov 2024 17:18:51 +1100 Subject: [PATCH 3/5] `qmk new-keymap`: validate keymap name (#23420) --- lib/python/qmk/cli/new/keymap.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index d4339bc9ef0..f1df05636ce 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -1,5 +1,6 @@ """This script automates the copying of the default keymap into your own keymap. """ +import re import shutil from milc import cli @@ -13,6 +14,13 @@ from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.userspace import UserspaceDefs +def validate_keymap_name(name): + """Returns True if the given keymap name contains only a-z, 0-9 and underscore characters. + """ + regex = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9_]+$') + return bool(regex.match(name)) + + def prompt_keyboard(): prompt = """{fg_yellow}Select Keyboard{style_reset_all} If you`re unsure you can view a full list of supported keyboards with {fg_yellow}qmk list-keyboards{style_reset_all}. @@ -60,6 +68,10 @@ def new_keymap(cli): cli.log.error(f'Default keymap {{fg_cyan}}{keymap_path_default}{{fg_reset}} does not exist!') return False + if not validate_keymap_name(user_name): + cli.log.error('Keymap names must contain only {fg_cyan}a-z{fg_reset}, {fg_cyan}0-9{fg_reset} and {fg_cyan}_{fg_reset}! Please choose a different name.') + return False + if keymap_path_new.exists(): cli.log.error(f'Keymap {{fg_cyan}}{user_name}{{fg_reset}} already exists! Please choose a different name.') return False From 9bea332a210aed22cd6775eaf726da595bd5e9ce Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 21 Nov 2024 17:20:05 +1100 Subject: [PATCH 4/5] `qmk via2json`: Improve macro parsing (#24345) --- lib/python/qmk/cli/via2json.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/python/qmk/cli/via2json.py b/lib/python/qmk/cli/via2json.py index 73c9a61b3d3..537e1026406 100755 --- a/lib/python/qmk/cli/via2json.py +++ b/lib/python/qmk/cli/via2json.py @@ -29,6 +29,7 @@ def _convert_macros(via_macros): if len(via_macros) == 0: return list() split_regex = re.compile(r'(}\,)|(\,{)') + macro_group_regex = re.compile(r'({.+?})') macros = list() for via_macro in via_macros: # Split VIA macro to its elements @@ -38,13 +39,28 @@ def _convert_macros(via_macros): macro_data = list() for m in macro: if '{' in m or '}' in m: - # Found keycode(s) - keycodes = m.split(',') - # Remove whitespaces and curly braces from around keycodes - keycodes = list(map(lambda s: s.strip(' {}'), keycodes)) - # Remove the KC prefix - keycodes = list(map(lambda s: s.replace('KC_', ''), keycodes)) - macro_data.append({"action": "tap", "keycodes": keycodes}) + # Split macro groups + macro_groups = macro_group_regex.findall(m) + for macro_group in macro_groups: + # Remove whitespaces and curly braces from around group + macro_group = macro_group.strip(' {}') + + macro_action = 'tap' + macro_keycodes = [] + + if macro_group[0] == '+': + macro_action = 'down' + macro_keycodes.append(macro_group[1:]) + elif macro_group[0] == '-': + macro_action = 'up' + macro_keycodes.append(macro_group[1:]) + else: + macro_keycodes.extend(macro_group.split(',') if ',' in macro_group else [macro_group]) + + # Remove the KC prefixes + macro_keycodes = list(map(lambda s: s.replace('KC_', ''), macro_keycodes)) + + macro_data.append({"action": macro_action, "keycodes": macro_keycodes}) else: # Found text macro_data.append(m) @@ -54,13 +70,13 @@ def _convert_macros(via_macros): def _fix_macro_keys(keymap_data): - macro_no = re.compile(r'MACRO0?([0-9]{1,2})') + macro_no = re.compile(r'MACRO0?\(([0-9]{1,2})\)') for i in range(0, len(keymap_data)): for j in range(0, len(keymap_data[i])): kc = keymap_data[i][j] m = macro_no.match(kc) if m: - keymap_data[i][j] = f'MACRO_{m.group(1)}' + keymap_data[i][j] = f'MC_{m.group(1)}' return keymap_data From 57be4871616ee9a8fe042f6186010d436ec7d4b1 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 21 Nov 2024 18:46:36 +0000 Subject: [PATCH 5/5] Fix rendering of `reference_configurator_support.md` (#24629) --- docs/reference_configurator_support.md | 38 +++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/reference_configurator_support.md b/docs/reference_configurator_support.md index dffed5c0c34..d0824c7705e 100644 --- a/docs/reference_configurator_support.md +++ b/docs/reference_configurator_support.md @@ -156,25 +156,25 @@ For more on the `info.json` files, see [`info.json` Format](reference_info_json) The Configurator's API uses the layout macro and the JSON file we've given it to create a visual representation of the keyboard that has each visual object tied to a specific key, in sequence: -key in layout macro | JSON object used -:---: | :---- -k00 | {"label":"Num Lock", "x":0, "y":0} -k01 | {"label":"/", "x":1, "y":0} -k02 | {"label":"*", "x":2, "y":0} -k03 | {"label":"-", "x":3, "y":0} -k10 | {"label":"7", "x":0, "y":1} -k11 | {"label":"8", "x":1, "y":1} -k12 | {"label":"9", "x":2, "y":1} -k13 | {"label":"+", "x":3, "y":1, "h":2} -k20 | {"label":"4", "x":0, "y":2} -k21 | {"label":"5", "x":1, "y":2} -k22 | {"label":"6", "x":2, "y":2} -k30 | {"label":"1", "x":0, "y":3} -k31 | {"label":"2", "x":1, "y":3} -k32 | {"label":"3", "x":2, "y":3} -k33 | {"label":"Enter", "x":3, "y":3, "h":2} -k40 | {"label":"0", "x":0, "y":4, "w":2} -k42 | {"label":".", "x":2, "y":4} +| Key in layout macro | JSON object used | +| ------------------- | ---------------------------------------- | +| k00 | `{"label":"Num Lock", "x":0, "y":0}` | +| k01 | `{"label":"/", "x":1, "y":0}` | +| k02 | `{"label":"*", "x":2, "y":0}` | +| k03 | `{"label":"-", "x":3, "y":0}` | +| k10 | `{"label":"7", "x":0, "y":1}` | +| k11 | `{"label":"8", "x":1, "y":1}` | +| k12 | `{"label":"9", "x":2, "y":1}` | +| k13 | `{"label":"+", "x":3, "y":1, "h":2}` | +| k20 | `{"label":"4", "x":0, "y":2}` | +| k21 | `{"label":"5", "x":1, "y":2}` | +| k22 | `{"label":"6", "x":2, "y":2}` | +| k30 | `{"label":"1", "x":0, "y":3}` | +| k31 | `{"label":"2", "x":1, "y":3}` | +| k32 | `{"label":"3", "x":2, "y":3}` | +| k33 | `{"label":"Enter", "x":3, "y":3, "h":2}` | +| k40 | `{"label":"0", "x":0, "y":4, "w":2}` | +| k42 | `{"label":".", "x":2, "y":4}` | When a user selects the top-left key in the Configurator, and assigns Num Lock to it, the Configurator builds a keymap file with `KC_NUM` as the first key, and so on as the keymap is built. The `label` keys are not used; they are only for the user's reference in identifying specific keys when debugging the `info.json` file.