component_information: rework to reflect mavlink message changes

This commit is contained in:
Beat Küng
2021-03-30 08:18:49 +02:00
parent 0f29b87101
commit 6a7688cbca
12 changed files with 179 additions and 156 deletions
+35 -19
View File
@@ -31,39 +31,55 @@
#
############################################################################
set(component_version_extra_args)
# types:
# 0: COMP_METADATA_TYPE_GENERAL
# 1: COMP_METADATA_TYPE_PARAMETER
# 2: COMP_METADATA_TYPE_COMMANDS
# 3: COMP_METADATA_TYPE_PERIPHERALS
set(comp_metadata_types)
# We disable parameter support if the metadata is not in the ROMFS. This can be
# removed once it is stored on a server
list(FIND config_romfs_extra_dependencies "parameters_xml" index)
set(comp_metadata_board "${PX4_BOARD_VENDOR}_${PX4_BOARD_MODEL}_${PX4_BOARD_LABEL}")
set(s3_url "https://px4-travis.s3.amazonaws.com")
set(comp_metadata_param_uri_board "${s3_url}/Firmware/{version}/${comp_metadata_board}/parameters.json.xz")
if (${index} EQUAL -1)
set(component_version_extra_args "--no-parameters")
set(comp_metadata_param_uri ${comp_metadata_param_uri_board})
# use generic URL as fallback
set(comp_metadata_param_uri_fallback "${s3_url}/Firmware/{version}/_general/parameters.json.xz")
else()
set(comp_metadata_param_uri "mftp://etc/extras/parameters.json.xz")
set(comp_metadata_param_uri_fallback ${comp_metadata_param_uri_board})
endif()
# arguments: type, metadata file, uri, fallback uri, optional translation uri
list(APPEND comp_metadata_types "--type" "1,${PX4_BINARY_DIR}/parameters.json.xz,${comp_metadata_param_uri},${comp_metadata_param_uri_fallback},")
set(component_version_json ${PX4_BINARY_DIR}/component_version.json)
add_custom_command(OUTPUT ${component_version_json} ${component_version_json}.xz
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_component_version.py
${component_version_json}
set(component_general_json ${PX4_BINARY_DIR}/component_general.json)
add_custom_command(OUTPUT ${component_general_json} ${component_general_json}.xz
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_component_general.py
${component_general_json}
--compress
${component_version_extra_args}
${comp_metadata_types}
--version-file ${PX4_BINARY_DIR}/src/lib/version/build_git_version.h
DEPENDS
generate_component_version.py
COMMENT "Generating component_version.json"
generate_component_general.py
${PX4_BINARY_DIR}/parameters.json.xz
parameters_xml
ver_gen
COMMENT "Generating component_general.json"
)
add_custom_target(component_version_json DEPENDS ${component_version_json})
add_custom_target(component_general_json DEPENDS ${component_general_json})
set(component_information_header ${CMAKE_CURRENT_BINARY_DIR}/hashes.h)
set(component_information_header ${CMAKE_CURRENT_BINARY_DIR}/checksums.h)
add_custom_command(OUTPUT ${component_information_header}
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_hashes.py
${PX4_BINARY_DIR}/params.json.xz
${component_version_json}
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_crc.py
${component_general_json}
--output ${component_information_header}
DEPENDS
generate_hashes.py
parameters_xml
${PX4_BINARY_DIR}/params.json.xz
${component_version_json}
COMMENT "Generating component_information/hashes.h"
generate_crc.py
${component_general_json}
COMMENT "Generating component_information/checksums.h"
)
add_custom_target(component_information_header DEPENDS ${component_information_header})
@@ -0,0 +1,79 @@
#!/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 (<type>,<metadata file>,<uri>,<fallback uri>,[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,
'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)
@@ -1,37 +0,0 @@
#!/usr/bin/env python
import argparse
import json
import lzma #to create .xz file
parser = argparse.ArgumentParser(description="""Generate the COMPONENT_VERSION json file""")
parser.add_argument('filename', metavar='component_version.json', help='JSON output file')
parser.add_argument('--compress', action='store_true', help='Add a compressed output file')
parser.add_argument('--no-parameters', action='store_true', help='disable parameter support')
args = parser.parse_args()
filename = args.filename
compress = args.compress
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_version = {}
component_version['version'] = 1
# types:
# 0: COMP_METADATA_TYPE_VERSION
# 1: COMP_METADATA_TYPE_PARAMETER
# 2: COMP_METADATA_TYPE_COMMANDS
supported_types = [0]
if not args.no_parameters: supported_types.append(1)
component_version['supportedCompMetadataTypes'] = supported_types
with open(filename, 'w') as outfile:
json.dump(component_version, outfile)
if compress:
save_compressed(filename)
+48
View File
@@ -0,0 +1,48 @@
#!/usr/bin/env python
import argparse
import os
parser = argparse.ArgumentParser(description="""Generate the COMPONENT_INFORMATION checksums (CRC32) header file""")
parser.add_argument('--output', metavar='checksums.h', help='output file')
parser.add_argument('files', nargs='+', metavar='input_file.json', help='files to generate CRC from')
args = parser.parse_args()
filename = args.output
files = args.files
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()
with open(filename, 'w') as outfile:
outfile.write("#include <stdint.h>\n")
outfile.write("namespace component_information {\n")
for filename in files:
file_crc = 0
for line in open(filename, "rb"):
file_crc = crc_update(line, crc_table, file_crc)
basename = os.path.basename(filename)
identifier = basename.split('.')[0]
outfile.write("static constexpr uint32_t {:}_crc = {:};\n".format(identifier, file_crc))
outfile.write("}\n")
@@ -1,31 +0,0 @@
#!/usr/bin/env python
import argparse
import zlib
import os
parser = argparse.ArgumentParser(description="""Generate the COMPONENT_INFORMATION hashes header file""")
parser.add_argument('--output', metavar='hashes.h', help='output file')
parser.add_argument('files', nargs='+', metavar='hashes.json', help='files to generate hashes from')
args = parser.parse_args()
filename = args.output
files = args.files
with open(filename, 'w') as outfile:
outfile.write("#include <stdint.h>\n")
outfile.write("namespace component_information {\n")
for filename in files:
# get CRC
file_hash = 0
for line in open(filename, "rb"):
file_hash = zlib.crc32(line, file_hash)
basename = os.path.basename(filename)
identifier = basename.split('.')[0]
outfile.write("static constexpr uint32_t {:}_hash = {:};\n".format(identifier, file_hash))
outfile.write("}\n")