"""Part of the Mission Information Base Exporter for the SOURCE project by KSat. Object exporter. """ import datetime import logging import os from pathlib import Path from fsfwgen.objects.objects import ( sql_object_exporter, ObjectDefinitionParser, write_translation_file, export_object_file, write_translation_header_file, ) from fsfwgen.utility.printer import PrettyPrinter from fsfwgen.utility.file_management import copy_file from definitions import BspType, DATABASE_NAME, OBSW_ROOT_DIR, ROOT_DIR _LOGGER = logging.getLogger(__name__) DATE_TODAY = datetime.datetime.now() DATE_STRING_FULL = DATE_TODAY.strftime("%Y-%m-%d %H:%M:%S") GENERATE_CSV = True MOVE_CSV = True GENERATE_CPP = True COPY_CPP = True GENERATE_HEADER = True class BspConfig: def __init__(self, bsp_select: BspType): self.bsp_select = bsp_select self.bsp_dir_name = bsp_select.value if ( self.bsp_select == BspType.BSP_Q7S or self.bsp_select == BspType.BSP_LINUX_BOARD ): self.fsfw_config_root = f"{OBSW_ROOT_DIR}/linux/fsfwconfig" else: self.fsfw_config_root = f"{OBSW_ROOT_DIR}/{self.bsp_dir_name}/fsfwconfig" self.cpp_copy_dest = Path(f"{self.fsfw_config_root}/objects/") self.csv_obj_filename = f"{ROOT_DIR}/{self.bsp_dir_name}_objects.csv" self.objects_path = Path(f"{self.fsfw_config_root}/objects/systemObjectList.h") self.objects_defs = [ self.objects_path, FRAMEWORK_OBJECT_PATH, COMMON_OBJECTS_PATH, ] EXPORT_TO_SQL = True CPP_FILENAME = f"{os.path.dirname(os.path.realpath(__file__))}//translateObjects.cpp" CPP_H_FILENAME = f"{os.path.dirname(os.path.realpath(__file__))}//translateObjects.h" CSV_COPY_DEST = f"{OBSW_ROOT_DIR}/tmtc/eive_tmtc/config/objects.csv" FILE_SEPARATOR = ";" FRAMEWORK_OBJECT_PATH = Path( f"{OBSW_ROOT_DIR}/fsfw/src/fsfw/objectmanager/frameworkObjects.h" ) COMMON_OBJECTS_PATH = Path(f"{OBSW_ROOT_DIR}/common/config/eive/objects.h") SQL_DELETE_OBJECTS_CMD = """ DROP TABLE IF EXISTS Objects """ SQL_CREATE_OBJECTS_CMD = """ CREATE TABLE IF NOT EXISTS Objects( id INTEGER PRIMARY KEY, objectid TEXT, name TEXT ) """ SQL_INSERT_INTO_OBJECTS_CMD = """ INSERT INTO Objects(objectid, name) VALUES(?,?) """ def parse_objects(bsp_select: BspType, print_object_list: bool = True): cfg = BspConfig(bsp_select) # fetch objects object_parser = ObjectDefinitionParser(cfg.objects_defs) subsystem_definitions = object_parser.parse_files() # id_subsystem_definitions.update(framework_subsystem_definitions) list_items = sorted(subsystem_definitions.items()) _LOGGER.info(f"ObjectParser: Number of objects: {len(list_items)}") if print_object_list: PrettyPrinter.pprint(list_items) handle_file_export(cfg, list_items) if EXPORT_TO_SQL: _LOGGER.info("ObjectParser: Exporting to SQL") sql_object_exporter( object_table=list_items, delete_cmd=SQL_DELETE_OBJECTS_CMD, insert_cmd=SQL_INSERT_INTO_OBJECTS_CMD, create_cmd=SQL_CREATE_OBJECTS_CMD, db_filename=f"{ROOT_DIR}/{DATABASE_NAME}", ) def handle_file_export(cfg: BspConfig, list_items): if GENERATE_CPP: _LOGGER.info("ObjectParser: Generating C++ translation file") write_translation_file( filename=CPP_FILENAME, list_of_entries=list_items, date_string_full=DATE_STRING_FULL, ) if COPY_CPP: _LOGGER.info( "ObjectParser: Copying object file to " + str(cfg.cpp_copy_dest) ) copy_file(Path(CPP_FILENAME), cfg.cpp_copy_dest) if GENERATE_HEADER: write_translation_header_file(filename=CPP_H_FILENAME) copy_file(filename=Path(CPP_H_FILENAME), destination=cfg.cpp_copy_dest) if GENERATE_CSV: _LOGGER.info("ObjectParser: Generating text export") export_object_file( filename=cfg.csv_obj_filename, object_list=list_items, file_separator=FILE_SEPARATOR, ) copy_file( filename=Path(cfg.csv_obj_filename), destination=Path(CSV_COPY_DEST), delete_existing_file=True, )