From de381ad3b72ccc8161744c8c14b95430fd4d498d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 13 Sep 2023 01:12:46 +0100 Subject: Generate keymap.json config options more forcefully (#21960) --- lib/python/qmk/cli/generate/config_h.py | 5 +++++ lib/python/qmk/cli/generate/rules_mk.py | 26 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 64d4db6ffe..828785ea48 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -15,7 +15,12 @@ from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE def generate_define(define, value=None): + is_keymap = cli.args.filename value = f' {value}' if value is not None else '' + if is_keymap: + return f""" +#undef {define} +#define {define}{value}""" return f""" #ifndef {define} # define {define}{value} diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index fc272da6c6..5291556109 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -14,6 +14,12 @@ from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE +def generate_rule(rules_key, rules_value): + is_keymap = cli.args.filename + rule_assignment_operator = '=' if is_keymap else '?=' + return f'{rules_key} {rule_assignment_operator} {rules_value}' + + def process_mapping_rule(kb_info_json, rules_key, info_dict): """Return the rules.mk line(s) for a mapping rule. """ @@ -29,15 +35,15 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): return None if key_type in ['array', 'list']: - return f'{rules_key} ?= {" ".join(rules_value)}' + return generate_rule(rules_key, " ".join(rules_value)) elif key_type == 'bool': - return f'{rules_key} ?= {"yes" if rules_value else "no"}' + return generate_rule(rules_key, "yes" if rules_value else "no") elif key_type == 'mapping': - return '\n'.join([f'{key} ?= {value}' for key, value in rules_value.items()]) + return '\n'.join([generate_rule(key, value) for key, value in rules_value.items()]) elif key_type == 'str': - return f'{rules_key} ?= "{rules_value}"' + return generate_rule(rules_key, f'"{rules_value}"') - return f'{rules_key} ?= {rules_value}' + return generate_rule(rules_key, rules_value) @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @@ -77,21 +83,21 @@ def generate_rules_mk(cli): for feature, enabled in kb_info_json['features'].items(): feature = feature.upper() enabled = 'yes' if enabled else 'no' - rules_mk_lines.append(f'{feature}_ENABLE ?= {enabled}') + rules_mk_lines.append(generate_rule(f'{feature}_ENABLE', enabled)) # Set SPLIT_TRANSPORT, if needed if kb_info_json.get('split', {}).get('transport', {}).get('protocol') == 'custom': - rules_mk_lines.append('SPLIT_TRANSPORT ?= custom') + rules_mk_lines.append(generate_rule('SPLIT_TRANSPORT', 'custom')) # Set CUSTOM_MATRIX, if needed if kb_info_json.get('matrix_pins', {}).get('custom'): if kb_info_json.get('matrix_pins', {}).get('custom_lite'): - rules_mk_lines.append('CUSTOM_MATRIX ?= lite') + rules_mk_lines.append(generate_rule('CUSTOM_MATRIX', 'lite')) else: - rules_mk_lines.append('CUSTOM_MATRIX ?= yes') + rules_mk_lines.append(generate_rule('CUSTOM_MATRIX', 'yes')) if converter: - rules_mk_lines.append(f'CONVERT_TO ?= {converter}') + rules_mk_lines.append(generate_rule('CONVERT_TO', converter)) # Show the results dump_lines(cli.args.output, rules_mk_lines) -- cgit v1.2.3 From 98530cad3ba8733d8a100e0bc5f3cf47339c4b3e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 29 Oct 2023 01:09:02 +0100 Subject: Implement data driven dip switches (#22017) * Add data driven dip switches * Autogen weak matrix_mask --- lib/python/qmk/cli/generate/config_h.py | 8 ++++++++ lib/python/qmk/cli/generate/keyboard_c.py | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 828785ea48..b261d6f851 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -72,6 +72,12 @@ def generate_matrix_size(kb_info_json, config_h_lines): config_h_lines.append(generate_define('MATRIX_ROWS', kb_info_json['matrix_size']['rows'])) +def generate_matrix_masked(kb_info_json, config_h_lines): + """"Enable matrix mask if required""" + if 'matrix_grid' in kb_info_json.get('dip_switch', {}): + config_h_lines.append(generate_define('MATRIX_MASKED')) + + def generate_config_items(kb_info_json, config_h_lines): """Iterate through the info_config map to generate basic config values. """ @@ -196,6 +202,8 @@ def generate_config_h(cli): generate_matrix_size(kb_info_json, config_h_lines) + generate_matrix_masked(kb_info_json, config_h_lines) + if 'matrix_pins' in kb_info_json: config_h_lines.append(matrix_pins(kb_info_json['matrix_pins'])) diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index 9004b41abb..325624c9cc 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -57,6 +57,31 @@ def _gen_led_config(info_data): return lines +def _gen_matrix_mask(info_data): + """Convert info.json content to matrix_mask + """ + cols = info_data['matrix_size']['cols'] + rows = info_data['matrix_size']['rows'] + + # Default mask to everything enabled + mask = [['1'] * cols for i in range(rows)] + + # Automatically mask out dip_switch.matrix_grid locations + matrix_grid = info_data.get('dip_switch', {}).get('matrix_grid', []) + for row, col in matrix_grid: + mask[row][col] = '0' + + lines = [] + lines.append('#ifdef MATRIX_MASKED') + lines.append('__attribute__((weak)) const matrix_row_t matrix_mask[] = {') + for i in range(rows): + lines.append(f' 0b{"".join(reversed(mask[i]))},') + lines.append('};') + lines.append('#endif') + + return lines + + @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate keyboard.c for.') @@ -70,6 +95,7 @@ def generate_keyboard_c(cli): keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#include QMK_KEYBOARD_H', ''] keyboard_h_lines.extend(_gen_led_config(kb_info_json)) + keyboard_h_lines.extend(_gen_matrix_mask(kb_info_json)) # Show the results dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet) -- cgit v1.2.3 From 559450a099539773e65adf4ab8c2e485344b7885 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 29 Oct 2023 23:41:44 +0000 Subject: Fix 'to_c' for config.h mappings (#22364) --- lib/python/qmk/cli/generate/config_h.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index b261d6f851..c4260fde54 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -86,9 +86,9 @@ def generate_config_items(kb_info_json, config_h_lines): for config_key, info_dict in info_config_map.items(): info_key = info_dict['info_key'] key_type = info_dict.get('value_type', 'raw') - to_config = info_dict.get('to_config', True) + to_c = info_dict.get('to_c', True) - if not to_config: + if not to_c: continue try: -- cgit v1.2.3 From 17c3182b1cc98adb5385c7c5223c775fce4d4dd9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 30 Oct 2023 00:49:56 +0000 Subject: Remove use of broken split.main (#22363) --- lib/python/qmk/cli/generate/config_h.py | 18 ------------------ 1 file changed, 18 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index c4260fde54..924834caef 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -141,24 +141,6 @@ def generate_encoder_config(encoder_json, config_h_lines, postfix=''): def generate_split_config(kb_info_json, config_h_lines): """Generate the config.h lines for split boards.""" - if 'primary' in kb_info_json['split']: - if kb_info_json['split']['primary'] in ('left', 'right'): - config_h_lines.append('') - config_h_lines.append('#ifndef MASTER_LEFT') - config_h_lines.append('# ifndef MASTER_RIGHT') - if kb_info_json['split']['primary'] == 'left': - config_h_lines.append('# define MASTER_LEFT') - elif kb_info_json['split']['primary'] == 'right': - config_h_lines.append('# define MASTER_RIGHT') - config_h_lines.append('# endif // MASTER_RIGHT') - config_h_lines.append('#endif // MASTER_LEFT') - elif kb_info_json['split']['primary'] == 'pin': - config_h_lines.append(generate_define('SPLIT_HAND_PIN')) - elif kb_info_json['split']['primary'] == 'matrix_grid': - config_h_lines.append(generate_define('SPLIT_HAND_MATRIX_GRID', f'{{ {",".join(kb_info_json["split"]["matrix_grid"])} }}')) - elif kb_info_json['split']['primary'] == 'eeprom': - config_h_lines.append(generate_define('EE_HANDS')) - if 'protocol' in kb_info_json['split'].get('transport', {}): if kb_info_json['split']['transport']['protocol'] == 'i2c': config_h_lines.append(generate_define('USE_I2C')) -- cgit v1.2.3 From a19ae3d78466588caa9caf7c38d1617932255733 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 1 Nov 2023 00:55:48 +0000 Subject: Add dd mapping for hardware based split handedness (#22369) --- lib/python/qmk/cli/generate/config_h.py | 13 +++++++++++++ lib/python/qmk/cli/generate/keyboard_c.py | 15 ++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 924834caef..2c624e3e9a 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -74,7 +74,14 @@ def generate_matrix_size(kb_info_json, config_h_lines): def generate_matrix_masked(kb_info_json, config_h_lines): """"Enable matrix mask if required""" + mask_required = False + if 'matrix_grid' in kb_info_json.get('dip_switch', {}): + mask_required = True + if 'matrix_grid' in kb_info_json.get('split', {}).get('handedness', {}): + mask_required = True + + if mask_required: config_h_lines.append(generate_define('MATRIX_MASKED')) @@ -141,6 +148,12 @@ def generate_encoder_config(encoder_json, config_h_lines, postfix=''): def generate_split_config(kb_info_json, config_h_lines): """Generate the config.h lines for split boards.""" + if 'handedness' in kb_info_json['split']: + # TODO: change SPLIT_HAND_MATRIX_GRID to require brackets + handedness = kb_info_json['split']['handedness'] + if 'matrix_grid' in handedness: + config_h_lines.append(generate_define('SPLIT_HAND_MATRIX_GRID', ', '.join(handedness['matrix_grid']))) + if 'protocol' in kb_info_json['split'].get('transport', {}): if kb_info_json['split']['transport']['protocol'] == 'i2c': config_h_lines.append(generate_define('USE_I2C')) diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index 325624c9cc..f8a2372cf3 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -63,13 +63,14 @@ def _gen_matrix_mask(info_data): cols = info_data['matrix_size']['cols'] rows = info_data['matrix_size']['rows'] - # Default mask to everything enabled - mask = [['1'] * cols for i in range(rows)] - - # Automatically mask out dip_switch.matrix_grid locations - matrix_grid = info_data.get('dip_switch', {}).get('matrix_grid', []) - for row, col in matrix_grid: - mask[row][col] = '0' + # Default mask to everything disabled + mask = [['0'] * cols for i in range(rows)] + + # Mirror layout macros squashed on top of each other + for layout_data in info_data['layouts'].values(): + for key_data in layout_data['layout']: + row, col = key_data['matrix'] + mask[row][col] = '1' lines = [] lines.append('#ifdef MATRIX_MASKED') -- cgit v1.2.3 From fbbb221a31a4890a3302a4b169465d9efb0c59ed Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 1 Nov 2023 01:26:24 +0000 Subject: Implement data driven lighting defaults (#21825) --- lib/python/qmk/cli/generate/config_h.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 2c624e3e9a..00fb1d9585 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -165,10 +165,13 @@ def generate_split_config(kb_info_json, config_h_lines): generate_encoder_config(kb_info_json['split']['encoder']['right'], config_h_lines, '_RIGHT') -def generate_led_animations_config(led_feature_json, config_h_lines, prefix): +def generate_led_animations_config(feature, led_feature_json, config_h_lines, enable_prefix, animation_prefix): + if 'animation' in led_feature_json.get('default', {}): + config_h_lines.append(generate_define(f'{feature.upper()}_DEFAULT_MODE', f'{animation_prefix}{led_feature_json["default"]["animation"].upper()}')) + for animation in led_feature_json.get('animations', {}): if led_feature_json['animations'][animation]: - config_h_lines.append(generate_define(f'{prefix}{animation.upper()}')) + config_h_lines.append(generate_define(f'{enable_prefix}{animation.upper()}')) @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @@ -209,13 +212,13 @@ def generate_config_h(cli): generate_split_config(kb_info_json, config_h_lines) if 'led_matrix' in kb_info_json: - generate_led_animations_config(kb_info_json['led_matrix'], config_h_lines, 'ENABLE_LED_MATRIX_') + generate_led_animations_config('led_matrix', kb_info_json['led_matrix'], config_h_lines, 'ENABLE_LED_MATRIX_', 'LED_MATRIX_') if 'rgb_matrix' in kb_info_json: - generate_led_animations_config(kb_info_json['rgb_matrix'], config_h_lines, 'ENABLE_RGB_MATRIX_') + generate_led_animations_config('rgb_matrix', kb_info_json['rgb_matrix'], config_h_lines, 'ENABLE_RGB_MATRIX_', 'RGB_MATRIX_') if 'rgblight' in kb_info_json: - generate_led_animations_config(kb_info_json['rgblight'], config_h_lines, 'RGBLIGHT_EFFECT_') + generate_led_animations_config('rgblight', kb_info_json['rgblight'], config_h_lines, 'RGBLIGHT_EFFECT_', 'RGBLIGHT_MODE_') # Show the results dump_lines(cli.args.output, config_h_lines, cli.args.quiet) -- cgit v1.2.3 From b31426252ed379937132ed7d2baf84a677123b5b Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 1 Nov 2023 02:11:42 +0000 Subject: Generate switch statement helpers for keycode ranges (#20059) --- lib/python/qmk/cli/generate/keycodes.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/keycodes.py b/lib/python/qmk/cli/generate/keycodes.py index ed8b6827bd..719fced5d5 100644 --- a/lib/python/qmk/cli/generate/keycodes.py +++ b/lib/python/qmk/cli/generate/keycodes.py @@ -94,6 +94,14 @@ def _generate_helpers(lines, keycodes): hi = keycodes["keycodes"][f'0x{codes[1]:04X}']['key'] lines.append(f'#define IS_{ _translate_group(group).upper() }_KEYCODE(code) ((code) >= {lo} && (code) <= {hi})') + lines.append('') + lines.append('// Switch statement Helpers') + for group, codes in temp.items(): + lo = keycodes["keycodes"][f'0x{codes[0]:04X}']['key'] + hi = keycodes["keycodes"][f'0x{codes[1]:04X}']['key'] + name = f'{ _translate_group(group).upper() }_KEYCODE_RANGE' + lines.append(f'#define { name.ljust(35) } {lo} ... {hi}') + def _generate_aliases(lines, keycodes): # Work around ChibiOS ch.h include guard -- cgit v1.2.3 From 49382107115f611a61f1f5e20a3b2a92000a35da Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 15 Nov 2023 16:24:54 +1100 Subject: CLI refactoring for common build target APIs (#22221) --- lib/python/qmk/cli/generate/compilation_database.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index 9e5c266516..5100d2b6d2 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -12,7 +12,7 @@ from typing import Dict, Iterator, List, Union from milc import cli, MILC -from qmk.commands import create_make_command +from qmk.commands import find_make from qmk.constants import QMK_FIRMWARE from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.keyboard import keyboard_completer, keyboard_folder @@ -76,9 +76,12 @@ def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]: return records -def write_compilation_database(keyboard: str, keymap: str, output_path: Path) -> bool: +def write_compilation_database(keyboard: str = None, keymap: str = None, output_path: Path = QMK_FIRMWARE / 'compile_commands.json', skip_clean: bool = False, command: List[str] = None, **env_vars) -> bool: # Generate the make command for a specific keyboard/keymap. - command = create_make_command(keyboard, keymap, dry_run=True) + if not command: + from qmk.build_targets import KeyboardKeymapBuildTarget # Lazy load due to circular references + target = KeyboardKeymapBuildTarget(keyboard, keymap) + command = target.compile_command(dry_run=True, **env_vars) if not command: cli.log.error('You must supply both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') @@ -90,9 +93,10 @@ def write_compilation_database(keyboard: str, keymap: str, output_path: Path) -> env.pop("MAKEFLAGS", None) # re-use same executable as the main make invocation (might be gmake) - clean_command = [command[0], 'clean'] - cli.log.info('Making clean with {fg_cyan}%s', ' '.join(clean_command)) - cli.run(clean_command, capture_output=False, check=True, env=env) + if not skip_clean: + clean_command = [find_make(), "clean"] + cli.log.info('Making clean with {fg_cyan}%s', ' '.join(clean_command)) + cli.run(clean_command, capture_output=False, check=True, env=env) cli.log.info('Gathering build instructions from {fg_cyan}%s', ' '.join(command)) -- cgit v1.2.3 From 46b996a55e370b7c370dc0b092100a61121f9ddd Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 22 Nov 2023 11:14:34 +1100 Subject: CLI parallel search updates (#22525) --- lib/python/qmk/cli/generate/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python/qmk/cli/generate') diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index 61a2f9f732..1948b483a1 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -10,7 +10,7 @@ from qmk.datetime import current_datetime from qmk.info import info_json from qmk.json_schema import json_load from qmk.keymap import list_keymaps -from qmk.keyboard import find_readme, list_keyboards +from qmk.keyboard import find_readme, list_keyboards, keyboard_alias_definitions from qmk.keycodes import load_spec, list_versions, list_languages DATA_PATH = Path('data') @@ -166,7 +166,7 @@ def generate_api(cli): # Generate data for the global files keyboard_list = sorted(kb_all) - keyboard_aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) + keyboard_aliases = keyboard_alias_definitions() keyboard_metadata = { 'last_updated': current_datetime(), 'keyboards': keyboard_list, -- cgit v1.2.3