blob_generator.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """This script generates the XAP info.json payload header to be compiled into QMK.
  2. """
  3. import json
  4. import gzip
  5. from pathlib import Path
  6. from qmk.info import keymap_json
  7. from qmk.commands import get_chunks, dump_lines
  8. from qmk.json_schema import deep_update, json_load
  9. from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
  10. def _build_info(keyboard, keymap):
  11. """Build the xap version of info.json
  12. """
  13. defaults_json = json_load(Path('data/mappings/xap_defaults.json'))
  14. km_info_json = keymap_json(keyboard, keymap)
  15. info_json = {}
  16. deep_update(info_json, defaults_json)
  17. deep_update(info_json, km_info_json)
  18. # TODO: Munge to XAP requirements
  19. info_json.pop('config_h_features', None)
  20. info_json.pop('keymaps', None)
  21. info_json.pop('parse_errors', None)
  22. info_json.pop('parse_warnings', None)
  23. info_json.get('usb', {}).pop('device_ver', None)
  24. for layout in info_json.get('layouts', {}).values():
  25. layout.pop('filename', None)
  26. layout.pop('c_macro', None)
  27. for item in layout.get('layout', []):
  28. item.pop('label', None)
  29. return info_json
  30. def generate_blob(output_file, keyboard, keymap):
  31. """Generate XAP payload
  32. """
  33. info_json = _build_info(keyboard, keymap)
  34. # Minify
  35. str_data = json.dumps(info_json, separators=(',', ':'))
  36. # Compress
  37. compressed = gzip.compress(str_data.encode("utf-8"), compresslevel=9)
  38. # split into lines to match xxd output
  39. hex_array = ["0x{:02X}".format(b) for b in compressed]
  40. data_len = len(hex_array)
  41. data = ""
  42. for chunk in get_chunks(hex_array, 12):
  43. data += f' {", ".join(chunk)},\n'
  44. lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '']
  45. # Gen output file
  46. lines.append('static const unsigned char config_blob_gz[] PROGMEM = {')
  47. lines.append(data)
  48. lines.append('};')
  49. lines.append(f'#define CONFIG_BLOB_GZ_LEN {data_len}')
  50. dump_lines(output_file, lines)