summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2024-11-24 20:32:30 +1100
committerGitHub <noreply@github.com>2024-11-24 20:32:30 +1100
commit7d8f193988495deb0e12ad79d5104d30c0724bf9 (patch)
treebff63d89048b699e393e8f65ec1c059f0d953d0c /lib
parent859dab864a0738f577d1da8e7189748ed8109c44 (diff)
Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. (#23451)
Diffstat (limited to 'lib')
-rw-r--r--lib/python/qmk/commands.py2
-rw-r--r--lib/python/qmk/keymap.py29
-rw-r--r--lib/python/qmk/tests/test_cli_commands.py24
-rw-r--r--lib/python/qmk/tests/test_qmk_keymap.py9
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 */
32const 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__
37const 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
46def _generate_keymap_table(keymap_json): 43def _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
57def _generate_encodermap_table(keymap_json): 55def _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
155const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 156const 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)
160const 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
193const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 193const 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)
198const 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
209def 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
215def test_json2c_no_json(): 207def 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
23const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 24const 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)
28const 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