generate_qmk.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. """This script generates the XAP protocol generated sources to be compiled into QMK firmware.
  2. """
  3. import json
  4. import gzip
  5. from milc import cli
  6. from qmk.path import normpath
  7. from qmk.info import info_json
  8. from qmk.commands import get_chunks, dump_lines
  9. from qmk.keyboard import keyboard_completer, keyboard_folder
  10. from qmk.xap.gen_firmware.inline_generator import generate_inline
  11. from qmk.xap.gen_firmware.header_generator import generate_header
  12. from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
  13. @cli.argument('-o', '--output', type=normpath, help='File to write to')
  14. @cli.subcommand('Generates the XAP protocol include.', hidden=False if cli.config.user.developer else True)
  15. def xap_generate_qmk_inc(cli):
  16. """Generates the XAP protocol inline codegen file, generated during normal build.
  17. """
  18. generate_inline(cli.args.output)
  19. @cli.argument('-o', '--output', type=normpath, help='File to write to')
  20. @cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Name of the keyboard')
  21. @cli.subcommand('Generates the XAP protocol include.', hidden=False if cli.config.user.developer else True)
  22. def xap_generate_qmk_h(cli):
  23. """Generates the XAP protocol header file, generated during normal build.
  24. """
  25. # Determine our keyboard
  26. if not cli.args.keyboard:
  27. cli.log.error('Missing parameter: --keyboard')
  28. cli.subcommands['xap-generate-qmk-h'].print_help()
  29. return False
  30. generate_header(cli.args.output, cli.args.keyboard)
  31. @cli.argument('-o', '--output', type=normpath, help='File to write to')
  32. @cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Name of the keyboard')
  33. @cli.argument('-km', '--keymap', help='The keymap\'s name')
  34. @cli.subcommand('Generates the XAP info.json payload include.', hidden=False if cli.config.user.developer else True)
  35. def xap_generate_info_h(cli):
  36. """Generates the XAP info.json payload header file, generated during normal build.
  37. """
  38. # Determine our keyboard
  39. if not cli.args.keyboard:
  40. cli.log.error('Missing parameter: --keyboard')
  41. cli.subcommands['xap-generate-info-h'].print_help()
  42. return False
  43. # TODO: merge in keymap level content
  44. # Build the info.json file
  45. kb_info_json = info_json(cli.args.keyboard)
  46. # Minify
  47. str_data = json.dumps(kb_info_json, separators=(',', ':'))
  48. # Compress
  49. compressed = gzip.compress(str_data.encode("utf-8"), compresslevel=9)
  50. # split into lines to match xxd output
  51. hex_array = ["0x{:02X}".format(b) for b in compressed]
  52. data_len = len(hex_array)
  53. data = ""
  54. for chunk in get_chunks(hex_array, 12):
  55. data += f' {", ".join(chunk)},\n'
  56. lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '']
  57. # Gen output file
  58. lines.append('unsigned char info_json_gz[] = {')
  59. lines.append(data)
  60. lines.append('};')
  61. lines.append(f'unsigned int info_json_gz_len = {data_len};')
  62. dump_lines(cli.args.output, lines)