diff options
| author | Nick Brassel <nick@tzarc.org> | 2024-11-24 20:32:30 +1100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-24 20:32:30 +1100 |
| commit | 7d8f193988495deb0e12ad79d5104d30c0724bf9 (patch) | |
| tree | bff63d89048b699e393e8f65ec1c059f0d953d0c /lib/python | |
| parent | 859dab864a0738f577d1da8e7189748ed8109c44 (diff) | |
Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. (#23451)
Diffstat (limited to 'lib/python')
| -rw-r--r-- | lib/python/qmk/commands.py | 2 | ||||
| -rw-r--r-- | lib/python/qmk/keymap.py | 29 | ||||
| -rw-r--r-- | lib/python/qmk/tests/test_cli_commands.py | 24 | ||||
| -rw-r--r-- | lib/python/qmk/tests/test_qmk_keymap.py | 9 |
4 files changed, 30 insertions, 34 deletions
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 97d9c5032c..a05b3641b5 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py | |||
| @@ -55,7 +55,7 @@ def parse_configurator_json(configurator_file): | |||
| 55 | cli.log.error(f'Invalid JSON keymap: {configurator_file} : {e.message}') | 55 | cli.log.error(f'Invalid JSON keymap: {configurator_file} : {e.message}') |
| 56 | maybe_exit(1) | 56 | maybe_exit(1) |
| 57 | 57 | ||
| 58 | keyboard = user_keymap['keyboard'] | 58 | keyboard = user_keymap.get('keyboard', None) |
| 59 | aliases = keyboard_alias_definitions() | 59 | aliases = keyboard_alias_definitions() |
| 60 | 60 | ||
| 61 | while keyboard in aliases: | 61 | while keyboard in aliases: |
diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 97c358788a..9dd043c4a8 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py | |||
| @@ -29,38 +29,40 @@ __INCLUDES__ | |||
| 29 | * This file was generated by qmk json2c. You may or may not want to | 29 | * This file was generated by qmk json2c. You may or may not want to |
| 30 | * edit it directly. | 30 | * edit it directly. |
| 31 | */ | 31 | */ |
| 32 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
| 33 | __KEYMAP_GOES_HERE__ | ||
| 34 | }; | ||
| 35 | 32 | ||
| 36 | #if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | 33 | __KEYMAP_GOES_HERE__ |
| 37 | const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | ||
| 38 | __ENCODER_MAP_GOES_HERE__ | 34 | __ENCODER_MAP_GOES_HERE__ |
| 39 | }; | ||
| 40 | #endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 41 | |||
| 42 | __MACRO_OUTPUT_GOES_HERE__ | 35 | __MACRO_OUTPUT_GOES_HERE__ |
| 36 | |||
| 37 | #ifdef OTHER_KEYMAP_C | ||
| 38 | # include OTHER_KEYMAP_C | ||
| 39 | #endif // OTHER_KEYMAP_C | ||
| 43 | """ | 40 | """ |
| 44 | 41 | ||
| 45 | 42 | ||
| 46 | def _generate_keymap_table(keymap_json): | 43 | def _generate_keymap_table(keymap_json): |
| 47 | lines = [] | 44 | lines = ['const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {'] |
| 48 | for layer_num, layer in enumerate(keymap_json['layers']): | 45 | for layer_num, layer in enumerate(keymap_json['layers']): |
| 49 | if layer_num != 0: | 46 | if layer_num != 0: |
| 50 | lines[-1] = lines[-1] + ',' | 47 | lines[-1] = lines[-1] + ',' |
| 51 | layer = map(_strip_any, layer) | 48 | layer = map(_strip_any, layer) |
| 52 | layer_keys = ', '.join(layer) | 49 | layer_keys = ', '.join(layer) |
| 53 | lines.append(' [%s] = %s(%s)' % (layer_num, keymap_json['layout'], layer_keys)) | 50 | lines.append(' [%s] = %s(%s)' % (layer_num, keymap_json['layout'], layer_keys)) |
| 51 | lines.append('};') | ||
| 54 | return lines | 52 | return lines |
| 55 | 53 | ||
| 56 | 54 | ||
| 57 | def _generate_encodermap_table(keymap_json): | 55 | def _generate_encodermap_table(keymap_json): |
| 58 | lines = [] | 56 | lines = [ |
| 57 | '#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)', | ||
| 58 | 'const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {', | ||
| 59 | ] | ||
| 59 | for layer_num, layer in enumerate(keymap_json['encoders']): | 60 | for layer_num, layer in enumerate(keymap_json['encoders']): |
| 60 | if layer_num != 0: | 61 | if layer_num != 0: |
| 61 | lines[-1] = lines[-1] + ',' | 62 | lines[-1] = lines[-1] + ',' |
| 62 | encoder_keycode_txt = ', '.join([f'ENCODER_CCW_CW({_strip_any(e["ccw"])}, {_strip_any(e["cw"])})' for e in layer]) | 63 | encoder_keycode_txt = ', '.join([f'ENCODER_CCW_CW({_strip_any(e["ccw"])}, {_strip_any(e["cw"])})' for e in layer]) |
| 63 | lines.append(' [%s] = {%s}' % (layer_num, encoder_keycode_txt)) | 64 | lines.append(' [%s] = {%s}' % (layer_num, encoder_keycode_txt)) |
| 65 | lines.extend(['};', '#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)']) | ||
| 64 | return lines | 66 | return lines |
| 65 | 67 | ||
| 66 | 68 | ||
| @@ -271,8 +273,11 @@ def generate_c(keymap_json): | |||
| 271 | A sequence of strings containing macros to implement for this keyboard. | 273 | A sequence of strings containing macros to implement for this keyboard. |
| 272 | """ | 274 | """ |
| 273 | new_keymap = DEFAULT_KEYMAP_C | 275 | new_keymap = DEFAULT_KEYMAP_C |
| 274 | layer_txt = _generate_keymap_table(keymap_json) | 276 | |
| 275 | keymap = '\n'.join(layer_txt) | 277 | keymap = '' |
| 278 | if 'layers' in keymap_json and keymap_json['layers'] is not None: | ||
| 279 | layer_txt = _generate_keymap_table(keymap_json) | ||
| 280 | keymap = '\n'.join(layer_txt) | ||
| 276 | new_keymap = new_keymap.replace('__KEYMAP_GOES_HERE__', keymap) | 281 | new_keymap = new_keymap.replace('__KEYMAP_GOES_HERE__', keymap) |
| 277 | 282 | ||
| 278 | encodermap = '' | 283 | encodermap = '' |
diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index b10fd8d19d..dd659fe0f2 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py | |||
| @@ -152,17 +152,16 @@ def test_json2c(): | |||
| 152 | * This file was generated by qmk json2c. You may or may not want to | 152 | * This file was generated by qmk json2c. You may or may not want to |
| 153 | * edit it directly. | 153 | * edit it directly. |
| 154 | */ | 154 | */ |
| 155 | |||
| 155 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 156 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 156 | [0] = LAYOUT_ortho_1x1(KC_A) | 157 | [0] = LAYOUT_ortho_1x1(KC_A) |
| 157 | }; | 158 | }; |
| 158 | 159 | ||
| 159 | #if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 160 | const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | ||
| 161 | |||
| 162 | }; | ||
| 163 | #endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 164 | 160 | ||
| 165 | 161 | ||
| 162 | #ifdef OTHER_KEYMAP_C | ||
| 163 | # include OTHER_KEYMAP_C | ||
| 164 | #endif // OTHER_KEYMAP_C | ||
| 166 | 165 | ||
| 167 | 166 | ||
| 168 | """ | 167 | """ |
| @@ -190,28 +189,21 @@ def test_json2c_stdin(): | |||
| 190 | * This file was generated by qmk json2c. You may or may not want to | 189 | * This file was generated by qmk json2c. You may or may not want to |
| 191 | * edit it directly. | 190 | * edit it directly. |
| 192 | */ | 191 | */ |
| 192 | |||
| 193 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 193 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 194 | [0] = LAYOUT_ortho_1x1(KC_A) | 194 | [0] = LAYOUT_ortho_1x1(KC_A) |
| 195 | }; | 195 | }; |
| 196 | 196 | ||
| 197 | #if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 198 | const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | ||
| 199 | |||
| 200 | }; | ||
| 201 | #endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 202 | 197 | ||
| 203 | 198 | ||
| 199 | #ifdef OTHER_KEYMAP_C | ||
| 200 | # include OTHER_KEYMAP_C | ||
| 201 | #endif // OTHER_KEYMAP_C | ||
| 204 | 202 | ||
| 205 | 203 | ||
| 206 | """ | 204 | """ |
| 207 | 205 | ||
| 208 | 206 | ||
| 209 | def test_json2c_wrong_json(): | ||
| 210 | result = check_subcommand('json2c', 'keyboards/handwired/pytest/info.json') | ||
| 211 | check_returncode(result, [1]) | ||
| 212 | assert 'Invalid JSON keymap' in result.stdout | ||
| 213 | |||
| 214 | |||
| 215 | def test_json2c_no_json(): | 207 | def test_json2c_no_json(): |
| 216 | result = check_subcommand('json2c', 'keyboards/handwired/pytest/basic/keymaps/default/keymap.c') | 208 | result = check_subcommand('json2c', 'keyboards/handwired/pytest/basic/keymaps/default/keymap.c') |
| 217 | check_returncode(result, [1]) | 209 | check_returncode(result, [1]) |
diff --git a/lib/python/qmk/tests/test_qmk_keymap.py b/lib/python/qmk/tests/test_qmk_keymap.py index 7482848eff..80cc679b00 100644 --- a/lib/python/qmk/tests/test_qmk_keymap.py +++ b/lib/python/qmk/tests/test_qmk_keymap.py | |||
| @@ -20,17 +20,16 @@ def test_generate_c_pytest_basic(): | |||
| 20 | * This file was generated by qmk json2c. You may or may not want to | 20 | * This file was generated by qmk json2c. You may or may not want to |
| 21 | * edit it directly. | 21 | * edit it directly. |
| 22 | */ | 22 | */ |
| 23 | |||
| 23 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 24 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 24 | [0] = LAYOUT(KC_A) | 25 | [0] = LAYOUT(KC_A) |
| 25 | }; | 26 | }; |
| 26 | 27 | ||
| 27 | #if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 28 | const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | ||
| 29 | |||
| 30 | }; | ||
| 31 | #endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) | ||
| 32 | 28 | ||
| 33 | 29 | ||
| 30 | #ifdef OTHER_KEYMAP_C | ||
| 31 | # include OTHER_KEYMAP_C | ||
| 32 | #endif // OTHER_KEYMAP_C | ||
| 34 | """ | 33 | """ |
| 35 | 34 | ||
| 36 | 35 | ||
