#!/usr/bin/env python import argparse import json import lzma #to create .xz file import re parser = argparse.ArgumentParser(description="""Generate the COMPONENT_GENERAL json file""") parser.add_argument('filename', metavar='component_general.json', help='JSON output file') parser.add_argument('--compress', action='store_true', help='Add a compressed output file') parser.add_argument('--type', metavar='type', action="append", default=[], help='Metadata type (,,,,[translation uri])') parser.add_argument('--version-file', metavar='build_git_version.h', help='Git version file') args = parser.parse_args() filename = args.filename compress = args.compress version_file = args.version_file version_dir = '' if version_file is not None: for line in open(version_file, "r"): version_search = re.search('PX4_GIT_TAG_OR_BRANCH_NAME\s+"(.+)"', line) if version_search: version_dir = version_search.group(1) break def save_compressed(filename): #create lzma compressed version xz_filename=filename+'.xz' with lzma.open(xz_filename, 'wt', preset=9) as f: with open(filename, 'r') as content_file: f.write(content_file.read()) component_general = {} component_general['version'] = 1 def create_table(): a = [] for i in range(256): k = i for j in range(8): if k & 1: k ^= 0x1db710640 k >>= 1 a.append(k) return a # MAVLink's CRC32 def crc_update(buf, crc_table, crc): for k in buf: crc = (crc >> 8) ^ crc_table[(crc & 0xff) ^ k] return crc crc_table = create_table() metadata_types = [] for metadata_type_tuple in args.type: type_id, metadata_file, uri, fallback_uri, translation_uri = metadata_type_tuple.split(',') file_crc = 0 for line in open(metadata_file, "rb"): file_crc = crc_update(line, crc_table, file_crc) json_type = { 'type': int(type_id), 'uri': uri.replace('{version}', version_dir), 'fileCrc': file_crc, } if len(fallback_uri) > 0: json_type['uriFallback'] = fallback_uri.replace('{version}', version_dir) if len(translation_uri) > 0: json_type['translationUri'] = translation_uri metadata_types.append(json_type) component_general['metadataTypes'] = metadata_types with open(filename, 'w') as outfile: json.dump(component_general, outfile) if compress: save_compressed(filename)