diff options
Diffstat (limited to 'lib/python/qmk/cli/generate')
| -rwxr-xr-x | lib/python/qmk/cli/generate/api.py | 37 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/generate/config_h.py | 36 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/generate/info_json.py | 8 | 
3 files changed, 63 insertions, 18 deletions
| diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index 0596b3f22b..8d8ca3cd41 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -12,21 +12,30 @@ from qmk.json_encoders import InfoJSONEncoder  from qmk.json_schema import json_load  from qmk.keyboard import find_readme, list_keyboards -TEMPLATE_PATH = Path('data/templates/api/') +DATA_PATH = Path('data') +TEMPLATE_PATH = DATA_PATH / 'templates/api/'  BUILD_API_PATH = Path('.build/api_data/') +def _filtered_keyboard_list(): +    """Perform basic filtering of list_keyboards +    """ +    keyboard_list = list_keyboards() +    if cli.args.filter: +        kb_list = [] +        for keyboard_name in keyboard_list: +            if any(i in keyboard_name for i in cli.args.filter): +                kb_list.append(keyboard_name) +        keyboard_list = kb_list +    return keyboard_list + +  @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't write the data to disk.")  @cli.argument('-f', '--filter', arg_only=True, action='append', default=[], help="Filter the list of keyboards based on partial name matches the supplied value. May be passed multiple times.") -@cli.subcommand('Creates a new keymap for the keyboard of your choosing', hidden=False if cli.config.user.developer else True) +@cli.subcommand('Generate QMK API data', hidden=False if cli.config.user.developer else True)  def generate_api(cli):      """Generates the QMK API data.      """ -    if BUILD_API_PATH.exists(): -        shutil.rmtree(BUILD_API_PATH) - -    shutil.copytree(TEMPLATE_PATH, BUILD_API_PATH) -      v1_dir = BUILD_API_PATH / 'v1'      keyboard_all_file = v1_dir / 'keyboards.json'  # A massive JSON containing everything      keyboard_list_file = v1_dir / 'keyboard_list.json'  # A simple list of keyboard targets @@ -34,14 +43,14 @@ def generate_api(cli):      keyboard_metadata_file = v1_dir / 'keyboard_metadata.json'  # All the data configurator/via needs for initialization      usb_file = v1_dir / 'usb.json'  # A mapping of USB VID/PID -> keyboard target +    if BUILD_API_PATH.exists(): +        shutil.rmtree(BUILD_API_PATH) + +    shutil.copytree(TEMPLATE_PATH, BUILD_API_PATH) +    shutil.copytree(DATA_PATH, v1_dir) +      # Filter down when required -    keyboard_list = list_keyboards() -    if cli.args.filter: -        kb_list = [] -        for keyboard_name in keyboard_list: -            if any(i in keyboard_name for i in cli.args.filter): -                kb_list.append(keyboard_name) -        keyboard_list = kb_list +    keyboard_list = _filtered_keyboard_list()      kb_all = {}      usb_list = {} diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 893892c479..a26dcdf7d7 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -134,6 +134,36 @@ def generate_config_items(kb_info_json, config_h_lines):              config_h_lines.append(f'#endif // {config_key}') +def generate_encoder_config(encoder_json, config_h_lines, postfix=''): +    """Generate the config.h lines for encoders.""" +    a_pads = [] +    b_pads = [] +    resolutions = [] +    for encoder in encoder_json.get("rotary", []): +        a_pads.append(encoder["pin_a"]) +        b_pads.append(encoder["pin_b"]) +        resolutions.append(encoder.get("resolution", None)) + +    config_h_lines.append(f'#ifndef ENCODERS_PAD_A{postfix}') +    config_h_lines.append(f'#   define ENCODERS_PAD_A{postfix} {{ { ", ".join(a_pads) } }}') +    config_h_lines.append(f'#endif // ENCODERS_PAD_A{postfix}') + +    config_h_lines.append(f'#ifndef ENCODERS_PAD_B{postfix}') +    config_h_lines.append(f'#   define ENCODERS_PAD_B{postfix} {{ { ", ".join(b_pads) } }}') +    config_h_lines.append(f'#endif // ENCODERS_PAD_B{postfix}') + +    if None in resolutions: +        cli.log.debug("Unable to generate ENCODER_RESOLUTION configuration") +    elif len(set(resolutions)) == 1: +        config_h_lines.append(f'#ifndef ENCODER_RESOLUTION{postfix}') +        config_h_lines.append(f'#   define ENCODER_RESOLUTION{postfix} { resolutions[0] }') +        config_h_lines.append(f'#endif // ENCODER_RESOLUTION{postfix}') +    else: +        config_h_lines.append(f'#ifndef ENCODER_RESOLUTIONS{postfix}') +        config_h_lines.append(f'#   define ENCODER_RESOLUTIONS{postfix} {{ { ", ".join(map(str,resolutions)) } }}') +        config_h_lines.append(f'#endif // ENCODER_RESOLUTIONS{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']: @@ -173,6 +203,9 @@ def generate_split_config(kb_info_json, config_h_lines):      if 'right' in kb_info_json['split'].get('matrix_pins', {}):          config_h_lines.append(matrix_pins(kb_info_json['split']['matrix_pins']['right'], '_RIGHT')) +    if 'right' in kb_info_json['split'].get('encoder', {}): +        generate_encoder_config(kb_info_json['split']['encoder']['right'], config_h_lines, '_RIGHT') +  @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") @@ -198,6 +231,9 @@ def generate_config_h(cli):      if 'matrix_pins' in kb_info_json:          config_h_lines.append(matrix_pins(kb_info_json['matrix_pins'])) +    if 'encoder' in kb_info_json: +        generate_encoder_config(kb_info_json['encoder'], config_h_lines) +      if 'split' in kb_info_json:          generate_split_config(kb_info_json, config_h_lines) diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py index 284d1a8510..0dc80f10cc 100755 --- a/lib/python/qmk/cli/generate/info_json.py +++ b/lib/python/qmk/cli/generate/info_json.py @@ -5,7 +5,7 @@ Compile an info.json for a particular keyboard and pretty-print it.  import json  from argcomplete.completers import FilesCompleter -from jsonschema import Draft7Validator, RefResolver, validators +from jsonschema import Draft202012Validator, RefResolver, validators  from milc import cli  from pathlib import Path @@ -18,7 +18,7 @@ from qmk.path import is_keyboard, normpath  def pruning_validator(validator_class): -    """Extends Draft7Validator to remove properties that aren't specified in the schema. +    """Extends Draft202012Validator to remove properties that aren't specified in the schema.      """      validate_properties = validator_class.VALIDATORS["properties"] @@ -37,10 +37,10 @@ def strip_info_json(kb_info_json):      """Remove the API-only properties from the info.json.      """      schema_store = compile_schema_store() -    pruning_draft_7_validator = pruning_validator(Draft7Validator) +    pruning_draft_validator = pruning_validator(Draft202012Validator)      schema = schema_store['qmk.keyboard.v1']      resolver = RefResolver.from_schema(schema_store['qmk.keyboard.v1'], store=schema_store) -    validator = pruning_draft_7_validator(schema, resolver=resolver).validate +    validator = pruning_draft_validator(schema, resolver=resolver).validate      return validator(kb_info_json) | 
