You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.5 KiB

  1. """Used by the make system to generate keyboard.c from info.json.
  2. """
  3. from milc import cli
  4. from qmk.info import info_json
  5. from qmk.commands import dump_lines
  6. from qmk.keyboard import keyboard_completer, keyboard_folder
  7. from qmk.path import normpath
  8. from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
  9. def _gen_led_config(info_data):
  10. """Convert info.json content to g_led_config
  11. """
  12. cols = info_data['matrix_size']['cols']
  13. rows = info_data['matrix_size']['rows']
  14. config_type = None
  15. if 'layout' in info_data.get('rgb_matrix', {}):
  16. config_type = 'rgb_matrix'
  17. elif 'layout' in info_data.get('led_matrix', {}):
  18. config_type = 'led_matrix'
  19. lines = []
  20. if not config_type:
  21. return lines
  22. matrix = [['NO_LED'] * cols for _ in range(rows)]
  23. pos = []
  24. flags = []
  25. led_layout = info_data[config_type]['layout']
  26. for index, led_data in enumerate(led_layout):
  27. if 'matrix' in led_data:
  28. row, col = led_data['matrix']
  29. matrix[row][col] = str(index)
  30. pos.append(f'{{{led_data.get("x", 0)}, {led_data.get("y", 0)}}}')
  31. flags.append(str(led_data.get('flags', 0)))
  32. if config_type == 'rgb_matrix':
  33. lines.append('#ifdef RGB_MATRIX_ENABLE')
  34. lines.append('#include "rgb_matrix.h"')
  35. elif config_type == 'led_matrix':
  36. lines.append('#ifdef LED_MATRIX_ENABLE')
  37. lines.append('#include "led_matrix.h"')
  38. lines.append('__attribute__ ((weak)) led_config_t g_led_config = {')
  39. lines.append(' {')
  40. for line in matrix:
  41. lines.append(f' {{ {", ".join(line)} }},')
  42. lines.append(' },')
  43. lines.append(f' {{ {", ".join(pos)} }},')
  44. lines.append(f' {{ {", ".join(flags)} }},')
  45. lines.append('};')
  46. lines.append('#endif')
  47. return lines
  48. def _gen_matrix_mask(info_data):
  49. """Convert info.json content to matrix_mask
  50. """
  51. cols = info_data['matrix_size']['cols']
  52. rows = info_data['matrix_size']['rows']
  53. # Default mask to everything disabled
  54. mask = [['0'] * cols for i in range(rows)]
  55. # Mirror layout macros squashed on top of each other
  56. for layout_data in info_data['layouts'].values():
  57. for key_data in layout_data['layout']:
  58. row, col = key_data['matrix']
  59. mask[row][col] = '1'
  60. lines = []
  61. lines.append('#ifdef MATRIX_MASKED')
  62. lines.append('__attribute__((weak)) const matrix_row_t matrix_mask[] = {')
  63. for i in range(rows):
  64. lines.append(f' 0b{"".join(reversed(mask[i]))},')
  65. lines.append('};')
  66. lines.append('#endif')
  67. return lines
  68. @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
  69. @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
  70. @cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate keyboard.c for.')
  71. @cli.subcommand('Used by the make system to generate keyboard.c from info.json', hidden=True)
  72. def generate_keyboard_c(cli):
  73. """Generates the keyboard.h file.
  74. """
  75. kb_info_json = info_json(cli.args.keyboard)
  76. # Build the layouts.h file.
  77. keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#include QMK_KEYBOARD_H', '']
  78. keyboard_h_lines.extend(_gen_led_config(kb_info_json))
  79. keyboard_h_lines.extend(_gen_matrix_mask(kb_info_json))
  80. # Show the results
  81. dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet)