apply black to python files

This commit is contained in:
Robin Müller 2022-09-09 10:54:00 +02:00
parent 4b511d8d30
commit 19078aa5fe
No known key found for this signature in database
GPG Key ID: 11D4952C8CCEF814
10 changed files with 346 additions and 185 deletions

View File

@ -20,27 +20,40 @@ def main():
print("-- Python CMake build configurator utility --") print("-- Python CMake build configurator utility --")
print("Parsing command line arguments..") print("Parsing command line arguments..")
parser = argparse.ArgumentParser(description="Processing arguments for CMake build configuration.") parser = argparse.ArgumentParser(
parser.add_argument( description="Processing arguments for CMake build configuration."
"-o", "--osal", type=str, choices=["freertos", "linux", "rtems", "host"],
help="FSFW OSAL. Valid arguments: host, linux, rtems, freertos"
) )
parser.add_argument( parser.add_argument(
"-b", "--buildtype", type=str, choices=["debug", "release", "size", "reldeb"], "-o",
help="CMake build type. Valid arguments: debug, release, size, reldeb (Release with Debug Information)", "--osal",
default="debug" type=str,
choices=["freertos", "linux", "rtems", "host"],
help="FSFW OSAL. Valid arguments: host, linux, rtems, freertos",
)
parser.add_argument(
"-b",
"--buildtype",
type=str,
choices=["debug", "release", "size", "reldeb"],
help="CMake build type. Valid arguments: debug, release, size, reldeb (Release with Debug Information)",
default="debug",
) )
parser.add_argument("-l", "--builddir", type=str, help="Specify build directory.") parser.add_argument("-l", "--builddir", type=str, help="Specify build directory.")
parser.add_argument( parser.add_argument(
"-g", "--generator", type=str, help="CMake Generator", choices=["make", "ninja"] "-g", "--generator", type=str, help="CMake Generator", choices=["make", "ninja"]
) )
parser.add_argument( parser.add_argument(
"-t", "--target-bsp", type=str, help="Target BSP, combination of architecture and machine" "-t",
"--target-bsp",
type=str,
help="Target BSP, combination of architecture and machine",
) )
parser.add_argument( parser.add_argument(
"-d", "--defines", "-d",
"--defines",
help="Additional custom defines passed to CMake (supply without -D prefix!)", help="Additional custom defines passed to CMake (supply without -D prefix!)",
nargs="*", type=str nargs="*",
type=str,
) )
args = parser.parse_args() args = parser.parse_args()
@ -53,15 +66,15 @@ def main():
if args.generator is None: if args.generator is None:
generator = determine_build_generator() generator = determine_build_generator()
generator_cmake_arg = f"-G \"{generator}\"" generator_cmake_arg = f'-G "{generator}"'
else: else:
if args.generator == "make": if args.generator == "make":
if os.name == 'nt': if os.name == "nt":
generator_cmake_arg = '-G "MinGW Makefiles"' generator_cmake_arg = '-G "MinGW Makefiles"'
else: else:
generator_cmake_arg = '-G "Unix Makefiles"' generator_cmake_arg = '-G "Unix Makefiles"'
elif args.generator == 'ninja': elif args.generator == "ninja":
generator_cmake_arg = '-G Ninja' generator_cmake_arg = "-G Ninja"
else: else:
generator_cmake_arg = args.generator generator_cmake_arg = args.generator
@ -73,14 +86,14 @@ def main():
cmake_build_type = determine_build_type(args.buildtype) cmake_build_type = determine_build_type(args.buildtype)
cmake_target_cfg_cmd = '' cmake_target_cfg_cmd = ""
define_string = "" define_string = ""
if args.defines is not None: if args.defines is not None:
define_list = args.defines[0].split() define_list = args.defines[0].split()
for define in define_list: for define in define_list:
define_string += f"-D{define} " define_string += f"-D{define} "
if args.builddir is None: if args.builddir is None:
cmake_build_folder = determine_build_folder(cmake_build_type) cmake_build_folder = determine_build_folder(cmake_build_type)
else: else:
@ -88,8 +101,10 @@ def main():
build_path = source_location + os.path.sep + cmake_build_folder build_path = source_location + os.path.sep + cmake_build_folder
if os.path.isdir(build_path): if os.path.isdir(build_path):
remove_old_dir = input(f"{cmake_build_folder} folder already exists. " remove_old_dir = input(
f"Remove old directory? [y/n]: ") f"{cmake_build_folder} folder already exists. "
f"Remove old directory? [y/n]: "
)
if str(remove_old_dir).lower() in ["yes", "y", 1]: if str(remove_old_dir).lower() in ["yes", "y", 1]:
remove_old_dir = True remove_old_dir = True
else: else:
@ -108,11 +123,13 @@ def main():
print(f"Navigating into build directory: {build_path}") print(f"Navigating into build directory: {build_path}")
os.chdir(cmake_build_folder) os.chdir(cmake_build_folder)
cmake_command = f"cmake {generator_cmake_arg} -DFSFW_OSAL=\"{cmake_fsfw_osal}\" " \ cmake_command = (
f"-DCMAKE_BUILD_TYPE=\"{cmake_build_type}\" {cmake_target_cfg_cmd} " \ f'cmake {generator_cmake_arg} -DFSFW_OSAL="{cmake_fsfw_osal}" '
f"{define_string} {source_location}" f'-DCMAKE_BUILD_TYPE="{cmake_build_type}" {cmake_target_cfg_cmd} '
f"{define_string} {source_location}"
)
# Remove redundant spaces # Remove redundant spaces
cmake_command = ' '.join(cmake_command.split()) cmake_command = " ".join(cmake_command.split())
print("Running CMake command (without +): ") print("Running CMake command (without +): ")
print(f"+ {cmake_command}") print(f"+ {cmake_command}")
os.system(cmake_command) os.system(cmake_command)
@ -121,8 +138,10 @@ def main():
def determine_build_generator() -> str: def determine_build_generator() -> str:
print("No generator specified. ") print("No generator specified. ")
print("Please select from the following list of build types or type " print(
"in desired system directly [h for help]: ") "Please select from the following list of build types or type "
"in desired system directly [h for help]: "
)
while True: while True:
user_input = input("Enter your selection: ") user_input = input("Enter your selection: ")
if user_input == "h": if user_input == "h":
@ -136,11 +155,15 @@ def determine_build_generator() -> str:
def determine_build_folder(cmake_build_type: str) -> str: def determine_build_folder(cmake_build_type: str) -> str:
confirm = input(f"No build folder specified. Set to build type name {cmake_build_type}? [y/n]: ") confirm = input(
f"No build folder specified. Set to build type name {cmake_build_type}? [y/n]: "
)
if confirm in ["yes", "y", 1]: if confirm in ["yes", "y", 1]:
return cmake_build_type return cmake_build_type
else: else:
new_folder_name = input("Please enter folder name, will be created in source folder: ") new_folder_name = input(
"Please enter folder name, will be created in source folder: "
)
return new_folder_name return new_folder_name
@ -150,19 +173,18 @@ def determine_source_location() -> str:
index += 1 index += 1
os.chdir("..") os.chdir("..")
if index >= 5: if index >= 5:
print("Error: Could not find source directory (determined by looking for fsfw folder!)") print(
"Error: Could not find source directory (determined by looking for fsfw folder!)"
)
sys.exit(1) sys.exit(1)
return os.getcwd() return os.getcwd()
def determine_fsfw_osal() -> str: def determine_fsfw_osal() -> str:
select_dict = dict({ select_dict = dict({1: "host", 2: "linux", 3: "freertos", 4: "rtems"})
1: "host", print(
2: "linux", "No build type specified. Please select from the following list of build types: "
3: "freertos", )
4: "rtems"
})
print("No build type specified. Please select from the following list of build types: ")
for key, item in select_dict.items(): for key, item in select_dict.items():
print(f"{key}: {item}") print(f"{key}: {item}")
select = input("Enter your selection: ") select = input("Enter your selection: ")
@ -179,13 +201,12 @@ def determine_fsfw_osal() -> str:
def determine_build_type(build_type_arg) -> str: def determine_build_type(build_type_arg) -> str:
if build_type_arg is None: if build_type_arg is None:
select_dict = dict({ select_dict = dict(
1: "Debug", {1: "Debug", 2: "Release", 3: "Release with Debug Information", 4: "Size"}
2: "Release", )
3: "Release with Debug Information", print(
4: "Size" "No build type specified. Please select from the following list of build types"
}) )
print("No build type specified. Please select from the following list of build types")
for key, item in select_dict.items(): for key, item in select_dict.items():
print(f"{key}: {item}") print(f"{key}: {item}")
select = input("Enter your selection: ") select = input("Enter your selection: ")
@ -229,11 +250,10 @@ def determine_tgt_bsp(osal: str) -> str:
print("Target BSP set to arm/stm32h743zi-nucleo") print("Target BSP set to arm/stm32h743zi-nucleo")
osal = "arm/stm32h743zi-nucleo" osal = "arm/stm32h743zi-nucleo"
elif osal == "linux": elif osal == "linux":
print("No target BSP specified. Please select from the following list of build types.") print(
select_dict = dict({ "No target BSP specified. Please select from the following list of build types."
1: "arm/raspberrypi", )
2: "none/hosted" select_dict = dict({1: "arm/raspberrypi", 2: "none/hosted"})
})
for key, item in select_dict.items(): for key, item in select_dict.items():
print(f"{key}: {item}") print(f"{key}: {item}")
select = input("Enter your selection: ") select = input("Enter your selection: ")

View File

@ -11,11 +11,20 @@ from fsfwgen.parserbase.parser import FileParser
from fsfwgen.utility.csv_writer import CsvWriter from fsfwgen.utility.csv_writer import CsvWriter
from fsfwgen.utility.printer import Printer from fsfwgen.utility.printer import Printer
PACKET_CONTENT_DEFINITION_DESTINATION = ["../../mission/pus/servicepackets/", PACKET_CONTENT_DEFINITION_DESTINATION = [
"../../fsfw/pus/servicepackets/"] "../../mission/pus/servicepackets/",
"../../fsfw/pus/servicepackets/",
]
PACKET_CONTENT_CSV_NAME = "mib_packet_data_content.csv" PACKET_CONTENT_CSV_NAME = "mib_packet_data_content.csv"
PACKET_CONTENT_HEADER_COLUMN = ["Service", "Subservice", "Packet Name", "Datatype", "Name", PACKET_CONTENT_HEADER_COLUMN = [
"Size [Bytes]", "Comment"] "Service",
"Subservice",
"Packet Name",
"Datatype",
"Name",
"Size [Bytes]",
"Comment",
]
SQL_DELETE_PACKET_DATA_CONTENT_CMD = """ SQL_DELETE_PACKET_DATA_CONTENT_CMD = """
DROP TABLE IF EXISTS PacketContent; DROP TABLE IF EXISTS PacketContent;
@ -43,12 +52,17 @@ VALUES(?,?,?,?,?,?,?)
def main(): def main():
print("PacketContentParser: Parsing for header files.") print("PacketContentParser: Parsing for header files.")
header_file_parser = FileListParser(PACKET_CONTENT_DEFINITION_DESTINATION) header_file_parser = FileListParser(PACKET_CONTENT_DEFINITION_DESTINATION)
header_file_list = header_file_parser.parse_header_files(False, "Parsing packet data files: ") header_file_list = header_file_parser.parse_header_files(
False, "Parsing packet data files: "
)
packet_content_parser = PacketContentParser(header_file_list) packet_content_parser = PacketContentParser(header_file_list)
subservice_table = packet_content_parser.parse_files(True) subservice_table = packet_content_parser.parse_files(True)
Printer.print_content(subservice_table, "PacketContentParser: Printing packet data table:") Printer.print_content(
subservice_writer = CsvWriter(PACKET_CONTENT_CSV_NAME, subservice_table, "PacketContentParser: Printing packet data table:"
subservice_table, PACKET_CONTENT_HEADER_COLUMN) )
subservice_writer = CsvWriter(
PACKET_CONTENT_CSV_NAME, subservice_table, PACKET_CONTENT_HEADER_COLUMN
)
subservice_writer.write_to_csv() subservice_writer.write_to_csv()
subservice_writer.move_csv("..") subservice_writer.move_csv("..")
@ -67,7 +81,7 @@ class PacketContentParser(FileParser):
self.commentColumn = 6 self.commentColumn = 6
self.lastEntryColumn = 7 self.lastEntryColumn = 7
self.columnListLength = 8 self.columnListLength = 8
self.dictEntryList = list(range(self.columnListLength-1)) self.dictEntryList = list(range(self.columnListLength - 1))
self.datatypeMatch = False self.datatypeMatch = False
self.ignoreFlag = False self.ignoreFlag = False
@ -78,7 +92,9 @@ class PacketContentParser(FileParser):
self_print_parsing_info = args[0] self_print_parsing_info = args[0]
# Read service from file name # Read service from file name
self.dictEntryList[self.serviceColumn] = re.search('[0-9]{1,3}', file_name).group(0) self.dictEntryList[self.serviceColumn] = re.search(
"[0-9]{1,3}", file_name
).group(0)
self.dictEntryList[self.subserviceColumn] = " " self.dictEntryList[self.subserviceColumn] = " "
file = open(file_name, "r") file = open(file_name, "r")
if self_print_parsing_info: if self_print_parsing_info:
@ -96,15 +112,19 @@ class PacketContentParser(FileParser):
self.update_packet_content_sizes() self.update_packet_content_sizes()
def scan_for_class_and_struct_match_and_handle_it(self, line): def scan_for_class_and_struct_match_and_handle_it(self, line):
class_or_struct_match = re.search('[\s]*class[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)', line) class_or_struct_match = re.search(
"[\s]*class[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)", line
)
if not class_or_struct_match: if not class_or_struct_match:
class_or_struct_match = re.search( class_or_struct_match = re.search(
'[\s]*struct[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)', line) "[\s]*struct[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)", line
)
if class_or_struct_match: if class_or_struct_match:
self.dictEntryList[self.classNameColumn] = class_or_struct_match.group(1) self.dictEntryList[self.classNameColumn] = class_or_struct_match.group(1)
if class_or_struct_match.group(2): if class_or_struct_match.group(2):
self.dictEntryList[self.subserviceColumn] = \ self.dictEntryList[
self.check_for_subservice_string(class_or_struct_match.group(2)) self.subserviceColumn
] = self.check_for_subservice_string(class_or_struct_match.group(2))
def scan_for_variable_match_and_handle_it(self, line): def scan_for_variable_match_and_handle_it(self, line):
# Look for datatype definitions # Look for datatype definitions
@ -117,26 +137,37 @@ class PacketContentParser(FileParser):
# First step: Search for possible parameter definitions # First step: Search for possible parameter definitions
# Generic serialize element or datatypes # Generic serialize element or datatypes
var_match = re.search( var_match = re.search(
r'[\w]*(?:<)?[\s]*(uint32_t|uint8_t|uint16_t|ReturnValue_t|Mode_t|Submode_t|' r"[\w]*(?:<)?[\s]*(uint32_t|uint8_t|uint16_t|ReturnValue_t|Mode_t|Submode_t|"
r'object_id_t|float|double|bool|ActionId_t|EventId_t|sid_t|ParameterId_t)' r"object_id_t|float|double|bool|ActionId_t|EventId_t|sid_t|ParameterId_t)"
r'(?:>)?[\s]*([\w]*)[\s]*(?:[= 0-9]*)?[;](?:[\/!< ]*([^\n]*))?', line) r"(?:>)?[\s]*([\w]*)[\s]*(?:[= 0-9]*)?[;](?:[\/!< ]*([^\n]*))?",
line,
)
if var_match: if var_match:
# Debug printout # Debug printout
# print(var_match.group(0)) # print(var_match.group(0))
self.handle_generic_variable_match(var_match) self.handle_generic_variable_match(var_match)
# Serial Fixed Array List with Size Header # Serial Fixed Array List with Size Header
else: else:
var_match = re.search(r'[ \w]*<SerialFixedArrayListAdapter<([\w_, ()]*)>>' var_match = re.search(
r'[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line) r"[ \w]*<SerialFixedArrayListAdapter<([\w_, ()]*)>>"
r"[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
if var_match: if var_match:
self.handle_serial_fixed_array_match(var_match) self.handle_serial_fixed_array_match(var_match)
# Serial Buffer, No length field # Serial Buffer, No length field
if not var_match: if not var_match:
var_match = re.search(r'[ \w]*<SerialBufferAdapter<([\w_,]*)>>' var_match = re.search(
r'[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line) r"[ \w]*<SerialBufferAdapter<([\w_,]*)>>"
r"[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
if not var_match: if not var_match:
var_match = re.search(r'[\w ]*(?:<)?(uint32_t|uint8_t|uint16_t)[\s]*\*' var_match = re.search(
r'(?:>)?[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line) r"[\w ]*(?:<)?(uint32_t|uint8_t|uint16_t)[\s]*\*"
r"(?:>)?[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
if var_match: if var_match:
self.handle_serial_buffer_match(var_match) self.handle_serial_buffer_match(var_match)
# exclude size definition in serialize adapter or any definitions which are not parameter initializations # exclude size definition in serialize adapter or any definitions which are not parameter initializations
@ -147,7 +178,7 @@ class PacketContentParser(FileParser):
def update_packet_content_table(self): def update_packet_content_table(self):
self.index = self.index + 1 self.index = self.index + 1
dict_entry_tuple = tuple(self.dictEntryList[:self.columnListLength]) dict_entry_tuple = tuple(self.dictEntryList[: self.columnListLength])
if not self.ignoreFlag: if not self.ignoreFlag:
self.mib_table.update({self.index: dict_entry_tuple}) self.mib_table.update({self.index: dict_entry_tuple})
else: else:
@ -162,16 +193,20 @@ class PacketContentParser(FileParser):
pass pass
else: else:
fixed_array_properties = re.search( fixed_array_properties = re.search(
'([\w_]*)[\s]*,[\s]*([\w_()]*)[\s]*,[\s]*([\w_()]*)[\s]*', var_match.group(1)) "([\w_]*)[\s]*,[\s]*([\w_()]*)[\s]*,[\s]*([\w_()]*)[\s]*",
var_match.group(1),
)
if fixed_array_properties: if fixed_array_properties:
type_of_next_buffer_size = fixed_array_properties.group(3) type_of_next_buffer_size = fixed_array_properties.group(3)
self.index = self.index + 1 self.index = self.index + 1
self.dictEntryList[self.datatypeColumn] = type_of_next_buffer_size self.dictEntryList[self.datatypeColumn] = type_of_next_buffer_size
self.dictEntryList[self.nameColumn] = "Size of following buffer" self.dictEntryList[self.nameColumn] = "Size of following buffer"
dict_entry_tuple = tuple(self.dictEntryList[:self.columnListLength]) dict_entry_tuple = tuple(self.dictEntryList[: self.columnListLength])
self.mib_table.update({self.index: dict_entry_tuple}) self.mib_table.update({self.index: dict_entry_tuple})
self.handle_var_match(var_match) self.handle_var_match(var_match)
self.dictEntryList[self.datatypeColumn] = fixed_array_properties.group(1) + " *" self.dictEntryList[self.datatypeColumn] = (
fixed_array_properties.group(1) + " *"
)
self.handle_exporter_string(var_match.group(3)) self.handle_exporter_string(var_match.group(3))
def handle_serial_buffer_match(self, var_match): def handle_serial_buffer_match(self, var_match):
@ -202,7 +237,9 @@ class PacketContentParser(FileParser):
self.mib_table.update({key: content}) self.mib_table.update({key: content})
def attempt_uint_match(self, content): def attempt_uint_match(self, content):
self.datatypeMatch = re.search('uint([\d]{1,2})_t', content[self.datatypeColumn]) self.datatypeMatch = re.search(
"uint([\d]{1,2})_t", content[self.datatypeColumn]
)
if self.datatypeMatch: if self.datatypeMatch:
content = list(content) content = list(content)
content[self.sizeColumn] = round(int(self.datatypeMatch.group(1)) / 8) content[self.sizeColumn] = round(int(self.datatypeMatch.group(1)) / 8)
@ -211,8 +248,9 @@ class PacketContentParser(FileParser):
def attempt_four_byte_match(self, content): def attempt_four_byte_match(self, content):
self.datatypeMatch = re.search( self.datatypeMatch = re.search(
r'object_id_t|ActionId_t|Mode_t|float|sid_t|ParameterId_t', r"object_id_t|ActionId_t|Mode_t|float|sid_t|ParameterId_t",
content[self.datatypeColumn]) content[self.datatypeColumn],
)
if self.datatypeMatch: if self.datatypeMatch:
content = list(content) content = list(content)
content[self.sizeColumn] = 4 content[self.sizeColumn] = 4
@ -220,7 +258,7 @@ class PacketContentParser(FileParser):
return content return content
def attempt_eight_byte_match(self, content): def attempt_eight_byte_match(self, content):
self.datatypeMatch = re.search('double', content[self.datatypeColumn]) self.datatypeMatch = re.search("double", content[self.datatypeColumn])
if self.datatypeMatch: if self.datatypeMatch:
content = list(content) content = list(content)
content[self.sizeColumn] = 8 content[self.sizeColumn] = 8
@ -228,7 +266,9 @@ class PacketContentParser(FileParser):
return content return content
def attempt_two_byte_match(self, content): def attempt_two_byte_match(self, content):
self.datatypeMatch = re.search('ReturnValue_t|EventId_t', content[self.datatypeColumn]) self.datatypeMatch = re.search(
"ReturnValue_t|EventId_t", content[self.datatypeColumn]
)
if self.datatypeMatch: if self.datatypeMatch:
content = list(content) content = list(content)
content[self.sizeColumn] = 2 content[self.sizeColumn] = 2
@ -236,7 +276,7 @@ class PacketContentParser(FileParser):
return content return content
def attempt_one_byte_match(self, content): def attempt_one_byte_match(self, content):
self.datatypeMatch = re.search('Submode_t|bool', content[self.datatypeColumn]) self.datatypeMatch = re.search("Submode_t|bool", content[self.datatypeColumn])
if self.datatypeMatch: if self.datatypeMatch:
content = list(content) content = list(content)
content[self.sizeColumn] = 1 content[self.sizeColumn] = 1
@ -244,7 +284,7 @@ class PacketContentParser(FileParser):
return content return content
def handle_uint_buffer_type(self, content): def handle_uint_buffer_type(self, content):
if re.search('\*', content[self.datatypeColumn]): if re.search("\*", content[self.datatypeColumn]):
content = list(content) content = list(content)
content[self.sizeColumn] = "deduced" content[self.sizeColumn] = "deduced"
content = tuple(content) content = tuple(content)
@ -252,14 +292,22 @@ class PacketContentParser(FileParser):
# Used to scan exporter string for ignore flag or store any comments # Used to scan exporter string for ignore flag or store any comments
def handle_exporter_string(self, match): def handle_exporter_string(self, match):
exporter_string = re.search('[ /!<]*\[EXPORT[\w]*\][\s]*:[\s]*([^\n]*)', match) exporter_string = re.search("[ /!<]*\[EXPORT[\w]*\][\s]*:[\s]*([^\n]*)", match)
if exporter_string: if exporter_string:
type_string = re.search("\[TYPE|BUFFERTYPE\][\s]*([\w]*)[^\n|\[]*", exporter_string.group(0), type_string = re.search(
re.IGNORECASE) "\[TYPE|BUFFERTYPE\][\s]*([\w]*)[^\n|\[]*",
exporter_string.group(0),
re.IGNORECASE,
)
if type_string: if type_string:
self.dictEntryList[self.datatypeColumn] = str(type_string.group(1)) + " *" self.dictEntryList[self.datatypeColumn] = (
comment_string = re.search("\[COMMENT\][\s]*([\w]*)[^\n|\[]*", exporter_string.group(0), str(type_string.group(1)) + " *"
re.IGNORECASE) )
comment_string = re.search(
"\[COMMENT\][\s]*([\w]*)[^\n|\[]*",
exporter_string.group(0),
re.IGNORECASE,
)
if comment_string: if comment_string:
self.dictEntryList[self.commentColumn] = comment_string.group(1) self.dictEntryList[self.commentColumn] = comment_string.group(1)
self.check_for_ignore_string(exporter_string.group(0)) self.check_for_ignore_string(exporter_string.group(0))
@ -269,13 +317,15 @@ class PacketContentParser(FileParser):
# Used to transform comma separated subservice numbers into specific subservice numbers # Used to transform comma separated subservice numbers into specific subservice numbers
def check_for_subservice_string(self, full_description): def check_for_subservice_string(self, full_description):
subservice_info = re.search( subservice_info = re.search(
r'^.*//[\s]*[!<]*[\s]*\[EXPORT[\w]*\][\s]*:[\s]*\[SUBSERVICE\][\s]*([^\n]*)', r"^.*//[\s]*[!<]*[\s]*\[EXPORT[\w]*\][\s]*:[\s]*\[SUBSERVICE\][\s]*([^\n]*)",
full_description, re.IGNORECASE) full_description,
description = ' ' re.IGNORECASE,
)
description = " "
if subservice_info: if subservice_info:
description = self.handle_subservice_string(subservice_info) description = self.handle_subservice_string(subservice_info)
if full_description == '': if full_description == "":
description = ' ' description = " "
return description return description
def check_for_ignore_string(self, string): def check_for_ignore_string(self, string):
@ -286,8 +336,8 @@ class PacketContentParser(FileParser):
@staticmethod @staticmethod
def handle_subservice_string(subservice_info): def handle_subservice_string(subservice_info):
description = ' ' description = " "
subservice_list = [int(x) for x in subservice_info.group(1).split(',')] subservice_list = [int(x) for x in subservice_info.group(1).split(",")]
subservice_number = len(subservice_list) subservice_number = len(subservice_list)
for i in range(subservice_number): for i in range(subservice_number):
description = description + str(subservice_list[i]) description = description + str(subservice_list[i])
@ -300,6 +350,3 @@ class PacketContentParser(FileParser):
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -21,8 +21,16 @@ DH_COMMAND_PACKET_DEFINITION_DESTINATION = "../../mission/devices/devicepackets/
DH_DEFINITION_DESTINATION = "../../mission/devices/" DH_DEFINITION_DESTINATION = "../../mission/devices/"
DH_COMMANDS_CSV_NAME = "mib_device_commands.csv" DH_COMMANDS_CSV_NAME = "mib_device_commands.csv"
DH_COMMAND_HEADER_COLUMNS = [ DH_COMMAND_HEADER_COLUMNS = [
"Device Handler", "Command Name", "Action ID", "Command Field Name", "Command Field Position", "Device Handler",
"Command Field Type", "Command Field Option Name", "Command Field Option Value", "Comment"] "Command Name",
"Action ID",
"Command Field Name",
"Command Field Position",
"Command Field Type",
"Command Field Option Name",
"Command Field Option Value",
"Comment",
]
SQL_DELETE_CMDTABLE_CMD = """ SQL_DELETE_CMDTABLE_CMD = """
DROP TABLE IF EXISTS DeviceHandlerCommand; DROP TABLE IF EXISTS DeviceHandlerCommand;
@ -55,6 +63,7 @@ class DeviceCommandColumns(Enum):
""" """
Specifies order of MIB columns Specifies order of MIB columns
""" """
DH_NAME = 0 DH_NAME = 0
NAME = 1 NAME = 1
ACTION_ID = 2 ACTION_ID = 2
@ -75,19 +84,27 @@ def main():
:return: :return:
""" """
info_header_file_parser = FileListParser(DH_DEFINITION_DESTINATION) info_header_file_parser = FileListParser(DH_DEFINITION_DESTINATION)
info_header_file_list = info_header_file_parser.\ info_header_file_list = info_header_file_parser.parse_header_files(
parse_header_files(False, "Parsing device handler informations:") False, "Parsing device handler informations:"
)
dh_information_parser = DeviceHandlerInformationParser(info_header_file_list) dh_information_parser = DeviceHandlerInformationParser(info_header_file_list)
dh_information_table = dh_information_parser.parse_files() dh_information_table = dh_information_parser.parse_files()
Printer.print_content(dh_information_table, "Priting device handler command information table: ") Printer.print_content(
dh_information_table, "Priting device handler command information table: "
)
header_file_parser = FileListParser(DH_COMMAND_PACKET_DEFINITION_DESTINATION) header_file_parser = FileListParser(DH_COMMAND_PACKET_DEFINITION_DESTINATION)
header_file_list = \ header_file_list = header_file_parser.parse_header_files(
header_file_parser.parse_header_files(False, "Parsing device handler command files:") False, "Parsing device handler command files:"
packet_subservice_parser = DeviceHandlerCommandParser(header_file_list, dh_information_table) )
packet_subservice_parser = DeviceHandlerCommandParser(
header_file_list, dh_information_table
)
dh_command_table = packet_subservice_parser.parse_files() dh_command_table = packet_subservice_parser.parse_files()
Printer.print_content(dh_command_table, "Printing device handler command table:") Printer.print_content(dh_command_table, "Printing device handler command table:")
dh_command_writer = CsvWriter(DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS) dh_command_writer = CsvWriter(
DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS
)
dh_command_writer.write_to_csv() dh_command_writer.write_to_csv()
dh_command_writer.copy_csv() dh_command_writer.copy_csv()
dh_command_writer.move_csv("..") dh_command_writer.move_csv("..")
@ -120,7 +137,7 @@ class DeviceHandlerInformationParser(FileParser):
self_print_parsing_info = args[0] self_print_parsing_info = args[0]
# Read device name from file name # Read device name from file name
handler_match = re.search(r'([\w]*).h', file_name) handler_match = re.search(r"([\w]*).h", file_name)
if not handler_match: if not handler_match:
print("Device Command Parser: Configuration error, no handler name match !") print("Device Command Parser: Configuration error, no handler name match !")
handler_name = handler_match.group(1) handler_name = handler_match.group(1)
@ -145,8 +162,12 @@ class DeviceHandlerInformationParser(FileParser):
:return: :return:
""" """
# Case insensitive matching of device command enums # Case insensitive matching of device command enums
enum_match = re.search(r'[\s]*enum[\s]*([\w]*)[\s]*{[\s][/!<>]*[\s]*' enum_match = re.search(
r'\[EXPORT[\w]*\][\s]*:[\s]*\[ENUM\]([^\n]*)', line, re.IGNORECASE) r"[\s]*enum[\s]*([\w]*)[\s]*{[\s][/!<>]*[\s]*"
r"\[EXPORT[\w]*\][\s]*:[\s]*\[ENUM\]([^\n]*)",
line,
re.IGNORECASE,
)
if enum_match: if enum_match:
self.command_enum_name = enum_match.group(1) self.command_enum_name = enum_match.group(1)
self.command_scanning_pending = True self.command_scanning_pending = True
@ -158,9 +179,11 @@ class DeviceHandlerInformationParser(FileParser):
self.__handle_command_enum_scanning(line) self.__handle_command_enum_scanning(line)
def __handle_command_definition_scanning(self, line): def __handle_command_definition_scanning(self, line):
command_match = \ command_match = re.search(
re.search(r'[\s]*static[\s]*const[\s]*DeviceCommandId_t[\s]*([\w]*)[\s]*=[\s]*' r"[\s]*static[\s]*const[\s]*DeviceCommandId_t[\s]*([\w]*)[\s]*=[\s]*"
r'([\w]*)[\s]*;[\s]*[/!<>]*[\s]*\[EXPORT\][\s]*:[\s]*\[COMMAND\]', line) r"([\w]*)[\s]*;[\s]*[/!<>]*[\s]*\[EXPORT\][\s]*:[\s]*\[COMMAND\]",
line,
)
if command_match: if command_match:
command_name = command_match.group(1) command_name = command_match.group(1)
command_id = command_match.group(2) command_id = command_match.group(2)
@ -171,8 +194,11 @@ class DeviceHandlerInformationParser(FileParser):
if not self.command_scanning_pending: if not self.command_scanning_pending:
# scanning enum finished # scanning enum finished
# stores current command into command dictionary with command name as unique key # stores current command into command dictionary with command name as unique key
command_tuple = self.command_value_name_list, self.command_value_list, \ command_tuple = (
self.command_comment_list self.command_value_name_list,
self.command_value_list,
self.command_comment_list,
)
self.command_enum_dict.update({self.command_enum_name: command_tuple}) self.command_enum_dict.update({self.command_enum_name: command_tuple})
self.command_enum_name = "" self.command_enum_name = ""
self.command_value_name_list = [] self.command_value_name_list = []
@ -180,13 +206,14 @@ class DeviceHandlerInformationParser(FileParser):
self.command_comment_list = [] self.command_comment_list = []
def __scan_command_entries(self, line): def __scan_command_entries(self, line):
command_match = \ command_match = re.search(
re.search(r'[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})[^/][\s]*[/!<>]*[\s]*([^\n]*)', line) r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})[^/][\s]*[/!<>]*[\s]*([^\n]*)", line
)
if command_match: if command_match:
self.command_value_name_list.append(command_match.group(1)) self.command_value_name_list.append(command_match.group(1))
self.command_value_list.append(command_match.group(2)) self.command_value_list.append(command_match.group(2))
self.command_comment_list.append(command_match.group(3)) self.command_comment_list.append(command_match.group(3))
elif re.search(r'}[\s]*;', line): elif re.search(r"}[\s]*;", line):
self.command_scanning_pending = False self.command_scanning_pending = False
def _post_parsing_operation(self): def _post_parsing_operation(self):
@ -197,6 +224,7 @@ class PendingScanType(Enum):
""" """
Specifies which scan type is performed in the device command parser. Specifies which scan type is performed in the device command parser.
""" """
NO_SCANNING = 0 NO_SCANNING = 0
STRUCT_SCAN = 1 STRUCT_SCAN = 1
CLASS_SCAN = 2 CLASS_SCAN = 2
@ -209,6 +237,7 @@ class DeviceHandlerCommandParser(FileParser):
packet definitions. A device handler info table must be passed which can be acquired packet definitions. A device handler info table must be passed which can be acquired
by running the DH information parser. by running the DH information parser.
""" """
def __init__(self, file_list, dh_information_table): def __init__(self, file_list, dh_information_table):
super().__init__(file_list) super().__init__(file_list)
# this table includes the current new table entry, # this table includes the current new table entry,
@ -258,9 +287,12 @@ class DeviceHandlerCommandParser(FileParser):
self.__scan_command(line) self.__scan_command(line)
def __scan_for_structs(self, line): def __scan_for_structs(self, line):
struct_match = re.search(r'[\s]*struct[\s]*([\w]*)[\s]*{[\s]*[/!<>]*[\s]*' struct_match = re.search(
r'\[EXPORT\][ :]*\[COMMAND\]' r"[\s]*struct[\s]*([\w]*)[\s]*{[\s]*[/!<>]*[\s]*"
r'[\s]*([\w]*)[ :]*([\w]*)', line) r"\[EXPORT\][ :]*\[COMMAND\]"
r"[\s]*([\w]*)[ :]*([\w]*)",
line,
)
if struct_match: if struct_match:
# Scan a found command struct # Scan a found command struct
self.__start_class_or_struct_scanning(struct_match) self.__start_class_or_struct_scanning(struct_match)
@ -269,8 +301,11 @@ class DeviceHandlerCommandParser(FileParser):
def __scan_for_class(self, line): def __scan_for_class(self, line):
# search for class command definition # search for class command definition
class_match = re.search(r'[\s]*class[\s]*([\w]*)[\s]*[^{]*{[ /!<>]*\[EXPORT\][ :]*' class_match = re.search(
r'\[COMMAND\][\s]*([\w]*)[ :]*([\w]*)', line) r"[\s]*class[\s]*([\w]*)[\s]*[^{]*{[ /!<>]*\[EXPORT\][ :]*"
r"\[COMMAND\][\s]*([\w]*)[ :]*([\w]*)",
line,
)
if class_match: if class_match:
self.__start_class_or_struct_scanning(class_match) self.__start_class_or_struct_scanning(class_match)
self.scanning_pending = PendingScanType.CLASS_SCAN.value self.scanning_pending = PendingScanType.CLASS_SCAN.value
@ -288,21 +323,27 @@ class DeviceHandlerCommandParser(FileParser):
if handler_name in self.dh_information_table: if handler_name in self.dh_information_table:
(command_id_dict, self.enum_dict) = self.dh_information_table[handler_name] (command_id_dict, self.enum_dict) = self.dh_information_table[handler_name]
if command_name in command_id_dict: if command_name in command_id_dict:
self.dict_entry_list[Clmns.ACTION_ID.value] = command_id_dict[command_name] self.dict_entry_list[Clmns.ACTION_ID.value] = command_id_dict[
command_name
]
def __scan_command(self, line): def __scan_command(self, line):
datatype_match = False datatype_match = False
if self.scanning_pending is PendingScanType.STRUCT_SCAN.value: if self.scanning_pending is PendingScanType.STRUCT_SCAN.value:
datatype_match = \ datatype_match = re.search(
re.search(r'[\s]*(uint[0-9]{1,2}_t|float|double|bool|int|char)[\s]*([\w]*);' r"[\s]*(uint[0-9]{1,2}_t|float|double|bool|int|char)[\s]*([\w]*);"
r'(?:[\s]*[/!<>]*[\s]*\[EXPORT\][: ]*(.*))?', line) r"(?:[\s]*[/!<>]*[\s]*\[EXPORT\][: ]*(.*))?",
line,
)
elif self.scanning_pending is PendingScanType.CLASS_SCAN.value: elif self.scanning_pending is PendingScanType.CLASS_SCAN.value:
datatype_match = re.search( datatype_match = re.search(
r'[\s]*SerializeElement[\s]*<(uint[0-9]{1,2}_t|float|double|bool|int|char)[ >]*' r"[\s]*SerializeElement[\s]*<(uint[0-9]{1,2}_t|float|double|bool|int|char)[ >]*"
r'([\w]*);(?:[ /!<>]*\[EXPORT\][: ]*(.*))?', line) r"([\w]*);(?:[ /!<>]*\[EXPORT\][: ]*(.*))?",
line,
)
if datatype_match: if datatype_match:
self.__handle_datatype_match(datatype_match) self.__handle_datatype_match(datatype_match)
elif re.search(r'}[\s]*;', line): elif re.search(r"}[\s]*;", line):
self.scanning_pending = PendingScanType.NO_SCANNING.value self.scanning_pending = PendingScanType.NO_SCANNING.value
self.command_index = 0 self.command_index = 0
@ -318,11 +359,15 @@ class DeviceHandlerCommandParser(FileParser):
def __analyse_exporter_sequence(self, exporter_sequence): def __analyse_exporter_sequence(self, exporter_sequence):
# This matches the exporter sequence pairs e.g. [ENUM] BLA [COMMENT] BLABLA [...] ... # This matches the exporter sequence pairs e.g. [ENUM] BLA [COMMENT] BLABLA [...] ...
export_string_matches = re.search(r'(?:\[([\w]*)\][\s]*([^\[]*))?', exporter_sequence) export_string_matches = re.search(
r"(?:\[([\w]*)\][\s]*([^\[]*))?", exporter_sequence
)
if export_string_matches: if export_string_matches:
if len(export_string_matches.groups()) % 2 != 0: if len(export_string_matches.groups()) % 2 != 0:
print("Device Command Parser: Error when analysing exporter sequence," print(
" check exporter string format") "Device Command Parser: Error when analysing exporter sequence,"
" check exporter string format"
)
else: else:
count = 0 count = 0
while count < len(export_string_matches.groups()): while count < len(export_string_matches.groups()):
@ -348,8 +393,7 @@ class DeviceHandlerCommandParser(FileParser):
enum_tuple = self.enum_dict[self.current_enum_name] enum_tuple = self.enum_dict[self.current_enum_name]
for count in range(0, size_of_enum): for count in range(0, size_of_enum):
self.__update_table_with_command_options(count, enum_tuple) self.__update_table_with_command_options(count, enum_tuple)
self.command_index = \ self.command_index = self.command_index + 1
self.command_index + 1
else: else:
self.__update_table_with_no_command_options() self.__update_table_with_no_command_options()
self.index = self.index + 1 self.index = self.index + 1
@ -357,12 +401,16 @@ class DeviceHandlerCommandParser(FileParser):
def __update_table_with_command_options(self, count, enum_tuple): def __update_table_with_command_options(self, count, enum_tuple):
enum_value_name_list, enum_value_list, enum_comment_list = enum_tuple enum_value_name_list, enum_value_list, enum_comment_list = enum_tuple
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_NAME.value] = \ self.dict_entry_list[
enum_value_name_list[count] Clmns.COMMAND_FIELD_OPTION_NAME.value
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = enum_value_list[count] ] = enum_value_name_list[count]
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = enum_comment_list[count] self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = enum_value_list[
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = \ count
self.command_index ]
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = enum_comment_list[
count
]
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = self.command_index
dh_command_tuple = tuple(self.dict_entry_list) dh_command_tuple = tuple(self.dict_entry_list)
self.index += 1 self.index += 1
self.mib_table.update({self.index: dh_command_tuple}) self.mib_table.update({self.index: dh_command_tuple})
@ -371,8 +419,7 @@ class DeviceHandlerCommandParser(FileParser):
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_NAME.value] = "" self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_NAME.value] = ""
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = "" self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = ""
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = self.command_comment self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = self.command_comment
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = \ self.dict_entry_list[Clmns.COMMAND_INDEX.value] = self.command_index
self.command_index
dh_command_tuple = tuple(self.dict_entry_list) dh_command_tuple = tuple(self.dict_entry_list)
self.mib_table.update({self.index: dh_command_tuple}) self.mib_table.update({self.index: dh_command_tuple})
self.command_index += 1 self.command_index += 1

View File

@ -49,7 +49,7 @@ SUBSYSTEM_DEFINITION_DESTINATIONS = [
HEADER_DEFINITION_DESTINATIONS = [ HEADER_DEFINITION_DESTINATIONS = [
f"{OBSW_ROOT_DIR}/bsp_hosted", f"{OBSW_ROOT_DIR}/bsp_hosted",
f"{OBSW_ROOT_DIR}/fsfw/", f"{OBSW_ROOT_DIR}/fsfw/",
f"{FSFW_CONFIG_ROOT}" f"{FSFW_CONFIG_ROOT}",
] ]
@ -83,7 +83,9 @@ def parse_events(
header_file_name=CPP_H_FILENAME, header_file_name=CPP_H_FILENAME,
) )
if COPY_CPP_FILE: if COPY_CPP_FILE:
LOGGER.info(f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}") LOGGER.info(
f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}"
)
copy_file(CPP_FILENAME, CPP_COPY_DESTINATION) copy_file(CPP_FILENAME, CPP_COPY_DESTINATION)
copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION) copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION)

@ -1 +1 @@
Subproject commit 6d423f7106e49f93743fb69e9436e1e652f9e001 Subproject commit b1e5a2d40a5f41b9020f2beb0b976035f91c6343

View File

@ -47,7 +47,7 @@ from packetcontent.packet_content_parser import (
PACKET_CONTENT_HEADER_COLUMN, PACKET_CONTENT_HEADER_COLUMN,
SQL_CREATE_PACKET_DATA_CONTENT_CMD, SQL_CREATE_PACKET_DATA_CONTENT_CMD,
SQL_INSERT_PACKET_DATA_CMD, SQL_INSERT_PACKET_DATA_CMD,
SQL_DELETE_PACKET_DATA_CONTENT_CMD SQL_DELETE_PACKET_DATA_CONTENT_CMD,
) )
from subservice.subservice_parser import ( from subservice.subservice_parser import (
SubserviceParser, SubserviceParser,
@ -67,7 +67,7 @@ from devicecommands.device_command_parser import (
DH_COMMAND_HEADER_COLUMNS, DH_COMMAND_HEADER_COLUMNS,
SQL_CREATE_CMDTABLE_CMD, SQL_CREATE_CMDTABLE_CMD,
SQL_INSERT_INTO_CMDTABLE_CMD, SQL_INSERT_INTO_CMDTABLE_CMD,
SQL_DELETE_CMDTABLE_CMD SQL_DELETE_CMDTABLE_CMD,
) )
from returnvalues.returnvalues_parser import ( from returnvalues.returnvalues_parser import (
InterfaceParser, InterfaceParser,
@ -75,15 +75,16 @@ from returnvalues.returnvalues_parser import (
INTERFACE_DEFINITION_FILES, INTERFACE_DEFINITION_FILES,
RETURNVALUE_DESTINATIONS, RETURNVALUE_DESTINATIONS,
sql_retval_exporter, sql_retval_exporter,
CSV_RETVAL_FILENAME CSV_RETVAL_FILENAME,
) )
from objects.objects import ( from objects.objects import (
ObjectDefinitionParser, ObjectDefinitionParser,
OBJECTS_DEFINITIONS, OBJECTS_DEFINITIONS,
export_object_file, export_object_file,
CSV_OBJECT_FILENAME, CSV_OBJECT_FILENAME,
sql_object_exporter sql_object_exporter,
) )
DO_EXPORT_MIB = True DO_EXPORT_MIB = True
PRINT_TABLES_TO_CONSOLE = False PRINT_TABLES_TO_CONSOLE = False
EXPORT_TO_CSV = True EXPORT_TO_CSV = True
@ -146,7 +147,7 @@ def handle_subservices_generation():
def generate_subservice_table(): def generate_subservice_table():
""" Generate the subservice table. """ """Generate the subservice table."""
subservice_header_parser = FileListParser( subservice_header_parser = FileListParser(
destination_corrected(SUBSERVICE_DEFINITION_DESTINATION) destination_corrected(SUBSERVICE_DEFINITION_DESTINATION)
) )
@ -161,7 +162,11 @@ def generate_subservice_table():
def handle_packet_content_generation(): def handle_packet_content_generation():
print("MIB Exporter: Parsing packing content") print("MIB Exporter: Parsing packing content")
packet_content_table = generate_packet_content_table() packet_content_table = generate_packet_content_table()
print("MIB Exporter: Found " + str(len(packet_content_table)) + " packet content entries.") print(
"MIB Exporter: Found "
+ str(len(packet_content_table))
+ " packet content entries."
)
if PRINT_TABLES_TO_CONSOLE: if PRINT_TABLES_TO_CONSOLE:
print("MIB Exporter: Print packet content table: ") print("MIB Exporter: Print packet content table: ")
Printer.print_content(packet_content_table) Printer.print_content(packet_content_table)
@ -179,12 +184,12 @@ def handle_packet_content_generation():
SQL_CREATE_PACKET_DATA_CONTENT_CMD, SQL_CREATE_PACKET_DATA_CONTENT_CMD,
SQL_INSERT_PACKET_DATA_CMD, SQL_INSERT_PACKET_DATA_CMD,
packet_content_table, packet_content_table,
SQL_DELETE_PACKET_DATA_CONTENT_CMD SQL_DELETE_PACKET_DATA_CONTENT_CMD,
) )
def generate_packet_content_table(): def generate_packet_content_table():
""" Generate packet content table """ """Generate packet content table"""
packet_data_header_parser = FileListParser( packet_data_header_parser = FileListParser(
destination_corrected(PACKET_CONTENT_DEFINITION_DESTINATION) destination_corrected(PACKET_CONTENT_DEFINITION_DESTINATION)
) )
@ -199,7 +204,11 @@ def generate_packet_content_table():
def handle_device_handler_command_generation(): def handle_device_handler_command_generation():
print("MIB Exporter: Parsing device handler commands.") print("MIB Exporter: Parsing device handler commands.")
dh_command_table = generate_device_command_table() dh_command_table = generate_device_command_table()
print("MIB Exporter: Found " + str(len(dh_command_table)) + " device handler command entries") print(
"MIB Exporter: Found "
+ str(len(dh_command_table))
+ " device handler command entries"
)
if PRINT_TABLES_TO_CONSOLE: if PRINT_TABLES_TO_CONSOLE:
print("MIB Exporter: Printing device handler command table: ") print("MIB Exporter: Printing device handler command table: ")
Printer.print_content(dh_command_table) Printer.print_content(dh_command_table)
@ -207,19 +216,23 @@ def handle_device_handler_command_generation():
device_command_writer = CsvWriter( device_command_writer = CsvWriter(
DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS
) )
print("MIB Exporter: Exporting device handler commands to " + DH_COMMANDS_CSV_NAME) print(
"MIB Exporter: Exporting device handler commands to " + DH_COMMANDS_CSV_NAME
)
device_command_writer.write_to_csv() device_command_writer.write_to_csv()
if EXPORT_TO_SQL: if EXPORT_TO_SQL:
print("MIB Exporter: Exporting device handler commands to SQL") print("MIB Exporter: Exporting device handler commands to SQL")
sql_writer = SqlWriter() sql_writer = SqlWriter()
sql_writer.sql_writing_helper( sql_writer.sql_writing_helper(
SQL_CREATE_CMDTABLE_CMD, SQL_INSERT_INTO_CMDTABLE_CMD, dh_command_table, SQL_CREATE_CMDTABLE_CMD,
SQL_DELETE_CMDTABLE_CMD SQL_INSERT_INTO_CMDTABLE_CMD,
dh_command_table,
SQL_DELETE_CMDTABLE_CMD,
) )
def generate_device_command_table(print_info_table: bool = False): def generate_device_command_table(print_info_table: bool = False):
""" Generate device command table """ """Generate device command table"""
info_header_file_parser = FileListParser( info_header_file_parser = FileListParser(
destination_corrected(DH_DEFINITION_DESTINATION) destination_corrected(DH_DEFINITION_DESTINATION)
) )
@ -228,11 +241,15 @@ def generate_device_command_table(print_info_table: bool = False):
) )
dh_information_parser = DeviceHandlerInformationParser(info_header_file_list) dh_information_parser = DeviceHandlerInformationParser(info_header_file_list)
dh_information_table = dh_information_parser.parse_files() dh_information_table = dh_information_parser.parse_files()
print("MIB Exporter: Found " + str(len(dh_information_table)) + print(
" device handler information entries.") "MIB Exporter: Found "
+ str(len(dh_information_table))
+ " device handler information entries."
)
if print_info_table: if print_info_table:
Printer.print_content( Printer.print_content(
dh_information_table, "MIB Exporter: Priting device handler command information table: " dh_information_table,
"MIB Exporter: Priting device handler command information table: ",
) )
header_file_parser = FileListParser( header_file_parser = FileListParser(
@ -270,7 +287,9 @@ def generate_returnvalue_table():
interfaces = interface_parser.parse_files() interfaces = interface_parser.parse_files()
print("MIB Exporter: Found interfaces : " + str(len(interfaces))) print("MIB Exporter: Found interfaces : " + str(len(interfaces)))
header_parser = FileListParser(destination_corrected(RETURNVALUE_DESTINATIONS)) header_parser = FileListParser(destination_corrected(RETURNVALUE_DESTINATIONS))
header_list = header_parser.parse_header_files(True, "MIB Exporter: Parsing header file list: ") header_list = header_parser.parse_header_files(
True, "MIB Exporter: Parsing header file list: "
)
returnvalue_parser = ReturnValueParser(interfaces, header_list, False) returnvalue_parser = ReturnValueParser(interfaces, header_list, False)
returnvalue_table = returnvalue_parser.parse_files(False) returnvalue_table = returnvalue_parser.parse_files(False)
if PRINT_TABLES_TO_CONSOLE: if PRINT_TABLES_TO_CONSOLE:
@ -323,7 +342,7 @@ def handle_external_file_running():
def update_globals(): def update_globals():
""" Updates the global variables """ """Updates the global variables"""
g.PP = pprint.PrettyPrinter(indent=0, width=250) g.PP = pprint.PrettyPrinter(indent=0, width=250)
g.doExportMIB = DO_EXPORT_MIB g.doExportMIB = DO_EXPORT_MIB
g.executeSQLcommands = False g.executeSQLcommands = False

View File

@ -15,7 +15,13 @@ from fsfwgen.objects.objects import (
from fsfwgen.utility.printer import PrettyPrinter from fsfwgen.utility.printer import PrettyPrinter
from fsfwgen.utility.file_management import copy_file from fsfwgen.utility.file_management import copy_file
from definitions import BSP_HOSTED, DATABASE_NAME, OBSW_ROOT_DIR, ROOT_DIR, EXAMPLE_COMMON_DIR from definitions import (
BSP_HOSTED,
DATABASE_NAME,
OBSW_ROOT_DIR,
ROOT_DIR,
EXAMPLE_COMMON_DIR,
)
LOGGER = get_console_logger() LOGGER = get_console_logger()
DATE_TODAY = datetime.datetime.now() DATE_TODAY = datetime.datetime.now()

View File

@ -9,7 +9,13 @@ from fsfwgen.returnvalues.returnvalues_parser import InterfaceParser, ReturnValu
from fsfwgen.utility.sql_writer import SqlWriter from fsfwgen.utility.sql_writer import SqlWriter
from fsfwgen.utility.printer import PrettyPrinter from fsfwgen.utility.printer import PrettyPrinter
from definitions import BSP_HOSTED, DATABASE_NAME, ROOT_DIR, OBSW_ROOT_DIR, EXAMPLE_COMMON_DIR from definitions import (
BSP_HOSTED,
DATABASE_NAME,
ROOT_DIR,
OBSW_ROOT_DIR,
EXAMPLE_COMMON_DIR,
)
LOGGER = get_console_logger() LOGGER = get_console_logger()
EXPORT_TO_FILE = True EXPORT_TO_FILE = True

View File

@ -28,7 +28,13 @@ from fsfwgen.utility.printer import Printer
SUBSERVICE_DEFINITION_DESTINATION = ["../../mission/", "../../fsfw/pus/"] SUBSERVICE_DEFINITION_DESTINATION = ["../../mission/", "../../fsfw/pus/"]
SUBSERVICE_CSV_NAME = "mib_subservices.csv" SUBSERVICE_CSV_NAME = "mib_subservices.csv"
SUBSERVICE_COLUMN_HEADER = ["Service", "Subservice Name", "Subservice Number", "Type", "Comment"] SUBSERVICE_COLUMN_HEADER = [
"Service",
"Subservice Name",
"Subservice Number",
"Type",
"Comment",
]
SQL_DELETE_SUBSVC_CMD = """ SQL_DELETE_SUBSVC_CMD = """
DROP TABLE IF EXISTS Subservice; DROP TABLE IF EXISTS Subservice;
@ -55,6 +61,7 @@ class SubserviceColumns(Enum):
""" """
Specifies order of MIB columns Specifies order of MIB columns
""" """
SERVICE = 0 SERVICE = 0
NAME = 1 NAME = 1
NUMBER = 2 NUMBER = 2
@ -71,12 +78,16 @@ def main():
:return: :return:
""" """
header_parser = FileListParser(SUBSERVICE_DEFINITION_DESTINATION) header_parser = FileListParser(SUBSERVICE_DEFINITION_DESTINATION)
header_file_list = header_parser.parse_header_files(False, "Parsing subservice header files: ") header_file_list = header_parser.parse_header_files(
False, "Parsing subservice header files: "
)
packet_subservice_parser = SubserviceParser(header_file_list) packet_subservice_parser = SubserviceParser(header_file_list)
subservice_table = packet_subservice_parser.parse_files() subservice_table = packet_subservice_parser.parse_files()
Printer.print_content(subservice_table, "Printing subservice table:") Printer.print_content(subservice_table, "Printing subservice table:")
print("Found " + str(len(subservice_table)) + " subservice entries.") print("Found " + str(len(subservice_table)) + " subservice entries.")
subservice_writer = CsvWriter(SUBSERVICE_CSV_NAME, subservice_table, SUBSERVICE_COLUMN_HEADER) subservice_writer = CsvWriter(
SUBSERVICE_CSV_NAME, subservice_table, SUBSERVICE_COLUMN_HEADER
)
subservice_writer.write_to_csv() subservice_writer.write_to_csv()
subservice_writer.move_csv("..") subservice_writer.move_csv("..")
@ -90,6 +101,7 @@ class SubserviceParser(FileParser):
""" """
This parser class can parse the subservice definitions. This parser class can parse the subservice definitions.
""" """
def __init__(self, file_list: list): def __init__(self, file_list: list):
super().__init__(file_list) super().__init__(file_list)
# Column System allows reshuffling of table columns in constructor # Column System allows reshuffling of table columns in constructor
@ -111,7 +123,7 @@ class SubserviceParser(FileParser):
self_print_parsing_info = args[0] self_print_parsing_info = args[0]
# Read service from file name # Read service from file name
service_match = re.search('Service[^0-9]*([0-9]{1,3})', file_name) service_match = re.search("Service[^0-9]*([0-9]{1,3})", file_name)
if service_match: if service_match:
self.dict_entry_list[Clmns.SERVICE.value] = service_match.group(1) self.dict_entry_list[Clmns.SERVICE.value] = service_match.group(1)
self.dict_entry_list[Clmns.NAME.value] = " " self.dict_entry_list[Clmns.NAME.value] = " "
@ -129,7 +141,7 @@ class SubserviceParser(FileParser):
:return: :return:
""" """
# Case insensitive matching # Case insensitive matching
enum_match = re.search(r'[\s]*enum[\s]*Subservice([^\n]*)', line, re.IGNORECASE) enum_match = re.search(r"[\s]*enum[\s]*Subservice([^\n]*)", line, re.IGNORECASE)
if enum_match: if enum_match:
self.subservice_enum_found = True self.subservice_enum_found = True
if self.subservice_enum_found: if self.subservice_enum_found:
@ -146,7 +158,7 @@ class SubserviceParser(FileParser):
subservice_match = self.__scan_subservices(line) subservice_match = self.__scan_subservices(line)
if subservice_match: if subservice_match:
self.index = self.index + 1 self.index = self.index + 1
dict_entry_tuple = tuple(self.dict_entry_list[:self.clmns_len]) dict_entry_tuple = tuple(self.dict_entry_list[: self.clmns_len])
self.mib_table.update({self.index: dict_entry_tuple}) self.mib_table.update({self.index: dict_entry_tuple})
self.__clear_tuple() self.__clear_tuple()
@ -158,8 +170,9 @@ class SubserviceParser(FileParser):
self.possible_match_on_next_lines = False self.possible_match_on_next_lines = False
def __scan_for_export_command(self, line: str) -> bool: def __scan_for_export_command(self, line: str) -> bool:
command_string = re.search(r"([^\[]*)\[export\][: ]*\[([\w]*)\][\s]*([^\n]*)", command_string = re.search(
line, re.IGNORECASE) r"([^\[]*)\[export\][: ]*\[([\w]*)\][\s]*([^\n]*)", line, re.IGNORECASE
)
if command_string: if command_string:
# Check whether there is a separated export command # Check whether there is a separated export command
# (export command is not on same line as subservice definition) # (export command is not on same line as subservice definition)
@ -179,9 +192,9 @@ class SubserviceParser(FileParser):
Strip whitespaces and comment symbols and add to comment buffer. Strip whitespaces and comment symbols and add to comment buffer.
""" """
possible_multiline_comment = line.lstrip() possible_multiline_comment = line.lstrip()
possible_multiline_comment = possible_multiline_comment.lstrip('/') possible_multiline_comment = possible_multiline_comment.lstrip("/")
possible_multiline_comment = possible_multiline_comment.lstrip('<') possible_multiline_comment = possible_multiline_comment.lstrip("<")
possible_multiline_comment = possible_multiline_comment.lstrip('!') possible_multiline_comment = possible_multiline_comment.lstrip("!")
possible_multiline_comment = possible_multiline_comment.rstrip() possible_multiline_comment = possible_multiline_comment.rstrip()
if len(possible_multiline_comment) > 0: if len(possible_multiline_comment) > 0:
self.dict_entry_list[Clmns.COMMENT.value] += possible_multiline_comment self.dict_entry_list[Clmns.COMMENT.value] += possible_multiline_comment
@ -192,8 +205,9 @@ class SubserviceParser(FileParser):
:param line: :param line:
:return: :return:
""" """
subservice_match = \ subservice_match = re.search(
re.search(r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})(?:,)?(?:[ /!<>]*([^\n]*))?", line) r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})(?:,)?(?:[ /!<>]*([^\n]*))?", line
)
if subservice_match: if subservice_match:
self.dict_entry_list[Clmns.NAME.value] = subservice_match.group(1) self.dict_entry_list[Clmns.NAME.value] = subservice_match.group(1)
self.dict_entry_list[Clmns.NUMBER.value] = subservice_match.group(2) self.dict_entry_list[Clmns.NUMBER.value] = subservice_match.group(2)
@ -204,7 +218,7 @@ class SubserviceParser(FileParser):
return True return True
# Check whether exporting was commanded on last lines # Check whether exporting was commanded on last lines
return bool(self.possible_match_on_next_lines) return bool(self.possible_match_on_next_lines)
if re.search(r'}[\s]*;', line): if re.search(r"}[\s]*;", line):
self.subservice_enum_found = False self.subservice_enum_found = False
return subservice_match return subservice_match
@ -217,19 +231,19 @@ class SubserviceParser(FileParser):
return export_command_found return export_command_found
def __scan_for_type(self, string) -> bool: def __scan_for_type(self, string) -> bool:
type_match = re.search(r'\[reply\]|\[tm\]', string, re.IGNORECASE) type_match = re.search(r"\[reply\]|\[tm\]", string, re.IGNORECASE)
if type_match: if type_match:
self.dict_entry_list[Clmns.TYPE.value] = 'TM' self.dict_entry_list[Clmns.TYPE.value] = "TM"
return True return True
type_match = re.search(r'\[command\]|\[tc\]', string, re.IGNORECASE) type_match = re.search(r"\[command\]|\[tc\]", string, re.IGNORECASE)
if type_match: if type_match:
self.dict_entry_list[Clmns.TYPE.value] = 'TC' self.dict_entry_list[Clmns.TYPE.value] = "TC"
return True return True
self.dict_entry_list[Clmns.TYPE.value] = 'Unspecified' self.dict_entry_list[Clmns.TYPE.value] = "Unspecified"
return False return False
def __scan_for_comment(self, comment_string): def __scan_for_comment(self, comment_string):
comment_match = re.search(r':[\s]*\[[\w]*\][\s]*([^\n]*)', comment_string) comment_match = re.search(r":[\s]*\[[\w]*\][\s]*([^\n]*)", comment_string)
if comment_match: if comment_match:
self.dict_entry_list[Clmns.COMMENT.value] = comment_match.group(1) self.dict_entry_list[Clmns.COMMENT.value] = comment_match.group(1)

View File

@ -15,4 +15,4 @@ printToConsole = True
exportToCSV = True exportToCSV = True
doCopyFile = False doCopyFile = False
copyDestination = "." copyDestination = "."
fileSeparator = ';' fileSeparator = ";"