diff --git a/Tools/autotest/validate_board_list.py b/Tools/autotest/validate_board_list.py new file mode 100755 index 0000000000..0645facd17 --- /dev/null +++ b/Tools/autotest/validate_board_list.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +''' +Check Tools/bootloader/board_types.txt for problems + +AP_FLAKE8_CLEAN + +''' + +import re + + +class ValidateBoardList(object): + + class BoardType(object): + def __init__(self, name, board_id): + self.name = name + self.board_id = board_id + + def __init__(self): + self.filepath = "Tools/AP_Bootloader/board_types.txt" + + def read_filepath(self, filepath): + '''return contents of filepath''' + content = "" + with open(filepath) as fh: + content += fh.read() + fh.close() + return content + + def parse_filepath_content(self, filepath): + '''read contents of filepath, returns a list of (id, name) tuples''' + content = self.read_filepath(filepath) + ret = [] + for line in content.split("\n"): + # strip comments: + line = re.sub("#.*", "", line) + # remove empty lines: + if not len(line) or line.isspace(): + continue + # remove trailing whitespace + line = line.rstrip() + m = re.match(r"^(.*?)\s+(\d+)$", line) + if m is None: + raise ValueError("Failed to match (%s)" % line) + print("line: (%s)" % str(line)) + ret.append((int(m.group(2)), m.group(1))) + return ret + + def validate_filepath_content(self, tuples): + '''validate a list of (id, name) tuples''' + + # a list of board IDs which can map to multiple names for + # historical reasons: + board_id_whitelist = frozenset([ + 9, # fmuv2 and fmuv3 + 10, # TARGET_HW_PX4_FMU_V4_PRO and TARGET_HW_PX4_PIO_V3 + 13, # TARGET_HW_PX4_FMU_V4_PRO and TARGET_HW_PX4_PIO_V3 + 29, # TARGET_HW_AV_V1 and TARGET_HW_AV_X_V1 + 51, # TARGET_HW_PX4_FMU_V5X and Reserved PX4 [BL] FMU v5X.x + 52, # TARGET_HW_PX4_FMU_V6 and Reserved "PX4 [BL] FMU v6.x" + 53, # TARGET_HW_PX4_FMU_V6X and Reserved "PX4 [BL] FMU v6X.x" + 57, # TARGET_HW_ARK_FMU_V6X and Reserved "ARK [BL] FMU v6X.x" + 80, # TARGET_HW_ARK_CAN_FLOW and Reserved "ARK CAN FLOW" + 20, # TARGET_HW_UVIFY_CORE and AP_HW_F4BY + ]) + + dict_by_id = {} + dict_by_name = {} + for (board_id, name) in tuples: + print("Checking (%u, %s)" % (board_id, name)) + if board_id in dict_by_id and board_id not in board_id_whitelist: + raise ValueError("Duplicate ID %s in file for (%s) and (%s)" % + (board_id, dict_by_id[board_id], name)) + if name in dict_by_name: + raise ValueError("Duplicate name %s in file for (%s) and (%s)" % + (name, dict_by_name[name], board_id)) + dict_by_name[name] = board_id + dict_by_id[board_id] = name + + def run(self): + parsed = self.parse_filepath_content(self.filepath) + self.validate_filepath_content(parsed) + return 0 + + +if __name__ == '__main__': + validator = ValidateBoardList() + validator.run()